From 4b42bdf2468d72e8086b38585656ab8e256d7a04 Mon Sep 17 00:00:00 2001 From: UnfamiliarLegacy <74633542+UnfamiliarLegacy@users.noreply.github.com> Date: Sat, 15 Jul 2023 07:00:21 +0200 Subject: [PATCH 01/13] Improve Nitro socket url matching --- .../connection/proxy/nitro/http/NitroHttpProxyFilter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java index b9795ec..3233f90 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java @@ -16,9 +16,9 @@ import java.util.regex.Pattern; public class NitroHttpProxyFilter extends HttpFiltersAdapter { - private static final String NitroConfigSearch = "\"socket.url\""; + private static final String NitroConfigSearch = "socket.url"; private static final String NitroClientSearch = "configurationUrls:"; - private static final Pattern NitroConfigPattern = Pattern.compile("\"socket\\.url\":.?\"(wss?://.*?)\"", Pattern.MULTILINE); + private static final Pattern NitroConfigPattern = Pattern.compile("[\"']socket\\.url[\"']:.?[\"'](wss?://.*?)[\"']", Pattern.MULTILINE); // https://developers.cloudflare.com/fundamentals/get-started/reference/cloudflare-cookies/ private static final HashSet CloudflareCookies = new HashSet<>(Arrays.asList( From a5383b01bb5fd3db897fd94bc471e00ec98ed125 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 21:19:39 +0000 Subject: [PATCH 02/13] Bump org.eclipse.jetty:jetty-http in /G-Earth Bumps [org.eclipse.jetty:jetty-http](https://github.com/eclipse/jetty.project) from 9.4.51.v20230217 to 9.4.53.v20231009. - [Release notes](https://github.com/eclipse/jetty.project/releases) - [Commits](https://github.com/eclipse/jetty.project/compare/jetty-9.4.51.v20230217...jetty-9.4.53.v20231009) --- updated-dependencies: - dependency-name: org.eclipse.jetty:jetty-http dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- G-Earth/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/G-Earth/pom.xml b/G-Earth/pom.xml index deb5bf3..e1845dc 100644 --- a/G-Earth/pom.xml +++ b/G-Earth/pom.xml @@ -10,7 +10,7 @@ 1.8 - 9.4.51.v20230217 + 9.4.53.v20231009 1.3.5 From 5180d6cf0b5fad503263397d15d52c32c8451d41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Nov 2023 23:27:56 +0000 Subject: [PATCH 03/13] Bump org.json:json from 20230227 to 20231013 in /G-Earth Bumps [org.json:json](https://github.com/douglascrockford/JSON-java) from 20230227 to 20231013. - [Release notes](https://github.com/douglascrockford/JSON-java/releases) - [Changelog](https://github.com/stleary/JSON-java/blob/master/docs/RELEASES.md) - [Commits](https://github.com/douglascrockford/JSON-java/commits) --- updated-dependencies: - dependency-name: org.json:json dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- G-Earth/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/G-Earth/pom.xml b/G-Earth/pom.xml index deb5bf3..4068b4f 100644 --- a/G-Earth/pom.xml +++ b/G-Earth/pom.xml @@ -209,7 +209,7 @@ org.json json - 20230227 + 20231013 org.fxmisc.richtext From 9bb98c1739b2276771ea9964a563cb384f618840 Mon Sep 17 00:00:00 2001 From: UnfamiliarLegacy <74633542+UnfamiliarLegacy@users.noreply.github.com> Date: Mon, 11 Dec 2023 05:01:56 +0100 Subject: [PATCH 04/13] Update config pattern --- .../connection/proxy/nitro/http/NitroHttpProxyFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java index 3233f90..30694ba 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java @@ -18,7 +18,7 @@ public class NitroHttpProxyFilter extends HttpFiltersAdapter { private static final String NitroConfigSearch = "socket.url"; private static final String NitroClientSearch = "configurationUrls:"; - private static final Pattern NitroConfigPattern = Pattern.compile("[\"']socket\\.url[\"']:.?[\"'](wss?://.*?)[\"']", Pattern.MULTILINE); + private static final Pattern NitroConfigPattern = Pattern.compile("[\"']socket\\.url[\"']:.+[\"'](wss?://.*?)[\"']", Pattern.MULTILINE); // https://developers.cloudflare.com/fundamentals/get-started/reference/cloudflare-cookies/ private static final HashSet CloudflareCookies = new HashSet<>(Arrays.asList( From bea6848fdc344d4ca7cffb9bd9bef37e7fd416c7 Mon Sep 17 00:00:00 2001 From: UnfamiliarLegacy <74633542+UnfamiliarLegacy@users.noreply.github.com> Date: Tue, 12 Dec 2023 01:21:04 +0100 Subject: [PATCH 05/13] Update socket url matching --- .../connection/proxy/nitro/http/NitroHttpProxyFilter.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java index 30694ba..e6e1152 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java @@ -18,7 +18,7 @@ public class NitroHttpProxyFilter extends HttpFiltersAdapter { private static final String NitroConfigSearch = "socket.url"; private static final String NitroClientSearch = "configurationUrls:"; - private static final Pattern NitroConfigPattern = Pattern.compile("[\"']socket\\.url[\"']:.+[\"'](wss?://.*?)[\"']", Pattern.MULTILINE); + private static final Pattern NitroConfigPattern = Pattern.compile("[\"']socket\\.url[\"']:(\\s+)?[\"'](wss?:.*?)[\"']", Pattern.MULTILINE); // https://developers.cloudflare.com/fundamentals/get-started/reference/cloudflare-cookies/ private static final HashSet CloudflareCookies = new HashSet<>(Arrays.asList( @@ -95,11 +95,11 @@ public class NitroHttpProxyFilter extends HttpFiltersAdapter { final Matcher matcher = NitroConfigPattern.matcher(responseBody); if (matcher.find()) { - final String originalWebsocket = matcher.group(1); + final String originalWebsocket = matcher.group(2).replace("\\/", "/"); final String replacementWebsocket = callback.replaceWebsocketServer(this.url, originalWebsocket); if (replacementWebsocket != null) { - responseBody = responseBody.replace(originalWebsocket, replacementWebsocket); + responseBody = responseBody.replace(matcher.group(2), replacementWebsocket); responseModified = true; } } From 4299428465c0497520a1491a8a802dd98b6287c4 Mon Sep 17 00:00:00 2001 From: WiredSpast Date: Sat, 3 Feb 2024 08:51:24 +0100 Subject: [PATCH 06/13] Updated catalog parsers to include Silver --- .../main/java/gearth/extensions/parsers/catalog/HOffer.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/G-Earth/src/main/java/gearth/extensions/parsers/catalog/HOffer.java b/G-Earth/src/main/java/gearth/extensions/parsers/catalog/HOffer.java index 6a9cb58..c5073de 100644 --- a/G-Earth/src/main/java/gearth/extensions/parsers/catalog/HOffer.java +++ b/G-Earth/src/main/java/gearth/extensions/parsers/catalog/HOffer.java @@ -13,6 +13,7 @@ public class HOffer { private int priceInCredits; private int priceInActivityPoints; private int activityPointType; + private int priceInSilver; private boolean giftable; private List products = new ArrayList<>(); private int clubLevel; @@ -28,6 +29,7 @@ public class HOffer { this.priceInCredits = packet.readInteger(); this.priceInActivityPoints = packet.readInteger(); this.activityPointType = packet.readInteger(); + this.priceInSilver = packet.readInteger(); this.giftable = packet.readBoolean(); int productCount = packet.readInteger(); @@ -65,6 +67,10 @@ public class HOffer { return activityPointType; } + public int getPriceInSilver() { + return priceInSilver; + } + public boolean isGiftable() { return giftable; } From f48dfb7122d6f25a46b748781d70a97f09dc2ce8 Mon Sep 17 00:00:00 2001 From: WiredSpast <74211155+WiredSpast@users.noreply.github.com> Date: Sat, 16 Mar 2024 16:14:27 +0100 Subject: [PATCH 07/13] Added G-Rust to readme --- docs/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/README.md b/docs/README.md index 0ab39aa..7441a57 100644 --- a/docs/README.md +++ b/docs/README.md @@ -39,6 +39,7 @@ G-Python1 | Python | sirjonasxx | https://github.com/sirjonasxx/G-Pyt Xabbo | C# | b7 | https://github.com/b7c/Xabbo.GEarth Xabbo scripter2 | C# | b7 | https://github.com/b7c/Xabbo.Scripter G-Node | Node.js | WiredSpast | https://github.com/WiredSpast/G-Node +G-Rust | Rust | WiredSpast | https://github.com/WiredSpast/G-Rust GProgrammer3 | Javascript | at15four2020 | https://github.com/at15four2020/GProgrammer/wiki 1: built-in in G-Earth through the [live scripting console](https://github.com/sirjonasxx/G-Earth/wiki/G-Python-qtConsole) From 84cfbac9a4e96772453d6ed1566efe48f41ec023 Mon Sep 17 00:00:00 2001 From: Lande <64076502+Laande@users.noreply.github.com> Date: Wed, 1 May 2024 21:20:32 +0200 Subject: [PATCH 08/13] Change port for habbo.com ref issue #179 --- .../gearth/protocol/connection/proxy/ProxyProviderFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/ProxyProviderFactory.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/ProxyProviderFactory.java index 9070132..acd04a7 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/ProxyProviderFactory.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/ProxyProviderFactory.java @@ -38,7 +38,7 @@ public class ProxyProviderFactory { autoDetectHosts.add("game-it.habbo.com:30000"); autoDetectHosts.add("game-nl.habbo.com:30000"); autoDetectHosts.add("game-tr.habbo.com:30000"); - autoDetectHosts.add("game-us.habbo.com:38101"); + autoDetectHosts.add("game-us.habbo.com:30000"); autoDetectHosts.add("game-s2.habbo.com:30000"); List additionalCachedHotels = Cacher.getList(HOTELS_CACHE_KEY); From d4c57ce28b705866c07f05d5e3e0d0e9141e03ee Mon Sep 17 00:00:00 2001 From: allombar Date: Sun, 19 May 2024 16:34:09 +0200 Subject: [PATCH 09/13] Implement Nitro Feature for macOS --- .../nitro/os/NitroOsFunctionsFactory.java | 8 +- .../proxy/nitro/os/macos/NitroMacOS.java | 97 +++++++++++++++++++ 2 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/macos/NitroMacOS.java diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/NitroOsFunctionsFactory.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/NitroOsFunctionsFactory.java index 18bbf7c..3c46e20 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/NitroOsFunctionsFactory.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/NitroOsFunctionsFactory.java @@ -1,6 +1,7 @@ package gearth.protocol.connection.proxy.nitro.os; import gearth.misc.OSValidator; +import gearth.protocol.connection.proxy.nitro.os.macos.NitroMacOS; import gearth.protocol.connection.proxy.nitro.os.windows.NitroWindows; import org.apache.commons.lang3.NotImplementedException; @@ -15,7 +16,10 @@ public final class NitroOsFunctionsFactory { throw new NotImplementedException("unix nitro is not implemented yet"); } - throw new NotImplementedException("macOS nitro is not implemented yet"); - } + if (OSValidator.isMac()) { + return new NitroMacOS(); + } + throw new NotImplementedException("unsupported operating system"); + } } diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/macos/NitroMacOS.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/macos/NitroMacOS.java new file mode 100644 index 0000000..fd094a3 --- /dev/null +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/macos/NitroMacOS.java @@ -0,0 +1,97 @@ +package gearth.protocol.connection.proxy.nitro.os.macos; + +import gearth.misc.RuntimeUtil; +import gearth.protocol.connection.proxy.nitro.os.NitroOsFunctions; + +import java.io.File; +import java.io.IOException; + +public class NitroMacOS implements NitroOsFunctions { + + /** + * Semicolon separated hosts to ignore for proxying. + */ + private static final String PROXY_IGNORE = "discord.com;discordapp.com;github.com;"; + + /** + * Checks if the certificate is trusted by the local machine. + * @param certificate Absolute path to the certificate. + * @return true if trusted + */ + @Override + public boolean isRootCertificateTrusted(File certificate) { + try { + final String output = RuntimeUtil.getCommandOutput(new String[] {"sh", "-c", "security verify-cert -c \"" + certificate.getAbsolutePath() + "\""}); + + return !output.contains("CSSMERR_TP_NOT_TRUSTED"); + } catch (IOException e) { + e.printStackTrace(); + } + + return false; + } + + @Override + public boolean installRootCertificate(File certificate) { + final String certificatePath = certificate.getAbsolutePath(); + + try { + // Install the certificate + Process process = new ProcessBuilder("sh", "-c", "sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain \"" + certificatePath + "\"") + .inheritIO() + .start(); + + // Wait for the process to complete + int exitCode = process.waitFor(); + if (exitCode != 0) { + System.out.printf("security add-trusted-cert command exited with exit code %d%n", exitCode); + return false; + } + + return true; + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + + return false; + } + + @Override + public boolean registerSystemProxy(String host, int port) { + try { + final String proxy = String.format("%s:%d", host, port); + final String[] ignoreHosts = PROXY_IGNORE.split(";"); + + // Enable proxy + Runtime.getRuntime().exec("networksetup -setwebproxy Wi-Fi " + host + " " + port); + Runtime.getRuntime().exec("networksetup -setsecurewebproxy Wi-Fi " + host + " " + port); + + // Set proxy bypass domains + for (String ignoreHost : ignoreHosts) { + Runtime.getRuntime().exec("networksetup -setproxybypassdomains Wi-Fi " + ignoreHost); + } + + return true; + } catch (IOException e) { + e.printStackTrace(); + } + + return false; + } + + @Override + public boolean unregisterSystemProxy() { + try { + // Disable proxy + Runtime.getRuntime().exec("networksetup -setwebproxystate Wi-Fi off"); + Runtime.getRuntime().exec("networksetup -setsecurewebproxystate Wi-Fi off"); + + return true; + } catch (IOException e) { + e.printStackTrace(); + } + + return false; + } + +} \ No newline at end of file From ed94340d04dafab803964b25f0b8b9bf2b5495ca Mon Sep 17 00:00:00 2001 From: allombar Date: Sun, 19 May 2024 16:36:17 +0200 Subject: [PATCH 10/13] Implement Nitro Feature for macOS --- .../protocol/connection/proxy/nitro/os/macos/NitroMacOS.java | 1 - 1 file changed, 1 deletion(-) diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/macos/NitroMacOS.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/macos/NitroMacOS.java index fd094a3..35d5ff1 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/macos/NitroMacOS.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/macos/NitroMacOS.java @@ -59,7 +59,6 @@ public class NitroMacOS implements NitroOsFunctions { @Override public boolean registerSystemProxy(String host, int port) { try { - final String proxy = String.format("%s:%d", host, port); final String[] ignoreHosts = PROXY_IGNORE.split(";"); // Enable proxy From 88ba87a8194268193f56ce6686b59760dc292f06 Mon Sep 17 00:00:00 2001 From: UnfamiliarLegacy <74633542+UnfamiliarLegacy@users.noreply.github.com> Date: Mon, 27 May 2024 19:20:00 +0200 Subject: [PATCH 11/13] Use SSL WebSockets for Nitro to prevent CSP issues --- .../proxy/nitro/NitroProxyProvider.java | 10 ++-- .../http/NitroCertificateSniffingManager.java | 23 +++++++- .../proxy/nitro/http/NitroHttpProxy.java | 53 ++++++++----------- .../nitro/http/NitroSslContextFactory.java | 20 +++++++ .../nitro/websocket/NitroWebsocketProxy.java | 25 +++++++-- 5 files changed, 93 insertions(+), 38 deletions(-) create mode 100644 G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroSslContextFactory.java diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/NitroProxyProvider.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/NitroProxyProvider.java index b86a4fc..c073a1a 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/NitroProxyProvider.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/NitroProxyProvider.java @@ -6,6 +6,8 @@ import gearth.protocol.connection.HProxySetter; import gearth.protocol.connection.HState; import gearth.protocol.connection.HStateSetter; import gearth.protocol.connection.proxy.ProxyProvider; +import gearth.protocol.connection.proxy.nitro.http.NitroAuthority; +import gearth.protocol.connection.proxy.nitro.http.NitroCertificateSniffingManager; import gearth.protocol.connection.proxy.nitro.http.NitroHttpProxy; import gearth.protocol.connection.proxy.nitro.http.NitroHttpProxyServerCallback; import gearth.protocol.connection.proxy.nitro.websocket.NitroWebsocketProxy; @@ -13,7 +15,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; -import java.net.ServerSocket; import java.util.concurrent.atomic.AtomicBoolean; public class NitroProxyProvider implements ProxyProvider, NitroHttpProxyServerCallback, StateChangeListener { @@ -32,11 +33,14 @@ public class NitroProxyProvider implements ProxyProvider, NitroHttpProxyServerCa private String originalCookies; public NitroProxyProvider(HProxySetter proxySetter, HStateSetter stateSetter, HConnection connection) { + final NitroAuthority authority = new NitroAuthority(); + final NitroCertificateSniffingManager certificateManager = new NitroCertificateSniffingManager(authority); + this.proxySetter = proxySetter; this.stateSetter = stateSetter; this.connection = connection; - this.nitroHttpProxy = new NitroHttpProxy(this); - this.nitroWebsocketProxy = new NitroWebsocketProxy(proxySetter, stateSetter, connection, this); + this.nitroHttpProxy = new NitroHttpProxy(this, certificateManager); + this.nitroWebsocketProxy = new NitroWebsocketProxy(proxySetter, stateSetter, connection, this, certificateManager); this.abortLock = new AtomicBoolean(); } diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroCertificateSniffingManager.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroCertificateSniffingManager.java index 35f4c2d..c5c3d63 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroCertificateSniffingManager.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroCertificateSniffingManager.java @@ -20,12 +20,31 @@ public class NitroCertificateSniffingManager implements MitmManager { private static final boolean DEBUG = false; private final BouncyCastleSslEngineSource sslEngineSource; + private final Authority authority; - public NitroCertificateSniffingManager(Authority authority) throws RootCertificateException { + public NitroCertificateSniffingManager(Authority authority) { + this.authority = authority; try { sslEngineSource = new BouncyCastleSslEngineSource(authority, true, true, null); } catch (final Exception e) { - throw new RootCertificateException("Errors during assembling root CA.", e); + throw new RuntimeException(new RootCertificateException("Errors during assembling root CA.", e)); + } + } + + public Authority getAuthority() { + return authority; + } + + public SSLEngine websocketSslEngine(String commonName) { + final SubjectAlternativeNameHolder san = new SubjectAlternativeNameHolder(); + + san.addDomainName("localhost"); + san.addIpAddress("127.0.0.1"); + + try { + return sslEngineSource.createCertForHost(commonName, san); + } catch (Exception e) { + throw new FakeCertificateException("Failed to create WebSocket certificate", e); } } diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxy.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxy.java index c0098f3..cb7e0ba 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxy.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxy.java @@ -12,8 +12,6 @@ import javafx.scene.control.ButtonType; import javafx.scene.control.Label; import org.littleshoot.proxy.HttpProxyServer; import org.littleshoot.proxy.impl.DefaultHttpProxyServer; -import org.littleshoot.proxy.mitm.Authority; -import org.littleshoot.proxy.mitm.RootCertificateException; import java.io.File; import java.io.IOException; @@ -25,20 +23,20 @@ public class NitroHttpProxy { private static final String ADMIN_WARNING_KEY = "admin_warning_dialog"; private static final AtomicBoolean SHUTDOWN_HOOK = new AtomicBoolean(); - private final Authority authority; private final NitroOsFunctions osFunctions; private final NitroHttpProxyServerCallback serverCallback; + private final NitroCertificateSniffingManager certificateManager; private HttpProxyServer proxyServer = null; - public NitroHttpProxy(NitroHttpProxyServerCallback serverCallback) { + public NitroHttpProxy(NitroHttpProxyServerCallback serverCallback, NitroCertificateSniffingManager certificateManager) { this.serverCallback = serverCallback; - this.authority = new NitroAuthority(); + this.certificateManager = certificateManager; this.osFunctions = NitroOsFunctionsFactory.create(); } private boolean initializeCertificate() { - final File certificate = this.authority.aliasFile(".pem"); + final File certificate = this.certificateManager.getAuthority().aliasFile(".pem"); // All good if certificate is already trusted. if (this.osFunctions.isRootCertificateTrusted(certificate)) { @@ -80,7 +78,7 @@ public class NitroHttpProxy { return false; } - return this.osFunctions.installRootCertificate(this.authority.aliasFile(".pem")); + return this.osFunctions.installRootCertificate(this.certificateManager.getAuthority().aliasFile(".pem")); } /** @@ -100,33 +98,28 @@ public class NitroHttpProxy { public boolean start() { setupShutdownHook(); - try { - proxyServer = DefaultHttpProxyServer.bootstrap() - .withPort(NitroConstants.HTTP_PORT) - .withManInTheMiddle(new NitroCertificateSniffingManager(authority)) - .withFiltersSource(new NitroHttpProxyFilterSource(serverCallback)) - .withTransparent(true) - .start(); + proxyServer = DefaultHttpProxyServer.bootstrap() + .withPort(NitroConstants.HTTP_PORT) + .withManInTheMiddle(this.certificateManager) + .withFiltersSource(new NitroHttpProxyFilterSource(serverCallback)) + .withTransparent(true) + .start(); - if (!initializeCertificate()) { - proxyServer.stop(); + if (!initializeCertificate()) { + proxyServer.stop(); - System.out.println("Failed to initialize certificate"); - return false; - } - - if (!registerProxy()) { - proxyServer.stop(); - - System.out.println("Failed to register certificate"); - return false; - } - - return true; - } catch (RootCertificateException e) { - e.printStackTrace(); + System.out.println("Failed to initialize certificate"); return false; } + + if (!registerProxy()) { + proxyServer.stop(); + + System.out.println("Failed to register certificate"); + return false; + } + + return true; } public void pause() { diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroSslContextFactory.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroSslContextFactory.java new file mode 100644 index 0000000..9e12b69 --- /dev/null +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroSslContextFactory.java @@ -0,0 +1,20 @@ +package gearth.protocol.connection.proxy.nitro.http; + +import org.eclipse.jetty.util.ssl.SslContextFactory; + +import javax.net.ssl.SSLEngine; + +public class NitroSslContextFactory extends SslContextFactory.Server { + + private final NitroCertificateSniffingManager certificateManager; + + public NitroSslContextFactory(NitroCertificateSniffingManager certificateManager) { + this.certificateManager = certificateManager; + } + + @Override + public SSLEngine newSSLEngine(String host, int port) { + System.out.printf("[NitroSslContextFactory] Creating SSLEngine for %s:%d%n", host, port); + return certificateManager.websocketSslEngine(host); + } +} diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroWebsocketProxy.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroWebsocketProxy.java index c60f8c2..a21244c 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroWebsocketProxy.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroWebsocketProxy.java @@ -4,7 +4,8 @@ import gearth.protocol.HConnection; import gearth.protocol.connection.HProxySetter; import gearth.protocol.connection.HStateSetter; import gearth.protocol.connection.proxy.nitro.NitroProxyProvider; -import org.eclipse.jetty.server.Connector; +import gearth.protocol.connection.proxy.nitro.http.NitroCertificateSniffingManager; +import gearth.protocol.connection.proxy.nitro.http.NitroSslContextFactory; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; @@ -21,19 +22,37 @@ public class NitroWebsocketProxy { private final HStateSetter stateSetter; private final HConnection connection; private final NitroProxyProvider proxyProvider; + private final NitroCertificateSniffingManager certificateManager; private final Server server; + private final int serverPort; - public NitroWebsocketProxy(HProxySetter proxySetter, HStateSetter stateSetter, HConnection connection, NitroProxyProvider proxyProvider) { + public NitroWebsocketProxy(HProxySetter proxySetter, + HStateSetter stateSetter, + HConnection connection, + NitroProxyProvider proxyProvider, + NitroCertificateSniffingManager certificateManager) { this.proxySetter = proxySetter; this.stateSetter = stateSetter; this.connection = connection; this.proxyProvider = proxyProvider; - this.server = new Server(0); + this.certificateManager = certificateManager; + this.server = new Server(); + this.serverPort = 0; } public boolean start() { try { + // Configure SSL. + final NitroSslContextFactory sslContextFactory = new NitroSslContextFactory(this.certificateManager); + final ServerConnector sslConnector = new ServerConnector(server, sslContextFactory); + + sslConnector.setPort(this.serverPort); + + // Add SSL to the server. + server.addConnector(sslConnector); + + // Configure the WebSocket. final ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); From 776d16ed49fd2c1577428ccff5cd7bf1d45c958a Mon Sep 17 00:00:00 2001 From: UnfamiliarLegacy <74633542+UnfamiliarLegacy@users.noreply.github.com> Date: Tue, 28 May 2024 19:31:15 +0200 Subject: [PATCH 12/13] Extra cloudflare cookies --- .../connection/proxy/nitro/http/NitroHttpProxyFilter.java | 7 ++++++- .../connection/proxy/nitro/os/windows/NitroWindows.java | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java index e6e1152..5d9978d 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/http/NitroHttpProxyFilter.java @@ -24,11 +24,16 @@ public class NitroHttpProxyFilter extends HttpFiltersAdapter { private static final HashSet CloudflareCookies = new HashSet<>(Arrays.asList( "__cflb", "__cf_bm", + "__cfseq", "cf_ob_info", "cf_use_ob", "__cfwaitingroom", "__cfruid", - "cf_clearance" + "_cfuvid", + "cf_clearance", + "cf_chl_rc_i", + "cf_chl_rc_ni", + "cf_chl_rc_m" )); private static final String HeaderAcceptEncoding = "Accept-Encoding"; diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/windows/NitroWindows.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/windows/NitroWindows.java index ec55105..fb7d370 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/windows/NitroWindows.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/os/windows/NitroWindows.java @@ -15,7 +15,8 @@ public class NitroWindows implements NitroOsFunctions { /** * Semicolon separated hosts to ignore for proxying. */ - private static final String PROXY_IGNORE = "discord.com;discordapp.com;github.com;"; + // habba.io; + private static final String PROXY_IGNORE = "discord.com;discordapp.com;github.com;challenges.cloudflare.com;"; /** * Checks if the certificate is trusted by the local machine. From 1fe7bb22e6e35ed19d847c461cd6d094b63d8f92 Mon Sep 17 00:00:00 2001 From: UnfamiliarLegacy <74633542+UnfamiliarLegacy@users.noreply.github.com> Date: Sat, 1 Jun 2024 18:46:13 +0200 Subject: [PATCH 13/13] Update ws to wss --- .../protocol/connection/proxy/nitro/NitroProxyProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/NitroProxyProvider.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/NitroProxyProvider.java index c073a1a..94d6869 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/NitroProxyProvider.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/NitroProxyProvider.java @@ -126,7 +126,7 @@ public class NitroProxyProvider implements ProxyProvider, NitroHttpProxyServerCa public String replaceWebsocketServer(String configUrl, String websocketUrl) { originalWebsocketUrl = websocketUrl; - return String.format("ws://127.0.0.1:%d", websocketPort); + return String.format("wss://127.0.0.1:%d", websocketPort); } @Override