From 7ec1f487c18791bb8bcec8dd0eb75030968a7347 Mon Sep 17 00:00:00 2001 From: md_5 Date: Tue, 25 May 2021 18:42:06 +1000 Subject: [PATCH] Remove ipv6 scope from forwarded addresses Affects forwarding when epoll enabled --- .../java/net/md_5/bungee/ServerConnector.java | 3 ++- .../net/md_5/bungee/util/AddressUtil.java | 26 +++++++++++++++++++ .../net/md_5/bungee/util/AddressUtilTest.java | 19 ++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 proxy/src/main/java/net/md_5/bungee/util/AddressUtil.java create mode 100644 proxy/src/test/java/net/md_5/bungee/util/AddressUtilTest.java diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java index fa2ceec5..a87585fb 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java @@ -51,6 +51,7 @@ import net.md_5.bungee.protocol.packet.ScoreboardObjective; import net.md_5.bungee.protocol.packet.ScoreboardScore; import net.md_5.bungee.protocol.packet.SetCompression; import net.md_5.bungee.protocol.packet.ViewDistance; +import net.md_5.bungee.util.AddressUtil; import net.md_5.bungee.util.BufUtil; import net.md_5.bungee.util.QuietException; @@ -102,7 +103,7 @@ public class ServerConnector extends PacketHandler if ( BungeeCord.getInstance().config.isIpForward() && user.getSocketAddress() instanceof InetSocketAddress ) { - String newHost = copiedHandshake.getHost() + "\00" + user.getAddress().getHostString() + "\00" + user.getUUID(); + String newHost = copiedHandshake.getHost() + "\00" + AddressUtil.sanitizeAddress( user.getAddress() ) + "\00" + user.getUUID(); LoginResult profile = user.getPendingConnection().getLoginProfile(); if ( profile != null && profile.getProperties() != null && profile.getProperties().length > 0 ) diff --git a/proxy/src/main/java/net/md_5/bungee/util/AddressUtil.java b/proxy/src/main/java/net/md_5/bungee/util/AddressUtil.java new file mode 100644 index 00000000..03dabe01 --- /dev/null +++ b/proxy/src/main/java/net/md_5/bungee/util/AddressUtil.java @@ -0,0 +1,26 @@ +package net.md_5.bungee.util; + +import java.net.Inet6Address; +import java.net.InetSocketAddress; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class AddressUtil +{ + + public static String sanitizeAddress(InetSocketAddress addr) + { + String string = addr.getHostString(); + + // Remove IPv6 scope if present + if ( addr.getAddress() instanceof Inet6Address ) + { + int strip = string.indexOf( '%' ); + return ( strip == -1 ) ? string : string.substring( 0, strip ); + } else + { + return string; + } + } +} diff --git a/proxy/src/test/java/net/md_5/bungee/util/AddressUtilTest.java b/proxy/src/test/java/net/md_5/bungee/util/AddressUtilTest.java new file mode 100644 index 00000000..e2a3a481 --- /dev/null +++ b/proxy/src/test/java/net/md_5/bungee/util/AddressUtilTest.java @@ -0,0 +1,19 @@ +package net.md_5.bungee.util; + +import java.net.InetSocketAddress; +import org.junit.Assert; +import org.junit.Test; + +public class AddressUtilTest +{ + + @Test + public void testScope() + { + InetSocketAddress addr = new InetSocketAddress( "0:0:0:0:0:0:0:1%0", 25577 ); + Assert.assertEquals( "0:0:0:0:0:0:0:1", AddressUtil.sanitizeAddress( addr ) ); + + InetSocketAddress addr2 = new InetSocketAddress( "0:0:0:0:0:0:0:1", 25577 ); + Assert.assertEquals( "0:0:0:0:0:0:0:1", AddressUtil.sanitizeAddress( addr2 ) ); + } +}