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() { 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/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; } 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/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/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/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/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java index e95fa544..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(new HttpServerCodec()); - pipeline.addLast(new HttpObjectAggregator(65536)); + pipeline.addLast("http-codec", new HttpServerCodec()); + pipeline.addLast("http-codec-compressor",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-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(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/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); 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 c7c08da5..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 @@ -71,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); @@ -130,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/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() { 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/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 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();