From 4fe420783725f64542ee30b80d8da0fb84501d2a Mon Sep 17 00:00:00 2001 From: Mirco Kroon <23699979+mircokroon@users.noreply.github.com> Date: Wed, 5 Jul 2023 19:09:13 +0200 Subject: [PATCH 1/2] Fixed issue with MS authentication --- .../java/proxy/auth/MicrosoftAuthHandler.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/proxy/auth/MicrosoftAuthHandler.java b/src/main/java/proxy/auth/MicrosoftAuthHandler.java index 696a8655..24795865 100644 --- a/src/main/java/proxy/auth/MicrosoftAuthHandler.java +++ b/src/main/java/proxy/auth/MicrosoftAuthHandler.java @@ -58,19 +58,19 @@ private String getRedirectUrl() { private void refresh() { LocalDateTime now = LocalDateTime.now(); - if (microsoftAccessToken == null || microsoftExpiration.isAfter(now)) { + if (microsoftAccessToken == null || microsoftExpiration.isBefore(now)) { acquireMicrosoftToken(); } - if (xboxLiveToken == null || xboxLiveExpiration.isAfter(now)) { + if (xboxLiveToken == null || xboxLiveExpiration.isBefore(now)) { acquireXboxLiveToken(); } - if (xboxSecurityToken == null || xboxSecurityExpiration.isAfter(now)) { + if (xboxSecurityToken == null || xboxSecurityExpiration.isBefore(now)) { acquireXboxSecurityToken(); } - if (minecraftAccessToken == null || minecraftAccessExpiration.isAfter(now)) { + if (minecraftAccessToken == null || minecraftAccessExpiration.isBefore(now)) { acquireMinecraftAccessToken(); } } @@ -108,6 +108,11 @@ private void acquireMicrosoftToken() { int expiresIn = res.getBody().getObject().getInt("expires_in"); this.microsoftExpiration = LocalDateTime.now().plusSeconds(expiresIn); + + // invalidate others + xboxLiveExpiration = LocalDateTime.MIN; + xboxSecurityExpiration = LocalDateTime.MIN; + minecraftAccessExpiration = LocalDateTime.MIN; } private void acquireXboxLiveToken() { @@ -129,6 +134,10 @@ private void acquireXboxLiveToken() { .getJSONObject(0) .getString("uhs"); this.xboxLiveExpiration = LocalDateTime.parse(jso.getString("NotAfter").split("\\.")[0]); + + // invalidate others + xboxSecurityExpiration = LocalDateTime.MIN; + minecraftAccessExpiration = LocalDateTime.MIN; } private void acquireXboxSecurityToken() { @@ -146,6 +155,9 @@ private void acquireXboxSecurityToken() { JSONObject jso = res.getBody().getObject(); this.xboxSecurityToken = jso.getString("Token"); this.xboxSecurityExpiration = LocalDateTime.parse(jso.getString("NotAfter").split("\\.")[0]); + + // invalidate others + minecraftAccessExpiration = LocalDateTime.MIN; } private void acquireMinecraftAccessToken() { From 2cda9e5602a84452b6fd2bf8f70a9224a962d9f9 Mon Sep 17 00:00:00 2001 From: Mirco Kroon <23699979+mircokroon@users.noreply.github.com> Date: Wed, 5 Jul 2023 19:09:45 +0200 Subject: [PATCH 2/2] Simplified UI connection tab --- src/main/java/config/Config.java | 6 +- src/main/java/gui/AuthTabController.java | 13 +--- src/main/java/gui/GuiSettings.java | 45 ++++-------- src/main/java/proxy/ConnectionDetails.java | 14 +++- .../java/proxy/auth/AuthDetailsManager.java | 17 +++++ src/main/resources/ui/Settings.fxml | 71 +++++++++---------- src/main/resources/ui/dark.css | 3 +- 7 files changed, 81 insertions(+), 88 deletions(-) diff --git a/src/main/java/config/Config.java b/src/main/java/config/Config.java index b13f515b..3286bdf0 100644 --- a/src/main/java/config/Config.java +++ b/src/main/java/config/Config.java @@ -205,7 +205,7 @@ public void settingsComplete() { isStarted = true; versionHandler = ProtocolVersionHandler.getInstance(); - connectionDetails = new ConnectionDetails(server, portRemote, portLocal, !disableSrvLookup); + connectionDetails = new ConnectionDetails(server, portLocal, !disableSrvLookup); if (!disableGui) { GuiManager.loadSceneMap(); @@ -354,10 +354,6 @@ public static PacketInjector getPacketInjector() { usage = "Your Minecraft username.") public transient String username; - @Option(name = "--port", aliases = "-p", - usage = "The port on which the remote server runs.") - public int portRemote = 25565; - @Option(name = "--local-port", aliases = "-l", usage = "The port on which the world downloader's server will run.") public int portLocal = 25565; diff --git a/src/main/java/gui/AuthTabController.java b/src/main/java/gui/AuthTabController.java index 2277b137..1d9acd46 100644 --- a/src/main/java/gui/AuthTabController.java +++ b/src/main/java/gui/AuthTabController.java @@ -89,19 +89,8 @@ private void clearAuthenticationStatus() { } public void checkButtonPressed(ActionEvent actionEvent) { - try { - AuthenticationMethod method = Config.getAuthMethod(); - AuthDetails details = AuthDetailsManager.loadAuthDetails(); + AuthDetailsManager.validateAuthStatus(this::setStatusText, this::setStatusError); - boolean isValid = details.isValid(); - if (isValid) { - setStatusText("Valid session found! \n\nUsername: " + details.getUsername()); - } else { - setStatusError(method.getErrorMessage()); - } - } catch (IOException e) { - setStatusError("Exception occurred: " + e.getMessage()); - } clearAuthenticationStatus(); } diff --git a/src/main/java/gui/GuiSettings.java b/src/main/java/gui/GuiSettings.java index 99714055..4c46b57c 100644 --- a/src/main/java/gui/GuiSettings.java +++ b/src/main/java/gui/GuiSettings.java @@ -37,7 +37,6 @@ public class GuiSettings { public TextField server; - public DefaultIntField portRemote; public DefaultIntField portLocal; public TextField worldOutputDir; @@ -52,13 +51,12 @@ public class GuiSettings { public Tab errTab; public TabPane tabPane; public TextArea errOutput; - public Label authDetailsVerifyLabel; - public Tooltip authTooltip; public CheckBox disableWorldGen; public Label portVerifyLabel; public Slider extendedDistance; public IntField extendedDistanceText; public Hyperlink openWorldDir; + public Hyperlink verifyAuthLink; public CheckBox renderOtherPlayers; public CheckBox enableInfoMessages; public Tab realmsTab; @@ -66,6 +64,7 @@ public class GuiSettings { public RealmsTabController realmsController; public AuthTabController authController; public CheckBox enableDrawExtendedChunks; + Config config; private boolean portInUse; @@ -82,7 +81,6 @@ void initialize() { // connection tab server.setText(config.server); - portRemote.setText("" + config.portRemote); portLocal.setText("" + config.portLocal); // output tab @@ -115,10 +113,8 @@ void initialize() { } }); } - disableWhenRunning(Arrays.asList(server, portRemote, portLocal, centerX, centerZ, worldOutputDir)); + disableWhenRunning(Arrays.asList(server, portLocal, centerX, centerZ, worldOutputDir)); - authTooltip = new Tooltip(""); - GuiManager.bindTooltip(authDetailsVerifyLabel, authTooltip); GuiManager.bindTooltip(portVerifyLabel, new Tooltip("Is the downloader already running?")); openWorldDir.setOnAction(e -> attemptQuiet(() -> { @@ -131,16 +127,17 @@ void initialize() { } })); -// accessToken.textProperty().addListener((ov, oldV, newV) -> { -// // trim invalid characters, remove accessToken at front in case they copied the entire line -// accessToken.setText(newV.trim() -// .replaceAll("[^A-Za-z0-9\\-_.]*", "") -// .replaceFirst("accessToken", "")); -// }); + verifyAuthLink.setOnAction(e -> tabPane.getSelectionModel().select(authTab)); handleDataValidation(); handleErrorTab(); handleResizing(); + + validateAuthentication(); + } + + private void validateAuthentication() { + } private void handleDataValidation() { @@ -279,7 +276,6 @@ public void saveSettings(ActionEvent actionEvent) { private void save() { // connection tab config.server = server.getText(); - config.portRemote = Math.abs(portRemote.getAsInt()); config.portLocal = Math.abs(portLocal.getAsInt()); // output tab @@ -310,22 +306,11 @@ public boolean portInUse(int port) { } } - public void setSelectedIp(String address) throws URISyntaxException, MalformedURLException { - // address needs to start with a scheme, so we just prefix https - URI uri = new URI("https://" + address); - - String host = uri.getHost(); - int port = uri.getPort(); - - // if the port is the default, maybe it is not actually reported(?), so just in case... - if (port < 0) { port = 25565; } - - if (host == null) { - throw new MalformedURLException("No host present in " + address); - } - - this.portRemote.setValue(port); - this.server.setText(host); + /** + * Set the IP address given by the realms tab + */ + public void setSelectedIp(String address) { + this.server.setText(address); tabPane.getSelectionModel().selectFirst(); this.saveButton.requestFocus(); diff --git a/src/main/java/proxy/ConnectionDetails.java b/src/main/java/proxy/ConnectionDetails.java index 439802ee..a06ba0b3 100644 --- a/src/main/java/proxy/ConnectionDetails.java +++ b/src/main/java/proxy/ConnectionDetails.java @@ -18,9 +18,17 @@ public class ConnectionDetails { private int portRemote; private int portLocal; - public ConnectionDetails(String host, int portRemote, int portLocal, boolean performSrvLookup) { - this.host = host; - this.portRemote = portRemote; + public ConnectionDetails(String host, int portLocal, boolean performSrvLookup) { + this.portRemote = DEFAULT_PORT; + + if (host.contains(":")) { + String[] hostParts = host.split(":"); + this.host = hostParts[0]; + + attempt(() -> this.portRemote = Integer.parseInt(hostParts[1])); + } else { + this.host = host; + } this.portLocal = portLocal; if (performSrvLookup) { diff --git a/src/main/java/proxy/auth/AuthDetailsManager.java b/src/main/java/proxy/auth/AuthDetailsManager.java index 204eba79..e9c3d9ac 100644 --- a/src/main/java/proxy/auth/AuthDetailsManager.java +++ b/src/main/java/proxy/auth/AuthDetailsManager.java @@ -4,6 +4,7 @@ import gui.GuiManager; import java.io.IOException; +import java.util.function.Consumer; /** * Class to handle retrieving authentication details from either user input, or the relevant launcher files. @@ -44,6 +45,22 @@ public static AuthDetails loadAuthDetails() throws IOException { }; } + public static void validateAuthStatus(Consumer onSuccess, Consumer onError) { + try { + AuthDetails details = loadAuthDetails(); + + boolean isValid = details.isValid(); + if (isValid) { + onSuccess.accept("Valid session found! \n\nUsername: " + details.getUsername()); + } else { + AuthenticationMethod method = Config.getAuthMethod(); + onError.accept(method.getErrorMessage()); + } + } catch (IOException e) { + onError.accept("Exception occurred: " + e.getMessage()); + } + } + public AuthDetails getAuthDetails() throws IOException { if (this.details == null) { this.details = loadAuthDetails(); diff --git a/src/main/resources/ui/Settings.fxml b/src/main/resources/ui/Settings.fxml index 85e35b53..6ee743e2 100644 --- a/src/main/resources/ui/Settings.fxml +++ b/src/main/resources/ui/Settings.fxml @@ -4,50 +4,39 @@ - -