From c7b05d92a56eab584fd425f0798276900b608eeb Mon Sep 17 00:00:00 2001 From: rtm516 Date: Wed, 17 Jun 2020 17:37:07 +0100 Subject: [PATCH] Move player map to store by XUID instead of socket address This will fix issues with strange socket address changes causing users to not be able to connect to the proxy --- .../org/geysermc/connect/MasterServer.java | 2 +- .../org/geysermc/connect/PacketHandler.java | 2 +- .../connect/proxy/GeyserProxySession.java | 15 ++++++++++++++- .../ProxyConnectorServerEventHandler.java | 18 +++++++----------- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/geysermc/connect/MasterServer.java b/src/main/java/org/geysermc/connect/MasterServer.java index 01840f0..43aca66 100644 --- a/src/main/java/org/geysermc/connect/MasterServer.java +++ b/src/main/java/org/geysermc/connect/MasterServer.java @@ -66,7 +66,7 @@ public class MasterServer { private final ScheduledExecutorService generalThreadPool; @Getter - private final Map players = new HashMap<>(); + private final Map players = new HashMap<>(); @Getter private GeyserProxyBootstrap geyserProxy; diff --git a/src/main/java/org/geysermc/connect/PacketHandler.java b/src/main/java/org/geysermc/connect/PacketHandler.java index 8e83a05..9d372cf 100644 --- a/src/main/java/org/geysermc/connect/PacketHandler.java +++ b/src/main/java/org/geysermc/connect/PacketHandler.java @@ -137,7 +137,7 @@ public class PacketHandler implements BedrockPacketHandler { // Create a new player and add it to the players list player = new Player(extraData, session); - masterServer.getPlayers().put(session.getAddress(), player); + masterServer.getPlayers().put(player.getXuid(), player); // Tell the client we have logged in successfully PlayStatusPacket playStatusPacket = new PlayStatusPacket(); diff --git a/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java b/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java index c4d0357..b819c9d 100644 --- a/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java +++ b/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java @@ -31,6 +31,7 @@ import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connect.MasterServer; import org.geysermc.connect.utils.Player; +import org.geysermc.connector.network.session.auth.AuthData; public class GeyserProxySession extends GeyserSession { @@ -43,9 +44,10 @@ public class GeyserProxySession extends GeyserSession { this.bedrockServerSession = bedrockServerSession; } + @Override public void authenticate(String username, String password) { // Get the player based on the connection address - Player player = MasterServer.getInstance().getPlayers().get(bedrockServerSession.getAddress()); + Player player = MasterServer.getInstance().getPlayers().get(getAuthData().getXboxUUID()); if (player != null && player.getCurrentServer() != null) { // Set the remote server info for the player connector.getRemoteServer().setAddress(player.getCurrentServer().getAddress()); @@ -56,4 +58,15 @@ public class GeyserProxySession extends GeyserSession { bedrockServerSession.disconnect("Please connect to the master server and pick a server first!"); } } + + @Override + public void setAuthenticationData(AuthData authData) { + super.setAuthenticationData(authData); + + Player player = MasterServer.getInstance().getPlayers().get(authData.getXboxUUID()); + if (player == null) { + bedrockServerSession.disconnect("Please connect to the master server and pick a server first!"); + return; + } + } } diff --git a/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java b/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java index 3e6ea42..ccabf7b 100644 --- a/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java +++ b/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java @@ -45,23 +45,19 @@ public class ProxyConnectorServerEventHandler extends ConnectorServerEventHandle @Override public void onSessionCreation(BedrockServerSession bedrockServerSession) { - bedrockServerSession.setPacketCodec(GeyserConnector.BEDROCK_PACKET_CODEC); // Only done here as it allows us to disconnect the player - - Player player = MasterServer.getInstance().getPlayers().get(bedrockServerSession.getAddress()); - if (player == null) { - bedrockServerSession.disconnect("Please connect to the master server and pick a server first!"); - return; - } - super.onSessionCreation(bedrockServerSession); // This doesn't clean up the old packet handler, so may cause a memory leak? - bedrockServerSession.setPacketHandler(new UpstreamPacketHandler(connector, new GeyserProxySession(connector, bedrockServerSession))); + GeyserProxySession session = new GeyserProxySession(connector, bedrockServerSession); + bedrockServerSession.setPacketHandler(new UpstreamPacketHandler(connector, session)); // Add another disconnect handler to remove the player on final disconnect bedrockServerSession.addDisconnectHandler(disconnectReason -> { - MasterServer.getInstance().getLogger().debug("Player disconnected from geyser proxy: " + player.getDisplayName() + " (" + disconnectReason + ")"); - MasterServer.getInstance().getPlayers().remove(bedrockServerSession.getAddress()); + Player player = MasterServer.getInstance().getPlayers().get(session.getAuthData().getXboxUUID()); + if (player != null) { + MasterServer.getInstance().getLogger().debug("Player disconnected from Geyser proxy: " + player.getDisplayName() + " (" + disconnectReason + ")"); + MasterServer.getInstance().getPlayers().remove(session.getAuthData().getXboxUUID()); + } }); } }