aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0171-Expose-client-protocol-version-and-virtual-host.patch
blob: f8c7fef6c9b66bfd3ca05137f910330fa09cef07 (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 ce4573c4cdc6c42aafb966e0e9658b197ab4243d..b08bd632e7e2126aa7aa58a3643e1f59f03fe538 100644
--- a/src/main/java/net/minecraft/server/network/HandshakeListener.java
+++ b/src/main/java/net/minecraft/server/network/HandshakeListener.java
@@ -150,6 +150,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 2a3a2ea0fb7aee6bee88c4e578d2dd8074be971b..debb2887387e0a873292d32a9e34096494e4b716 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) {