summaryrefslogtreecommitdiffstats
path: root/nms-patches/HandshakeListener.patch
blob: 920c5c6af3e68bf3d232f8db9e0f7073a8a8a741 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
--- a/net/minecraft/server/HandshakeListener.java
+++ b/net/minecraft/server/HandshakeListener.java
@@ -1,7 +1,17 @@
 package net.minecraft.server;
 
+// CraftBukkit start
+import java.net.InetAddress;
+import java.util.HashMap;
+// CraftBukkit end
+
 public class HandshakeListener implements PacketHandshakingInListener {
 
+    // CraftBukkit start - add fields
+    private static final HashMap<InetAddress, Long> throttleTracker = new HashMap<InetAddress, Long>();
+    private static int throttleCounter = 0;
+    // CraftBukkit end
+
     private final MinecraftServer a;
     private final NetworkManager b;
 
@@ -11,21 +21,58 @@
     }
 
     public void a(PacketHandshakingInSetProtocol packethandshakinginsetprotocol) {
+        this.b.channel.pipeline().get(PacketEncoder.class).version = packethandshakinginsetprotocol.b(); // CraftBukkit
         switch (HandshakeListener.SyntheticClass_1.a[packethandshakinginsetprotocol.a().ordinal()]) {
         case 1:
             this.b.setProtocol(EnumProtocol.LOGIN);
             ChatComponentText chatcomponenttext;
 
+            // CraftBukkit start - Connection throttle
+            try {
+                long currentTime = System.currentTimeMillis();
+                long connectionThrottle = MinecraftServer.getServer().server.getConnectionThrottle();
+                InetAddress address = ((java.net.InetSocketAddress) this.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.b.sendPacket(new PacketLoginOutDisconnect(chatcomponenttext));
+                        this.b.close(chatcomponenttext);
+                        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 (packethandshakinginsetprotocol.b() > 109) {
                 chatcomponenttext = new ChatComponentText("Outdated server! I\'m still on 1.9.2");
                 this.b.sendPacket(new PacketLoginOutDisconnect(chatcomponenttext));
                 this.b.close(chatcomponenttext);
-            } else if (packethandshakinginsetprotocol.b() < 109) {
+            } else if (packethandshakinginsetprotocol.b() < 107) {
                 chatcomponenttext = new ChatComponentText("Outdated client! Please use 1.9.2");
                 this.b.sendPacket(new PacketLoginOutDisconnect(chatcomponenttext));
                 this.b.close(chatcomponenttext);
             } else {
                 this.b.setPacketListener(new LoginListener(this.a, this.b));
+                ((LoginListener) this.b.i()).hostname = packethandshakinginsetprotocol.hostname + ":" + packethandshakinginsetprotocol.port; // CraftBukkit - set hostname
             }
             break;