1
0
forked from xjboss/KCauldronX
KCauldronX/patches/net/minecraft/server/network/NetHandlerHandshakeTCP.java.patch
2015-03-22 20:38:04 +03:00

123 lines
5.8 KiB
Diff

--- ../src-base/minecraft/net/minecraft/server/network/NetHandlerHandshakeTCP.java
+++ ../src-work/minecraft/net/minecraft/server/network/NetHandlerHandshakeTCP.java
@@ -3,6 +3,7 @@
import cpw.mods.fml.common.FMLCommonHandler;
import io.netty.util.concurrent.GenericFutureListener;
import net.minecraft.network.EnumConnectionState;
+import net.minecraft.network.INetHandler;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.handshake.INetHandlerHandshakeServer;
import net.minecraft.network.handshake.client.C00Handshake;
@@ -11,8 +12,24 @@
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.IChatComponent;
+
+// CraftBukkit start
+import java.net.InetAddress;
+import java.util.HashMap;
+// CraftBukkit end
+// Spigot start
+import com.mojang.authlib.properties.Property;
+import com.mojang.util.UUIDTypeAdapter;
+// Spigot end
+
public class NetHandlerHandshakeTCP implements INetHandlerHandshakeServer
{
+ private static final com.google.gson.Gson gson = new com.google.gson.Gson(); // Spigot
+ // CraftBukkit start
+ private static final HashMap<InetAddress, Long> throttleTracker = new HashMap<InetAddress, Long>();
+ private static int throttleCounter = 0;
+ // CraftBukkit end
+
private final MinecraftServer field_147387_a;
private final NetworkManager field_147386_b;
private static final String __OBFID = "CL_00001456";
@@ -39,6 +56,52 @@
this.field_147386_b.setConnectionState(EnumConnectionState.LOGIN);
ChatComponentText chatcomponenttext;
+ // CraftBukkit start
+ try
+ {
+ long currentTime = System.currentTimeMillis();
+ long connectionThrottle = MinecraftServer.getServer().server.getConnectionThrottle();
+ InetAddress address = ((java.net.InetSocketAddress) this.field_147386_b.getSocketAddress()).getAddress();
+
+ synchronized (throttleTracker)
+ {
+ if (throttleTracker.containsKey(address) && !"127.0.0.1".equals(address.getHostAddress()) && currentTime - throttleTracker.get(address) < connectionThrottle)
+ {
+ throttleTracker.put(address, currentTime);
+ chatcomponenttext = new ChatComponentText("Connection throttled! Please wait before reconnecting.");
+ this.field_147386_b.scheduleOutboundPacket(new S00PacketDisconnect(chatcomponenttext), new GenericFutureListener[0]);
+ this.field_147386_b.closeChannel(chatcomponenttext); // Should be close
+ return;
+ }
+
+ throttleTracker.put(address, currentTime);
+ throttleCounter++;
+
+ if (throttleCounter > 200)
+ {
+ throttleCounter = 0;
+ // Cleanup stale entries
+ java.util.Iterator iter = throttleTracker.entrySet().iterator();
+
+ while (iter.hasNext())
+ {
+ java.util.Map.Entry<InetAddress, Long> entry = (java.util.Map.Entry) iter.next();
+
+ if (entry.getValue() > connectionThrottle)
+ {
+ iter.remove();
+ }
+ }
+ }
+ }
+ }
+ catch (Throwable t)
+ {
+ org.apache.logging.log4j.LogManager.getLogger().debug("Failed to check connection throttle", t);
+ }
+
+ // CraftBukkit end
+
if (p_147383_1_.func_149595_d() > 5)
{
chatcomponenttext = new ChatComponentText("Outdated server! I\'m still on 1.7.10");
@@ -54,6 +117,33 @@
else
{
this.field_147386_b.setNetHandler(new NetHandlerLoginServer(this.field_147387_a, this.field_147386_b));
+
+ // Spigot Start
+ if (org.spigotmc.SpigotConfig.bungee)
+ {
+ String[] split = p_147383_1_.field_149598_b.split("\00");
+
+ if (split.length == 3 || split.length == 4)
+ {
+ p_147383_1_.field_149598_b = split[0];
+ field_147386_b.socketAddress = new java.net.InetSocketAddress(split[1], ((java.net.InetSocketAddress) field_147386_b.getSocketAddress()).getPort());
+ field_147386_b.spoofedUUID = UUIDTypeAdapter.fromString( split[2] );
+ }
+ else
+ {
+ chatcomponenttext = new ChatComponentText("If you wish to use IP forwarding, please enable it in your BungeeCord config as well!");
+ this.field_147386_b.scheduleOutboundPacket(new S00PacketDisconnect(chatcomponenttext), new GenericFutureListener[0]);
+ this.field_147386_b.closeChannel(chatcomponenttext);
+ return;
+ }
+
+ if (split.length == 4)
+ {
+ field_147386_b.spoofedProfile = gson.fromJson(split[3], Property[].class);
+ }
+ }
+ // Spigot End
+ ((NetHandlerLoginServer) this.field_147386_b.getNetHandler()).hostname = p_147383_1_.field_149598_b + ":" + p_147383_1_.field_149599_c; // CraftBukkit - set hostname
}
break;