From 5747dd9da0de626155ddd03d6073008dfceacda5 Mon Sep 17 00:00:00 2001 From: Gravit Date: Fri, 21 Feb 2020 11:35:14 +0700 Subject: [PATCH 01/23] [ANY] 5.1.1 dev --- LauncherCore/src/main/java/pro/gravit/utils/Version.java | 4 ++-- build.gradle | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/LauncherCore/src/main/java/pro/gravit/utils/Version.java b/LauncherCore/src/main/java/pro/gravit/utils/Version.java index 0f5b3f1e..8943395e 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/Version.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/Version.java @@ -15,9 +15,9 @@ public final class Version { public final Type release; public static final int MAJOR = 5; public static final int MINOR = 1; - public static final int PATCH = 0; + public static final int PATCH = 1; public static final int BUILD = 1; - public static final Version.Type RELEASE = Type.BETA; + public static final Version.Type RELEASE = Type.DEV; public Version(int major, int minor, int patch) { diff --git a/build.gradle b/build.gradle index ddaddb54..c071da22 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ id 'signing' } group = 'pro.gravit.launcher' -version = '5.1.0' +version = '5.1.1-SNAPSHOT' configure(subprojects.findAll { it.name != 'modules' }) { apply plugin: 'idea' From e84530cce406e0d32dfaae317c2d25681a648df8 Mon Sep 17 00:00:00 2001 From: Zaxar163 Date: Fri, 21 Feb 2020 06:07:33 +0100 Subject: [PATCH 02/23] =?UTF-8?q?[FIX]=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20gradle.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/wrapper/gradle-wrapper.jar | Bin 55616 -> 58695 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 35 ++++++++++------------- gradlew.bat | 2 +- 4 files changed, 17 insertions(+), 22 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 5c2d1cf016b3885f6930543d57b744ea8c220a1a..f3d88b1c2faf2fc91d853cd5d4242b5547257070 100644 GIT binary patch delta 22808 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 delta 20005 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 nvEpR}Ffj;rE}sKLhd|1%F5dI!=ox-rLy2 Date: Fri, 21 Feb 2020 06:20:54 +0100 Subject: [PATCH 03/23] =?UTF-8?q?[FIX]=20=D0=92=D1=81=D1=91=20=D0=B2=20gra?= =?UTF-8?q?dle-=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=B0=D1=85=20=D0=BA?= =?UTF-8?q?=D1=80=D0=BE=D0=BC=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3?= =?UTF-8?q?=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B9=20compile/testCompile.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LaunchServer/build.gradle | 8 ++++---- Launcher/build.gradle | 10 ++-------- ServerWrapper/build.gradle | 2 +- build.gradle | 4 ++-- modules | 2 +- 5 files changed, 10 insertions(+), 16 deletions(-) diff --git a/LaunchServer/build.gradle b/LaunchServer/build.gradle index 5cadc5a7..190a175c 100644 --- a/LaunchServer/build.gradle +++ b/LaunchServer/build.gradle @@ -8,7 +8,7 @@ url "https://oss.sonatype.org/content/repositories/snapshots" } maven { - url "http://maven.geomajas.org/" + url "https://maven.geomajas.org/" } } @@ -31,7 +31,6 @@ dependsOn parent.childProjects.Launcher.tasks.build from { configurations.pack.collect { it.isDirectory() ? it : zipTree(it) } } from(parent.childProjects.Launcher.tasks.shadowJar.archivePath) - from(parent.childProjects.Launcher.tasks.genRuntimeJS.archivePath) manifest.attributes("Main-Class": mainClassName, "Premain-Class": mainAgentName, "Can-Redefine-Classes": "true", @@ -125,6 +124,7 @@ task hikari(type: Copy) { task launch4jM(type: Copy) { into "$buildDir/libs/libraries/launch4j" from(configurations.launch4jCJ.collect { it.isDirectory() ? it : zipTree(it) }) + duplicatesStrategy = 'INCLUDE' includeEmptyDirs false eachFile { FileCopyDetails fcp -> if (fcp.relativePath.pathString.startsWith("launch4j-")) { @@ -163,8 +163,8 @@ task dumpCompileOnlyLibs(type: Copy) { task bundle(type: Zip) { dependsOn parent.childProjects.Launcher.tasks.build, tasks.dumpLibs, tasks.dumpCompileOnlyLibs, tasks.jar - archiveName 'LaunchServer.zip' - destinationDir file("$buildDir") + archiveFileName = 'LaunchServer.zip' + destinationDirectory = file("$buildDir") from(tasks.dumpLibs.destinationDir) { into 'libraries' } from(tasks.dumpCompileOnlyLibs.destinationDir) { into 'launcher-libraries-compile' } from tasks.jar.archivePath diff --git a/Launcher/build.gradle b/Launcher/build.gradle index b99e62a8..0ddb6d06 100644 --- a/Launcher/build.gradle +++ b/Launcher/build.gradle @@ -8,7 +8,7 @@ repositories { maven { - url "http://repo.spring.io/plugins-release/" + url "https://repo.spring.io/plugins-release/" } } javafx { @@ -59,19 +59,13 @@ pack project(':LauncherAPI') pack 'org.ow2.asm:asm-tree:7.1' } -task genRuntimeJS(type: Zip) { - archiveName = "runtime.zip" - destinationDir = file("${buildDir}/tmp") - from "runtime/" -} - task dumpLibs(type: Copy) { into "$buildDir/libs/libraries" from configurations.bundle } -assemble.dependsOn tasks.genRuntimeJS, tasks.dumpLibs, tasks.shadowJar +assemble.dependsOn tasks.dumpLibs, tasks.shadowJar publishing { publications { diff --git a/ServerWrapper/build.gradle b/ServerWrapper/build.gradle index 9db86cf6..6c69d053 100644 --- a/ServerWrapper/build.gradle +++ b/ServerWrapper/build.gradle @@ -10,7 +10,7 @@ repositories { maven { - url "http://repo.spring.io/plugins-release/" + url "https://repo.spring.io/plugins-release/" } } diff --git a/build.gradle b/build.gradle index c071da22..8c03a9e7 100644 --- a/build.gradle +++ b/build.gradle @@ -15,9 +15,9 @@ repositories { mavenCentral() - maven { url 'http://oss.sonatype.org/content/groups/public' } + maven { url 'https://oss.sonatype.org/content/groups/public' } maven { - url "http://clojars.org/repo/" + url "https://clojars.org/repo/" } } diff --git a/modules b/modules index 0fbc3fb2..fa940313 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 0fbc3fb26c505800a61976cdf1310cad6ab7808d +Subproject commit fa9403131f0d3caed104d323128b241ac05ecda3 From 3da2951cace5459d3e1eaf78c411ac1eb3528a62 Mon Sep 17 00:00:00 2001 From: Zaxar163 Date: Fri, 21 Feb 2020 16:46:19 +0100 Subject: [PATCH 04/23] =?UTF-8?q?[FIX]=20=D0=A1=D0=BA=D1=80=D0=B8=D0=BF?= =?UTF-8?q?=D1=82=D1=8B=20gradle,=20=D0=BE=D0=BA=D0=BE=D0=BD=D1=87=D0=B0?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LaunchServer/build.gradle | 5 +++-- Launcher/build.gradle | 6 ++---- LauncherAPI/build.gradle | 6 +++--- LauncherAuthlib/build.gradle | 6 +++--- LauncherCore/build.gradle | 16 ++++++++-------- ServerWrapper/build.gradle | 2 +- build.gradle | 9 +++++---- modules | 2 +- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/LaunchServer/build.gradle b/LaunchServer/build.gradle index 190a175c..3afe323d 100644 --- a/LaunchServer/build.gradle +++ b/LaunchServer/build.gradle @@ -24,10 +24,11 @@ launch4j launch4jCJ bundleOnly.extendsFrom bundle - compile.extendsFrom bundle, hikari, pack, launch4jCJ, launch4j + compile.extendsFrom bundle, hikari, pack, launch4j } jar { + duplicatesStrategy = 'INCLUDE' dependsOn parent.childProjects.Launcher.tasks.build from { configurations.pack.collect { it.isDirectory() ? it : zipTree(it) } } from(parent.childProjects.Launcher.tasks.shadowJar.archivePath) @@ -113,7 +114,7 @@ pack project(':LauncherAPI') compileOnlyA 'com.google.guava:guava:26.0-jre' compileOnlyA 'log4j:log4j:1.2.17' // Do not update (laggy dep). compileOnlyA 'org.apache.logging.log4j:log4j-core:2.11.2' - testCompile 'org.junit.jupiter:junit-jupiter:5.4.1' + testImplementation 'org.junit.jupiter:junit-jupiter:5.4.1' } task hikari(type: Copy) { diff --git a/Launcher/build.gradle b/Launcher/build.gradle index 0ddb6d06..7c01ec74 100644 --- a/Launcher/build.gradle +++ b/Launcher/build.gradle @@ -1,6 +1,4 @@ -plugins { - id 'org.openjfx.javafxplugin' version '0.0.5' -} +apply plugin: 'org.openjfx.javafxplugin' apply plugin: 'com.github.johnrengelman.shadow' String mainClassName = "pro.gravit.launcher.ClientLauncherWrapper" @@ -21,7 +19,7 @@ configurations { bundle pack - compile.extendsFrom bundle, pack + api.extendsFrom bundle, pack } jar { diff --git a/LauncherAPI/build.gradle b/LauncherAPI/build.gradle index c6382a08..aff52823 100644 --- a/LauncherAPI/build.gradle +++ b/LauncherAPI/build.gradle @@ -2,9 +2,9 @@ targetCompatibility = '1.8' dependencies { - compile project(':LauncherCore') - compileOnly 'io.netty:netty-codec-http:4.1.43.Final' - testCompile 'org.junit.jupiter:junit-jupiter:5.4.1' + api project(':LauncherCore') + implementation 'io.netty:netty-codec-http:4.1.43.Final' + testImplementation 'org.junit.jupiter:junit-jupiter:5.4.1' } test { diff --git a/LauncherAuthlib/build.gradle b/LauncherAuthlib/build.gradle index c80e6841..ce574258 100644 --- a/LauncherAuthlib/build.gradle +++ b/LauncherAuthlib/build.gradle @@ -2,7 +2,7 @@ targetCompatibility = '1.8' dependencies { - compile project(':LauncherAPI') - compileOnly 'com.google.guava:guava:26.0-jre' - compile files('../compat/authlib/authlib-clean.jar') + api project(':LauncherAPI') + implementation 'com.google.guava:guava:26.0-jre' + api files('../compat/authlib/authlib-clean.jar') } diff --git a/LauncherCore/build.gradle b/LauncherCore/build.gradle index c4783f31..94101c17 100644 --- a/LauncherCore/build.gradle +++ b/LauncherCore/build.gradle @@ -1,15 +1,15 @@ -apply plugin: 'java-library' +apply plugin: 'java' sourceCompatibility = '1.8' targetCompatibility = '1.8' dependencies { - compileOnly 'org.fusesource.jansi:jansi:1.18' - compileOnly 'org.jline:jline:3.11.0' - compileOnly 'org.jline:jline-reader:3.11.0' - compileOnly 'org.jline:jline-terminal:3.11.0' - compileOnly 'org.bouncycastle:bcprov-jdk15:1.46' - compile 'com.google.code.gson:gson:2.8.5' - testCompile 'org.junit.jupiter:junit-jupiter:5.4.1' + api 'org.fusesource.jansi:jansi:1.18' + api 'org.jline:jline:3.11.0' + api 'org.jline:jline-reader:3.11.0' + api 'org.jline:jline-terminal:3.11.0' + api 'org.bouncycastle:bcprov-jdk15:1.46' + api 'com.google.code.gson:gson:2.8.5' + testImplementation 'org.junit.jupiter:junit-jupiter:5.4.1' } test { diff --git a/ServerWrapper/build.gradle b/ServerWrapper/build.gradle index 6c69d053..dd10b6f9 100644 --- a/ServerWrapper/build.gradle +++ b/ServerWrapper/build.gradle @@ -5,7 +5,7 @@ configurations { pack - compile.extendsFrom pack + api.extendsFrom pack } repositories { diff --git a/build.gradle b/build.gradle index 8c03a9e7..d67ce7a2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,8 @@ plugins { - id 'com.github.johnrengelman.shadow' version '5.0.0' apply false + id 'com.github.johnrengelman.shadow' version '5.2.0' apply false id 'maven-publish' id 'signing' + id 'org.openjfx.javafxplugin' version '0.0.8' apply false } group = 'pro.gravit.launcher' version = '5.1.1-SNAPSHOT' @@ -9,7 +10,7 @@ configure(subprojects.findAll { it.name != 'modules' }) { apply plugin: 'idea' apply plugin: 'eclipse' - apply plugin: 'java' + apply plugin: 'java-library' group = 'pro.gravit' @@ -26,8 +27,8 @@ aptCompileOnly aptOnly aptOnly.extendsFrom apt, aptCompileOnly - compile.extendsFrom apt - compileOnly.extendsFrom aptCompileOnly + api.extendsFrom apt + implementation.extendsFrom aptCompileOnly } tasks.withType(JavaCompile) { diff --git a/modules b/modules index fa940313..d430430a 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit fa9403131f0d3caed104d323128b241ac05ecda3 +Subproject commit d430430a83080312a420ee6b91d335b23d75c693 From 0f9fd46d2948a8e1385bcd55780227c73a38495d Mon Sep 17 00:00:00 2001 From: Zaxar163 Date: Sat, 22 Feb 2020 05:46:01 +0100 Subject: [PATCH 05/23] =?UTF-8?q?[FIX]=20=D0=9F=D0=BE=D1=81=D0=BB=D0=B5?= =?UTF-8?q?=D0=B4=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=B0=D1=80=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BE=20=D0=BD=D0=B5=D1=81=D0=BE=D0=B2=D0=BC=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D1=81=20Gradle=207.0/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LaunchServer/build.gradle | 1 + .../gravit/launchserver/binary/tasks/PrepareBuildTask.java | 2 +- Launcher/build.gradle | 7 ++++++- .../src/main/java/pro/gravit/utils/helper/IOHelper.java | 7 +++++++ modules | 2 +- 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/LaunchServer/build.gradle b/LaunchServer/build.gradle index 3afe323d..8fec5a20 100644 --- a/LaunchServer/build.gradle +++ b/LaunchServer/build.gradle @@ -32,6 +32,7 @@ dependsOn parent.childProjects.Launcher.tasks.build from { configurations.pack.collect { it.isDirectory() ? it : zipTree(it) } } from(parent.childProjects.Launcher.tasks.shadowJar.archivePath) + from(parent.childProjects.Launcher.tasks.genRuntimeJS.archivePath) manifest.attributes("Main-Class": mainClassName, "Premain-Class": mainAgentName, "Can-Redefine-Classes": "true", diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/binary/tasks/PrepareBuildTask.java b/LaunchServer/src/main/java/pro/gravit/launchserver/binary/tasks/PrepareBuildTask.java index b412fb5b..0b9d3256 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/binary/tasks/PrepareBuildTask.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/binary/tasks/PrepareBuildTask.java @@ -45,8 +45,8 @@ public boolean allowDelete() { public void tryUnpack() throws IOException { LogHelper.info("Unpacking launcher native guard list and runtime"); - UnpackHelper.unpackZipNoCheck("guard.zip", server.launcherBinary.guardDir); UnpackHelper.unpackZipNoCheck("runtime.zip", server.launcherBinary.runtimeDir); + IOHelper.keepDir(server.launcherBinary.guardDir); } private static final class ListFileVisitor extends SimpleFileVisitor { diff --git a/Launcher/build.gradle b/Launcher/build.gradle index 7c01ec74..eb424741 100644 --- a/Launcher/build.gradle +++ b/Launcher/build.gradle @@ -62,8 +62,13 @@ task dumpLibs(type: Copy) { from configurations.bundle } +task genRuntimeJS(type: Zip) { + archiveFileName = "runtime.zip" + destinationDirectory = file("${buildDir}/tmp") + from "runtime/" +} -assemble.dependsOn tasks.dumpLibs, tasks.shadowJar +assemble.dependsOn tasks.genRuntimeJS, tasks.dumpLibs, tasks.shadowJar publishing { publications { diff --git a/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java b/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java index f5defefe..755a7bf9 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java @@ -733,4 +733,11 @@ public static void write(Path file, byte[] bytes) throws IOException { private IOHelper() { } + + public static void keepDir(Path dir) throws IOException { + if (Files.isDirectory(dir)) + return; + Files.deleteIfExists(dir); + Files.createDirectory(dir); + } } diff --git a/modules b/modules index d430430a..6df9e7b0 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit d430430a83080312a420ee6b91d335b23d75c693 +Subproject commit 6df9e7b0fb74623336baaf8a1c53c2073dce4ffd From 308cc48d4cb055baf6f457c876dfde8492e82692 Mon Sep 17 00:00:00 2001 From: Gravit Date: Tue, 25 Feb 2020 11:08:41 +0700 Subject: [PATCH 06/23] =?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 6df9e7b0..a330c4d3 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 6df9e7b0fb74623336baaf8a1c53c2073dce4ffd +Subproject commit a330c4d3004f7318cb7ccb494acdc157a55f0ce4 From 3f307d7b2013d7e23693fc79775581b26a8bf3d6 Mon Sep 17 00:00:00 2001 From: Gravit Date: Tue, 25 Feb 2020 13:38:11 +0700 Subject: [PATCH 07/23] =?UTF-8?q?[FEATURE]=20=D0=9E=D1=82=D0=BA=D0=B0?= =?UTF-8?q?=D1=82=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=97=D0=B0=D1=85=D0=B0=D1=80=D0=B0,=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=B0=D1=83=D0=BD=D1=87=D0=B5=D1=80?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LaunchServer/build.gradle | 12 +++++------ .../launchserver/LaunchServerStarter.java | 1 - .../gravit/launchserver/asm/NodeUtils.java | 1 - .../launchserver/binary/ProguardConf.java | 1 - .../binary/tasks/PrepareBuildTask.java | 2 +- .../manangers/SessionManager.java | 1 - Launcher/build.gradle | 19 ++++++++++-------- LauncherAPI/build.gradle | 6 +++--- LauncherAuthlib/build.gradle | 6 +++--- LauncherCore/build.gradle | 16 +++++++-------- .../pro/gravit/utils/helper/IOHelper.java | 7 ------- .../pro/gravit/utils/helper/JarHelper.java | 20 +++++++++++++++++-- ServerWrapper/build.gradle | 4 ++-- build.gradle | 13 ++++++------ modules | 2 +- 15 files changed, 58 insertions(+), 53 deletions(-) diff --git a/LaunchServer/build.gradle b/LaunchServer/build.gradle index 8fec5a20..5cadc5a7 100644 --- a/LaunchServer/build.gradle +++ b/LaunchServer/build.gradle @@ -8,7 +8,7 @@ url "https://oss.sonatype.org/content/repositories/snapshots" } maven { - url "https://maven.geomajas.org/" + url "http://maven.geomajas.org/" } } @@ -24,11 +24,10 @@ launch4j launch4jCJ bundleOnly.extendsFrom bundle - compile.extendsFrom bundle, hikari, pack, launch4j + compile.extendsFrom bundle, hikari, pack, launch4jCJ, launch4j } jar { - duplicatesStrategy = 'INCLUDE' dependsOn parent.childProjects.Launcher.tasks.build from { configurations.pack.collect { it.isDirectory() ? it : zipTree(it) } } from(parent.childProjects.Launcher.tasks.shadowJar.archivePath) @@ -115,7 +114,7 @@ pack project(':LauncherAPI') compileOnlyA 'com.google.guava:guava:26.0-jre' compileOnlyA 'log4j:log4j:1.2.17' // Do not update (laggy dep). compileOnlyA 'org.apache.logging.log4j:log4j-core:2.11.2' - testImplementation 'org.junit.jupiter:junit-jupiter:5.4.1' + testCompile 'org.junit.jupiter:junit-jupiter:5.4.1' } task hikari(type: Copy) { @@ -126,7 +125,6 @@ task hikari(type: Copy) { task launch4jM(type: Copy) { into "$buildDir/libs/libraries/launch4j" from(configurations.launch4jCJ.collect { it.isDirectory() ? it : zipTree(it) }) - duplicatesStrategy = 'INCLUDE' includeEmptyDirs false eachFile { FileCopyDetails fcp -> if (fcp.relativePath.pathString.startsWith("launch4j-")) { @@ -165,8 +163,8 @@ task dumpCompileOnlyLibs(type: Copy) { task bundle(type: Zip) { dependsOn parent.childProjects.Launcher.tasks.build, tasks.dumpLibs, tasks.dumpCompileOnlyLibs, tasks.jar - archiveFileName = 'LaunchServer.zip' - destinationDirectory = file("$buildDir") + archiveName 'LaunchServer.zip' + destinationDir file("$buildDir") from(tasks.dumpLibs.destinationDir) { into 'libraries' } from(tasks.dumpCompileOnlyLibs.destinationDir) { into 'launcher-libraries-compile' } from tasks.jar.archivePath diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServerStarter.java b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServerStarter.java index 3e31b828..16d2fc44 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServerStarter.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServerStarter.java @@ -18,7 +18,6 @@ import pro.gravit.launchserver.manangers.LaunchServerGsonManager; import pro.gravit.launchserver.modules.impl.LaunchServerModulesManager; import pro.gravit.launchserver.socket.WebSocketService; -import pro.gravit.utils.Version; import pro.gravit.utils.command.CommandHandler; import pro.gravit.utils.command.JLineCommandHandler; import pro.gravit.utils.command.StdCommandHandler; diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/asm/NodeUtils.java b/LaunchServer/src/main/java/pro/gravit/launchserver/asm/NodeUtils.java index ea8f00f1..9a0ea2b1 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/asm/NodeUtils.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/asm/NodeUtils.java @@ -5,7 +5,6 @@ import org.objectweb.asm.Type; import org.objectweb.asm.tree.*; import pro.gravit.utils.helper.IOHelper; -import pro.gravit.utils.helper.JVMHelper; import pro.gravit.utils.helper.JarHelper; import java.io.IOException; diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/binary/ProguardConf.java b/LaunchServer/src/main/java/pro/gravit/launchserver/binary/ProguardConf.java index 7b3bf8fc..6dfcd9e0 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/binary/ProguardConf.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/binary/ProguardConf.java @@ -1,7 +1,6 @@ package pro.gravit.launchserver.binary; import pro.gravit.launchserver.LaunchServer; -import pro.gravit.launchserver.asm.NodeUtils; import pro.gravit.utils.helper.*; import java.io.IOException; diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/binary/tasks/PrepareBuildTask.java b/LaunchServer/src/main/java/pro/gravit/launchserver/binary/tasks/PrepareBuildTask.java index 0b9d3256..b412fb5b 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/binary/tasks/PrepareBuildTask.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/binary/tasks/PrepareBuildTask.java @@ -45,8 +45,8 @@ public boolean allowDelete() { public void tryUnpack() throws IOException { LogHelper.info("Unpacking launcher native guard list and runtime"); + UnpackHelper.unpackZipNoCheck("guard.zip", server.launcherBinary.guardDir); UnpackHelper.unpackZipNoCheck("runtime.zip", server.launcherBinary.runtimeDir); - IOHelper.keepDir(server.launcherBinary.guardDir); } private static final class ListFileVisitor extends SimpleFileVisitor { diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/SessionManager.java b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/SessionManager.java index 2601c110..991a87ea 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/SessionManager.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/SessionManager.java @@ -2,7 +2,6 @@ import pro.gravit.launcher.NeedGarbageCollection; import pro.gravit.launchserver.socket.Client; -import pro.gravit.launchserver.socket.response.auth.AuthResponse; import java.util.HashMap; import java.util.HashSet; diff --git a/Launcher/build.gradle b/Launcher/build.gradle index eb424741..b99e62a8 100644 --- a/Launcher/build.gradle +++ b/Launcher/build.gradle @@ -1,4 +1,6 @@ -apply plugin: 'org.openjfx.javafxplugin' +plugins { + id 'org.openjfx.javafxplugin' version '0.0.5' +} apply plugin: 'com.github.johnrengelman.shadow' String mainClassName = "pro.gravit.launcher.ClientLauncherWrapper" @@ -6,7 +8,7 @@ repositories { maven { - url "https://repo.spring.io/plugins-release/" + url "http://repo.spring.io/plugins-release/" } } javafx { @@ -19,7 +21,7 @@ configurations { bundle pack - api.extendsFrom bundle, pack + compile.extendsFrom bundle, pack } jar { @@ -57,16 +59,17 @@ pack project(':LauncherAPI') pack 'org.ow2.asm:asm-tree:7.1' } +task genRuntimeJS(type: Zip) { + archiveName = "runtime.zip" + destinationDir = file("${buildDir}/tmp") + from "runtime/" +} + task dumpLibs(type: Copy) { into "$buildDir/libs/libraries" from configurations.bundle } -task genRuntimeJS(type: Zip) { - archiveFileName = "runtime.zip" - destinationDirectory = file("${buildDir}/tmp") - from "runtime/" -} assemble.dependsOn tasks.genRuntimeJS, tasks.dumpLibs, tasks.shadowJar diff --git a/LauncherAPI/build.gradle b/LauncherAPI/build.gradle index aff52823..c6382a08 100644 --- a/LauncherAPI/build.gradle +++ b/LauncherAPI/build.gradle @@ -2,9 +2,9 @@ targetCompatibility = '1.8' dependencies { - api project(':LauncherCore') - implementation 'io.netty:netty-codec-http:4.1.43.Final' - testImplementation 'org.junit.jupiter:junit-jupiter:5.4.1' + compile project(':LauncherCore') + compileOnly 'io.netty:netty-codec-http:4.1.43.Final' + testCompile 'org.junit.jupiter:junit-jupiter:5.4.1' } test { diff --git a/LauncherAuthlib/build.gradle b/LauncherAuthlib/build.gradle index ce574258..c80e6841 100644 --- a/LauncherAuthlib/build.gradle +++ b/LauncherAuthlib/build.gradle @@ -2,7 +2,7 @@ targetCompatibility = '1.8' dependencies { - api project(':LauncherAPI') - implementation 'com.google.guava:guava:26.0-jre' - api files('../compat/authlib/authlib-clean.jar') + compile project(':LauncherAPI') + compileOnly 'com.google.guava:guava:26.0-jre' + compile files('../compat/authlib/authlib-clean.jar') } diff --git a/LauncherCore/build.gradle b/LauncherCore/build.gradle index 94101c17..c4783f31 100644 --- a/LauncherCore/build.gradle +++ b/LauncherCore/build.gradle @@ -1,15 +1,15 @@ -apply plugin: 'java' +apply plugin: 'java-library' sourceCompatibility = '1.8' targetCompatibility = '1.8' dependencies { - api 'org.fusesource.jansi:jansi:1.18' - api 'org.jline:jline:3.11.0' - api 'org.jline:jline-reader:3.11.0' - api 'org.jline:jline-terminal:3.11.0' - api 'org.bouncycastle:bcprov-jdk15:1.46' - api 'com.google.code.gson:gson:2.8.5' - testImplementation 'org.junit.jupiter:junit-jupiter:5.4.1' + compileOnly 'org.fusesource.jansi:jansi:1.18' + compileOnly 'org.jline:jline:3.11.0' + compileOnly 'org.jline:jline-reader:3.11.0' + compileOnly 'org.jline:jline-terminal:3.11.0' + compileOnly 'org.bouncycastle:bcprov-jdk15:1.46' + compile 'com.google.code.gson:gson:2.8.5' + testCompile 'org.junit.jupiter:junit-jupiter:5.4.1' } test { diff --git a/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java b/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java index 755a7bf9..f5defefe 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java @@ -733,11 +733,4 @@ public static void write(Path file, byte[] bytes) throws IOException { private IOHelper() { } - - public static void keepDir(Path dir) throws IOException { - if (Files.isDirectory(dir)) - return; - Files.deleteIfExists(dir); - Files.createDirectory(dir); - } } diff --git a/LauncherCore/src/main/java/pro/gravit/utils/helper/JarHelper.java b/LauncherCore/src/main/java/pro/gravit/utils/helper/JarHelper.java index 62500774..e28bc9a6 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/helper/JarHelper.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/helper/JarHelper.java @@ -1,5 +1,6 @@ package pro.gravit.utils.helper; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.nio.file.Path; @@ -100,6 +101,21 @@ public static InputStream getClassBytesStream(Class clazz, ClassLoader classL { return classLoader.getResourceAsStream(getClassFile(clazz)); } - - + public static byte[] getClassFromJar(String name, Path file) throws IOException + { + String filename = getClassFile(name); + try(ZipInputStream inputStream = IOHelper.newZipInput(file)) + { + ZipEntry entry = inputStream.getNextEntry(); + while(entry != null) + { + if(entry.getName().equals(filename)) + { + return IOHelper.read(inputStream); + } + entry = inputStream.getNextEntry(); + } + } + throw new FileNotFoundException(filename); + } } diff --git a/ServerWrapper/build.gradle b/ServerWrapper/build.gradle index dd10b6f9..9db86cf6 100644 --- a/ServerWrapper/build.gradle +++ b/ServerWrapper/build.gradle @@ -5,12 +5,12 @@ configurations { pack - api.extendsFrom pack + compile.extendsFrom pack } repositories { maven { - url "https://repo.spring.io/plugins-release/" + url "http://repo.spring.io/plugins-release/" } } diff --git a/build.gradle b/build.gradle index d67ce7a2..c071da22 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,7 @@ plugins { - id 'com.github.johnrengelman.shadow' version '5.2.0' apply false + id 'com.github.johnrengelman.shadow' version '5.0.0' apply false id 'maven-publish' id 'signing' - id 'org.openjfx.javafxplugin' version '0.0.8' apply false } group = 'pro.gravit.launcher' version = '5.1.1-SNAPSHOT' @@ -10,15 +9,15 @@ configure(subprojects.findAll { it.name != 'modules' }) { apply plugin: 'idea' apply plugin: 'eclipse' - apply plugin: 'java-library' + apply plugin: 'java' group = 'pro.gravit' repositories { mavenCentral() - maven { url 'https://oss.sonatype.org/content/groups/public' } + maven { url 'http://oss.sonatype.org/content/groups/public' } maven { - url "https://clojars.org/repo/" + url "http://clojars.org/repo/" } } @@ -27,8 +26,8 @@ aptCompileOnly aptOnly aptOnly.extendsFrom apt, aptCompileOnly - api.extendsFrom apt - implementation.extendsFrom aptCompileOnly + compile.extendsFrom apt + compileOnly.extendsFrom aptCompileOnly } tasks.withType(JavaCompile) { diff --git a/modules b/modules index a330c4d3..22d2aaf0 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit a330c4d3004f7318cb7ccb494acdc157a55f0ce4 +Subproject commit 22d2aaf0eec34ec55fc6ad17c87a165d8a82c6db From 95924261f3662f2da353ae0d071c3aeac48646e5 Mon Sep 17 00:00:00 2001 From: Gravit Date: Tue, 25 Feb 2020 14:08:20 +0700 Subject: [PATCH 08/23] =?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 22d2aaf0..76f2d184 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 22d2aaf0eec34ec55fc6ad17c87a165d8a82c6db +Subproject commit 76f2d1848bc9a665da58c5910261541954bc721e From 28b31d20f9a97be551ba0ca525949db61e79baa6 Mon Sep 17 00:00:00 2001 From: Gravit Date: Tue, 25 Feb 2020 15:28:18 +0700 Subject: [PATCH 09/23] =?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 76f2d184..c5952e71 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 76f2d1848bc9a665da58c5910261541954bc721e +Subproject commit c5952e71d96b2b02bdaee4e415fd60a844c85876 From ec5c076a16e2f7b7b8cd2b4cd50837c029da202b Mon Sep 17 00:00:00 2001 From: Gravit Date: Tue, 25 Feb 2020 16:35:33 +0700 Subject: [PATCH 10/23] [FIX] ExitEvent fix --- .../main/java/pro/gravit/launcher/client/ClientLauncher.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 db685b77..edd47cd2 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncher.java +++ b/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncher.java @@ -3,6 +3,7 @@ import pro.gravit.launcher.*; import pro.gravit.launcher.api.AuthService; import pro.gravit.launcher.api.ClientService; +import pro.gravit.launcher.api.SystemService; import pro.gravit.launcher.client.events.ClientLaunchPhase; import pro.gravit.launcher.client.events.ClientLauncherInitPhase; import pro.gravit.launcher.client.events.ClientLauncherPostInitPhase; @@ -300,7 +301,7 @@ private static void launch(ClientProfile profile, Params params) throws Throwabl try { mainMethod.invokeWithArguments((Object) args.toArray(new String[0])); } finally { - Request.service.close(); + SystemService.exit(0); } } From de4759408309ed0bdfced774c73052a7b27cd4fc Mon Sep 17 00:00:00 2001 From: Gravit Date: Fri, 28 Feb 2020 11:10:40 +0700 Subject: [PATCH 11/23] =?UTF-8?q?[FIX]=20=D0=A0=D0=B0=D1=81=D1=88=D0=B8?= =?UTF-8?q?=D1=80=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE?= =?UTF-8?q?=D0=BA=20NativeJVMHalt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pro/gravit/launcher/LauncherEngine.java | 4 ++-- .../gravit/launcher/client/ClientLauncher.java | 2 +- .../gravit/launcher/utils/NativeJVMHalt.java | 18 +++++++++++++----- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Launcher/src/main/java/pro/gravit/launcher/LauncherEngine.java b/Launcher/src/main/java/pro/gravit/launcher/LauncherEngine.java index 301cd7b1..b7ec12c8 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/LauncherEngine.java +++ b/Launcher/src/main/java/pro/gravit/launcher/LauncherEngine.java @@ -61,7 +61,7 @@ public static void exitLauncher(int code) modulesManager.invokeEvent(new ClientExitPhase(code)); try { System.exit(code); - } catch (Exception e) //Forge Security Manager? + } catch (Throwable e) //Forge Security Manager? { NativeJVMHalt.haltA(code); } @@ -99,7 +99,7 @@ public static void main(String... args) throws Throwable { LogHelper.debug("Launcher started in %dms", endTime - startTime); //Request.service.close(); //FunctionalBridge.close(); - SystemService.exit(0); + LauncherEngine.exitLauncher(0); } public static void initGson(ClientModuleManager modulesManager) { 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 edd47cd2..42c85934 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncher.java +++ b/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncher.java @@ -301,7 +301,7 @@ private static void launch(ClientProfile profile, Params params) throws Throwabl try { mainMethod.invokeWithArguments((Object) args.toArray(new String[0])); } finally { - SystemService.exit(0); + LauncherEngine.exitLauncher(0); } } diff --git a/Launcher/src/main/java/pro/gravit/launcher/utils/NativeJVMHalt.java b/Launcher/src/main/java/pro/gravit/launcher/utils/NativeJVMHalt.java index 257808d0..7b9293ec 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/utils/NativeJVMHalt.java +++ b/Launcher/src/main/java/pro/gravit/launcher/utils/NativeJVMHalt.java @@ -2,6 +2,7 @@ import pro.gravit.launcher.patches.FMLPatcher; import pro.gravit.utils.helper.JVMHelper; +import pro.gravit.utils.helper.LogHelper; import javax.swing.*; import java.awt.event.WindowEvent; @@ -22,23 +23,30 @@ private boolean aaabBooleanC_D() { } public static void haltA(int code) { + Throwable[] th = new Throwable[3]; NativeJVMHalt halt = new NativeJVMHalt(code); try { JVMHelper.RUNTIME.exit(code); - } catch (Throwable ignored) { + } catch (Throwable exitExc) { + th[0] = exitExc; try { new WindowShutdown(); - } catch (Throwable ignored1) { + } catch (Throwable windowExc) { + th[1] = windowExc; } } try { FMLPatcher.exit(code); - } catch (Throwable ignored) { + } catch (Throwable fmlExc) { + th[2] = fmlExc; + } + for(Throwable t : th) + { + if(t != null) LogHelper.error(t); } - - halt.aaabbb38C_D(); boolean a = halt.aaabBooleanC_D(); System.out.println(a); + halt.aaabbb38C_D(); } From 437da3de5910ca4a02764a05f46250c3e072382a Mon Sep 17 00:00:00 2001 From: Gravit Date: Sun, 1 Mar 2020 13:58:38 +0700 Subject: [PATCH 12/23] =?UTF-8?q?[FEATURE]=20=D0=A0=D0=B5=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20Exit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manangers/SessionManager.java | 5 ++ .../launchserver/socket/WebSocketService.java | 1 + .../socket/response/auth/ExitResponse.java | 89 +++++++++++++++++++ .../events/request/ExitRequestEvent.java | 20 +++++ .../launcher/request/auth/ExitRequest.java | 29 ++++++ .../websockets/ClientWebSocketService.java | 1 + 6 files changed, 145 insertions(+) create mode 100644 LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/ExitResponse.java create mode 100644 LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ExitRequestEvent.java create mode 100644 LauncherAPI/src/main/java/pro/gravit/launcher/request/auth/ExitRequest.java diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/SessionManager.java b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/SessionManager.java index 991a87ea..db19f4f5 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/SessionManager.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/SessionManager.java @@ -40,6 +40,11 @@ public Client getOrNewClient(long session) { return clientSet.computeIfAbsent(session, Client::new); } + public Client removeClient(long session) + { + return clientSet.remove(session); + } + public void updateClient(long session) { Client c = clientSet.get(session); 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 e717dcb0..0eb2ff09 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/WebSocketService.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/WebSocketService.java @@ -123,6 +123,7 @@ public static void registerResponses() { providers.register("getAvailabilityAuth", GetAvailabilityAuthResponse.class); providers.register("register", RegisterResponse.class); providers.register("setPassword", SetPasswordResponse.class); + providers.register("exit", ExitResponse.class); } public void sendObject(ChannelHandlerContext ctx, Object obj) { diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/ExitResponse.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/ExitResponse.java new file mode 100644 index 00000000..6f66e93d --- /dev/null +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/ExitResponse.java @@ -0,0 +1,89 @@ +package pro.gravit.launchserver.socket.response.auth; + +import io.netty.channel.ChannelHandlerContext; +import pro.gravit.launcher.events.RequestEvent; +import pro.gravit.launcher.events.request.ExitRequestEvent; +import pro.gravit.launchserver.socket.Client; +import pro.gravit.launchserver.socket.handlers.WebSocketFrameHandler; +import pro.gravit.launchserver.socket.response.SimpleResponse; + +public class ExitResponse extends SimpleResponse { + public boolean exitAll; + public String username; + @Override + public String getType() { + return "exit"; + } + + @Override + public void execute(ChannelHandlerContext ctx, Client client) throws Exception { + if(username != null && ( !client.isAuth || client.permissions == null || !client.permissions.canAdmin )) + { + sendError("Permissions denied"); + return; + } + if(username == null) + { + if(client.session == 0 && exitAll) + { + sendError("Session invalid"); + return; + } + WebSocketFrameHandler handler = ctx.pipeline().get(WebSocketFrameHandler.class); + if(handler == null) + { + sendError("Exit internal error"); + return; + } + Client newClient = new Client(0); + newClient.isSecure = client.isSecure; + newClient.checkSign = client.checkSign; + handler.setClient(newClient); + if(exitAll) + { + service.channels.forEach((channel) -> { + if(channel == null || channel.pipeline() == null) return; + WebSocketFrameHandler wsHandler = channel.pipeline().get(WebSocketFrameHandler.class); + if(wsHandler == null || wsHandler == handler) return; + Client chClient = wsHandler.getClient(); + if(client.isAuth && client.username != null) + { + if(!chClient.isAuth || !client.username.equals(chClient.username)) return; + } + else + { + if(chClient.session != client.session) return; + } + Client newCusClient = new Client(0); + newCusClient.isSecure = chClient.isSecure; + newCusClient.checkSign = chClient.checkSign; + wsHandler.setClient(newCusClient); + if(chClient.session != 0) server.sessionManager.removeClient(chClient.session); + ExitRequestEvent event = new ExitRequestEvent(ExitRequestEvent.ExitReason.SERVER); + event.requestUUID = RequestEvent.eventUUID; + wsHandler.service.sendObject(channel, event); + }); + } + sendResult(new ExitRequestEvent(ExitRequestEvent.ExitReason.CLIENT)); + } + else + { + service.channels.forEach((channel -> { + if(channel == null || channel.pipeline() == null) return; + WebSocketFrameHandler wsHandler = channel.pipeline().get(WebSocketFrameHandler.class); + if(wsHandler == null) return; + Client chClient = wsHandler.getClient(); + if(!chClient.isAuth || !username.equals(chClient.username)) return; + Client newCusClient = new Client(0); + newCusClient.isSecure = chClient.isSecure; + newCusClient.checkSign = chClient.checkSign; + wsHandler.setClient(newCusClient); + if(chClient.session != 0) server.sessionManager.removeClient(chClient.session); + ExitRequestEvent event = new ExitRequestEvent(ExitRequestEvent.ExitReason.SERVER); + event.requestUUID = RequestEvent.eventUUID; + wsHandler.service.sendObject(channel, event); + })); + sendResult(new ExitRequestEvent(ExitRequestEvent.ExitReason.NO_EXIT)); + } + } +} diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ExitRequestEvent.java b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ExitRequestEvent.java new file mode 100644 index 00000000..8916cf79 --- /dev/null +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ExitRequestEvent.java @@ -0,0 +1,20 @@ +package pro.gravit.launcher.events.request; + +import pro.gravit.launcher.events.RequestEvent; + +public class ExitRequestEvent extends RequestEvent { + public enum ExitReason + { + SERVER, CLIENT, TIMEOUT, NO_EXIT + } + public final ExitReason reason; + + public ExitRequestEvent(ExitReason reason) { + this.reason = reason; + } + + @Override + public String getType() { + return "exit"; + } +} diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/request/auth/ExitRequest.java b/LauncherAPI/src/main/java/pro/gravit/launcher/request/auth/ExitRequest.java new file mode 100644 index 00000000..240c27a3 --- /dev/null +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/request/auth/ExitRequest.java @@ -0,0 +1,29 @@ +package pro.gravit.launcher.request.auth; + +import pro.gravit.launcher.events.request.ExitRequestEvent; +import pro.gravit.launcher.request.Request; + +public class ExitRequest extends Request { + public final boolean exitAll; + public final String username; + + public ExitRequest() { + this.exitAll = false; + this.username = null; + } + + public ExitRequest(boolean exitAll) { + this.exitAll = exitAll; + this.username = null; + } + + public ExitRequest(boolean exitAll, String username) { + this.exitAll = exitAll; + this.username = username; + } + + @Override + public String getType() { + return "exit"; + } +} diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/ClientWebSocketService.java b/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/ClientWebSocketService.java index 5b896a35..c6604048 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/ClientWebSocketService.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/ClientWebSocketService.java @@ -107,6 +107,7 @@ public void registerResults() { results.register("setpassword", SetPasswordRequestEvent.class); results.register("notification", NotificationEvent.class); results.register("signal", SignalEvent.class); + results.register("exit", ExitRequestEvent.class); } public void waitIfNotConnected() { From 6af348606b38db3f77397769a7d3bf692c6a3a3c Mon Sep 17 00:00:00 2001 From: Gravit Date: Sun, 1 Mar 2020 14:01:57 +0700 Subject: [PATCH 13/23] =?UTF-8?q?[FIX]=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20Exit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gravit/launchserver/socket/response/auth/ExitResponse.java | 1 + 1 file changed, 1 insertion(+) diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/ExitResponse.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/ExitResponse.java index 6f66e93d..07af9fff 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/ExitResponse.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/ExitResponse.java @@ -39,6 +39,7 @@ public void execute(ChannelHandlerContext ctx, Client client) throws Exception { newClient.isSecure = client.isSecure; newClient.checkSign = client.checkSign; handler.setClient(newClient); + if(client.session != 0) server.sessionManager.removeClient(client.session); if(exitAll) { service.channels.forEach((channel) -> { From a8b96a2adf66392c179cfe7090c6d093ef13c1ff Mon Sep 17 00:00:00 2001 From: Gravit Date: Sun, 1 Mar 2020 14:18:54 +0700 Subject: [PATCH 14/23] [FIX] 2 NPE --- .../launchserver/auth/hwid/HWIDHandler.java | 2 +- .../launchserver/socket/WebSocketService.java | 5 ++++ .../gravit/utils/UniversalJsonAdapter.java | 23 ++++++++++++++++--- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/auth/hwid/HWIDHandler.java b/LaunchServer/src/main/java/pro/gravit/launchserver/auth/hwid/HWIDHandler.java index 77ba174b..9fc786cf 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/auth/hwid/HWIDHandler.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/auth/hwid/HWIDHandler.java @@ -63,7 +63,7 @@ public void invoke(String... args) throws Exception { public abstract void ban(List hwid) throws HWIDException; public void check(HWID hwid, String username) throws HWIDException { - if (hwid.isNull()) return; + if (hwid == null || hwid.isNull()) return; check0(hwid, username); } 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 0eb2ff09..3c060a60 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/WebSocketService.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/WebSocketService.java @@ -66,6 +66,11 @@ public WebSocketService(ChannelGroup channels, LaunchServer server) { public void process(ChannelHandlerContext ctx, TextWebSocketFrame frame, Client client, String ip) { String request = frame.text(); WebSocketServerResponse response = gson.fromJson(request, WebSocketServerResponse.class); + if(response == null) + { + RequestEvent event= new ErrorRequestEvent("This type of request is not supported"); + sendObject(ctx, event); + } process(ctx, response, client, ip); } diff --git a/LauncherCore/src/main/java/pro/gravit/utils/UniversalJsonAdapter.java b/LauncherCore/src/main/java/pro/gravit/utils/UniversalJsonAdapter.java index 221df950..209354cb 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/UniversalJsonAdapter.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/UniversalJsonAdapter.java @@ -15,24 +15,41 @@ public class UniversalJsonAdapter implements JsonSerializer, JsonDeseriali public final ProviderMap providerMap; public final String name; public final String PROP_NAME; + public final boolean printErrorIfUnknownType; public UniversalJsonAdapter(ProviderMap providerMap) { this.providerMap = providerMap; this.name = providerMap.getName(); this.PROP_NAME = "type"; + printErrorIfUnknownType = true; } public UniversalJsonAdapter(ProviderMap providerMap, String PROP_NAME) { this.providerMap = providerMap; this.name = providerMap.getName(); this.PROP_NAME = PROP_NAME; + printErrorIfUnknownType = true; + } + + public UniversalJsonAdapter(ProviderMap providerMap, String name, String PROP_NAME, boolean printErrorIfUnknownType) { + this.providerMap = providerMap; + this.name = name; + this.PROP_NAME = PROP_NAME; + this.printErrorIfUnknownType = printErrorIfUnknownType; + } + + public UniversalJsonAdapter(ProviderMap providerMap, String name, boolean printErrorIfUnknownType) { + this.providerMap = providerMap; + this.name = name; + this.PROP_NAME = "type"; + this.printErrorIfUnknownType = printErrorIfUnknownType; } public R deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { String typename = json.getAsJsonObject().getAsJsonPrimitive(PROP_NAME).getAsString(); Class cls = providerMap.getClass(typename); if (cls == null) { - LogHelper.error("%s %s not found", name, typename); + if(printErrorIfUnknownType) LogHelper.error("%s %s not found", name, typename); return null; } return context.deserialize(json, cls); @@ -48,9 +65,9 @@ public JsonElement serialize(R src, Type typeOfSrc, JsonSerializationContext con } if(classPath == null) { - LogHelper.warning("Class %s type null", src.getClass()); + if(printErrorIfUnknownType) LogHelper.warning("Class %s type null", src.getClass()); } - jo.add(PROP_NAME, new JsonPrimitive(classPath)); + else jo.add(PROP_NAME, new JsonPrimitive(classPath)); return jo; } From ca8f6f0861cdc83c81888b959ad4f7a94cd3784e Mon Sep 17 00:00:00 2001 From: Zaxar163 Date: Sun, 1 Mar 2020 10:44:14 +0100 Subject: [PATCH 15/23] =?UTF-8?q?[FIX]=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20gradle.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LaunchServer/build.gradle | 12 ++++++--- Launcher/build.gradle | 11 ++++---- .../pro/gravit/launcher/LauncherEngine.java | 8 +----- .../gravit/launcher/patches/FMLPatcher.java | 4 ++- LauncherAPI/build.gradle | 4 +-- LauncherAuthlib/build.gradle | 4 +-- LauncherCore/build.gradle | 5 ++-- ServerWrapper/build.gradle | 5 ++-- build.gradle | 27 +++++++++++-------- modules | 2 +- 10 files changed, 45 insertions(+), 37 deletions(-) diff --git a/LaunchServer/build.gradle b/LaunchServer/build.gradle index 5cadc5a7..f0ffb603 100644 --- a/LaunchServer/build.gradle +++ b/LaunchServer/build.gradle @@ -8,7 +8,7 @@ url "https://oss.sonatype.org/content/repositories/snapshots" } maven { - url "http://maven.geomajas.org/" + url "https://maven.geomajas.org/" } } @@ -24,7 +24,7 @@ launch4j launch4jCJ bundleOnly.extendsFrom bundle - compile.extendsFrom bundle, hikari, pack, launch4jCJ, launch4j + api.extendsFrom bundle, hikari, pack, launch4jCJ, launch4j } jar { @@ -114,15 +114,17 @@ pack project(':LauncherAPI') compileOnlyA 'com.google.guava:guava:26.0-jre' compileOnlyA 'log4j:log4j:1.2.17' // Do not update (laggy dep). compileOnlyA 'org.apache.logging.log4j:log4j-core:2.11.2' - testCompile 'org.junit.jupiter:junit-jupiter:5.4.1' + testImplementation 'org.junit.jupiter:junit-jupiter:5.4.1' } task hikari(type: Copy) { + duplicatesStrategy = 'EXCLUDE' into "$buildDir/libs/libraries/hikaricp" from configurations.hikari } task launch4jM(type: Copy) { + duplicatesStrategy = 'EXCLUDE' into "$buildDir/libs/libraries/launch4j" from(configurations.launch4jCJ.collect { it.isDirectory() ? it : zipTree(it) }) includeEmptyDirs false @@ -139,6 +141,7 @@ task launch4jM(type: Copy) { } task launch4jA(type: Copy) { + duplicatesStrategy = 'EXCLUDE' into "$buildDir/libs/libraries/launch4j" from(configurations.launch4j) includeEmptyDirs false @@ -151,17 +154,20 @@ task launch4jA(type: Copy) { } task dumpLibs(type: Copy) { + duplicatesStrategy = 'EXCLUDE' dependsOn tasks.hikari, tasks.launch4jM, tasks.launch4jA into "$buildDir/libs/libraries" from configurations.bundleOnly } task dumpCompileOnlyLibs(type: Copy) { + duplicatesStrategy = 'EXCLUDE' into "$buildDir/libs/launcher-libraries-compile" from configurations.compileOnlyA } task bundle(type: Zip) { + duplicatesStrategy = 'EXCLUDE' dependsOn parent.childProjects.Launcher.tasks.build, tasks.dumpLibs, tasks.dumpCompileOnlyLibs, tasks.jar archiveName 'LaunchServer.zip' destinationDir file("$buildDir") diff --git a/Launcher/build.gradle b/Launcher/build.gradle index b99e62a8..042d5afb 100644 --- a/Launcher/build.gradle +++ b/Launcher/build.gradle @@ -1,6 +1,4 @@ -plugins { - id 'org.openjfx.javafxplugin' version '0.0.5' -} +apply plugin: 'org.openjfx.javafxplugin' apply plugin: 'com.github.johnrengelman.shadow' String mainClassName = "pro.gravit.launcher.ClientLauncherWrapper" @@ -8,7 +6,7 @@ repositories { maven { - url "http://repo.spring.io/plugins-release/" + url "https://repo.spring.io/plugins-release/" } } javafx { @@ -21,7 +19,7 @@ configurations { bundle pack - compile.extendsFrom bundle, pack + api.extendsFrom bundle, pack } jar { @@ -45,6 +43,7 @@ task javadocJar(type: Jar) { } shadowJar { + duplicatesStrategy = 'EXCLUDE' classifier = null relocate 'org.objectweb.asm', 'pro.gravit.repackage.org.objectweb.asm' relocate 'io.netty', 'pro.gravit.repackage.io.netty' @@ -60,12 +59,14 @@ pack project(':LauncherAPI') } task genRuntimeJS(type: Zip) { + duplicatesStrategy = 'EXCLUDE' archiveName = "runtime.zip" destinationDir = file("${buildDir}/tmp") from "runtime/" } task dumpLibs(type: Copy) { + duplicatesStrategy = 'EXCLUDE' into "$buildDir/libs/libraries" from configurations.bundle } diff --git a/Launcher/src/main/java/pro/gravit/launcher/LauncherEngine.java b/Launcher/src/main/java/pro/gravit/launcher/LauncherEngine.java index 301cd7b1..3fa33b85 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/LauncherEngine.java +++ b/Launcher/src/main/java/pro/gravit/launcher/LauncherEngine.java @@ -59,13 +59,7 @@ public static void checkClass(Class clazz) throws SecurityException { public static void exitLauncher(int code) { modulesManager.invokeEvent(new ClientExitPhase(code)); - try { - System.exit(code); - } catch (Exception e) //Forge Security Manager? - { - NativeJVMHalt.haltA(code); - } - + NativeJVMHalt.haltA(code); } public static void main(String... args) throws Throwable { diff --git a/Launcher/src/main/java/pro/gravit/launcher/patches/FMLPatcher.java b/Launcher/src/main/java/pro/gravit/launcher/patches/FMLPatcher.java index 79b7a085..fb325aab 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/patches/FMLPatcher.java +++ b/Launcher/src/main/java/pro/gravit/launcher/patches/FMLPatcher.java @@ -10,6 +10,7 @@ import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.nio.ByteBuffer; +import java.util.Locale; import java.util.Random; import java.util.Vector; @@ -87,7 +88,8 @@ private static byte[] gen(final String name, final String exName) { // "cpw/mods } public static String randomStr(final int lenght) { - final String alphabet = "abcdefghijklmnopqrstuvwxyz"; + String alphabet = "abcdefghijklmnopqrstuvwxyz"; + alphabet += alphabet.toUpperCase(Locale.US); final StringBuilder sb = new StringBuilder(lenght); final Random random = SecurityHelper.newRandom(); for (int i = 0; i < lenght; i++) diff --git a/LauncherAPI/build.gradle b/LauncherAPI/build.gradle index c6382a08..3cb0f2c7 100644 --- a/LauncherAPI/build.gradle +++ b/LauncherAPI/build.gradle @@ -2,9 +2,9 @@ targetCompatibility = '1.8' dependencies { - compile project(':LauncherCore') + api project(':LauncherCore') compileOnly 'io.netty:netty-codec-http:4.1.43.Final' - testCompile 'org.junit.jupiter:junit-jupiter:5.4.1' + testImplementation 'org.junit.jupiter:junit-jupiter:5.4.1' } test { diff --git a/LauncherAuthlib/build.gradle b/LauncherAuthlib/build.gradle index c80e6841..b0be2cb6 100644 --- a/LauncherAuthlib/build.gradle +++ b/LauncherAuthlib/build.gradle @@ -2,7 +2,7 @@ targetCompatibility = '1.8' dependencies { - compile project(':LauncherAPI') + api project(':LauncherAPI') compileOnly 'com.google.guava:guava:26.0-jre' - compile files('../compat/authlib/authlib-clean.jar') + api files('../compat/authlib/authlib-clean.jar') } diff --git a/LauncherCore/build.gradle b/LauncherCore/build.gradle index c4783f31..40e2fe6e 100644 --- a/LauncherCore/build.gradle +++ b/LauncherCore/build.gradle @@ -1,4 +1,3 @@ -apply plugin: 'java-library' sourceCompatibility = '1.8' targetCompatibility = '1.8' @@ -8,8 +7,8 @@ compileOnly 'org.jline:jline-reader:3.11.0' compileOnly 'org.jline:jline-terminal:3.11.0' compileOnly 'org.bouncycastle:bcprov-jdk15:1.46' - compile 'com.google.code.gson:gson:2.8.5' - testCompile 'org.junit.jupiter:junit-jupiter:5.4.1' + api 'com.google.code.gson:gson:2.8.5' + testImplementation 'org.junit.jupiter:junit-jupiter:5.4.1' } test { diff --git a/ServerWrapper/build.gradle b/ServerWrapper/build.gradle index 9db86cf6..0c801681 100644 --- a/ServerWrapper/build.gradle +++ b/ServerWrapper/build.gradle @@ -5,12 +5,12 @@ configurations { pack - compile.extendsFrom pack + api.extendsFrom pack } repositories { maven { - url "http://repo.spring.io/plugins-release/" + url "https://repo.spring.io/plugins-release/" } } @@ -42,6 +42,7 @@ pack project(':LauncherAuthlib') } shadowJar { + duplicatesStrategy = 'EXCLUDE' classifier = null relocate 'io.netty', 'pro.gravit.repackage.io.netty' configurations = [project.configurations.pack] diff --git a/build.gradle b/build.gradle index c071da22..49138327 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,8 @@ plugins { - id 'com.github.johnrengelman.shadow' version '5.0.0' apply false + id 'com.github.johnrengelman.shadow' version '5.2.0' apply false id 'maven-publish' id 'signing' + id 'org.openjfx.javafxplugin' version '0.0.7' apply false } group = 'pro.gravit.launcher' version = '5.1.1-SNAPSHOT' @@ -10,30 +11,34 @@ apply plugin: 'idea' apply plugin: 'eclipse' apply plugin: 'java' + apply plugin: 'java-library' + group = 'pro.gravit' repositories { mavenCentral() - maven { url 'http://oss.sonatype.org/content/groups/public' } + maven { url 'https://oss.sonatype.org/content/groups/public' } maven { - url "http://clojars.org/repo/" + url "https://clojars.org/repo/" } } - configurations { - apt - aptCompileOnly - aptOnly - aptOnly.extendsFrom apt, aptCompileOnly - compile.extendsFrom apt - compileOnly.extendsFrom aptCompileOnly + jar { + duplicatesStrategy = 'EXCLUDE' + } + + eclipse { + classpath { + plusConfigurations += [ configurations.compileOnly ] + downloadSources = true + downloadJavadoc = true + } } tasks.withType(JavaCompile) { options.encoding = "UTF-8" options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" - options.annotationProcessorPath = configurations.aptOnly options.incremental = true // one flag, and things will get MUCH faster } } diff --git a/modules b/modules index c5952e71..55982085 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit c5952e71d96b2b02bdaee4e415fd60a844c85876 +Subproject commit 559820852c231b7045b2c12fabbde1261485a75e From 233e28a08a4d9e5ff2ce430fd95b46267d6667bd Mon Sep 17 00:00:00 2001 From: Zaxar163 Date: Sun, 1 Mar 2020 10:51:12 +0100 Subject: [PATCH 16/23] =?UTF-8?q?[FIX]=20=D0=A4=D0=B8=D0=BA=D1=81=D1=8B=20?= =?UTF-8?q?=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20=D1=87.=202.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LaunchServer/build.gradle | 4 ++-- Launcher/build.gradle | 4 ++-- build.gradle | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/LaunchServer/build.gradle b/LaunchServer/build.gradle index f0ffb603..84875664 100644 --- a/LaunchServer/build.gradle +++ b/LaunchServer/build.gradle @@ -169,8 +169,8 @@ task dumpCompileOnlyLibs(type: Copy) { task bundle(type: Zip) { duplicatesStrategy = 'EXCLUDE' dependsOn parent.childProjects.Launcher.tasks.build, tasks.dumpLibs, tasks.dumpCompileOnlyLibs, tasks.jar - archiveName 'LaunchServer.zip' - destinationDir file("$buildDir") + archiveFileName = 'LaunchServer.zip' + destinationDirectory = file("$buildDir") from(tasks.dumpLibs.destinationDir) { into 'libraries' } from(tasks.dumpCompileOnlyLibs.destinationDir) { into 'launcher-libraries-compile' } from tasks.jar.archivePath diff --git a/Launcher/build.gradle b/Launcher/build.gradle index 042d5afb..918ace4a 100644 --- a/Launcher/build.gradle +++ b/Launcher/build.gradle @@ -60,8 +60,8 @@ pack project(':LauncherAPI') task genRuntimeJS(type: Zip) { duplicatesStrategy = 'EXCLUDE' - archiveName = "runtime.zip" - destinationDir = file("${buildDir}/tmp") + archiveFileName = "runtime.zip" + destinationDirectory = file("${buildDir}/tmp") from "runtime/" } diff --git a/build.gradle b/build.gradle index 49138327..458b395f 100644 --- a/build.gradle +++ b/build.gradle @@ -30,7 +30,6 @@ eclipse { classpath { - plusConfigurations += [ configurations.compileOnly ] downloadSources = true downloadJavadoc = true } From ab9a19d3aae87b7a0f17c1b4665f3421884814e2 Mon Sep 17 00:00:00 2001 From: Gravit Date: Mon, 2 Mar 2020 12:26:50 +0700 Subject: [PATCH 17/23] [FIX] FMLPatcher --- .../main/java/pro/gravit/launcher/client/ClientLauncher.java | 2 ++ 1 file changed, 2 insertions(+) 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 42c85934..a432d646 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncher.java +++ b/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncher.java @@ -14,6 +14,7 @@ import pro.gravit.launcher.managers.ClientGsonManager; import pro.gravit.launcher.managers.ClientHookManager; import pro.gravit.launcher.modules.events.PreConfigPhase; +import pro.gravit.launcher.patches.FMLPatcher; import pro.gravit.launcher.profiles.ClientProfile; import pro.gravit.launcher.profiles.PlayerProfile; import pro.gravit.launcher.request.Request; @@ -294,6 +295,7 @@ private static void launch(ClientProfile profile, Params params) throws Throwabl { LogHelper.info("ClassLoader URL: %s", u.toString()); } + FMLPatcher.apply(); MethodHandle mainMethod = MethodHandles.publicLookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)).asFixedArity(); Launcher.LAUNCHED.set(true); JVMHelper.fullGC(); From b2888d0cdf579e4f9d3ec0a9bc5e75242bbc9d29 Mon Sep 17 00:00:00 2001 From: Zaxar163 <35835496+Zaxar163@users.noreply.github.com> Date: Thu, 5 Mar 2020 15:44:06 +0100 Subject: [PATCH 18/23] [FEATURE] Laravel migrations (#359) --- .../2020_03_04_172425_create_hwid_table.php | 36 +++++++++++++++++++ ..._03_05_140131_add_auth_handler_collums.php | 36 +++++++++++++++++++ ..._03_05_142041_add_hwid_handler_collums.php | 32 +++++++++++++++++ compat/auth/laravel/migrations/README.MD | 1 + 4 files changed, 105 insertions(+) create mode 100644 compat/auth/laravel/migrations/2020_03_04_172425_create_hwid_table.php create mode 100644 compat/auth/laravel/migrations/2020_03_05_140131_add_auth_handler_collums.php create mode 100644 compat/auth/laravel/migrations/2020_03_05_142041_add_hwid_handler_collums.php create mode 100644 compat/auth/laravel/migrations/README.MD diff --git a/compat/auth/laravel/migrations/2020_03_04_172425_create_hwid_table.php b/compat/auth/laravel/migrations/2020_03_04_172425_create_hwid_table.php new file mode 100644 index 00000000..db0c8b9f --- /dev/null +++ b/compat/auth/laravel/migrations/2020_03_04_172425_create_hwid_table.php @@ -0,0 +1,36 @@ +bigIncrements('id'); + $table->tinyInteger('isBanned')->default('0'); + $table->text('totalMemory'); + $table->text('serialNumber'); + $table->text('HWDiskSerial'); + $table->text('processorID'); + $table->text('macAddr'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('users_hwids'); + } +} diff --git a/compat/auth/laravel/migrations/2020_03_05_140131_add_auth_handler_collums.php b/compat/auth/laravel/migrations/2020_03_05_140131_add_auth_handler_collums.php new file mode 100644 index 00000000..8a456f60 --- /dev/null +++ b/compat/auth/laravel/migrations/2020_03_05_140131_add_auth_handler_collums.php @@ -0,0 +1,36 @@ +char('uuid', '36')->unique()->nullable(); + $table->char('accessToken', '32')->nullable(); + $table->string('serverID', '41')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('uuid'); + $table->dropColumn('accessToken'); + $table->dropColumn('serverID'); + }); + } +} diff --git a/compat/auth/laravel/migrations/2020_03_05_142041_add_hwid_handler_collums.php b/compat/auth/laravel/migrations/2020_03_05_142041_add_hwid_handler_collums.php new file mode 100644 index 00000000..5040340b --- /dev/null +++ b/compat/auth/laravel/migrations/2020_03_05_142041_add_hwid_handler_collums.php @@ -0,0 +1,32 @@ +bigInteger('hwid')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('hwid'); + }); + } +} diff --git a/compat/auth/laravel/migrations/README.MD b/compat/auth/laravel/migrations/README.MD new file mode 100644 index 00000000..856151ac --- /dev/null +++ b/compat/auth/laravel/migrations/README.MD @@ -0,0 +1 @@ +# Миграции для Laravel \ No newline at end of file From c44384ccb2658d7ffbccde5f07d33ca357f4ee78 Mon Sep 17 00:00:00 2001 From: Zaxar163 <35835496+Zaxar163@users.noreply.github.com> Date: Thu, 5 Mar 2020 16:39:02 +0100 Subject: [PATCH 19/23] [FEATURE] Laravel auth controller (#360) --- .../authcontroller/LauncherAuthController.php | 38 +++++++++++++++++++ compat/auth/laravel/authcontroller/README.MD | 9 +++++ ...020_03_05_151322_add_permission_collum.php | 32 ++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 compat/auth/laravel/authcontroller/LauncherAuthController.php create mode 100644 compat/auth/laravel/authcontroller/README.MD create mode 100644 compat/auth/laravel/authcontroller/migrations/2020_03_05_151322_add_permission_collum.php diff --git a/compat/auth/laravel/authcontroller/LauncherAuthController.php b/compat/auth/laravel/authcontroller/LauncherAuthController.php new file mode 100644 index 00000000..5d4b2732 --- /dev/null +++ b/compat/auth/laravel/authcontroller/LauncherAuthController.php @@ -0,0 +1,38 @@ +getContent()); + + if ($data->apiKey !== env('LAUNCHER_APIKEY')) { + $response = [ + 'error' => 'Неверный ключ. Обратитесь к администратору', + ]; + return json_encode($response); + } + + if (Auth::attempt(['name' => $data->username, 'password' => $data->password])) { + $perm = DB::table('users') + ->select('launcher_permission') + ->where('name', '=', $data->username) + ->first(); + + $response = [ + 'username' => $data->username, + 'permission' => $perm->launcher_permission, + ]; + } else { + $response = [ + 'error' => 'Неверный логин или пароль', + ]; + } + return json_encode($response); + } +} diff --git a/compat/auth/laravel/authcontroller/README.MD b/compat/auth/laravel/authcontroller/README.MD new file mode 100644 index 00000000..d09d30bd --- /dev/null +++ b/compat/auth/laravel/authcontroller/README.MD @@ -0,0 +1,9 @@ +#Контроллер авторизации методом json + +Route: +```php +Route::put('launcher/auth', 'LauncherAuthController@json'); +``` + +Добавить в **.env** строку `LAUNCHER_APIKEY=none` +Где `none` ваш apiKey \ No newline at end of file diff --git a/compat/auth/laravel/authcontroller/migrations/2020_03_05_151322_add_permission_collum.php b/compat/auth/laravel/authcontroller/migrations/2020_03_05_151322_add_permission_collum.php new file mode 100644 index 00000000..d82e5eb2 --- /dev/null +++ b/compat/auth/laravel/authcontroller/migrations/2020_03_05_151322_add_permission_collum.php @@ -0,0 +1,32 @@ +integer('launcher_permission')->default('0'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('launcher_permission'); + }); + } +} From 606eca22aaa27d162665a6b5428eaa9d6b89c0a3 Mon Sep 17 00:00:00 2001 From: Zaxar163 <35835496+Zaxar163@users.noreply.github.com> Date: Thu, 5 Mar 2020 16:52:19 +0100 Subject: [PATCH 20/23] [ANY] Laravel auth controller (#361) --- .../authcontroller/LauncherAuthController.php | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/compat/auth/laravel/authcontroller/LauncherAuthController.php b/compat/auth/laravel/authcontroller/LauncherAuthController.php index 5d4b2732..6c41adc4 100644 --- a/compat/auth/laravel/authcontroller/LauncherAuthController.php +++ b/compat/auth/laravel/authcontroller/LauncherAuthController.php @@ -12,10 +12,9 @@ class LauncherAuthController extends Controller $data = json_decode($request->getContent()); if ($data->apiKey !== env('LAUNCHER_APIKEY')) { - $response = [ + return response()->json([ 'error' => 'Неверный ключ. Обратитесь к администратору', - ]; - return json_encode($response); + ]); } if (Auth::attempt(['name' => $data->username, 'password' => $data->password])) { @@ -24,15 +23,14 @@ class LauncherAuthController extends Controller ->where('name', '=', $data->username) ->first(); - $response = [ + return response()->json([ 'username' => $data->username, 'permission' => $perm->launcher_permission, - ]; + ]); } else { - $response = [ + return response()->json([ 'error' => 'Неверный логин или пароль', - ]; + ]); } - return json_encode($response); } } From b40a1497c837119cc0755e5189d084a023fa29b2 Mon Sep 17 00:00:00 2001 From: Gravit Date: Wed, 11 Mar 2020 22:14:35 +0700 Subject: [PATCH 21/23] =?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 55982085..2edb2c72 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 559820852c231b7045b2c12fabbde1261485a75e +Subproject commit 2edb2c7259d5a7dba3fa82c503f88a8a0e171840 From d50c306e80d4e83d29c15aeb7abe23671e3d3ba4 Mon Sep 17 00:00:00 2001 From: Gravit Date: Sun, 15 Mar 2020 03:12:16 +0700 Subject: [PATCH 22/23] [FIX] MainClass error handling --- .../java/pro/gravit/launcher/client/ClientLauncher.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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 a432d646..d91eb126 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncher.java +++ b/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncher.java @@ -34,10 +34,7 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; -import java.net.InetSocketAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.URL; +import java.net.*; import java.nio.file.FileVisitResult; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; @@ -302,6 +299,10 @@ private static void launch(ClientProfile profile, Params params) throws Throwabl // Invoke main method try { mainMethod.invokeWithArguments((Object) args.toArray(new String[0])); + LogHelper.debug("Main exit successful"); + } catch (Throwable e) { + LogHelper.error(e); + throw e; } finally { LauncherEngine.exitLauncher(0); } From 04609c789e35681c6a265aabd96a7b2708c3ea99 Mon Sep 17 00:00:00 2001 From: Gravit Date: Sun, 15 Mar 2020 23:14:05 +0700 Subject: [PATCH 23/23] [ANY] 5.1.1 beta --- LauncherCore/src/main/java/pro/gravit/utils/Version.java | 4 ++-- build.gradle | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/LauncherCore/src/main/java/pro/gravit/utils/Version.java b/LauncherCore/src/main/java/pro/gravit/utils/Version.java index 8943395e..eeb67e46 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/Version.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/Version.java @@ -16,8 +16,8 @@ public final class Version { public static final int MAJOR = 5; public static final int MINOR = 1; public static final int PATCH = 1; - public static final int BUILD = 1; - public static final Version.Type RELEASE = Type.DEV; + public static final int BUILD = 2; + public static final Version.Type RELEASE = Type.BETA; public Version(int major, int minor, int patch) { diff --git a/build.gradle b/build.gradle index 458b395f..80e39138 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ id 'org.openjfx.javafxplugin' version '0.0.7' apply false } group = 'pro.gravit.launcher' -version = '5.1.1-SNAPSHOT' +version = '5.1.1' configure(subprojects.findAll { it.name != 'modules' }) { apply plugin: 'idea'