From 945316dc5d23c9330235422f0871b413b6ab9634 Mon Sep 17 00:00:00 2001 From: Shane Freeder Date: Thu, 9 Jun 2022 14:27:06 +0100 Subject: [PATCH] Add support for Velocity forwarding v2 This is strictly not needed, however, I wanted to write this in part to test the new forwarding logic, parsing and advertising the latest featureset is also not exactly a bad thing --- .../Add-Velocity-IP-Forwarding-Support.patch | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/patches/server/Add-Velocity-IP-Forwarding-Support.patch b/patches/server/Add-Velocity-IP-Forwarding-Support.patch index 8c5615bbab..9aaee5660f 100644 --- a/patches/server/Add-Velocity-IP-Forwarding-Support.patch +++ b/patches/server/Add-Velocity-IP-Forwarding-Support.patch @@ -34,9 +34,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 +import javax.crypto.spec.SecretKeySpec; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; ++import net.minecraft.world.entity.player.ProfilePublicKey; + +public class VelocityProxy { + private static final int SUPPORTED_FORWARDING_VERSION = 1; ++ public static final int MODERN_FORWARDING_WITH_KEY = 2; ++ public static final byte MAX_SUPPORTED_FORWARDING_VERSION = 2; + public static final ResourceLocation PLAYER_INFO_CHANNEL = new ResourceLocation("velocity", "player_info"); + + public static boolean checkIntegrity(final FriendlyByteBuf buf) { @@ -57,11 +60,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + throw new AssertionError(e); + } + -+ int version = buf.readVarInt(); -+ if (version != SUPPORTED_FORWARDING_VERSION) { -+ throw new IllegalStateException("Unsupported forwarding version " + version + ", wanted " + SUPPORTED_FORWARDING_VERSION); -+ } -+ + return true; + } + @@ -84,6 +82,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + profile.getProperties().put(name, new Property(name, value, signature)); + } + } ++ ++ public static ProfilePublicKey.Data readForwardedKey(FriendlyByteBuf buf) { ++ return new ProfilePublicKey.Data(buf); ++ } +} diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 @@ -104,7 +106,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + // Paper start - Velocity support + if (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.velocity.enabled) { + this.velocityLoginMessageId = java.util.concurrent.ThreadLocalRandom.current().nextInt(); -+ net.minecraft.network.protocol.login.ClientboundCustomQueryPacket packet1 = new net.minecraft.network.protocol.login.ClientboundCustomQueryPacket(this.velocityLoginMessageId, com.destroystokyo.paper.proxy.VelocityProxy.PLAYER_INFO_CHANNEL, new net.minecraft.network.FriendlyByteBuf(io.netty.buffer.Unpooled.EMPTY_BUFFER)); ++ net.minecraft.network.FriendlyByteBuf buf = new net.minecraft.network.FriendlyByteBuf(io.netty.buffer.Unpooled.buffer()); ++ buf.writeByte(com.destroystokyo.paper.proxy.VelocityProxy.MAX_SUPPORTED_FORWARDING_VERSION); ++ net.minecraft.network.protocol.login.ClientboundCustomQueryPacket packet1 = new net.minecraft.network.protocol.login.ClientboundCustomQueryPacket(this.velocityLoginMessageId, com.destroystokyo.paper.proxy.VelocityProxy.PLAYER_INFO_CHANNEL, buf); + this.connection.send(packet1); + return; + } @@ -142,6 +146,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + return; + } + ++ int version = buf.readVarInt(); ++ if (version > com.destroystokyo.paper.proxy.VelocityProxy.MAX_SUPPORTED_FORWARDING_VERSION) { ++ throw new IllegalStateException("Unsupported forwarding version " + version + ", wanted upto " + com.destroystokyo.paper.proxy.VelocityProxy.MAX_SUPPORTED_FORWARDING_VERSION); ++ } ++ + java.net.SocketAddress listening = this.connection.getRemoteAddress(); + int port = 0; + if (listening instanceof java.net.InetSocketAddress) { @@ -151,6 +160,19 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + + this.gameProfile = com.destroystokyo.paper.proxy.VelocityProxy.createProfile(buf); + ++ // We should already have this, but, we'll read it out anyway ++ //noinspection NonStrictComparisonCanBeEquality ++ if (version >= com.destroystokyo.paper.proxy.VelocityProxy.MODERN_FORWARDING_WITH_KEY) { ++ final ProfilePublicKey.Data forwardedKey = com.destroystokyo.paper.proxy.VelocityProxy.readForwardedKey(buf); ++ if (this.playerProfilePublicKey == null) { ++ try { ++ this.playerProfilePublicKey = ProfilePublicKey.createValidated(this.server.getServiceSignatureValidator(), forwardedKey); ++ } catch (CryptException e) { ++ this.disconnect("Unable to validate forwarded player key"); ++ } ++ } ++ } ++ + // Proceed with login + authenticatorPool.execute(() -> { + try {