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..5caca6439d2135e34880d501397fe2ea197d7249 --- /dev/null +++ b/src/main/java/com/destroystokyo/paper/network/PaperNetworkClient.java @@ -0,0 +1,50 @@ +package com.destroystokyo.paper.network; + +import net.minecraft.server.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/server/HandshakeListener.java b/src/main/java/net/minecraft/server/HandshakeListener.java index ad2861cde180403069c96f5fd7e4d26ee918bbea..07d5036ce3b04c78f332deed65b9177b70b4361a 100644 --- a/src/main/java/net/minecraft/server/HandshakeListener.java +++ b/src/main/java/net/minecraft/server/HandshakeListener.java @@ -133,6 +133,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/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java index 5a0129d007459fbb868784f53585fd26f495358c..aeee6bfbc1c0113beef35bf33e8c6928a1db2844 100644 --- a/src/main/java/net/minecraft/server/NetworkManager.java +++ b/src/main/java/net/minecraft/server/NetworkManager.java @@ -60,6 +60,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/server/PacketHandshakingInSetProtocol.java b/src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java index 4f008e4723d2cb0bcabb2d5621203d63c40c4923..8545146fb1f093f821e3b966d9337049575c6773 100644 --- a/src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java +++ b/src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java @@ -35,6 +35,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/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 6ca7a7a3267d3c8477c8333dea9ac2bbad230056..6eb02d0a69a0375ba099f776636de765612911e5 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) {