From 498df7983b9a95c40bc538cc727898dc48ecc368 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Mon, 11 Jan 2021 16:29:39 -0500 Subject: [PATCH] Add Microsoft account support (#19) * Add MSA support; fix up whatever IntelliJ complained about * Add togglable password authentication option --- pom.xml | 2 +- .../geysermc/connect/GeyserConnectConfig.java | 3 +++ .../org/geysermc/connect/MasterServer.java | 8 +++---- .../org/geysermc/connect/PacketHandler.java | 8 +++---- .../connect/proxy/GeyserProxyBootstrap.java | 1 + .../connect/proxy/GeyserProxySession.java | 21 +++++++++++++++++-- .../org/geysermc/connect/ui/UIHandler.java | 20 +++++++----------- src/main/resources/config.yml | 3 +++ src/main/resources/proxy_config.yml | 1 + 9 files changed, 44 insertions(+), 23 deletions(-) diff --git a/pom.xml b/pom.xml index 4cad70f..4b11100 100644 --- a/pom.xml +++ b/pom.xml @@ -85,7 +85,7 @@ com.github.CloudburstMC.Protocol bedrock-v422 - 87d862d69d + d41b84e86c compile diff --git a/src/main/java/org/geysermc/connect/GeyserConnectConfig.java b/src/main/java/org/geysermc/connect/GeyserConnectConfig.java index 53bac24..b27a8b9 100644 --- a/src/main/java/org/geysermc/connect/GeyserConnectConfig.java +++ b/src/main/java/org/geysermc/connect/GeyserConnectConfig.java @@ -74,6 +74,9 @@ public class GeyserConnectConfig { private int port; + @JsonProperty("allow-password-authentication") + private boolean allowPasswordAuthentication = true; + @JsonProperty("debug-mode") private boolean debugMode; diff --git a/src/main/java/org/geysermc/connect/MasterServer.java b/src/main/java/org/geysermc/connect/MasterServer.java index c64b8e7..9b071cc 100644 --- a/src/main/java/org/geysermc/connect/MasterServer.java +++ b/src/main/java/org/geysermc/connect/MasterServer.java @@ -49,7 +49,6 @@ import java.util.concurrent.ScheduledExecutorService; public class MasterServer { - private final Timer timer; private BedrockServer bdServer; private BedrockPong bdPong; @@ -79,10 +78,10 @@ public class MasterServer { @Setter @Getter - private long lastDisconnectTime = 0l; + private long lastDisconnectTime = 0L; public MasterServer() { - this.instance = this; + instance = this; logger = new Logger(); @@ -101,7 +100,7 @@ public class MasterServer { this.generalThreadPool = Executors.newScheduledThreadPool(32); // Start a timer to keep the thread running - timer = new Timer(); + Timer timer = new Timer(); TimerTask task = new TimerTask() { public void run() { } }; timer.scheduleAtFixedRate(task, 0L, 1000L); @@ -165,6 +164,7 @@ public class MasterServer { public void shutdown() { shuttingDown = true; + bdServer.close(); shutdownGeyserProxy(); diff --git a/src/main/java/org/geysermc/connect/PacketHandler.java b/src/main/java/org/geysermc/connect/PacketHandler.java index 65cc9d5..3547ef2 100644 --- a/src/main/java/org/geysermc/connect/PacketHandler.java +++ b/src/main/java/org/geysermc/connect/PacketHandler.java @@ -58,8 +58,8 @@ import java.util.concurrent.TimeUnit; public class PacketHandler implements BedrockPacketHandler { - private BedrockServerSession session; - private MasterServer masterServer; + private final BedrockServerSession session; + private final MasterServer masterServer; private Player player; @@ -69,7 +69,7 @@ public class PacketHandler implements BedrockPacketHandler { this.session = session; this.masterServer = masterServer; - session.addDisconnectHandler((reason) -> disconnect(reason)); + session.addDisconnectHandler(this::disconnect); } public void disconnect(DisconnectReason reason) { @@ -78,7 +78,7 @@ public class PacketHandler implements BedrockPacketHandler { masterServer.getStorageManager().saveServers(player); if (player.getCurrentServer() != null && player.getCurrentServer().isBedrock()) { - masterServer.getPlayers().remove(player); + masterServer.getPlayers().remove(player.getXuid(), player); } } } diff --git a/src/main/java/org/geysermc/connect/proxy/GeyserProxyBootstrap.java b/src/main/java/org/geysermc/connect/proxy/GeyserProxyBootstrap.java index 58cd569..ee6c968 100644 --- a/src/main/java/org/geysermc/connect/proxy/GeyserProxyBootstrap.java +++ b/src/main/java/org/geysermc/connect/proxy/GeyserProxyBootstrap.java @@ -71,6 +71,7 @@ public class GeyserProxyBootstrap implements GeyserBootstrap { text = text.replace("PORT", String.valueOf(multiConfig.getGeyser().getPort())); text = text.replaceAll("MOTD", multiConfig.getMotd()); text = text.replace("PLAYERS", String.valueOf(multiConfig.getMaxPlayers())); + text = text.replace("ALLOWPASSWORDAUTHENTICATION", String.valueOf(multiConfig.getGeyser().isAllowPasswordAuthentication())); ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory()); geyserConfig = objectMapper.readValue(text, GeyserProxyConfiguration.class); diff --git a/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java b/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java index 713fdfe..2c1bae2 100644 --- a/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java +++ b/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java @@ -56,7 +56,25 @@ public class GeyserProxySession extends GeyserSession { connector.setAuthType(player.getCurrentServer().isOnline() ? AuthType.ONLINE : AuthType.OFFLINE); super.authenticate(username, password); - }else{ + } else { + // Disconnect the player if they haven't picked a server on the master server list + bedrockServerSession.disconnect("Please connect to the master server and pick a server first!"); + } + } + + @Override + public void authenticateWithMicrosoftCode() { + // Get the player based on the connection address + 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()); + connector.getRemoteServer().setPort(player.getCurrentServer().getPort()); + + connector.setAuthType(player.getCurrentServer().isOnline() ? AuthType.ONLINE : AuthType.OFFLINE); + + super.authenticateWithMicrosoftCode(); + } else { // Disconnect the player if they haven't picked a server on the master server list bedrockServerSession.disconnect("Please connect to the master server and pick a server first!"); } @@ -77,7 +95,6 @@ public class GeyserProxySession extends GeyserSession { 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/ui/UIHandler.java b/src/main/java/org/geysermc/connect/ui/UIHandler.java index a49d68a..9c0dc9e 100644 --- a/src/main/java/org/geysermc/connect/ui/UIHandler.java +++ b/src/main/java/org/geysermc/connect/ui/UIHandler.java @@ -83,8 +83,7 @@ public class UIHandler { * @return A {@link SimpleFormWindow} object */ public static FormWindow getWaitingScreen(Server server) { - SimpleFormWindow window = new SimpleFormWindow("Connecting", "Please wait while we connect you to " + server.toString()); - return window; + return new SimpleFormWindow("Connecting", "Please wait while we connect you to " + server.toString()); } /** @@ -93,13 +92,12 @@ public class UIHandler { * @return A {@link CustomFormWindow} object */ public static FormWindow getDirectConnect() { - CustomFormWindow window = new CustomFormBuilder("Direct Connect") + return new CustomFormBuilder("Direct Connect") .addComponent(new InputComponent("IP", "play.cubecraft.net", "")) .addComponent(new InputComponent("Port", "25565", "25565")) .addComponent(new ToggleComponent("Online mode", true)) .addComponent(new ToggleComponent("Bedrock server", false)) .build(); - return window; } /** @@ -128,13 +126,12 @@ public class UIHandler { * @return A {@link CustomFormWindow} object */ public static FormWindow getAddServer() { - CustomFormWindow window = new CustomFormBuilder("Add Server") + return new CustomFormBuilder("Add Server") .addComponent(new InputComponent("IP", "play.cubecraft.net", "")) .addComponent(new InputComponent("Port", "25565", "25565")) .addComponent(new ToggleComponent("Online mode", true)) .addComponent(new ToggleComponent("Bedrock server", false)) .build(); - return window; } /** @@ -176,14 +173,13 @@ public class UIHandler { */ public static FormWindow getEditServer(int serverIndex, Server server) { String port = String.valueOf(server.getPort()); - CustomFormWindow window = new CustomFormBuilder("Edit Server") + return new CustomFormBuilder("Edit Server") .addComponent(new LabelComponent("Server at index: " + serverIndex)) .addComponent(new InputComponent("IP", server.getAddress(), server.getAddress())) .addComponent(new InputComponent("Port", port, port)) .addComponent(new ToggleComponent("Online mode", server.isOnline())) .addComponent(new ToggleComponent("Bedrock server", server.isBedrock())) .build(); - return window; } /** @@ -227,7 +223,7 @@ public class UIHandler { try { String address = data.getInputResponses().get(0); - int port = Integer.valueOf(data.getInputResponses().get(1)); + int port = Integer.parseInt(data.getInputResponses().get(1)); boolean online = data.getToggleResponses().get(2); boolean bedrock = data.getToggleResponses().get(3); @@ -288,7 +284,7 @@ public class UIHandler { try { String address = data.getInputResponses().get(0); - int port = Integer.valueOf(data.getInputResponses().get(1)); + int port = Integer.parseInt(data.getInputResponses().get(1)); boolean online = data.getToggleResponses().get(2); boolean bedrock = data.getToggleResponses().get(3); @@ -399,10 +395,10 @@ public class UIHandler { } try { - int serverIndex = Integer.valueOf(data.getLabelResponses().get(0).split(":")[1].trim()); + int serverIndex = Integer.parseInt(data.getLabelResponses().get(0).split(":")[1].trim()); String address = data.getInputResponses().get(1); - int port = Integer.valueOf(data.getInputResponses().get(2)); + int port = Integer.parseInt(data.getInputResponses().get(2)); boolean online = data.getToggleResponses().get(3); boolean bedrock = data.getToggleResponses().get(4); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 6cbeab0..851d34f 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -25,6 +25,9 @@ geyser: # The port that will listen for connections port: 19133 + # If password authentication should be allowed in online mode. + allow-password-authentication: true + # If debug messages should be sent through console, has to be enabled in both places to work debug-mode: false diff --git a/src/main/resources/proxy_config.yml b/src/main/resources/proxy_config.yml index df228d5..71c37f4 100644 --- a/src/main/resources/proxy_config.yml +++ b/src/main/resources/proxy_config.yml @@ -32,6 +32,7 @@ remote: port: 25565 # Authentication type. Can be offline, online, or floodgate (see https://github.com/GeyserMC/Geyser/wiki/Floodgate). auth-type: online + allow-password-authentication: ALLOWPASSWORDAUTHENTICATION # Floodgate uses encryption to ensure use from authorised sources. # This should point to the public key generated by Floodgate (Bungee or CraftBukkit)