From 1a1c6b6c5a6e9f89f3ccd70b7ac2a1bc86a9f2f5 Mon Sep 17 00:00:00 2001 From: Gravit Date: Tue, 22 Jan 2019 11:18:48 +0700 Subject: [PATCH 1/6] =?UTF-8?q?[FEATURE]=20=D0=92=D0=B2=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=B1=D1=89=D0=B5=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B2=D1=81=D0=B5=D1=85=20Optional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../launcher/client/ClientLauncher.java | 37 +++--- .../launcher/profiles/ClientProfile.java | 117 ++++-------------- .../profiles/optional/OptionalDepend.java | 10 ++ .../profiles/optional/OptionalFile.java | 67 ++++++++++ .../profiles/optional/OptionalType.java | 16 +++ 5 files changed, 135 insertions(+), 112 deletions(-) create mode 100644 libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalDepend.java create mode 100644 libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java create mode 100644 libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalType.java diff --git a/Launcher/src/main/java/ru/gravit/launcher/client/ClientLauncher.java b/Launcher/src/main/java/ru/gravit/launcher/client/ClientLauncher.java index fa950ead..78e706a2 100644 --- a/Launcher/src/main/java/ru/gravit/launcher/client/ClientLauncher.java +++ b/Launcher/src/main/java/ru/gravit/launcher/client/ClientLauncher.java @@ -10,6 +10,8 @@ import ru.gravit.launcher.hasher.HashedDir; import ru.gravit.launcher.profiles.ClientProfile; import ru.gravit.launcher.profiles.PlayerProfile; +import ru.gravit.launcher.profiles.optional.OptionalArgs; +import ru.gravit.launcher.profiles.optional.OptionalFile; import ru.gravit.launcher.request.Request; import ru.gravit.launcher.request.update.LegacyLauncherRequest; import ru.gravit.launcher.serialize.HInput; @@ -32,7 +34,6 @@ import java.net.URL; import java.nio.file.FileVisitResult; import java.nio.file.Path; -import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.PosixFilePermission; @@ -68,11 +69,11 @@ public static final class Params extends StreamObject { @LauncherAPI public final PlayerProfile pp; @LauncherAPI - public final Set updateOptional; + public final Set updateOptional; @LauncherAPI - public final Set optionalClientArgs; + public final Set optionalClientArgs; @LauncherAPI - public final Set optionalClassPath; + public final Set optionalClassPath; @LauncherAPI public final String accessToken; @LauncherAPI @@ -96,13 +97,13 @@ public Params(byte[] launcherDigest, Path assetDir, Path clientDir, PlayerProfil this.updateOptional = new HashSet<>(); this.optionalClientArgs = new HashSet<>(); this.optionalClassPath = new HashSet<>(); - for (ClientProfile.OptionalFile s : Launcher.profile.getOptional()) { + for (OptionalFile s : Launcher.profile.getOptional()) { if (s.mark) updateOptional.add(s); } - for (ClientProfile.OptionalArgs s : Launcher.profile.getOptionalClientArgs()) { + for (OptionalArgs s : Launcher.profile.getOptionalClientArgs()) { if (s.mark) optionalClientArgs.add(s); } - for (ClientProfile.OptionalArgs s : Launcher.profile.getOptionalClassPath()) { + for (OptionalArgs s : Launcher.profile.getOptionalClassPath()) { if (s.mark) optionalClassPath.add(s); } // Client paths @@ -133,7 +134,7 @@ public Params(HInput input) throws Exception { for (int i = 0; i < len; ++i) { String file = input.readString(512); boolean mark = input.readBoolean(); - updateOptional.add(new ClientProfile.OptionalFile(file, mark)); + updateOptional.add(new OptionalFile(file, mark)); } len = input.readLength(256); for (int i = 0; i < len; ++i) { @@ -141,7 +142,7 @@ public Params(HInput input) throws Exception { boolean mark = input.readBoolean(); String[] optArgs = new String[len]; for (int j = 0; j < len2; ++j) optArgs[j] = input.readString(512); - optionalClientArgs.add(new ClientProfile.OptionalArgs(optArgs, mark)); + optionalClientArgs.add(new OptionalArgs(optArgs, mark)); } len = input.readLength(256); for (int i = 0; i < len; ++i) { @@ -149,7 +150,7 @@ public Params(HInput input) throws Exception { boolean mark = input.readBoolean(); String[] optArgs = new String[len]; for (int j = 0; j < len2; ++j) optArgs[j] = input.readString(512); - optionalClassPath.add(new ClientProfile.OptionalArgs(optArgs, mark)); + optionalClassPath.add(new OptionalArgs(optArgs, mark)); } // Client params pp = new PlayerProfile(input); @@ -171,18 +172,18 @@ public void write(HOutput output) throws IOException { output.writeString(assetDir.toString(), 0); output.writeString(clientDir.toString(), 0); output.writeLength(updateOptional.size(), 128); - for (ClientProfile.OptionalFile s : updateOptional) { + for (OptionalFile s : updateOptional) { output.writeString(s.file, 512); output.writeBoolean(s.mark); } output.writeLength(optionalClientArgs.size(), 256); - for (ClientProfile.OptionalArgs s : optionalClientArgs) { + for (OptionalArgs s : optionalClientArgs) { output.writeLength(s.args.length, 16); output.writeBoolean(s.mark); for (String f : s.args) output.writeString(f, 512); } output.writeLength(optionalClassPath.size(), 256); - for (ClientProfile.OptionalArgs s : optionalClassPath) { + for (OptionalArgs s : optionalClassPath) { output.writeLength(s.args.length, 16); output.writeBoolean(s.mark); for (String f : s.args) output.writeString(f, 512); @@ -284,7 +285,7 @@ private static void addClientArgs(Collection args, ClientProfile profile Collections.addAll(args, "--server", profile.getServerAddress()); Collections.addAll(args, "--port", Integer.toString(profile.getServerPort())); } - for (ClientProfile.OptionalArgs optionalArgs : params.optionalClientArgs) { + for (OptionalArgs optionalArgs : params.optionalClientArgs) { if (optionalArgs.mark) Collections.addAll(args, optionalArgs.args); } // Add window size args @@ -426,7 +427,7 @@ public static Process launch( String pathLauncher = IOHelper.getCodeSource(ClientLauncher.class).toString(); Collections.addAll(args, profile.getJvmArgs()); if (profile.getOptionalJVMArgs() != null) { - for (ClientProfile.OptionalArgs addArgs : profile.getOptionalJVMArgs()) { + for (OptionalArgs addArgs : profile.getOptionalJVMArgs()) { if (addArgs.mark) Collections.addAll(args, addArgs.args); } } @@ -512,7 +513,7 @@ public static void main(String... args) throws Throwable { for (Path classpathURL : classPath) { LauncherAgent.addJVMClassPath(classpathURL.toAbsolutePath().toString()); } - for (ClientProfile.OptionalArgs optionalArgs : params.optionalClassPath) { + for (OptionalArgs optionalArgs : params.optionalClassPath) { if (!optionalArgs.mark) continue; LinkedList optionalClassPath = resolveClassPathList(params.clientDir, optionalArgs.args); for (Path classpathURL : optionalClassPath) { @@ -535,7 +536,7 @@ public static void main(String... args) throws Throwable { // Verify current state of all dirs //verifyHDir(IOHelper.JVM_DIR, jvmHDir.object, null, digest); HashedDir hdir = clientHDir.object; - for (ClientProfile.OptionalFile s : Launcher.profile.getOptional()) { + for (OptionalFile s : Launcher.profile.getOptional()) { if (params.updateOptional.contains(s)) s.mark = true; else hdir.removeR(s.file); } @@ -574,7 +575,7 @@ public void launchLocal(SignedObjectHolder assetHDir, SignedObjectHol // Verify current state of all dirs //verifyHDir(IOHelper.JVM_DIR, jvmHDir.object, null, digest); HashedDir hdir = clientHDir.object; - for (ClientProfile.OptionalFile s : Launcher.profile.getOptional()) { + for (OptionalFile s : Launcher.profile.getOptional()) { if (params.updateOptional.contains(s)) s.mark = true; else hdir.removeR(s.file); } diff --git a/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java b/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java index b5d6476c..5c78c576 100644 --- a/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java +++ b/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java @@ -3,6 +3,8 @@ import ru.gravit.launcher.LauncherAPI; import ru.gravit.launcher.hasher.FileNameMatcher; import ru.gravit.launcher.hasher.HashedDir; +import ru.gravit.launcher.profiles.optional.OptionalFile; +import ru.gravit.launcher.profiles.optional.OptionalType; import ru.gravit.utils.helper.IOHelper; import ru.gravit.utils.helper.VerifyHelper; @@ -79,66 +81,6 @@ public String toString() { @LauncherAPI private int serverPort; - public static class OptionalFile { - @LauncherAPI - public String file; - @LauncherAPI - public boolean mark; - @LauncherAPI - public String name; - @LauncherAPI - public String info; - @LauncherAPI - public String[] dependenciesFile; - @LauncherAPI - public String[] conflictFile; - @LauncherAPI - public transient OptionalFile[] dependencies; - @LauncherAPI - public transient OptionalFile[] conflict; - @LauncherAPI - public int subTreeLevel = 1; - @LauncherAPI - public boolean isAdminOnly = false; - @LauncherAPI - public transient Set dependenciesCount; - - public OptionalFile(String file, boolean mark) { - this.file = file; - this.mark = mark; - } - - public OptionalFile(String file) { - this.file = file; - this.mark = false; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - OptionalFile that = (OptionalFile) o; - return Objects.equals(file, that.file); - } - - @Override - public int hashCode() { - return Objects.hash(file); - } - } - - public static class OptionalArgs { - @LauncherAPI - public boolean mark; - @LauncherAPI - public String[] args; - - public OptionalArgs(String[] args, boolean mark) { - this.mark = mark; - this.args = args; - } - } - // Updater and client watch service @LauncherAPI private final List update = new ArrayList<>(); @@ -165,12 +107,6 @@ public OptionalArgs(String[] args, boolean mark) { private final List clientArgs = new ArrayList<>(); @LauncherAPI private final List whitelist = new ArrayList<>(); - @LauncherAPI - private final List optionalJVMArgs = new ArrayList<>(); - @LauncherAPI - private final List optionalClientArgs = new ArrayList<>(); - @LauncherAPI - private final List optionalClassPath = new ArrayList<>(); @Override public int compareTo(ClientProfile o) { @@ -192,21 +128,6 @@ public String[] getClassPath() { return classPath.toArray(new String[0]); } - @LauncherAPI - public List getOptionalJVMArgs() { - return optionalJVMArgs; - } - - @LauncherAPI - public List getOptionalClientArgs() { - return optionalClientArgs; - } - - @LauncherAPI - public List getOptionalClassPath() { - return optionalClassPath; - } - @LauncherAPI public String[] getClientArgs() { return clientArgs.toArray(new String[0]); @@ -269,22 +190,22 @@ public void updateOptionalGraph() { if (file.dependenciesFile != null) { file.dependencies = new OptionalFile[file.dependenciesFile.length]; for (int i = 0; i < file.dependenciesFile.length; ++i) { - file.dependencies[i] = getOptionalFile(file.dependenciesFile[i]); + file.dependencies[i] = getOptionalFile(file.dependenciesFile[i].name, file.dependenciesFile[i].type); } } if (file.conflictFile != null) { file.conflict = new OptionalFile[file.conflictFile.length]; for (int i = 0; i < file.conflictFile.length; ++i) { - file.conflict[i] = getOptionalFile(file.conflictFile[i]); + file.conflict[i] = getOptionalFile(file.conflictFile[i].name, file.conflictFile[i].type); } } } } @LauncherAPI - public OptionalFile getOptionalFile(String file) { + public OptionalFile getOptionalFile(String file, OptionalType type) { for (OptionalFile f : updateOptional) - if (f.file.equals(file)) return f; + if (f.type.equals(type) && f.name.equals(file)) return f; return null; } @@ -294,10 +215,12 @@ public Collection getShared() { } @LauncherAPI - public void markOptional(String opt) { - if (!updateOptional.contains(new OptionalFile(opt))) - throw new SecurityException(String.format("Optional mod %s not found in optionalList", opt)); - OptionalFile file = getOptionalFile(opt); + public void markOptional(String name, OptionalType type) { + OptionalFile file = getOptionalFile(name,type); + if(file == null) + { + throw new SecurityException(String.format("Optional %s not found in optionalList", name)); + } markOptional(file); } @@ -321,10 +244,12 @@ public void markOptional(OptionalFile file) { } @LauncherAPI - public void unmarkOptional(String opt) { - if (!updateOptional.contains(new OptionalFile(opt))) - throw new SecurityException(String.format("Optional mod %s not found in optionalList", opt)); - OptionalFile file = getOptionalFile(opt); + public void unmarkOptional(String name, OptionalType type) { + OptionalFile file = getOptionalFile(name,type); + if(file == null) + { + throw new SecurityException(String.format("Optional %s not found in optionalList", name)); + } unmarkOptional(file); } @@ -355,7 +280,11 @@ public void unmarkOptional(OptionalFile file) { public void pushOptional(HashedDir dir, boolean digest) { for (OptionalFile opt : updateOptional) { - if (!opt.mark) dir.removeR(opt.file); + if (opt.type.equals(OptionalType.FILE) && !opt.mark) + { + for(String file : opt.files) + dir.removeR(file); + } } } diff --git a/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalDepend.java b/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalDepend.java new file mode 100644 index 00000000..c49d9ddb --- /dev/null +++ b/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalDepend.java @@ -0,0 +1,10 @@ +package ru.gravit.launcher.profiles.optional; + +import ru.gravit.launcher.LauncherAPI; + +public class OptionalDepend { + @LauncherAPI + public String name; + @LauncherAPI + public OptionalType type; +} diff --git a/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java b/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java new file mode 100644 index 00000000..4f82ece4 --- /dev/null +++ b/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java @@ -0,0 +1,67 @@ +package ru.gravit.launcher.profiles.optional; + +import ru.gravit.launcher.LauncherAPI; + +import java.util.Objects; +import java.util.Set; + +public class OptionalFile { + @LauncherAPI + public String[] files; + @LauncherAPI + public OptionalType type; + @LauncherAPI + public boolean mark; + @LauncherAPI + public boolean visible; + @LauncherAPI + public String name; + @LauncherAPI + public String info; + @LauncherAPI + public OptionalDepend[] dependenciesFile; + @LauncherAPI + public OptionalDepend[] conflictFile; + @LauncherAPI + public transient OptionalFile[] dependencies; + @LauncherAPI + public transient OptionalFile[] conflict; + @LauncherAPI + public int subTreeLevel = 1; + @LauncherAPI + public long permissions = 0L; + @LauncherAPI + public transient Set dependenciesCount; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + OptionalFile that = (OptionalFile) o; + return Objects.equals(name, that.name); + } + + public int hashCode() { + return Objects.hash(name); + } + + public OptionalType getType() { + return OptionalType.FILE; + } + + public String getName() { + return name; + } + + public boolean isVisible() { + return visible; + } + + public boolean isMark() { + return mark; + } + + public long getPermissions() { + return permissions; + } +} diff --git a/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalType.java b/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalType.java new file mode 100644 index 00000000..2bcacf60 --- /dev/null +++ b/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalType.java @@ -0,0 +1,16 @@ +package ru.gravit.launcher.profiles.optional; + +import ru.gravit.launcher.LauncherAPI; + +@LauncherAPI +public enum OptionalType +{ + @LauncherAPI + FILE, + @LauncherAPI + CLASSPATH, + @LauncherAPI + JVMARGS, + @LauncherAPI + CLIENTARGS +} From 6d39f514cae70475ca009f0ddb6ecc78decd6372 Mon Sep 17 00:00:00 2001 From: Gravit Date: Tue, 22 Jan 2019 11:38:41 +0700 Subject: [PATCH 2/6] =?UTF-8?q?[FEATURE]=20=D0=9F=D0=B5=D1=80=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0=20optionalClientArgs/optio?= =?UTF-8?q?nalJVMArgs/optionalClassPath?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/gravit/launchserver/LaunchServer.java | 4 +- .../binary/tasks/PrepareBuildTask.java | 2 +- .../launcher/client/ClientLauncher.java | 99 +++---------------- .../request/update/UpdateRequest.java | 4 +- .../launcher/profiles/ClientProfile.java | 50 ++++++++-- .../profiles/optional/OptionalFile.java | 2 +- 6 files changed, 61 insertions(+), 100 deletions(-) diff --git a/LaunchServer/src/main/java/ru/gravit/launchserver/LaunchServer.java b/LaunchServer/src/main/java/ru/gravit/launchserver/LaunchServer.java index a1f3d3ce..0f2b0b45 100644 --- a/LaunchServer/src/main/java/ru/gravit/launchserver/LaunchServer.java +++ b/LaunchServer/src/main/java/ru/gravit/launchserver/LaunchServer.java @@ -343,8 +343,8 @@ public LaunchServer(Path dir, String[] args) throws IOException, InvalidKeySpecE publicKey = (RSAPublicKey) pair.getPublic(); privateKey = (RSAPrivateKey) pair.getPrivate(); - // Write key pair files - LogHelper.info("Writing RSA keypair files"); + // Write key pair list + LogHelper.info("Writing RSA keypair list"); IOHelper.write(publicKeyFile, publicKey.getEncoded()); IOHelper.write(privateKeyFile, privateKey.getEncoded()); } diff --git a/LaunchServer/src/main/java/ru/gravit/launchserver/binary/tasks/PrepareBuildTask.java b/LaunchServer/src/main/java/ru/gravit/launchserver/binary/tasks/PrepareBuildTask.java index 1e2ae3df..dc08fe0b 100644 --- a/LaunchServer/src/main/java/ru/gravit/launchserver/binary/tasks/PrepareBuildTask.java +++ b/LaunchServer/src/main/java/ru/gravit/launchserver/binary/tasks/PrepareBuildTask.java @@ -42,7 +42,7 @@ public boolean allowDelete() { } public void tryUnpack() throws IOException { - LogHelper.info("Unpacking launcher native guard files and runtime"); + LogHelper.info("Unpacking launcher native guard list and runtime"); UnpackHelper.unpackZipNoCheck("guard.zip", server.launcherBinary.guardDir); UnpackHelper.unpackZipNoCheck("runtime.zip", server.launcherBinary.runtimeDir); } diff --git a/Launcher/src/main/java/ru/gravit/launcher/client/ClientLauncher.java b/Launcher/src/main/java/ru/gravit/launcher/client/ClientLauncher.java index 78e706a2..84fe9162 100644 --- a/Launcher/src/main/java/ru/gravit/launcher/client/ClientLauncher.java +++ b/Launcher/src/main/java/ru/gravit/launcher/client/ClientLauncher.java @@ -10,8 +10,6 @@ import ru.gravit.launcher.hasher.HashedDir; import ru.gravit.launcher.profiles.ClientProfile; import ru.gravit.launcher.profiles.PlayerProfile; -import ru.gravit.launcher.profiles.optional.OptionalArgs; -import ru.gravit.launcher.profiles.optional.OptionalFile; import ru.gravit.launcher.request.Request; import ru.gravit.launcher.request.update.LegacyLauncherRequest; import ru.gravit.launcher.serialize.HInput; @@ -69,12 +67,6 @@ public static final class Params extends StreamObject { @LauncherAPI public final PlayerProfile pp; @LauncherAPI - public final Set updateOptional; - @LauncherAPI - public final Set optionalClientArgs; - @LauncherAPI - public final Set optionalClassPath; - @LauncherAPI public final String accessToken; @LauncherAPI public final boolean autoEnter; @@ -94,18 +86,6 @@ public static final class Params extends StreamObject { public Params(byte[] launcherDigest, Path assetDir, Path clientDir, PlayerProfile pp, String accessToken, boolean autoEnter, boolean fullScreen, int ram, int width, int height) { this.launcherDigest = launcherDigest.clone(); - this.updateOptional = new HashSet<>(); - this.optionalClientArgs = new HashSet<>(); - this.optionalClassPath = new HashSet<>(); - for (OptionalFile s : Launcher.profile.getOptional()) { - if (s.mark) updateOptional.add(s); - } - for (OptionalArgs s : Launcher.profile.getOptionalClientArgs()) { - if (s.mark) optionalClientArgs.add(s); - } - for (OptionalArgs s : Launcher.profile.getOptionalClassPath()) { - if (s.mark) optionalClassPath.add(s); - } // Client paths this.assetDir = assetDir; this.clientDir = clientDir; @@ -127,31 +107,6 @@ public Params(HInput input) throws Exception { // Client paths assetDir = IOHelper.toPath(input.readString(0)); clientDir = IOHelper.toPath(input.readString(0)); - updateOptional = new HashSet<>(); - optionalClientArgs = new HashSet<>(); - optionalClassPath = new HashSet<>(); - int len = input.readLength(128); - for (int i = 0; i < len; ++i) { - String file = input.readString(512); - boolean mark = input.readBoolean(); - updateOptional.add(new OptionalFile(file, mark)); - } - len = input.readLength(256); - for (int i = 0; i < len; ++i) { - int len2 = input.readLength(16); - boolean mark = input.readBoolean(); - String[] optArgs = new String[len]; - for (int j = 0; j < len2; ++j) optArgs[j] = input.readString(512); - optionalClientArgs.add(new OptionalArgs(optArgs, mark)); - } - len = input.readLength(256); - for (int i = 0; i < len; ++i) { - int len2 = input.readLength(16); - boolean mark = input.readBoolean(); - String[] optArgs = new String[len]; - for (int j = 0; j < len2; ++j) optArgs[j] = input.readString(512); - optionalClassPath.add(new OptionalArgs(optArgs, mark)); - } // Client params pp = new PlayerProfile(input); byte[] encryptedAccessToken = input.readByteArray(SecurityHelper.CRYPTO_MAX_LENGTH); @@ -171,24 +126,6 @@ public void write(HOutput output) throws IOException { // Client paths output.writeString(assetDir.toString(), 0); output.writeString(clientDir.toString(), 0); - output.writeLength(updateOptional.size(), 128); - for (OptionalFile s : updateOptional) { - output.writeString(s.file, 512); - output.writeBoolean(s.mark); - } - output.writeLength(optionalClientArgs.size(), 256); - for (OptionalArgs s : optionalClientArgs) { - output.writeLength(s.args.length, 16); - output.writeBoolean(s.mark); - for (String f : s.args) output.writeString(f, 512); - } - output.writeLength(optionalClassPath.size(), 256); - for (OptionalArgs s : optionalClassPath) { - output.writeLength(s.args.length, 16); - output.writeBoolean(s.mark); - for (String f : s.args) output.writeString(f, 512); - } - // Client params pp.write(output); try { output.writeByteArray(SecurityHelper.encrypt(Launcher.getConfig().secretKeyClient.getBytes(), accessToken.getBytes()), SecurityHelper.CRYPTO_MAX_LENGTH); @@ -285,9 +222,7 @@ private static void addClientArgs(Collection args, ClientProfile profile Collections.addAll(args, "--server", profile.getServerAddress()); Collections.addAll(args, "--port", Integer.toString(profile.getServerPort())); } - for (OptionalArgs optionalArgs : params.optionalClientArgs) { - if (optionalArgs.mark) Collections.addAll(args, optionalArgs.args); - } + profile.pushOptionalClientArgs(args); // Add window size args if (params.fullScreen) Collections.addAll(args, "--fullscreen", Boolean.toString(true)); @@ -426,11 +361,7 @@ public static Process launch( // Add classpath and main class String pathLauncher = IOHelper.getCodeSource(ClientLauncher.class).toString(); Collections.addAll(args, profile.getJvmArgs()); - if (profile.getOptionalJVMArgs() != null) { - for (OptionalArgs addArgs : profile.getOptionalJVMArgs()) { - if (addArgs.mark) Collections.addAll(args, addArgs.args); - } - } + profile.pushOptionalJvmArgs(args); Collections.addAll(args, "-Djava.library.path=".concat(params.clientDir.resolve(NATIVES_DIR).toString())); // Add Native Path Collections.addAll(args, "-javaagent:".concat(pathLauncher)); if (wrapper) @@ -513,14 +444,12 @@ public static void main(String... args) throws Throwable { for (Path classpathURL : classPath) { LauncherAgent.addJVMClassPath(classpathURL.toAbsolutePath().toString()); } - for (OptionalArgs optionalArgs : params.optionalClassPath) { - if (!optionalArgs.mark) continue; - LinkedList optionalClassPath = resolveClassPathList(params.clientDir, optionalArgs.args); + profile.pushOptionalClassPath(cp -> { + LinkedList optionalClassPath = resolveClassPathList(params.clientDir, cp); for (Path classpathURL : optionalClassPath) { LauncherAgent.addJVMClassPath(classpathURL.toAbsolutePath().toString()); } - } - + }); URL[] classpathurls = resolveClassPath(params.clientDir, profile.getClassPath()); classLoader = new PublicURLClassLoader(classpathurls, ClassLoader.getSystemClassLoader()); Thread.currentThread().setContextClassLoader(classLoader); @@ -536,10 +465,11 @@ public static void main(String... args) throws Throwable { // Verify current state of all dirs //verifyHDir(IOHelper.JVM_DIR, jvmHDir.object, null, digest); HashedDir hdir = clientHDir.object; - for (OptionalFile s : Launcher.profile.getOptional()) { - if (params.updateOptional.contains(s)) s.mark = true; - else hdir.removeR(s.file); - } + //for (OptionalFile s : Launcher.profile.getOptional()) { + // if (params.updateOptional.contains(s)) s.mark = true; + // else hdir.removeR(s.file); + //} + Launcher.profile.pushOptionalFile(hdir,false); verifyHDir(params.assetDir, assetHDir.object, assetMatcher, digest); verifyHDir(params.clientDir, hdir, clientMatcher, digest); Launcher.modulesManager.postInitModules(); @@ -575,10 +505,11 @@ public void launchLocal(SignedObjectHolder assetHDir, SignedObjectHol // Verify current state of all dirs //verifyHDir(IOHelper.JVM_DIR, jvmHDir.object, null, digest); HashedDir hdir = clientHDir.object; - for (OptionalFile s : Launcher.profile.getOptional()) { - if (params.updateOptional.contains(s)) s.mark = true; - else hdir.removeR(s.file); - } + //for (OptionalFile s : Launcher.profile.getOptional()) { + // if (params.updateOptional.contains(s)) s.mark = true; + // else hdir.removeR(s.file); + //} + Launcher.profile.pushOptionalFile(hdir,false); verifyHDir(params.assetDir, assetHDir.object, assetMatcher, digest); verifyHDir(params.clientDir, hdir, clientMatcher, digest); Launcher.modulesManager.postInitModules(); diff --git a/LauncherAPI/src/main/java/ru/gravit/launcher/request/update/UpdateRequest.java b/LauncherAPI/src/main/java/ru/gravit/launcher/request/update/UpdateRequest.java index 57d72295..5d065966 100644 --- a/LauncherAPI/src/main/java/ru/gravit/launcher/request/update/UpdateRequest.java +++ b/LauncherAPI/src/main/java/ru/gravit/launcher/request/update/UpdateRequest.java @@ -224,7 +224,7 @@ private void deleteExtraDir(Path subDir, HashedDir subHDir, boolean flag) throws String name = mapEntry.getKey(); Path path = subDir.resolve(name); - // Delete files and dirs based on type + // Delete list and dirs based on type HashedEntry entry = mapEntry.getValue(); HashedEntry.Type entryType = entry.getType(); switch (entryType) { @@ -308,7 +308,7 @@ protected SignedObjectHolder requestDo(HInput input, HOutput output) // Get diff between local and remote dir SignedObjectHolder remoteHDirHolder = new SignedObjectHolder<>(input, config.publicKey, HashedDir::new); HashedDir hackHackedDir = remoteHDirHolder.object; - Launcher.profile.pushOptional(hackHackedDir, !Launcher.profile.isUpdateFastCheck()); + Launcher.profile.pushOptionalFile(hackHackedDir, !Launcher.profile.isUpdateFastCheck()); HashedDir.Diff diff = hackHackedDir.diff(localDir, matcher); totalSize = diff.mismatch.size(); boolean compress = input.readBoolean(); diff --git a/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java b/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java index 5c78c576..9210ff1b 100644 --- a/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java +++ b/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java @@ -1,5 +1,6 @@ package ru.gravit.launcher.profiles; +import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils; import ru.gravit.launcher.LauncherAPI; import ru.gravit.launcher.hasher.FileNameMatcher; import ru.gravit.launcher.hasher.HashedDir; @@ -8,7 +9,9 @@ import ru.gravit.utils.helper.IOHelper; import ru.gravit.utils.helper.VerifyHelper; +import java.io.IOException; import java.net.InetSocketAddress; +import java.nio.file.Path; import java.util.*; public final class ClientProfile implements Comparable { @@ -216,9 +219,8 @@ public Collection getShared() { @LauncherAPI public void markOptional(String name, OptionalType type) { - OptionalFile file = getOptionalFile(name,type); - if(file == null) - { + OptionalFile file = getOptionalFile(name, type); + if (file == null) { throw new SecurityException(String.format("Optional %s not found in optionalList", name)); } markOptional(file); @@ -245,9 +247,8 @@ public void markOptional(OptionalFile file) { @LauncherAPI public void unmarkOptional(String name, OptionalType type) { - OptionalFile file = getOptionalFile(name,type); - if(file == null) - { + OptionalFile file = getOptionalFile(name, type); + if (file == null) { throw new SecurityException(String.format("Optional %s not found in optionalList", name)); } unmarkOptional(file); @@ -278,16 +279,45 @@ public void unmarkOptional(OptionalFile file) { } } - public void pushOptional(HashedDir dir, boolean digest) { + public void pushOptionalFile(HashedDir dir, boolean digest) { for (OptionalFile opt : updateOptional) { - if (opt.type.equals(OptionalType.FILE) && !opt.mark) - { - for(String file : opt.files) + if (opt.type.equals(OptionalType.FILE) && !opt.mark) { + for (String file : opt.list) dir.removeR(file); } } } + public void pushOptionalJvmArgs(Collection jvmArgs1) + { + for (OptionalFile opt : updateOptional) { + if (opt.type.equals(OptionalType.JVMARGS) && opt.mark) { + jvmArgs1.addAll(Arrays.asList(opt.list)); + } + } + } + public void pushOptionalClientArgs(Collection clientArgs1) + { + for (OptionalFile opt : updateOptional) { + if (opt.type.equals(OptionalType.CLIENTARGS) && opt.mark) { + clientArgs1.addAll(Arrays.asList(opt.list)); + } + } + } + public void pushOptionalClassPath(pushOptionalClassPathCallback callback) throws IOException + { + for (OptionalFile opt : updateOptional) { + if (opt.type.equals(OptionalType.CLASSPATH) && opt.mark) { + callback.run(opt.list); + } + } + } + @FunctionalInterface + public interface pushOptionalClassPathCallback + { + void run(String[] opt) throws IOException; + } + @LauncherAPI public int getServerPort() { return serverPort; diff --git a/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java b/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java index 4f82ece4..e87a3f91 100644 --- a/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java +++ b/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java @@ -7,7 +7,7 @@ public class OptionalFile { @LauncherAPI - public String[] files; + public String[] list; @LauncherAPI public OptionalType type; @LauncherAPI From acd3c0258cbe6fffe9ea3f479a54bb76796b3eaa Mon Sep 17 00:00:00 2001 From: Gravit Date: Tue, 22 Jan 2019 11:40:40 +0700 Subject: [PATCH 3/6] =?UTF-8?q?[FIX]=20=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BE?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=B8?= =?UTF-8?q?=D0=BB=D1=8F=D1=86=D0=B8=D0=B8=20=D0=B2=20ClientProfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/ru/gravit/launcher/profiles/ClientProfile.java | 1 - 1 file changed, 1 deletion(-) diff --git a/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java b/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java index 9210ff1b..5d7858c6 100644 --- a/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java +++ b/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java @@ -1,6 +1,5 @@ package ru.gravit.launcher.profiles; -import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils; import ru.gravit.launcher.LauncherAPI; import ru.gravit.launcher.hasher.FileNameMatcher; import ru.gravit.launcher.hasher.HashedDir; From 4d7fca7b2a44158be2fdcf5b5e44a09de97416b8 Mon Sep 17 00:00:00 2001 From: Gravit Date: Tue, 22 Jan 2019 11:54:53 +0700 Subject: [PATCH 4/6] =?UTF-8?q?[FIX]=20=D0=A1=D0=B5=D1=80=D0=B8=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20OptionalType?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../profiles/optional/OptionalFile.java | 60 +++++++++++++++++-- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java b/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java index e87a3f91..ee041d08 100644 --- a/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java +++ b/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java @@ -1,7 +1,11 @@ package ru.gravit.launcher.profiles.optional; import ru.gravit.launcher.LauncherAPI; +import ru.gravit.launcher.serialize.HInput; +import ru.gravit.launcher.serialize.HOutput; +import ru.gravit.utils.helper.LogHelper; +import java.io.IOException; import java.util.Objects; import java.util.Set; @@ -44,24 +48,70 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(name); } - + @LauncherAPI public OptionalType getType() { return OptionalType.FILE; } - + @LauncherAPI public String getName() { return name; } - + @LauncherAPI public boolean isVisible() { return visible; } - + @LauncherAPI public boolean isMark() { return mark; } - + @LauncherAPI public long getPermissions() { return permissions; } + @LauncherAPI + public void writeType(HOutput output) throws IOException + { + switch(type) + { + + case FILE: + output.writeInt(1); + break; + case CLASSPATH: + output.writeInt(2); + break; + case JVMARGS: + output.writeInt(3); + break; + case CLIENTARGS: + output.writeInt(4); + break; + default: + output.writeInt(5); + break; + } + } + @LauncherAPI + public void readType(HInput input) throws IOException + { + int t = input.readInt(); + switch(t) + { + case 1: + type = OptionalType.FILE; + break; + case 2: + type = OptionalType.CLASSPATH; + break; + case 3: + type = OptionalType.JVMARGS; + break; + case 4: + type = OptionalType.CLIENTARGS; + break; + default: + LogHelper.error("readType failed. Read int %d",t); + break; + } + } } From 8e2e9d4aee8897ab18669a1df91b2fb6fcf35cd1 Mon Sep 17 00:00:00 2001 From: Gravit Date: Tue, 22 Jan 2019 12:02:58 +0700 Subject: [PATCH 5/6] =?UTF-8?q?[FEATURE]=20=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5?= =?UTF-8?q?=D1=80=D0=B6=D0=BA=D0=B0=20=D0=B4=D0=B8=D0=B7=D0=B0=D0=B9=D0=BD?= =?UTF-8?q?=D0=BE=D0=BC=20=D0=BD=D0=BE=D0=B2=D1=8B=D1=85=20=D0=BE=D0=BF?= =?UTF-8?q?=D1=86=20=D0=BC=D0=BE=D0=B4=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runtime/dialog/overlay/options/options.js | 23 +++++++++---------- Launcher/runtime/engine/api.js | 1 + .../launcher/gui/JSRuntimeProvider.java | 2 ++ .../profiles/optional/OptionalFile.java | 5 +++- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/Launcher/runtime/dialog/overlay/options/options.js b/Launcher/runtime/dialog/overlay/options/options.js index 282a63fa..6c443423 100644 --- a/Launcher/runtime/dialog/overlay/options/options.js +++ b/Launcher/runtime/dialog/overlay/options/options.js @@ -43,15 +43,16 @@ var options = { for(var j = 0; j < listSize; j++) { var mark = input.readBoolean(); + var modType = OptionalFile.readType(input); var modFile = input.readString(0); if(mark) { - profile.markOptional(modFile); + profile.markOptional(modFile,modType); LogHelper.debug("Load options %s marked",modFile); } else { - profile.unmarkOptional(modFile); + profile.unmarkOptional(modFile,modType); LogHelper.debug("Load options %s unmarked",modFile); } } @@ -69,7 +70,8 @@ var options = { output.writeInt(profile.getSortIndex()); list.forEach(function(modFile,j,arr2) { output.writeBoolean(modFile.mark); - output.writeString(modFile.file, 0); + modFile.writeType(output); + output.writeString(modFile.name, 0); }); }); }, @@ -101,11 +103,9 @@ var options = { list.forEach(function(modFile) { dModsIds.push(modFile.string); - var modName = modFile.file, modDescription = "", subLevel = 1; - if(modFile.isAdminOnly && !loginData.permissions.canAdmin) + var modName = modFile.name, modDescription = "", subLevel = 1; + if(!modFile.isVisible || !((loginData.permissions & modFile.permissions) != 0)) return; - if(modFile.name != null)//Есть ли у модификации имя? - modName = modFile.name; if(modFile.info != null) //Есть ли описание? modDescription = modFile.info; if(modFile.subTreeLevel != null && modFile.subTreeLevel > 1)//Это суб-модификация? @@ -121,18 +121,17 @@ var options = { var isSelected = event.getSource().isSelected(); if(isSelected) { - profile.markOptional(modFile.file); - LogHelper.debug("Selected mod %s", modFile.file); + profile.markOptional(modFile); + LogHelper.debug("Selected mod %s", modFile.name); } else { - profile.unmarkOptional(modFile.file); - LogHelper.debug("Unselected mod %s", modFile.file); + profile.unmarkOptional(modFile); + LogHelper.debug("Unselected mod %s", modFile.name); } options.update(); }); checkBoxList.add(testMod); - if(modDescription != "") { //Добавляем описание? textDescr = new javafx.scene.text.Text(modDescription); if(subLevel > 1) { diff --git a/Launcher/runtime/engine/api.js b/Launcher/runtime/engine/api.js index f423687d..d7cbcae5 100644 --- a/Launcher/runtime/engine/api.js +++ b/Launcher/runtime/engine/api.js @@ -44,6 +44,7 @@ var StreamObjectAdapter = StreamObjectAdapterClass.static; var SignedBytesHolder = SignedBytesHolderClass.static; var SignedObjectHolder = SignedObjectHolderClass.static; var EnumSerializer = EnumSerializerClass.static; +var OptionalFile = OptionalFileClass.static; // Helper class API imports var CommonHelper = CommonHelperClass.static; diff --git a/Launcher/src/main/java/ru/gravit/launcher/gui/JSRuntimeProvider.java b/Launcher/src/main/java/ru/gravit/launcher/gui/JSRuntimeProvider.java index bf8ec25f..fc99a3c0 100644 --- a/Launcher/src/main/java/ru/gravit/launcher/gui/JSRuntimeProvider.java +++ b/Launcher/src/main/java/ru/gravit/launcher/gui/JSRuntimeProvider.java @@ -18,6 +18,7 @@ import ru.gravit.launcher.profiles.ClientProfile; import ru.gravit.launcher.profiles.PlayerProfile; import ru.gravit.launcher.profiles.Texture; +import ru.gravit.launcher.profiles.optional.OptionalFile; import ru.gravit.launcher.request.*; import ru.gravit.launcher.request.auth.AuthRequest; import ru.gravit.launcher.request.auth.CheckServerRequest; @@ -95,6 +96,7 @@ public static void addLauncherClassBindings(Map bindings) { bindings.put("SignedBytesHolderClass", SignedBytesHolder.class); bindings.put("SignedObjectHolderClass", SignedObjectHolder.class); bindings.put("EnumSerializerClass", EnumSerializer.class); + bindings.put("OptionalFileClass", OptionalFile.class); // Set helper class bindings bindings.put("CommonHelperClass", CommonHelper.class); diff --git a/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java b/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java index ee041d08..35e8a9f7 100644 --- a/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java +++ b/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java @@ -92,9 +92,10 @@ public void writeType(HOutput output) throws IOException } } @LauncherAPI - public void readType(HInput input) throws IOException + public static OptionalType readType(HInput input) throws IOException { int t = input.readInt(); + OptionalType type; switch(t) { case 1: @@ -111,7 +112,9 @@ public void readType(HInput input) throws IOException break; default: LogHelper.error("readType failed. Read int %d",t); + type = OptionalType.FILE; break; } + return type; } } From 97f9f034e750f74d00035d0e9b845d014069aa9c Mon Sep 17 00:00:00 2001 From: Gravit Date: Tue, 22 Jan 2019 12:29:57 +0700 Subject: [PATCH 6/6] =?UTF-8?q?[FIX]=20=D0=A4=D0=B8=D0=BA=D1=81=20runtime?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D1=81=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=BC=D0=B8=20=D0=BE=D0=BF?= =?UTF-8?q?=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=BC=D0=BE=D0=B4=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runtime/dialog/overlay/options/options.js | 15 ++++++++++----- .../ru/gravit/launcher/ClientPermissions.java | 1 + .../launcher/profiles/optional/OptionalFile.java | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Launcher/runtime/dialog/overlay/options/options.js b/Launcher/runtime/dialog/overlay/options/options.js index 6c443423..336c99b8 100644 --- a/Launcher/runtime/dialog/overlay/options/options.js +++ b/Launcher/runtime/dialog/overlay/options/options.js @@ -98,14 +98,19 @@ var options = { var profile = profilesList[serverHolder.old]; var list = profile.getOptional(); var checkBoxList = new java.util.ArrayList; - var dModsIds = []; - list.forEach(function(modFile) { - dModsIds.push(modFile.string); - var modName = modFile.name, modDescription = "", subLevel = 1; - if(!modFile.isVisible || !((loginData.permissions & modFile.permissions) != 0)) + if(!modFile.isVisible) + { + LogHelper.debug("optionalMod %s hidden",modFile.name); return; + } + + if(modFile.permissions != 0 && ((loginData.permissions.toLong() & modFile.permissions) != 0)) + { + LogHelper.debug("optionalMod %s permissions deny",modFile.name); + return; + } if(modFile.info != null) //Есть ли описание? modDescription = modFile.info; if(modFile.subTreeLevel != null && modFile.subTreeLevel > 1)//Это суб-модификация? diff --git a/libLauncher/src/main/java/ru/gravit/launcher/ClientPermissions.java b/libLauncher/src/main/java/ru/gravit/launcher/ClientPermissions.java index 0c77e2bc..c13828a6 100644 --- a/libLauncher/src/main/java/ru/gravit/launcher/ClientPermissions.java +++ b/libLauncher/src/main/java/ru/gravit/launcher/ClientPermissions.java @@ -46,6 +46,7 @@ public ClientPermissions(long data) { canUSR3 = (data & (1 << 4)) != 0; canBot = (data & (1 << 5)) != 0; } + @LauncherAPI public long toLong() { long result = 0; diff --git a/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java b/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java index 35e8a9f7..878b6e3d 100644 --- a/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java +++ b/libLauncher/src/main/java/ru/gravit/launcher/profiles/optional/OptionalFile.java @@ -17,7 +17,7 @@ public class OptionalFile { @LauncherAPI public boolean mark; @LauncherAPI - public boolean visible; + public boolean visible = true; @LauncherAPI public String name; @LauncherAPI