From 6af7283b60aa9e92b0614eaa9c5f7ff18c8c6be9 Mon Sep 17 00:00:00 2001 From: zaxar163 Date: Sat, 28 Sep 2019 19:48:39 +0300 Subject: [PATCH 1/8] =?UTF-8?q?[FIX]=20=D0=94=D0=BE=D1=81=D1=82=D1=83?= =?UTF-8?q?=D0=BF=20=D0=BA=20NettyServerSocketHandler=20=D0=BD=D0=B0=20pos?= =?UTF-8?q?tInit...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/pro/gravit/launchserver/LaunchServer.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java index d5eee7fe..b13fe974 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java @@ -405,6 +405,10 @@ public LaunchServer(LaunchServerDirectories directories, LaunchServerEnv env, La Files.createDirectory(profilesDir); syncProfilesDir(); + if (config.netty != null) + nettyServerSocketHandler = new NettyServerSocketHandler(this); + else + nettyServerSocketHandler = null; // post init modules modulesManager.invokeEvent(new LaunchServerPostInitPhase(this)); if (config.components != null) { @@ -415,11 +419,6 @@ public LaunchServer(LaunchServerDirectories directories, LaunchServerEnv env, La }); LogHelper.debug("PostInit components successful"); } - // start updater - if (config.netty != null) - nettyServerSocketHandler = new NettyServerSocketHandler(this); - else - nettyServerSocketHandler = null; } private LauncherBinary binary() { From 50d5c941f42aa4606ea5871b7cbb56f64f23bcde Mon Sep 17 00:00:00 2001 From: zaxar163 Date: Sat, 28 Sep 2019 20:05:03 +0300 Subject: [PATCH 2/8] =?UTF-8?q?[FIX]=20=D0=9D=D0=B0=D0=B7=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=85=D0=B0=D0=BD=D0=B4=D0=BB=D0=B5=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B2=20LauncherNettyServer,=20=D1=83=D0=B4?= =?UTF-8?q?=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=B8=D1=88=D0=BD?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=20API.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../launchserver/socket/LauncherNettyServer.java | 12 ++++++------ .../gravit/launchserver/socket/WebSocketService.java | 2 -- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java index e95fa544..e0906254 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java @@ -56,15 +56,15 @@ public void initChannel(SocketChannel ch) { ChannelPipeline pipeline = ch.pipeline(); NettyConnectContext context = new NettyConnectContext(); //p.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast(new HttpServerCodec()); - pipeline.addLast(new HttpObjectAggregator(65536)); + pipeline.addLast("httpc", new HttpServerCodec()); + pipeline.addLast("httpca",new HttpObjectAggregator(65536)); if (server.config.netty.ipForwarding) - pipeline.addLast(new NettyIpForwardHandler(context)); - pipeline.addLast(new WebSocketServerCompressionHandler()); - pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true)); + pipeline.addLast("forward", new NettyIpForwardHandler(context)); + pipeline.addLast("decomp", new WebSocketServerCompressionHandler()); + pipeline.addLast("decoder", new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true)); if (server.config.netty.fileServerEnabled) pipeline.addLast(new FileServerHandler(server.updatesDir, true, config.showHiddenFiles)); - pipeline.addLast(new WebSocketFrameHandler(context, server, service)); + pipeline.addLast("final", new WebSocketFrameHandler(context, server, service)); pipelineHook.hook(context, ch); } }); diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/WebSocketService.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/WebSocketService.java index ec7c74f6..6749d352 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/WebSocketService.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/WebSocketService.java @@ -37,7 +37,6 @@ public class WebSocketService { public final ChannelGroup channels; public static ProviderMap providers = new ProviderMap<>(); - public final BiHookSet packetHook = new BiHookSet<>(); public static class WebSocketRequestContext { public WebSocketServerResponse response; @@ -65,7 +64,6 @@ public WebSocketService(ChannelGroup channels, LaunchServer server) { private final Gson gson; public void process(ChannelHandlerContext ctx, TextWebSocketFrame frame, Client client, String ip) { - if (packetHook.hook(frame, ctx)) return; String request = frame.text(); WebSocketServerResponse response = gson.fromJson(request, WebSocketServerResponse.class); process(ctx, response, client, ip); From a38853180b3bf4c1f41ad81e192086c78b3b261c Mon Sep 17 00:00:00 2001 From: zaxar163 Date: Sun, 29 Sep 2019 09:26:04 +0300 Subject: [PATCH 3/8] =?UTF-8?q?[FIX]=20=D0=94=D1=83=D0=BF=D0=BB=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D1=8B=20=D0=BA=D0=BE=D0=B4=D0=B0=20=D0=B2=20?= =?UTF-8?q?ClientLauncher,=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=85=D0=B0=D0=BD=D0=B4=D0=BB=D0=B5=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B2=20LauncherNettyServer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../launchserver/socket/LauncherNettyServer.java | 14 +++++++------- .../pro/gravit/launcher/client/ClientLauncher.java | 14 +++----------- modules | 2 +- 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java index e0906254..2e9163af 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java @@ -56,15 +56,15 @@ public void initChannel(SocketChannel ch) { ChannelPipeline pipeline = ch.pipeline(); NettyConnectContext context = new NettyConnectContext(); //p.addLast(new LoggingHandler(LogLevel.INFO)); - pipeline.addLast("httpc", new HttpServerCodec()); - pipeline.addLast("httpca",new HttpObjectAggregator(65536)); + pipeline.addLast("http-codec", new HttpServerCodec()); + pipeline.addLast("http-codec-compressor",new HttpObjectAggregator(65536)); if (server.config.netty.ipForwarding) - pipeline.addLast("forward", new NettyIpForwardHandler(context)); - pipeline.addLast("decomp", new WebSocketServerCompressionHandler()); - pipeline.addLast("decoder", new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true)); + pipeline.addLast("forward-http", new NettyIpForwardHandler(context)); + pipeline.addLast("websock-comp", new WebSocketServerCompressionHandler()); + pipeline.addLast("websock-codec", new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true)); if (server.config.netty.fileServerEnabled) - pipeline.addLast(new FileServerHandler(server.updatesDir, true, config.showHiddenFiles)); - pipeline.addLast("final", new WebSocketFrameHandler(context, server, service)); + pipeline.addLast("fileserver", new FileServerHandler(server.updatesDir, true, config.showHiddenFiles)); + pipeline.addLast("launchserver", new WebSocketFrameHandler(context, server, service)); pipelineHook.hook(context, ch); } }); diff --git a/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncher.java b/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncher.java index b0f4ba40..97433e2a 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncher.java +++ b/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncher.java @@ -595,15 +595,11 @@ public static interface ParamsAPI { public static ParamsAPI container = new ParamsAPI() { @Override public ParamContainer read() throws Exception { - ParamContainer p = new ParamContainer(); + ParamContainer p; try (Socket socket = IOHelper.newSocket()) { socket.connect(new InetSocketAddress(SOCKET_HOST, SOCKET_PORT)); try (HInput input = new HInput(socket.getInputStream())) { - p.params = new Params(input); - p.profile = Launcher.gsonManager.gson.fromJson(input.readString(0), ClientProfile.class); - p.assetHDir = new HashedDir(input); - p.clientHDir = new HashedDir(input); - ClientHookManager.paramsInputHook.hook(input); + p = new ParamContainer(input); } } return p; @@ -630,11 +626,7 @@ public void write(ParamContainer p) throws Exception { return; } try (HOutput output = new HOutput(client.getOutputStream())) { - p.params.write(output); - output.writeString(Launcher.gsonManager.gson.toJson(p.profile), 0); - p.assetHDir.write(output); - p.clientHDir.write(output); - ClientHookManager.paramsOutputHook.hook(output); + p.write(output); } clientStarted = true; } diff --git a/modules b/modules index 3e485e5a..3bc733e7 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 3e485e5ae681cd1c136fc25a49d5dd339bc4d30a +Subproject commit 3bc733e724483b064000371fb26bb31c60aa5308 From efd58d66c752c8d4464a67bfab95adad9ac07381 Mon Sep 17 00:00:00 2001 From: Gravit Date: Sun, 29 Sep 2019 15:40:26 +0700 Subject: [PATCH 4/8] =?UTF-8?q?[FEATURE]=20=D0=97=D0=B0=D1=89=D0=B8=D1=82?= =?UTF-8?q?=D0=B0=20=D0=BE=D1=82=20=D0=B2=D0=B7=D0=BB=D0=BE=D0=BC=D0=B0=20?= =?UTF-8?q?=D0=BB=D0=B0=D1=83=D0=BD=D1=87=D0=B5=D1=80=D0=B0=20=D0=B2=20Lau?= =?UTF-8?q?ncherRequest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/protect/StdProtectHandler.java | 3 ++- .../binary/LauncherConfigurator.java | 4 ++++ .../binary/tasks/MainBuildTask.java | 7 +++++++ .../config/LaunchServerRuntimeConfig.java | 3 +++ .../socket/response/auth/AuthResponse.java | 16 +++++++--------- .../response/update/LauncherResponse.java | 17 ++++++++++++++++- .../java/pro/gravit/launcher/AutogenConfig.java | 2 ++ .../pro/gravit/launcher/LauncherConfig.java | 9 +++++++++ .../request/update/LauncherRequest.java | 6 ++++++ 9 files changed, 56 insertions(+), 11 deletions(-) diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/auth/protect/StdProtectHandler.java b/LaunchServer/src/main/java/pro/gravit/launchserver/auth/protect/StdProtectHandler.java index 0c37166e..1c197296 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/auth/protect/StdProtectHandler.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/auth/protect/StdProtectHandler.java @@ -4,6 +4,7 @@ import pro.gravit.utils.helper.SecurityHelper; public class StdProtectHandler extends ProtectHandler { + public boolean checkSecure = true; @Override public String generateSecureToken(AuthResponse.AuthContext context) { return SecurityHelper.randomStringToken(); @@ -21,7 +22,7 @@ public boolean verifyClientSecureToken(String token, String secureKey) { @Override public boolean allowGetAccessToken(AuthResponse.AuthContext context) { - return (context.authType == AuthResponse.ConnectTypes.CLIENT); + return (context.authType == AuthResponse.ConnectTypes.CLIENT) && (!checkSecure || context.client.isSecure); } @Override diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/binary/LauncherConfigurator.java b/LaunchServer/src/main/java/pro/gravit/launchserver/binary/LauncherConfigurator.java index 56b5e6c8..49e53c53 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/binary/LauncherConfigurator.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/binary/LauncherConfigurator.java @@ -87,6 +87,10 @@ private void setStringField(String name, String value) public void setGuardType(String key) { setStringField("guardType", key); } + public void setSecureCheck(String hash, String salt) { + setStringField("secureCheckHash", hash); + setStringField("secureCheckSalt", salt); + } private void push(final int value) { if (value >= -1 && value <= 5) diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/binary/tasks/MainBuildTask.java b/LaunchServer/src/main/java/pro/gravit/launchserver/binary/tasks/MainBuildTask.java index 0975bff7..dc27b3fb 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/binary/tasks/MainBuildTask.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/binary/tasks/MainBuildTask.java @@ -8,6 +8,8 @@ import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; +import java.util.Arrays; +import java.util.Base64; import java.util.HashMap; import java.util.Map; import java.util.jar.JarFile; @@ -133,6 +135,11 @@ public Path process(Path inputJar) throws IOException { launcherConfigurator.setGuardType(server.config.launcher.guardType); launcherConfigurator.setWarningMissArchJava(server.config.launcher.warningMissArchJava); launcherConfigurator.setEnv(server.config.env); + String launcherSalt = SecurityHelper.randomStringToken(); + byte[] launcherSecureHash = SecurityHelper.digest(SecurityHelper.DigestAlgorithm.SHA256, + server.runtime.clientCheckSecret.concat(".").concat(launcherSalt)); + launcherConfigurator.setSecureCheck(Base64.getEncoder().encodeToString(launcherSecureHash), launcherSalt); + //LogHelper.debug("[checkSecure] %s: %s", launcherSalt, Arrays.toString(launcherSecureHash)); if (server.runtime.oemUnlockKey == null) server.runtime.oemUnlockKey = SecurityHelper.randomStringToken(); launcherConfigurator.setOemUnlockKey(server.runtime.oemUnlockKey); server.buildHookManager.registerAllClientModuleClass(launcherConfigurator); diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/config/LaunchServerRuntimeConfig.java b/LaunchServer/src/main/java/pro/gravit/launchserver/config/LaunchServerRuntimeConfig.java index fdc4eb42..0e600258 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/config/LaunchServerRuntimeConfig.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/config/LaunchServerRuntimeConfig.java @@ -7,13 +7,16 @@ public class LaunchServerRuntimeConfig { public String clientToken; public String oemUnlockKey; public String registerApiKey; + public String clientCheckSecret; public void verify() { if (clientToken == null) LogHelper.error("[RuntimeConfig] clientToken must not be null"); + if (clientCheckSecret == null) { LogHelper.warning("[RuntimeConfig] clientCheckSecret must not be null"); clientCheckSecret = SecurityHelper.randomStringToken(); } } public void reset() { clientToken = SecurityHelper.randomStringToken(); registerApiKey = SecurityHelper.randomStringToken(); + clientCheckSecret = SecurityHelper.randomStringToken(); } } diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/AuthResponse.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/AuthResponse.java index 7e979d66..e4ec148a 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/AuthResponse.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/AuthResponse.java @@ -11,7 +11,6 @@ import io.netty.channel.ChannelHandlerContext; import pro.gravit.launcher.events.request.AuthRequestEvent; import pro.gravit.launcher.hwid.HWID; -import pro.gravit.launcher.hwid.OshiHWID; import pro.gravit.launcher.profiles.ClientProfile; import pro.gravit.launcher.request.auth.AuthRequest; import pro.gravit.launcher.request.auth.password.AuthPlainPassword; @@ -72,7 +71,7 @@ public void execute(ChannelHandlerContext ctx, Client clientData) throws Excepti AuthProviderPair pair; if (auth_id.isEmpty()) pair = server.config.getAuthProviderPair(); else pair = server.config.getAuthProviderPair(auth_id); - AuthContext context = new AuthContext(0, login, customText, client, null, ip, authType); + AuthContext context = new AuthContext(clientData, login, customText, client, hwid, ip, authType); AuthProvider provider = pair.provider; server.authHookManager.preHook.hook(context, clientData); provider.preAuth(login, password, customText, ip); @@ -131,24 +130,23 @@ public void execute(ChannelHandlerContext ctx, Client clientData) throws Excepti } public static class AuthContext { - public AuthContext(long session, String login, String customText, String client, String hwid, String ip, ConnectTypes authType) { - this.session = session; + public AuthContext(Client client, String login, String customText, String profileName, HWID hwid, String ip, ConnectTypes authType) { + this.client = client; this.login = login; this.customText = customText; - this.client = client; + this.profileName = profileName; this.hwid = hwid; this.ip = ip; this.authType = authType; } - - public long session; public String login; @Deprecated public int password_length; //Use AuthProvider for get password - public String client; - public String hwid; + public String profileName; + public HWID hwid; public String customText; public String ip; public ConnectTypes authType; + public Client client; } } diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/update/LauncherResponse.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/update/LauncherResponse.java index 9a9de042..d5974076 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/update/LauncherResponse.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/update/LauncherResponse.java @@ -8,6 +8,8 @@ import pro.gravit.launchserver.socket.Client; import pro.gravit.launchserver.socket.response.SimpleResponse; import pro.gravit.utils.Version; +import pro.gravit.utils.helper.LogHelper; +import pro.gravit.utils.helper.SecurityHelper; public class LauncherResponse extends SimpleResponse { public Version version; @@ -15,6 +17,9 @@ public class LauncherResponse extends SimpleResponse { public byte[] digest; public int launcher_type; + public String secureHash; + public String secureSalt; + @Override public String getType() { return "launcher"; @@ -33,6 +38,7 @@ public void execute(ChannelHandlerContext ctx, Client client) { if (hash == null) service.sendObjectAndClose(ctx, new LauncherRequestEvent(true, server.config.netty.launcherURL)); if (Arrays.equals(bytes, hash)) { client.checkSign = true; + client.isSecure = checkSecure(secureHash, secureSalt); sendResult(new LauncherRequestEvent(false, server.config.netty.launcherURL)); } else { sendResultAndClose(new LauncherRequestEvent(true, server.config.netty.launcherURL)); @@ -43,12 +49,21 @@ public void execute(ChannelHandlerContext ctx, Client client) { if (hash == null) sendResultAndClose(new LauncherRequestEvent(true, server.config.netty.launcherEXEURL)); if (Arrays.equals(bytes, hash)) { client.checkSign = true; + client.isSecure = checkSecure(secureHash, secureSalt); sendResult(new LauncherRequestEvent(false, server.config.netty.launcherEXEURL)); } else { sendResultAndClose(new LauncherRequestEvent(true, server.config.netty.launcherEXEURL)); } } else sendError("Request launcher type error"); - + } + private boolean checkSecure(String hash, String salt) + { + if(hash == null || salt == null) return false; + byte[] normal_hash = SecurityHelper.digest(SecurityHelper.DigestAlgorithm.SHA256, + server.runtime.clientCheckSecret.concat(".").concat(salt)); + byte[] launcher_hash = Base64.getDecoder().decode(hash); + //LogHelper.debug("[checkSecure] %s vs %s", Arrays.toString(normal_hash), Arrays.toString(launcher_hash)); + return Arrays.equals(normal_hash, launcher_hash); } } diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/AutogenConfig.java b/LauncherAPI/src/main/java/pro/gravit/launcher/AutogenConfig.java index 18274403..05edd785 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/AutogenConfig.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/AutogenConfig.java @@ -10,6 +10,8 @@ public class AutogenConfig { public String guardLicenseName; public String guardLicenseKey; public String guardLicenseEncryptKey; + public String secureCheckHash; + public String secureCheckSalt; public int env; public boolean isWarningMissArchJava; // 0 - Dev (дебаг включен по умолчанию, все сообщения) diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/LauncherConfig.java b/LauncherAPI/src/main/java/pro/gravit/launcher/LauncherConfig.java index 6294bf86..6019b49d 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/LauncherConfig.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/LauncherConfig.java @@ -43,10 +43,15 @@ public static AutogenConfig getAutogenConfig() { public final String guardLicenseKey; public final String guardLicenseEncryptKey; public final String guardType; + + public final String secureCheckHash; + public final String secureCheckSalt; @LauncherAPI public LauncherConfig(HInput input) throws IOException, InvalidKeySpecException { publicKey = SecurityHelper.toPublicRSAKey(input.readByteArray(SecurityHelper.CRYPTO_MAX_LENGTH)); + secureCheckHash = config.secureCheckHash; + secureCheckSalt = config.secureCheckSalt; projectname = config.projectname; clientPort = config.clientPort; secretKeyClient = config.secretKeyClient; @@ -92,6 +97,8 @@ public LauncherConfig(String address, RSAPublicKey publicKey, Map impleme @LauncherNetworkAPI public byte[] digest; @LauncherNetworkAPI + public String secureHash; + @LauncherNetworkAPI + public String secureSalt; + @LauncherNetworkAPI public int launcher_type = EXE_BINARY ? 2 : 1; @LauncherAPI public static final Path BINARY_PATH = IOHelper.getCodeSource(Launcher.class); @@ -89,6 +93,8 @@ public LauncherRequest() { } catch (IOException e) { LogHelper.error(e); } + secureHash = Launcher.getConfig().secureCheckHash; + secureSalt = Launcher.getConfig().secureCheckSalt; } @Override From 8e1000ec41f4c95bb44f4c2f78281e4b368103cc Mon Sep 17 00:00:00 2001 From: Gravit Date: Mon, 30 Sep 2019 08:40:32 +0700 Subject: [PATCH 5/8] =?UTF-8?q?[FEATURE][EXPERIMENTAL]=20=D0=9F=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20Stacktrace=20=D0=B2=20?= =?UTF-8?q?=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pro/gravit/launcher/LauncherAgent.java | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/Launcher/src/main/java/pro/gravit/launcher/LauncherAgent.java b/Launcher/src/main/java/pro/gravit/launcher/LauncherAgent.java index 0d5d034e..d6664146 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/LauncherAgent.java +++ b/Launcher/src/main/java/pro/gravit/launcher/LauncherAgent.java @@ -32,18 +32,33 @@ public boolean isAgentStarted() { public static void premain(String agentArgument, Instrumentation instrumentation) { System.out.println("Launcher Agent"); + checkAgentStacktrace(); inst = instrumentation; - SafeExitJVMLegacy.class.getName(); - SafeExitJVM.class.getName(); - NativeJVMHalt.class.getName(); - NativeJVMHalt.initFunc(); - boolean bad = false; - try { - for (StackTraceElement e : new Throwable().getStackTrace()) - if (Class.forName(e.getClassName()).getClassLoader() != Runtime.class.getClassLoader() && Class.forName(e.getClassName()) != LauncherAgent.class) bad = true; - } catch(Throwable e) { bad = true; } - if (bad) NativeJVMHalt.haltA(-17); - else isAgentStarted = true; + //SafeExitJVMLegacy.class.getName(); + //SafeExitJVM.class.getName(); + //NativeJVMHalt.class.getName(); + //NativeJVMHalt.initFunc(); + isAgentStarted = true; + } + public static void checkAgentStacktrace() + { + RuntimeException ex = new SecurityException("Error check agent stacktrace"); + boolean isFoundNative = false; + boolean foundPreMain = false; + for(StackTraceElement e : ex.getStackTrace()) + { + if(e.isNativeMethod()) + { + if(!isFoundNative) isFoundNative = true; + else throw ex; + } + if(e.getMethodName().equals("premain")) + { + if(!foundPreMain) foundPreMain = true; + else throw ex; + } + } + if(!isFoundNative || !foundPreMain) throw ex; } public static boolean isStarted() { From 81f50a57f3ab842698eb68a1e69c4d24197f1a58 Mon Sep 17 00:00:00 2001 From: Gravit Date: Mon, 30 Sep 2019 10:43:41 +0700 Subject: [PATCH 6/8] =?UTF-8?q?[FEATURE]=20=D0=9D=D0=BE=D0=B2=D1=8B=D0=B5?= =?UTF-8?q?=20=D1=84=D0=B8=D1=82=D1=87=D0=B8=20MirrorManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/hash/DownloadAssetCommand.java | 6 +- .../command/hash/DownloadClientCommand.java | 13 ++- .../launchserver/manangers/MirrorManager.java | 91 ++++++++++++++++--- .../java/pro/gravit/utils/HTTPRequest.java | 19 ++-- 4 files changed, 101 insertions(+), 28 deletions(-) diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/DownloadAssetCommand.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/DownloadAssetCommand.java index c6f6e708..78317457 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/DownloadAssetCommand.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/DownloadAssetCommand.java @@ -30,7 +30,8 @@ public String getUsageDescription() { @Override public void invoke(String... args) throws Exception { verifyArgs(args, 2); - Version version = Version.byName(args[0]); + //Version version = Version.byName(args[0]); + String versionName = args[0]; String dirName = IOHelper.verifyFileName(args[1]); Path assetDir = server.updatesDir.resolve(dirName); @@ -40,7 +41,8 @@ public void invoke(String... args) throws Exception { // Download required asset LogHelper.subInfo("Downloading asset, it may take some time"); - HttpDownloader.downloadZip(server.mirrorManager.getDefaultMirror().getAssetsURL(version.name), assetDir); + //HttpDownloader.downloadZip(server.mirrorManager.getDefaultMirror().getAssetsURL(version.name), assetDir); + server.mirrorManager.downloadZip(assetDir,"assets/%s.zip", versionName); // Finished server.syncUpdatesDir(Collections.singleton(dirName)); diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/DownloadClientCommand.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/DownloadClientCommand.java index 26807bc4..bc89c1c6 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/DownloadClientCommand.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/DownloadClientCommand.java @@ -7,6 +7,7 @@ import java.nio.file.Path; import java.util.Collections; +import com.google.gson.JsonElement; import pro.gravit.launcher.Launcher; import pro.gravit.launcher.profiles.ClientProfile; import pro.gravit.launcher.profiles.ClientProfile.Version; @@ -36,7 +37,8 @@ public String getUsageDescription() { @Override public void invoke(String... args) throws IOException, CommandException { verifyArgs(args, 2); - Version version = Version.byName(args[0]); + //Version version = Version.byName(args[0]); + String versionName = args[0]; String dirName = IOHelper.verifyFileName(args[1]); Path clientDir = server.updatesDir.resolve(args[1]); @@ -46,14 +48,19 @@ public void invoke(String... args) throws IOException, CommandException { // Download required client LogHelper.subInfo("Downloading client, it may take some time"); - HttpDownloader.downloadZip(server.mirrorManager.getDefaultMirror().getClientsURL(version.name), clientDir); + //HttpDownloader.downloadZip(server.mirrorManager.getDefaultMirror().getClientsURL(version.name), clientDir); + server.mirrorManager.downloadZip(clientDir,"clients/%s.zip", versionName); // Create profile file LogHelper.subInfo("Creaing profile file: '%s'", dirName); ClientProfile client; - String profilePath = String.format("pro/gravit/launchserver/defaults/profile%s.cfg", version.name); + String profilePath = String.format("pro/gravit/launchserver/defaults/profile%s.cfg", versionName); try (BufferedReader reader = IOHelper.newReader(IOHelper.getResourceURL(profilePath))) { client = Launcher.gsonManager.configGson.fromJson(reader, ClientProfile.class); + } catch (IOException e) + { + JsonElement clientJson = server.mirrorManager.jsonRequest(null, "GET", "clients/%s.json", versionName); + client = Launcher.gsonManager.configGson.fromJson(clientJson, ClientProfile.class); } client.setTitle(dirName); client.setDir(dirName); diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/MirrorManager.java b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/MirrorManager.java index 684accb3..592a5fc6 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/MirrorManager.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/MirrorManager.java @@ -1,33 +1,36 @@ package pro.gravit.launchserver.manangers; +import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; +import java.nio.file.Path; import java.util.ArrayList; +import java.util.Arrays; +import com.google.gson.JsonElement; +import pro.gravit.utils.HTTPRequest; +import pro.gravit.utils.HttpDownloader; import pro.gravit.utils.helper.IOHelper; +import pro.gravit.utils.helper.LogHelper; public class MirrorManager { - public class Mirror { - URL url; - String assetsURLMask; - String clientsURLMask; + public static class Mirror { + String baseUrl; boolean enabled; Mirror(String url) { - assetsURLMask = url.concat("assets/%s.zip"); - clientsURLMask = url.concat("clients/%s.zip"); + //assetsURLMask = url.concat("assets/%s.zip"); + //clientsURLMask = url.concat("clients/%s.zip"); + baseUrl = url; } - private URL formatArg(String mask, String arg) throws MalformedURLException { - return new URL(String.format(mask, IOHelper.urlEncode(arg))); + private URL formatArgs(String mask, Object... args) throws MalformedURLException { + Object[] data = Arrays.stream(args).map(e -> IOHelper.urlEncode(e.toString())).toArray(); + return new URL(baseUrl.concat(String.format(mask, data))); } - public URL getAssetsURL(String assets) throws MalformedURLException { - return formatArg(assetsURLMask, assets); - } - - public URL getClientsURL(String client) throws MalformedURLException { - return formatArg(clientsURLMask, client); + public URL getURL(String mask, Object... args) throws MalformedURLException { + return formatArgs(mask, args); } } @@ -38,13 +41,14 @@ public void addMirror(String mirror) { Mirror m = new Mirror(mirror); m.enabled = true; if (defaultMirror == null) defaultMirror = m; + list.add(m); } public void addMirror(String mirror, boolean enabled) throws MalformedURLException { Mirror m = new Mirror(mirror); - m.url = new URL(mirror); m.enabled = enabled; if (defaultMirror == null && enabled) defaultMirror = m; + list.add(m); } public Mirror getDefaultMirror() { @@ -66,4 +70,61 @@ public void enableMirror(int index) { public int size() { return list.size(); } + + public boolean downloadZip(Mirror mirror, Path path, String mask, Object... args) throws IOException + { + if(!mirror.enabled) return false; + URL url = mirror.getURL(mask, args); + LogHelper.debug("Try download %s", url.toString()); + try { + HttpDownloader.downloadZip(url, path); + } catch (IOException e) + { + LogHelper.error("Download %s failed(%s: %s)", url.toString(), e.getClass().getName(), e.getMessage()); + return false; + } + return true; + } + + public void downloadZip(Path path, String mask, Object... args) throws IOException + { + if(downloadZip(defaultMirror, path, mask, args)) + { + return; + } + for(Mirror mirror : list) + { + if(mirror != defaultMirror) + { + if(downloadZip(mirror, path, mask, args)) return; + } + } + throw new IOException(String.format("Error download %s. All mirrors return error", path.toString())); + } + public JsonElement jsonRequest(Mirror mirror, JsonElement request, String method, String mask, Object... args) throws IOException + { + if(!mirror.enabled) return null; + URL url = mirror.getURL(mask, args); + try { + return HTTPRequest.jsonRequest(request, method, url); + } catch (IOException e) + { + LogHelper.error("JsonRequest %s failed(%s: %s)", url.toString(), e.getClass().getName(), e.getMessage()); + return null; + } + } + public JsonElement jsonRequest(JsonElement request, String method, String mask, Object... args) throws IOException + { + JsonElement result = jsonRequest(defaultMirror, request, method, mask, args); + if(result != null) return result; + for(Mirror mirror : list) + { + if(mirror != defaultMirror) + { + result = jsonRequest(mirror, request, method, mask, args); + if(result != null) return result; + } + } + throw new IOException("Error jsonRequest. All mirrors return error"); + } } diff --git a/LauncherCore/src/main/java/pro/gravit/utils/HTTPRequest.java b/LauncherCore/src/main/java/pro/gravit/utils/HTTPRequest.java index 662ad81c..59077f26 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/HTTPRequest.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/HTTPRequest.java @@ -39,19 +39,22 @@ public static int sendCrashreport(String strurl, String data) throws IOException } public static JsonElement jsonRequest(JsonElement request, URL url) throws IOException { + return jsonRequest(request, "POST", url); + } + + public static JsonElement jsonRequest(JsonElement request, String method, URL url) throws IOException { HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); - connection.setDoOutput(true); - connection.setRequestMethod("POST"); - connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + if(request != null) connection.setDoOutput(true); + connection.setRequestMethod(method); + if(request != null) connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); connection.setRequestProperty("Accept", "application/json"); if (TIMEOUT > 0) connection.setConnectTimeout(TIMEOUT); - - OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(), Charset.forName("UTF-8")); - writer.write(request.toString()); - writer.flush(); - writer.close(); + if(request != null) try (OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8)) { + writer.write(request.toString()); + writer.flush(); + } InputStreamReader reader; int statusCode = connection.getResponseCode(); From dda863db9d163f77b5bfb77fe5403e901ad54df1 Mon Sep 17 00:00:00 2001 From: Gravit Date: Mon, 30 Sep 2019 12:47:18 +0700 Subject: [PATCH 7/8] =?UTF-8?q?[ANY]=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index 3bc733e7..bb16428c 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 3bc733e724483b064000371fb26bb31c60aa5308 +Subproject commit bb16428caecd83cd7c39f1de144b9735bfbb23ab From f8fbe8e425d67bb81ff4ea13de9e5003465810fc Mon Sep 17 00:00:00 2001 From: Gravit Date: Mon, 30 Sep 2019 14:01:41 +0700 Subject: [PATCH 8/8] [FIX] Duplicate META-INF --- .../main/java/pro/gravit/launchserver/binary/BuildContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/binary/BuildContext.java b/LaunchServer/src/main/java/pro/gravit/launchserver/binary/BuildContext.java index 7ede8a64..0e821bf9 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/binary/BuildContext.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/binary/BuildContext.java @@ -49,7 +49,7 @@ public void pushJarFile(ZipInputStream input) throws IOException { public void pushJarFile(ZipInputStream input, Set blacklist) throws IOException { ZipEntry e = input.getNextEntry(); while (e != null) { - if (blacklist.contains(e.getName())) { + if (fileList.contains(e.getName()) || blacklist.contains(e.getName())) { e = input.getNextEntry(); continue; }