aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0172-Expose-client-protocol-version-and-virtual-host.patch
blob: 3f282910be3c06f532da8c0d213353fb0d2906fe (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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Minecrell <minecrell@minecrell.net>
Date: Tue, 10 Oct 2017 18:45:20 +0200
Subject: [PATCH] Expose client protocol version and virtual host


diff --git a/src/main/java/com/destroystokyo/paper/network/PaperNetworkClient.java b/src/main/java/com/destroystokyo/paper/network/PaperNetworkClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..8a716c1647aa29906be26ac262e93ebd2c1adfaa
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/network/PaperNetworkClient.java
@@ -0,0 +1,50 @@
+package com.destroystokyo.paper.network;
+
+import net.minecraft.network.NetworkManager;
+
+import java.net.InetSocketAddress;
+
+import javax.annotation.Nullable;
+
+public class PaperNetworkClient implements NetworkClient {
+
+    private final NetworkManager networkManager;
+
+    PaperNetworkClient(NetworkManager networkManager) {
+        this.networkManager = networkManager;
+    }
+
+    @Override
+    public InetSocketAddress getAddress() {
+        return (InetSocketAddress) this.networkManager.getSocketAddress();
+    }
+
+    @Override
+    public int getProtocolVersion() {
+        return this.networkManager.protocolVersion;
+    }
+
+    @Nullable
+    @Override
+    public InetSocketAddress getVirtualHost() {
+        return this.networkManager.virtualHost;
+    }
+
+    public static InetSocketAddress prepareVirtualHost(String host, int port) {
+        int len = host.length();
+
+        // FML appends a marker to the host to recognize FML clients (\0FML\0)
+        int pos = host.indexOf('\0');
+        if (pos >= 0) {
+            len = pos;
+        }
+
+        // When clients connect with a SRV record, their host contains a trailing '.'
+        if (len > 0 && host.charAt(len -  1) == '.') {
+            len--;
+        }
+
+        return InetSocketAddress.createUnresolved(host.substring(0, len), port);
+    }
+
+}
diff --git a/src/main/java/net/minecraft/network/NetworkManager.java b/src/main/java/net/minecraft/network/NetworkManager.java
index f093b465b868e6003bb2b5ee634a624b5b054493..60e4a4aa3854aaeb250d1318f2f25cf3591ea1d3 100644
--- a/src/main/java/net/minecraft/network/NetworkManager.java
+++ b/src/main/java/net/minecraft/network/NetworkManager.java
@@ -70,6 +70,10 @@ public class NetworkManager extends SimpleChannelInboundHandler<Packet<?>> {
     private float s;
     private int t;
     private boolean u;
+    // Paper start - NetworkClient implementation
+    public int protocolVersion;
+    public java.net.InetSocketAddress virtualHost;
+    // Paper end
 
     public NetworkManager(EnumProtocolDirection enumprotocoldirection) {
         this.h = enumprotocoldirection;
diff --git a/src/main/java/net/minecraft/network/protocol/handshake/PacketHandshakingInSetProtocol.java b/src/main/java/net/minecraft/network/protocol/handshake/PacketHandshakingInSetProtocol.java
index b290ddfbc19aed3e44169281c3dae5429dac0062..14c002376540d2039fc2fe2ef746e53471a9cb08 100644
--- a/src/main/java/net/minecraft/network/protocol/handshake/PacketHandshakingInSetProtocol.java
+++ b/src/main/java/net/minecraft/network/protocol/handshake/PacketHandshakingInSetProtocol.java
@@ -39,6 +39,7 @@ public class PacketHandshakingInSetProtocol implements Packet<PacketHandshakingI
         return this.d;
     }
 
+    public int getProtocolVersion() { return c(); } // Paper - OBFHELPER
     public int c() {
         return this.a;
     }
diff --git a/src/main/java/net/minecraft/server/network/HandshakeListener.java b/src/main/java/net/minecraft/server/network/HandshakeListener.java
index 31011ec34e5eeae29705f6ec167fb2e832284873..965dd2a4a446ca31597b9e91bd405e4f01ad8348 100644
--- a/src/main/java/net/minecraft/server/network/HandshakeListener.java
+++ b/src/main/java/net/minecraft/server/network/HandshakeListener.java
@@ -145,6 +145,10 @@ public class HandshakeListener implements PacketHandshakingInListener {
                 throw new UnsupportedOperationException("Invalid intention " + packethandshakinginsetprotocol.b());
         }
 
+        // Paper start - NetworkClient implementation
+        this.getNetworkManager().protocolVersion = packethandshakinginsetprotocol.getProtocolVersion();
+        this.getNetworkManager().virtualHost = com.destroystokyo.paper.network.PaperNetworkClient.prepareVirtualHost(packethandshakinginsetprotocol.hostname, packethandshakinginsetprotocol.port);
+        // Paper end
     }
 
     @Override
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index c3058d6fca2fd58aea5001e4310592aa8bd20640..cf9ae60db30ef09bb4c89935a42632e562b6d61e 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -188,6 +188,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
         }
     }
 
+    // Paper start - Implement NetworkClient
+    @Override
+    public int getProtocolVersion() {
+        if (getHandle().playerConnection == null) return -1;
+        return getHandle().playerConnection.networkManager.protocolVersion;
+    }
+
+    @Override
+    public InetSocketAddress getVirtualHost() {
+        if (getHandle().playerConnection == null) return null;
+        return getHandle().playerConnection.networkManager.virtualHost;
+    }
+    // Paper end
+
     @Override
     public double getEyeHeight(boolean ignorePose) {
         if (ignorePose) {