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
This commit is contained in:
rtm516 2020-06-17 17:37:07 +01:00
parent d7ea4ce73e
commit c7b05d92a5
4 changed files with 23 additions and 14 deletions

View file

@ -66,7 +66,7 @@ public class MasterServer {
private final ScheduledExecutorService generalThreadPool; private final ScheduledExecutorService generalThreadPool;
@Getter @Getter
private final Map<InetSocketAddress, Player> players = new HashMap<>(); private final Map<String, Player> players = new HashMap<>();
@Getter @Getter
private GeyserProxyBootstrap geyserProxy; private GeyserProxyBootstrap geyserProxy;

View file

@ -137,7 +137,7 @@ public class PacketHandler implements BedrockPacketHandler {
// Create a new player and add it to the players list // Create a new player and add it to the players list
player = new Player(extraData, session); 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 // Tell the client we have logged in successfully
PlayStatusPacket playStatusPacket = new PlayStatusPacket(); PlayStatusPacket playStatusPacket = new PlayStatusPacket();

View file

@ -31,6 +31,7 @@ import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connect.MasterServer; import org.geysermc.connect.MasterServer;
import org.geysermc.connect.utils.Player; import org.geysermc.connect.utils.Player;
import org.geysermc.connector.network.session.auth.AuthData;
public class GeyserProxySession extends GeyserSession { public class GeyserProxySession extends GeyserSession {
@ -43,9 +44,10 @@ public class GeyserProxySession extends GeyserSession {
this.bedrockServerSession = bedrockServerSession; this.bedrockServerSession = bedrockServerSession;
} }
@Override
public void authenticate(String username, String password) { public void authenticate(String username, String password) {
// Get the player based on the connection address // 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) { if (player != null && player.getCurrentServer() != null) {
// Set the remote server info for the player // Set the remote server info for the player
connector.getRemoteServer().setAddress(player.getCurrentServer().getAddress()); 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!"); 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;
}
}
} }

View file

@ -45,23 +45,19 @@ public class ProxyConnectorServerEventHandler extends ConnectorServerEventHandle
@Override @Override
public void onSessionCreation(BedrockServerSession bedrockServerSession) { 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); super.onSessionCreation(bedrockServerSession);
// This doesn't clean up the old packet handler, so may cause a memory leak? // 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 // Add another disconnect handler to remove the player on final disconnect
bedrockServerSession.addDisconnectHandler(disconnectReason -> { bedrockServerSession.addDisconnectHandler(disconnectReason -> {
MasterServer.getInstance().getLogger().debug("Player disconnected from geyser proxy: " + player.getDisplayName() + " (" + disconnectReason + ")"); Player player = MasterServer.getInstance().getPlayers().get(session.getAuthData().getXboxUUID());
MasterServer.getInstance().getPlayers().remove(bedrockServerSession.getAddress()); if (player != null) {
MasterServer.getInstance().getLogger().debug("Player disconnected from Geyser proxy: " + player.getDisplayName() + " (" + disconnectReason + ")");
MasterServer.getInstance().getPlayers().remove(session.getAuthData().getXboxUUID());
}
}); });
} }
} }