mirror of
https://github.com/GravitLauncher/Launcher
synced 2024-12-23 00:51:01 +03:00
Merge branch 'release/5.2.10'
This commit is contained in:
commit
7254a197a1
26 changed files with 309 additions and 106 deletions
|
@ -75,7 +75,7 @@ task cleanjar(type: Jar, dependsOn: jar) {
|
|||
dependencies {
|
||||
pack project(':LauncherAPI')
|
||||
bundle group: 'me.tongfei', name: 'progressbar', version: '0.9.2'
|
||||
bundle group: 'com.github.Marcono1234', name: 'gson-record-type-adapter-factory', version: 'v0.1.0'
|
||||
bundle group: 'com.github.Marcono1234', name: 'gson-record-type-adapter-factory', version: 'v0.2.0'
|
||||
bundle group: 'org.fusesource.jansi', name: 'jansi', version: rootProject['verJansi']
|
||||
bundle group: 'org.jline', name: 'jline', version: rootProject['verJline']
|
||||
bundle group: 'org.jline', name: 'jline-reader', version: rootProject['verJline']
|
||||
|
@ -84,8 +84,6 @@ pack project(':LauncherAPI')
|
|||
bundle group: 'org.ow2.asm', name: 'asm-commons', version: rootProject['verAsm']
|
||||
bundle group: 'io.netty', name: 'netty-all', version: rootProject['verNetty']
|
||||
bundle group: 'org.slf4j', name: 'slf4j-api', version: rootProject['verSlf4j']
|
||||
bundle group: 'org.hibernate', name: 'hibernate-core', version: rootProject['verHibernate']
|
||||
bundle group: 'org.hibernate', name: 'hibernate-hikaricp', version: rootProject['verHibernate']
|
||||
bundle group: 'mysql', name: 'mysql-connector-java', version: rootProject['verMySQLConn']
|
||||
bundle group: 'org.postgresql', name: 'postgresql', version: rootProject['verPostgreSQLConn']
|
||||
bundle group: 'com.guardsquare', name: 'proguard-base', version: rootProject['verProguard']
|
||||
|
@ -96,8 +94,8 @@ pack project(':LauncherAPI')
|
|||
bundle group: 'io.jsonwebtoken', name: 'jjwt-gson', version: rootProject['verJwt']
|
||||
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: rootProject['verJunit']
|
||||
|
||||
hikari 'io.micrometer:micrometer-core:1.7.2'
|
||||
hikari('com.zaxxer:HikariCP:5.0.0') {
|
||||
hikari 'io.micrometer:micrometer-core:1.8.4'
|
||||
hikari('com.zaxxer:HikariCP:5.0.1') {
|
||||
exclude group: 'javassist'
|
||||
exclude group: 'io.micrometer'
|
||||
exclude group: 'org.slf4j'
|
||||
|
|
|
@ -363,6 +363,19 @@ public Map<String, String> getProperties() {
|
|||
}
|
||||
return properties;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "HttpUser{" +
|
||||
"username='" + username + '\'' +
|
||||
", uuid=" + uuid +
|
||||
", serverId='" + serverId + '\'' +
|
||||
", accessToken='" + accessToken + '\'' +
|
||||
", permissions=" + permissions +
|
||||
", assets=" + getAssets() +
|
||||
", properties=" + properties +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
public static class HttpUserSession implements UserSession {
|
||||
|
@ -393,5 +406,14 @@ public User getUser() {
|
|||
public long getExpireIn() {
|
||||
return expireIn;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "HttpUserSession{" +
|
||||
"id='" + id + '\'' +
|
||||
", user=" + user +
|
||||
", expireIn=" + expireIn +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ public boolean allowGetSecureLevelInfo(Client client) {
|
|||
@Override
|
||||
public void onHardwareReport(HardwareReportResponse response, Client client) {
|
||||
if (!enableHardwareFeature) {
|
||||
response.sendResult(new HardwareReportRequestEvent(createHardwareToken(client.username, response.hardware)));
|
||||
response.sendResult(new HardwareReportRequestEvent(null));
|
||||
return;
|
||||
}
|
||||
if (!client.isAuth || client.trustLevel == null || client.trustLevel.publicKey == null) {
|
||||
|
@ -73,11 +73,14 @@ public void onHardwareReport(HardwareReportResponse response, Client client) {
|
|||
throw new SecurityException("Your hardware banned");
|
||||
}
|
||||
client.trustLevel.hardwareInfo = hardware.getHardwareInfo();
|
||||
response.sendResult(new HardwareReportRequestEvent(createHardwareToken(client.username, hardware)));
|
||||
return;
|
||||
} else {
|
||||
logger.error("AuthCoreProvider not supported hardware");
|
||||
response.sendError("AuthCoreProvider not supported hardware");
|
||||
return;
|
||||
}
|
||||
}
|
||||
response.sendResult(new HardwareReportRequestEvent(createHardwareToken(client.username, response.hardware)));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -93,10 +96,10 @@ public VerifySecureLevelKeyRequestEvent onSuccessVerify(Client client) {
|
|||
}
|
||||
client.trustLevel.hardwareInfo = hardware.getHardwareInfo();
|
||||
authSupportHardware.connectUserAndHardware(client.sessionObject, hardware);
|
||||
return new VerifySecureLevelKeyRequestEvent(false, false, createPublicKeyToken(client.username, client.trustLevel.publicKey), createHardwareToken(client.username, hardware));
|
||||
} else {
|
||||
logger.warn("AuthCoreProvider not supported hardware. HardwareInfo not checked!");
|
||||
}
|
||||
return new VerifySecureLevelKeyRequestEvent(false, false, createPublicKeyToken(client.username, client.trustLevel.publicKey));
|
||||
}
|
||||
return new VerifySecureLevelKeyRequestEvent(false, false, createPublicKeyToken(client.username, client.trustLevel.publicKey));
|
||||
}
|
||||
|
@ -115,12 +118,12 @@ public void init(LaunchServer server) {
|
|||
public void close() {
|
||||
}
|
||||
|
||||
public String createHardwareToken(String username, HardwareReportRequest.HardwareInfo info) {
|
||||
public String createHardwareToken(String username, UserHardware hardware) {
|
||||
return Jwts.builder()
|
||||
.setIssuer("LaunchServer")
|
||||
.setSubject(username)
|
||||
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 8))
|
||||
.claim("hardware", info)
|
||||
.claim("hardware", hardware.getId())
|
||||
.signWith(server.keyAgreementManager.ecdsaPrivateKey)
|
||||
.compact();
|
||||
}
|
||||
|
@ -152,10 +155,14 @@ public HardwareInfoTokenVerifier(LaunchServer server) {
|
|||
public boolean accept(Client client, AuthProviderPair pair, String extendedToken) {
|
||||
try {
|
||||
var parse = parser.parseClaimsJws(extendedToken);
|
||||
HardwareReportRequest.HardwareInfo hardwareInfo = parse.getBody().get("hardware", HardwareReportRequest.HardwareInfo.class);
|
||||
if (hardwareInfo == null) return false;
|
||||
String hardwareInfoId = parse.getBody().get("hardware", String.class);
|
||||
if (hardwareInfoId == null) return false;
|
||||
if(client.auth == null) return false;
|
||||
var hardwareSupport = client.auth.core.isSupport(AuthSupportHardware.class);
|
||||
if(hardwareSupport == null) return false;
|
||||
UserHardware hardware = hardwareSupport.getHardwareInfoById(hardwareInfoId);
|
||||
if (client.trustLevel == null) client.trustLevel = new Client.TrustLevel();
|
||||
client.trustLevel.hardwareInfo = hardwareInfo;
|
||||
client.trustLevel.hardwareInfo = hardware.getHardwareInfo();
|
||||
return true;
|
||||
} catch (Throwable e) {
|
||||
logger.error("Hardware JWT error", e);
|
||||
|
|
|
@ -152,7 +152,7 @@ public Path process(Path inputFile) throws IOException {
|
|||
parser.parse(proguard_cfg);
|
||||
ProGuard proGuard = new ProGuard(proguard_cfg);
|
||||
proGuard.execute();
|
||||
} catch (ParseException e) {
|
||||
} catch (Exception e) {
|
||||
logger.error(e);
|
||||
}
|
||||
} else
|
||||
|
|
|
@ -84,6 +84,7 @@ public boolean accept(Client client, AuthProviderPair pair, String extendedToken
|
|||
if(client.permissions == null) client.permissions = new ClientPermissions();
|
||||
client.permissions.addPerm("launchserver.checkserver");
|
||||
client.permissions.addPerm(String.format("launchserver.profile.%s.show", info.serverName));
|
||||
client.setSerializableProperty("launchserver.serverName", info.serverName);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package pro.gravit.launchserver.manangers.hook;
|
||||
|
||||
import pro.gravit.launchserver.auth.core.User;
|
||||
import pro.gravit.launchserver.manangers.AuthManager;
|
||||
import pro.gravit.launchserver.socket.Client;
|
||||
import pro.gravit.launchserver.socket.response.auth.AuthResponse;
|
||||
import pro.gravit.launchserver.socket.response.auth.CheckServerResponse;
|
||||
|
@ -12,6 +14,7 @@ public class AuthHookManager {
|
|||
public final BiHookSet<AuthResponse.AuthContext, Client> preHook = new BiHookSet<>();
|
||||
public final BiHookSet<AuthResponse.AuthContext, Client> postHook = new BiHookSet<>();
|
||||
public final BiHookSet<CheckServerResponse, Client> checkServerHook = new BiHookSet<>();
|
||||
public final BiHookSet<AuthManager.CheckServerReport, Client> postCheckServerHook = new BiHookSet<>();
|
||||
public final BiHookSet<JoinServerResponse, Client> joinServerHook = new BiHookSet<>();
|
||||
public final BiHookSet<SetProfileResponse, Client> setProfileHook = new BiHookSet<>();
|
||||
public final HookSet<RegContext> registraion = new HookSet<>();
|
||||
|
|
|
@ -37,6 +37,7 @@ public void execute(ChannelHandlerContext ctx, Client pClient) {
|
|||
}
|
||||
result.playerProfile = report.playerProfile;
|
||||
result.uuid = report.uuid;
|
||||
server.authHookManager.postCheckServerHook.hook(report, pClient);
|
||||
logger.debug("checkServer: {} uuid: {} serverID: {}", result.playerProfile == null ? null : result.playerProfile.username, result.uuid, serverID);
|
||||
} catch (AuthException | HookException e) {
|
||||
sendError(e.getMessage());
|
||||
|
|
|
@ -12,14 +12,4 @@ private SystemService() {
|
|||
public static void exit(int code) {
|
||||
LauncherEngine.exitLauncher(code);
|
||||
}
|
||||
|
||||
public static void setSecurityManager(SecurityManager s) {
|
||||
LogHelper.debug("Try set security manager %s", s == null ? "null" : s.getClass().getName());
|
||||
if (AuthService.profile == null || AuthService.profile.getSecurityManagerConfig() == ClientProfile.SecurityManagerConfig.NONE)
|
||||
return;
|
||||
if (AuthService.profile.getSecurityManagerConfig() == ClientProfile.SecurityManagerConfig.CLIENT) {
|
||||
System.setSecurityManager(s);
|
||||
}
|
||||
//TODO NEXT
|
||||
}
|
||||
}
|
||||
|
|
|
@ -349,19 +349,19 @@ private static void launch(ClientProfile profile, ClientLauncherProcess.ClientPa
|
|||
}
|
||||
FMLPatcher.apply();
|
||||
LauncherEngine.modulesManager.invokeEvent(new ClientProcessPreInvokeMainClassEvent(params, profile, args));
|
||||
{
|
||||
List<String> compatClasses = profile.getCompatClasses();
|
||||
for (String e : compatClasses) {
|
||||
Class<?> clazz = classLoader.loadClass(e);
|
||||
MethodHandle runMethod = MethodHandles.publicLookup().findStatic(clazz, "run", MethodType.methodType(void.class));
|
||||
runMethod.invoke();
|
||||
}
|
||||
}
|
||||
MethodHandle mainMethod = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)).asFixedArity();
|
||||
Launcher.LAUNCHED.set(true);
|
||||
JVMHelper.fullGC();
|
||||
// Invoke main method
|
||||
try {
|
||||
{
|
||||
List<String> compatClasses = profile.getCompatClasses();
|
||||
for (String e : compatClasses) {
|
||||
Class<?> clazz = classLoader.loadClass(e);
|
||||
MethodHandle runMethod = MethodHandles.publicLookup().findStatic(clazz, "run", MethodType.methodType(void.class));
|
||||
runMethod.invoke();
|
||||
}
|
||||
}
|
||||
MethodHandle mainMethod = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)).asFixedArity();
|
||||
Launcher.LAUNCHED.set(true);
|
||||
JVMHelper.fullGC();
|
||||
mainMethod.invokeWithArguments((Object) args.toArray(new String[0]));
|
||||
LogHelper.debug("Main exit successful");
|
||||
} catch (Throwable e) {
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
import pro.gravit.utils.Version;
|
||||
import pro.gravit.utils.helper.*;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
|
@ -33,7 +34,7 @@ public class ClientLauncherProcess {
|
|||
public final ClientParams params = new ClientParams();
|
||||
public final List<String> jvmArgs = new LinkedList<>();
|
||||
public final List<String> jvmModules = new LinkedList<>();
|
||||
public final List<Path> jvmModulesPaths = new LinkedList<>();
|
||||
public final List<String> jvmModulesPaths = new LinkedList<>();
|
||||
public final List<String> systemClientArgs = new LinkedList<>();
|
||||
public final List<String> systemClassPath = new LinkedList<>();
|
||||
public final Map<String, String> systemEnv = new HashMap<>();
|
||||
|
@ -127,7 +128,8 @@ private void applyClientProfile() {
|
|||
this.params.oauthExpiredTime = Request.getTokenExpiredTime();
|
||||
this.params.extendedTokens = Request.getExtendedTokens();
|
||||
}
|
||||
|
||||
this.jvmModules.addAll(this.params.profile.getModules());
|
||||
this.jvmModulesPaths.addAll(this.params.profile.getModulePath());
|
||||
if (this.params.profile.getRuntimeInClientConfig() != ClientProfile.RuntimeInClientConfig.NONE) {
|
||||
jvmModules.add("javafx.base");
|
||||
jvmModules.add("javafx.graphics");
|
||||
|
@ -137,6 +139,7 @@ private void applyClientProfile() {
|
|||
jvmModules.add("javafx.media");
|
||||
jvmModules.add("javafx.web");
|
||||
}
|
||||
|
||||
LauncherEngine.modulesManager.invokeEvent(new ClientProcessBuilderCreateEvent(this));
|
||||
}
|
||||
|
||||
|
@ -187,20 +190,26 @@ public void start(boolean pipeOutput) throws IOException, InterruptedException {
|
|||
}
|
||||
|
||||
private void applyJava9Params(List<String> processArgs) {
|
||||
jvmModulesPaths.add(javaVersion.jvmDir);
|
||||
/*jvmModulesPaths.add(javaVersion.jvmDir);
|
||||
jvmModulesPaths.add(javaVersion.jvmDir.resolve("jre"));
|
||||
Path openjfxPath = JavaHelper.tryGetOpenJFXPath(javaVersion.jvmDir);
|
||||
if (openjfxPath != null) {
|
||||
jvmModulesPaths.add(openjfxPath);
|
||||
}
|
||||
}*/ // TODO: fix runtime in client
|
||||
StringBuilder modulesPath = new StringBuilder();
|
||||
StringBuilder modulesAdd = new StringBuilder();
|
||||
for (String moduleName : jvmModules) {
|
||||
boolean success = JavaHelper.tryAddModule(jvmModulesPaths, moduleName, modulesPath);
|
||||
/*boolean success = JavaHelper.tryAddModule(jvmModulesPaths, moduleName, modulesPath);
|
||||
if (success) {
|
||||
if (modulesAdd.length() > 0) modulesAdd.append(",");
|
||||
modulesAdd.append(moduleName);
|
||||
}
|
||||
}*/
|
||||
if (modulesAdd.length() > 0) modulesAdd.append(",");
|
||||
modulesAdd.append(moduleName);
|
||||
}
|
||||
for(String modulePath : jvmModulesPaths) {
|
||||
if (modulesPath.length() > 0) modulesPath.append(File.pathSeparator);
|
||||
modulesPath.append(modulePath);
|
||||
}
|
||||
if (modulesAdd.length() > 0) {
|
||||
processArgs.add("--add-modules");
|
||||
|
|
|
@ -6,6 +6,7 @@ public class VerifySecureLevelKeyRequestEvent extends RequestEvent {
|
|||
public boolean needHardwareInfo;
|
||||
public boolean onlyStatisticInfo;
|
||||
public String extendedToken;
|
||||
public String hardwareExtendedToken;
|
||||
|
||||
public VerifySecureLevelKeyRequestEvent() {
|
||||
}
|
||||
|
@ -20,6 +21,13 @@ public VerifySecureLevelKeyRequestEvent(boolean needHardwareInfo, boolean onlySt
|
|||
this.extendedToken = extendedToken;
|
||||
}
|
||||
|
||||
public VerifySecureLevelKeyRequestEvent(boolean needHardwareInfo, boolean onlyStatisticInfo, String extendedToken, String hardwareExtendedToken) {
|
||||
this.needHardwareInfo = needHardwareInfo;
|
||||
this.onlyStatisticInfo = onlyStatisticInfo;
|
||||
this.extendedToken = extendedToken;
|
||||
this.hardwareExtendedToken = hardwareExtendedToken;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return "verifySecureLevelKey";
|
||||
|
|
|
@ -48,6 +48,10 @@ public final class ClientProfile implements Comparable<ClientProfile> {
|
|||
@LauncherNetworkAPI
|
||||
private List<String> classPath;
|
||||
@LauncherNetworkAPI
|
||||
private List<String> modulePath = new ArrayList<>();
|
||||
@LauncherNetworkAPI
|
||||
private List<String> modules = new ArrayList<>();
|
||||
@LauncherNetworkAPI
|
||||
private List<String> altClassPath;
|
||||
@LauncherNetworkAPI
|
||||
private List<String> clientArgs;
|
||||
|
@ -91,6 +95,7 @@ public ClientProfile() {
|
|||
updateOptional = new HashSet<>();
|
||||
jvmArgs = new ArrayList<>();
|
||||
classPath = new ArrayList<>();
|
||||
modulePath = new ArrayList<>();
|
||||
altClassPath = new ArrayList<>();
|
||||
clientArgs = new ArrayList<>();
|
||||
compatClasses = new ArrayList<>();
|
||||
|
@ -102,7 +107,7 @@ public ClientProfile() {
|
|||
runtimeInClientConfig = RuntimeInClientConfig.NONE;
|
||||
}
|
||||
|
||||
public ClientProfile(List<String> update, List<String> updateExclusions, List<String> updateShared, List<String> updateVerify, Set<OptionalFile> updateOptional, List<String> jvmArgs, List<String> classPath, List<String> altClassPath, List<String> clientArgs, List<String> compatClasses, Map<String, String> properties, List<ServerProfile> servers, SecurityManagerConfig securityManagerConfig, ClassLoaderConfig classLoaderConfig, SignedClientConfig signedClientConfig, RuntimeInClientConfig runtimeInClientConfig, String version, String assetIndex, String dir, String assetDir, int recommendJavaVersion, int minJavaVersion, int maxJavaVersion, boolean warnMissJavaVersion, ProfileDefaultSettings settings, int sortIndex, UUID uuid, String title, String info, boolean updateFastCheck, String mainClass) {
|
||||
public ClientProfile(List<String> update, List<String> updateExclusions, List<String> updateShared, List<String> updateVerify, Set<OptionalFile> updateOptional, List<String> jvmArgs, List<String> classPath, List<String> modulePath, List<String> modules, List<String> altClassPath, List<String> clientArgs, List<String> compatClasses, Map<String, String> properties, List<ServerProfile> servers, SecurityManagerConfig securityManagerConfig, ClassLoaderConfig classLoaderConfig, SignedClientConfig signedClientConfig, RuntimeInClientConfig runtimeInClientConfig, String version, String assetIndex, String dir, String assetDir, int recommendJavaVersion, int minJavaVersion, int maxJavaVersion, boolean warnMissJavaVersion, ProfileDefaultSettings settings, int sortIndex, UUID uuid, String title, String info, boolean updateFastCheck, String mainClass) {
|
||||
this.update = update;
|
||||
this.updateExclusions = updateExclusions;
|
||||
this.updateShared = updateShared;
|
||||
|
@ -110,6 +115,8 @@ public ClientProfile(List<String> update, List<String> updateExclusions, List<St
|
|||
this.updateOptional = updateOptional;
|
||||
this.jvmArgs = jvmArgs;
|
||||
this.classPath = classPath;
|
||||
this.modulePath = modulePath;
|
||||
this.modules = modules;
|
||||
this.altClassPath = altClassPath;
|
||||
this.clientArgs = clientArgs;
|
||||
this.compatClasses = compatClasses;
|
||||
|
@ -160,6 +167,14 @@ public String[] getClassPath() {
|
|||
return classPath.toArray(new String[0]);
|
||||
}
|
||||
|
||||
public List<String> getModulePath() {
|
||||
return Collections.unmodifiableList(modulePath);
|
||||
}
|
||||
|
||||
public List<String> getModules() {
|
||||
return Collections.unmodifiableList(modules);
|
||||
}
|
||||
|
||||
public String[] getAlternativeClassPath() {
|
||||
return altClassPath.toArray(new String[0]);
|
||||
}
|
||||
|
@ -411,14 +426,6 @@ public int hashCode() {
|
|||
return Objects.hash(uuid);
|
||||
}
|
||||
|
||||
public SecurityManagerConfig getSecurityManagerConfig() {
|
||||
return securityManagerConfig;
|
||||
}
|
||||
|
||||
public void setSecurityManagerConfig(SecurityManagerConfig securityManagerConfig) {
|
||||
this.securityManagerConfig = securityManagerConfig;
|
||||
}
|
||||
|
||||
public ClassLoaderConfig getClassLoaderConfig() {
|
||||
return classLoaderConfig;
|
||||
}
|
||||
|
@ -427,14 +434,6 @@ public void setClassLoaderConfig(ClassLoaderConfig classLoaderConfig) {
|
|||
this.classLoaderConfig = classLoaderConfig;
|
||||
}
|
||||
|
||||
public SignedClientConfig getSignedClientConfig() {
|
||||
return signedClientConfig;
|
||||
}
|
||||
|
||||
public void setSignedClientConfig(SignedClientConfig signedClientConfig) {
|
||||
this.signedClientConfig = signedClientConfig;
|
||||
}
|
||||
|
||||
public RuntimeInClientConfig getRuntimeInClientConfig() {
|
||||
return runtimeInClientConfig;
|
||||
}
|
||||
|
@ -517,7 +516,7 @@ public enum SecurityManagerConfig {
|
|||
}
|
||||
|
||||
public enum ClassLoaderConfig {
|
||||
AGENT, LAUNCHER, SYSTEM_ARGS
|
||||
AGENT, LAUNCHER, MODULE, SYSTEM_ARGS
|
||||
}
|
||||
|
||||
public enum SignedClientConfig {
|
||||
|
|
|
@ -12,6 +12,8 @@ public class ClientProfileBuilder {
|
|||
private Set<OptionalFile> updateOptional = new HashSet<>();
|
||||
private List<String> jvmArgs = new ArrayList<>();
|
||||
private List<String> classPath = new ArrayList<>();
|
||||
private List<String> modulePath = new ArrayList<>();
|
||||
private List<String> modules = new ArrayList<>();
|
||||
private List<String> altClassPath = new ArrayList<>();
|
||||
private List<String> clientArgs = new ArrayList<>();
|
||||
private List<String> compatClasses = new ArrayList<>();
|
||||
|
@ -142,6 +144,16 @@ public ClientProfileBuilder setRecommendJavaVersion(int recommendJavaVersion) {
|
|||
return this;
|
||||
}
|
||||
|
||||
public ClientProfileBuilder setModulePath(List<String> modulePath) {
|
||||
this.modulePath = modulePath;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ClientProfileBuilder setModules(List<String> modules) {
|
||||
this.modules = modules;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ClientProfileBuilder setMinJavaVersion(int minJavaVersion) {
|
||||
this.minJavaVersion = minJavaVersion;
|
||||
return this;
|
||||
|
@ -193,6 +205,6 @@ public ClientProfileBuilder setMainClass(String mainClass) {
|
|||
}
|
||||
|
||||
public ClientProfile createClientProfile() {
|
||||
return new ClientProfile(update, updateExclusions, updateShared, updateVerify, updateOptional, jvmArgs, classPath, altClassPath, clientArgs, compatClasses, properties, servers, securityManagerConfig, classLoaderConfig, signedClientConfig, runtimeInClientConfig, version, assetIndex, dir, assetDir, recommendJavaVersion, minJavaVersion, maxJavaVersion, warnMissJavaVersion, settings, sortIndex, uuid, title, info, updateFastCheck, mainClass);
|
||||
return new ClientProfile(update, updateExclusions, updateShared, updateVerify, updateOptional, jvmArgs, classPath, modulePath, modules, altClassPath, clientArgs, compatClasses, properties, servers, securityManagerConfig, classLoaderConfig, signedClientConfig, runtimeInClientConfig, version, assetIndex, dir, assetDir, recommendJavaVersion, minJavaVersion, maxJavaVersion, warnMissJavaVersion, settings, sortIndex, uuid, title, info, updateFastCheck, mainClass);
|
||||
}
|
||||
}
|
|
@ -6,7 +6,7 @@ public final class Version implements Comparable<Version> {
|
|||
|
||||
public static final int MAJOR = 5;
|
||||
public static final int MINOR = 2;
|
||||
public static final int PATCH = 9;
|
||||
public static final int PATCH = 10;
|
||||
public static final int BUILD = 1;
|
||||
public static final Version.Type RELEASE = Type.STABLE;
|
||||
public final int major;
|
||||
|
|
|
@ -14,16 +14,37 @@
|
|||
}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
java11 {
|
||||
java {
|
||||
srcDirs = ['src/main/java11']
|
||||
}
|
||||
dependencies {
|
||||
java11Implementation project(':LauncherAPI')
|
||||
java11Implementation files(sourceSets.main.output.classesDirs) { builtBy compileJava }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sourceCompatibility = '1.8'
|
||||
targetCompatibility = '1.8'
|
||||
|
||||
compileJava11Java {
|
||||
sourceCompatibility = 11
|
||||
targetCompatibility = 11
|
||||
}
|
||||
|
||||
jar {
|
||||
into('META-INF/versions/11') {
|
||||
from sourceSets.java11.output
|
||||
}
|
||||
archiveClassifier.set('clean')
|
||||
manifest.attributes("Main-Class": mainClassName,
|
||||
"Premain-Class": mainAgentName,
|
||||
"Can-Redefine-Classes": "true",
|
||||
"Can-Retransform-Classes": "true",
|
||||
"Can-Set-Native-Method-Prefix": "true")
|
||||
"Can-Set-Native-Method-Prefix": "true",
|
||||
"Multi-Release": "true")
|
||||
}
|
||||
|
||||
task sourcesJar(type: Jar) {
|
||||
|
|
|
@ -18,6 +18,10 @@
|
|||
import pro.gravit.launcher.request.auth.RestoreRequest;
|
||||
import pro.gravit.launcher.request.update.ProfilesRequest;
|
||||
import pro.gravit.launcher.request.websockets.StdWebSocketService;
|
||||
import pro.gravit.launcher.server.launch.ClasspathLaunch;
|
||||
import pro.gravit.launcher.server.launch.Launch;
|
||||
import pro.gravit.launcher.server.launch.ModuleLaunch;
|
||||
import pro.gravit.launcher.server.launch.SimpleLaunch;
|
||||
import pro.gravit.launcher.server.setup.ServerWrapperSetup;
|
||||
import pro.gravit.utils.PublicURLClassLoader;
|
||||
import pro.gravit.utils.helper.IOHelper;
|
||||
|
@ -139,22 +143,6 @@ public void run(String... args) throws Throwable {
|
|||
LogHelper.error("Auth not configured. Please use 'java -jar ServerWrapper.jar setup'");
|
||||
System.exit(-1);
|
||||
}
|
||||
Class<?> mainClass;
|
||||
if (config.classpath != null && !config.classpath.isEmpty()) {
|
||||
if(config.classLoaderConfig == ClientProfile.ClassLoaderConfig.LAUNCHER) {
|
||||
URL[] urls = config.classpath.stream().map(Paths::get).map(IOHelper::toURL).toArray(URL[]::new);
|
||||
ucp = new PublicURLClassLoader(urls);
|
||||
Thread.currentThread().setContextClassLoader(ucp);
|
||||
loader = ucp;
|
||||
} else if(config.classLoaderConfig == ClientProfile.ClassLoaderConfig.AGENT) {
|
||||
if (!ServerAgent.isAgentStarted()) {
|
||||
LogHelper.error("JavaAgent not found");
|
||||
System.exit(-1);
|
||||
}
|
||||
for (String c : config.classpath)
|
||||
ServerAgent.addJVMClassPath(c);
|
||||
}
|
||||
}
|
||||
if (config.autoloadLibraries) {
|
||||
if (!ServerAgent.isAgentStarted()) {
|
||||
throw new UnsupportedOperationException("JavaAgent not found, autoloadLibraries not available");
|
||||
|
@ -165,24 +153,34 @@ public void run(String... args) throws Throwable {
|
|||
LogHelper.info("Load libraries");
|
||||
ServerAgent.loadLibraries(librariesDir);
|
||||
}
|
||||
if (loader != null) mainClass = Class.forName(classname, true, loader);
|
||||
else mainClass = Class.forName(classname);
|
||||
MethodHandle mainMethod = MethodHandles.publicLookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class));
|
||||
LogHelper.info("ServerWrapper: LaunchServer address: %s. Title: %s", config.address, Launcher.profile != null ? Launcher.profile.getTitle() : "unknown");
|
||||
LogHelper.info("Minecraft Version (for profile): %s", wrapper.profile == null ? "unknown" : wrapper.profile.getVersion().name);
|
||||
LogHelper.info("Start Minecraft Server");
|
||||
LogHelper.debug("Invoke main method %s", mainClass.getName());
|
||||
if (config.args == null) {
|
||||
String[] real_args;
|
||||
if (args.length > 0) {
|
||||
real_args = new String[args.length - 1];
|
||||
System.arraycopy(args, 1, real_args, 0, args.length - 1);
|
||||
} else real_args = args;
|
||||
|
||||
mainMethod.invoke(real_args);
|
||||
} else {
|
||||
mainMethod.invoke(config.args.toArray(new String[0]));
|
||||
String[] real_args;
|
||||
if (args.length > 0) {
|
||||
real_args = new String[args.length - 1];
|
||||
System.arraycopy(args, 1, real_args, 0, args.length - 1);
|
||||
} else real_args = args;
|
||||
Launch launch;
|
||||
switch (config.classLoaderConfig) {
|
||||
case LAUNCHER:
|
||||
launch = new ClasspathLaunch();
|
||||
break;
|
||||
case MODULE:
|
||||
launch = new ModuleLaunch();
|
||||
break;
|
||||
default:
|
||||
launch = new SimpleLaunch();
|
||||
break;
|
||||
}
|
||||
LogHelper.info("Start Minecraft Server");
|
||||
LogHelper.debug("Invoke main method %s with %s", config.mainclass, launch.getClass().getName());
|
||||
try {
|
||||
launch.run(config, real_args);
|
||||
} catch (Throwable e) {
|
||||
LogHelper.error(e);
|
||||
System.exit(-1);
|
||||
}
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
public void updateLauncherConfig() {
|
||||
|
@ -231,8 +229,15 @@ public static final class Config {
|
|||
public long oauthExpireTime;
|
||||
public Map<String, String> extendedTokens;
|
||||
public LauncherConfig.LauncherEnvironment env;
|
||||
public ModuleConf moduleConf = new ModuleConf();
|
||||
}
|
||||
|
||||
public static final class WebSocketConf {
|
||||
public static final class ModuleConf {
|
||||
public List<String> modules = new ArrayList<>();
|
||||
public List<String> modulePath = new ArrayList<>();
|
||||
public String mainModule = "";
|
||||
public Map<String, String> exports = new HashMap<>();
|
||||
public Map<String, String> opens = new HashMap<>();
|
||||
public Map<String, String> reads = new HashMap<>();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
package pro.gravit.launcher.server.launch;
|
||||
|
||||
import pro.gravit.launcher.server.ServerWrapper;
|
||||
import pro.gravit.utils.PublicURLClassLoader;
|
||||
import pro.gravit.utils.helper.IOHelper;
|
||||
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
public class ClasspathLaunch implements Launch {
|
||||
@Override
|
||||
@SuppressWarnings("ConfusingArgumentToVarargsMethod")
|
||||
public void run(ServerWrapper.Config config, String[] args) throws Throwable {
|
||||
URL[] urls = config.classpath.stream().map(Paths::get).map(IOHelper::toURL).toArray(URL[]::new);
|
||||
ClassLoader ucl = new PublicURLClassLoader(urls);
|
||||
Class<?> mainClass = Class.forName(config.mainclass, true, ucl);
|
||||
MethodHandle mainMethod = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class));
|
||||
mainMethod.invoke(args);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
package pro.gravit.launcher.server.launch;
|
||||
|
||||
import pro.gravit.launcher.server.ServerWrapper;
|
||||
|
||||
public interface Launch {
|
||||
void run(ServerWrapper.Config config, String[] args) throws Throwable;
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
package pro.gravit.launcher.server.launch;
|
||||
|
||||
import pro.gravit.launcher.server.ServerWrapper;
|
||||
|
||||
public class ModuleLaunch implements Launch {
|
||||
@Override
|
||||
public void run(ServerWrapper.Config config, String[] args) throws Throwable {
|
||||
throw new UnsupportedOperationException("Module system not supported");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package pro.gravit.launcher.server.launch;
|
||||
|
||||
import pro.gravit.launcher.server.ServerWrapper;
|
||||
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.MethodType;
|
||||
|
||||
public class SimpleLaunch implements Launch {
|
||||
@Override
|
||||
@SuppressWarnings("ConfusingArgumentToVarargsMethod")
|
||||
public void run(ServerWrapper.Config config, String[] args) throws Throwable {
|
||||
Class<?> mainClass = Class.forName(config.mainclass);
|
||||
MethodHandle mainMethod = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class));
|
||||
mainMethod.invoke(args);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
package pro.gravit.launcher.server.launch;
|
||||
|
||||
import pro.gravit.launcher.server.ServerWrapper;
|
||||
import pro.gravit.utils.PublicURLClassLoader;
|
||||
import pro.gravit.utils.helper.IOHelper;
|
||||
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ModuleFinder;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class ModuleLaunch implements Launch {
|
||||
@Override
|
||||
@SuppressWarnings("ConfusingArgumentToVarargsMethod")
|
||||
public void run(ServerWrapper.Config config, String[] args) throws Throwable {
|
||||
URL[] urls = config.classpath.stream().map(Paths::get).map(IOHelper::toURL).toArray(URL[]::new);
|
||||
ClassLoader ucl = new PublicURLClassLoader(urls);
|
||||
// Create Module Layer
|
||||
ModuleFinder finder = ModuleFinder.of(config.moduleConf.modulePath.stream().map(Paths::get).toArray(Path[]::new));
|
||||
ModuleLayer bootLayer = ModuleLayer.boot();
|
||||
Configuration configuration = bootLayer.configuration()
|
||||
.resolveAndBind(ModuleFinder.of(), finder, config.moduleConf.modules);
|
||||
ModuleLayer.Controller controller = ModuleLayer.defineModulesWithOneLoader(configuration, List.of(bootLayer), ucl);
|
||||
ModuleLayer layer = controller.layer();
|
||||
// Configure exports / opens
|
||||
for(var e : config.moduleConf.exports.entrySet()) {
|
||||
String[] split = e.getKey().split("\\\\");
|
||||
Module source = layer.findModule(split[0]).orElseThrow();
|
||||
String pkg = split[1];
|
||||
Module target = layer.findModule(e.getValue()).orElseThrow();
|
||||
controller.addExports(source, pkg, target);
|
||||
}
|
||||
for(var e : config.moduleConf.opens.entrySet()) {
|
||||
String[] split = e.getKey().split("\\\\");
|
||||
Module source = layer.findModule(split[0]).orElseThrow();
|
||||
String pkg = split[1];
|
||||
Module target = layer.findModule(e.getValue()).orElseThrow();
|
||||
controller.addOpens(source, pkg, target);
|
||||
}
|
||||
for(var e : config.moduleConf.reads.entrySet()) {
|
||||
Module source = layer.findModule(e.getKey()).orElseThrow();
|
||||
Module target = layer.findModule(e.getValue()).orElseThrow();
|
||||
controller.addReads(source, target);
|
||||
}
|
||||
Module mainModule = layer.findModule(config.moduleConf.mainModule).orElseThrow();
|
||||
Module unnamed = ModuleLaunch.class.getClassLoader().getUnnamedModule();
|
||||
if(unnamed != null) {
|
||||
controller.addOpens(mainModule, getPackageFromClass(config.mainclass), unnamed);
|
||||
}
|
||||
// Start main class
|
||||
ClassLoader loader = mainModule.getClassLoader();
|
||||
Class<?> mainClass = Class.forName(config.mainclass, true, loader);
|
||||
MethodHandle mainMethod = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class));
|
||||
mainMethod.invoke(args);
|
||||
}
|
||||
|
||||
private static String getPackageFromClass(String clazz) {
|
||||
int index = clazz.lastIndexOf(".");
|
||||
if(index >= 0) {
|
||||
return clazz.substring(0, index);
|
||||
}
|
||||
return clazz;
|
||||
}
|
||||
}
|
|
@ -5,7 +5,7 @@
|
|||
id 'org.openjfx.javafxplugin' version '0.0.10' apply false
|
||||
}
|
||||
group = 'pro.gravit.launcher'
|
||||
version = '5.2.9'
|
||||
version = '5.2.10'
|
||||
|
||||
apply from: 'props.gradle'
|
||||
|
||||
|
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,5 +1,5 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
|
2
modules
2
modules
|
@ -1 +1 @@
|
|||
Subproject commit aea93d6803e4770f23ff4a2ea4b5f8752d053d8b
|
||||
Subproject commit 4319cabbeb0abbb1c6bc76f23c16b7902b2be500
|
18
props.gradle
18
props.gradle
|
@ -1,20 +1,20 @@
|
|||
project.ext {
|
||||
verAsm = '9.2'
|
||||
verNetty = '4.1.70.Final'
|
||||
verOshiCore = '6.0.0'
|
||||
verNetty = '4.1.75.Final'
|
||||
verOshiCore = '6.1.5'
|
||||
verJunit = '5.8.2'
|
||||
verGuavaC = '30.1.1-jre'
|
||||
verJansi = '2.3.4'
|
||||
verJansi = '2.4.0'
|
||||
verJline = '3.21.0'
|
||||
verJwt = '0.11.2'
|
||||
verBcprov = '1.70'
|
||||
verGson = '2.8.9'
|
||||
verGson = '2.9.0'
|
||||
verBcpkix = '1.70'
|
||||
verSlf4j = '1.7.32'
|
||||
verLog4j = '2.17.1'
|
||||
verMySQLConn = '8.0.27'
|
||||
verPostgreSQLConn = '42.3.1'
|
||||
verProguard = '7.2.0-beta2'
|
||||
verSlf4j = '1.7.36'
|
||||
verLog4j = '2.17.2'
|
||||
verMySQLConn = '8.0.28'
|
||||
verPostgreSQLConn = '42.3.3'
|
||||
verProguard = '7.2.1'
|
||||
verLaunch4j = '3.14'
|
||||
verHibernate = '5.5.6.Final'
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue