Files
CatServer/patches/net/minecraft/server/network/NetHandlerHandshakeTCP.java.patch

125 lines
6.7 KiB
Diff

--- ../src-base/minecraft/net/minecraft/server/network/NetHandlerHandshakeTCP.java
+++ ../src-work/minecraft/net/minecraft/server/network/NetHandlerHandshakeTCP.java
@@ -9,39 +9,94 @@
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentTranslation;
-public class NetHandlerHandshakeTCP implements INetHandlerHandshakeServer
-{
+import java.net.InetAddress;
+import java.util.HashMap;
+
+public class NetHandlerHandshakeTCP implements INetHandlerHandshakeServer {
private final MinecraftServer server;
private final NetworkManager networkManager;
- public NetHandlerHandshakeTCP(MinecraftServer serverIn, NetworkManager netManager)
- {
+ private static final HashMap<InetAddress, Long> throttleTracker = new HashMap<InetAddress, Long>();
+ private static int throttleCounter = 0;
+ private static final com.google.gson.Gson gson = new com.google.gson.Gson(); // Spigot
+
+ public NetHandlerHandshakeTCP(MinecraftServer serverIn, NetworkManager netManager) {
this.server = serverIn;
this.networkManager = netManager;
}
- public void processHandshake(C00Handshake packetIn)
- {
- switch (packetIn.getRequestedState())
- {
+ public void processHandshake(C00Handshake packetIn) {
+ if (!net.minecraftforge.fml.common.FMLCommonHandler.instance().handleServerHandshake(packetIn, this.networkManager))
+ return;
+
+ switch (packetIn.getRequestedState()) {
case LOGIN:
this.networkManager.setConnectionState(EnumConnectionState.LOGIN);
- if (packetIn.getProtocolVersion() > 340)
- {
- ITextComponent itextcomponent = new TextComponentTranslation("multiplayer.disconnect.outdated_server", new Object[] {"1.12.2"});
+ // CraftBukkit start - Connection throttle
+ try {
+ long currentTime = System.currentTimeMillis();
+ long connectionThrottle = MinecraftServer.getServerInst().server.getConnectionThrottle();
+ InetAddress address = ((java.net.InetSocketAddress) this.networkManager.getRemoteAddress()).getAddress();
+
+ synchronized (throttleTracker) {
+ if (throttleTracker.containsKey(address) && !"127.0.0.1".equals(address.getHostAddress()) && currentTime - throttleTracker.get(address) < connectionThrottle) {
+ throttleTracker.put(address, currentTime);
+ ITextComponent chatmessage = new TextComponentTranslation("Connection throttled! Please wait before reconnecting.");
+ this.networkManager.sendPacket(new SPacketDisconnect(chatmessage));
+ this.networkManager.closeChannel(chatmessage);
+ 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 (packetIn.getProtocolVersion() > 340) {
+ ITextComponent itextcomponent = new TextComponentTranslation(org.spigotmc.SpigotConfig.outdatedServerMessage.replaceAll("'", "''"), new Object[]{"1.12.2"}); // Spigot
this.networkManager.sendPacket(new SPacketDisconnect(itextcomponent));
this.networkManager.closeChannel(itextcomponent);
- }
- else if (packetIn.getProtocolVersion() < 340)
- {
- ITextComponent itextcomponent1 = new TextComponentTranslation("multiplayer.disconnect.outdated_client", new Object[] {"1.12.2"});
+ } else if (packetIn.getProtocolVersion() < 340) {
+ ITextComponent itextcomponent1 = new TextComponentTranslation(org.spigotmc.SpigotConfig.outdatedClientMessage.replaceAll("'", "''"), new Object[]{"1.12.2"}); // Spigot
this.networkManager.sendPacket(new SPacketDisconnect(itextcomponent1));
this.networkManager.closeChannel(itextcomponent1);
- }
- else
- {
+ } else {
this.networkManager.setNetHandler(new NetHandlerLoginServer(this.server, this.networkManager));
+ // Spigot Start
+ if (org.spigotmc.SpigotConfig.bungee) {
+ String[] split = packetIn.ip.split("\00");
+ if (split.length == 3 || split.length == 4) {
+ packetIn.ip = split[0];
+ networkManager.socketAddress = new java.net.InetSocketAddress(split[1], ((java.net.InetSocketAddress) networkManager.getRemoteAddress()).getPort());
+ networkManager.spoofedUUID = com.mojang.util.UUIDTypeAdapter.fromString(split[2]);
+ } else {
+ ITextComponent itextcomponent1 = new TextComponentTranslation("If you wish to use IP forwarding, please enable it in your BungeeCord config as well!");
+ this.networkManager.sendPacket(new SPacketDisconnect(itextcomponent1));
+ this.networkManager.closeChannel(itextcomponent1);
+ return;
+ }
+ if (split.length == 4) {
+ networkManager.spoofedProfile = gson.fromJson(split[3], com.mojang.authlib.properties.Property[].class);
+ }
+ }
+ // Spigot End
+ ((NetHandlerLoginServer) this.networkManager.getNetHandler()).hostname = packetIn.ip + ":" + packetIn.port; // CraftBukkit - set hostname
}
break;
@@ -54,7 +109,6 @@
}
}
- public void onDisconnect(ITextComponent reason)
- {
+ public void onDisconnect(ITextComponent reason) {
}
}