Backport IPv6 modern forwarding fix to Velocity 1.0.x

This commit is contained in:
Andrew Steinborn
2020-10-10 11:02:29 -04:00
parent 8238865bbe
commit b14e7e651e

View File

@@ -21,6 +21,7 @@ import com.velocitypowered.proxy.protocol.packet.SetCompression;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import java.io.IOException; import java.io.IOException;
import java.net.InetSocketAddress;
import java.security.InvalidKeyException; import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@@ -62,7 +63,7 @@ public class LoginSessionHandler implements MinecraftSessionHandler {
response.setSuccess(true); response.setSuccess(true);
response.setId(packet.getId()); response.setId(packet.getId());
response.setData(createForwardingData(configuration.getForwardingSecret(), response.setData(createForwardingData(configuration.getForwardingSecret(),
serverConn.getPlayer().getRemoteAddress().getHostString(), cleanRemoteAddress(serverConn.getPlayer().getRemoteAddress()),
serverConn.getPlayer().getGameProfile())); serverConn.getPlayer().getGameProfile()));
mc.write(response); mc.write(response);
informationForwarded = true; informationForwarded = true;
@@ -123,6 +124,16 @@ public class LoginSessionHandler implements MinecraftSessionHandler {
.completeExceptionally(new IOException("Unexpectedly disconnected from remote server")); .completeExceptionally(new IOException("Unexpectedly disconnected from remote server"));
} }
private static String cleanRemoteAddress(InetSocketAddress address) {
String addressString = address.getAddress().getHostAddress();
int ipv6ScopeIdx = addressString.indexOf('%');
if (ipv6ScopeIdx == -1) {
return addressString;
} else {
return addressString.substring(0, ipv6ScopeIdx);
}
}
private static ByteBuf createForwardingData(byte[] hmacSecret, String address, private static ByteBuf createForwardingData(byte[] hmacSecret, String address,
GameProfile profile) { GameProfile profile) {
ByteBuf dataToForward = Unpooled.buffer(); ByteBuf dataToForward = Unpooled.buffer();