diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/helper/MakeProfileHelper.java b/LaunchServer/src/main/java/pro/gravit/launchserver/helper/MakeProfileHelper.java index 4bee8597..405f93be 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/helper/MakeProfileHelper.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/helper/MakeProfileHelper.java @@ -97,6 +97,17 @@ public static ClientProfile makeProfile(ClientProfile.Version version, String ti optionalOther.triggersList = List.of(nonMacTrigger); optionals.add(optionalOther); } + Optional logFile = findOption(options, MakeProfileOptionLog4j.class); + if(logFile.isPresent()) { + var log4jOption = logFile.get(); + if(log4jOption.logFile != null) { + jvmArgs.add("-Dlog4j.configurationFile=".concat(logFile.get().logFile)); + } else if(log4jOption.affected) { + if(version.compareTo(ClientProfile.Version.MC117) >= 0 && version.compareTo(ClientProfile.Version.MC118) < 0) { + jvmArgs.add("-Dlog4j2.formatMsgNoLookups=true"); + } + } + } if (version.compareTo(ClientProfile.Version.MC117) >= 0) { builder.setMinJavaVersion(16); builder.setRecommendJavaVersion(16); @@ -156,18 +167,52 @@ public static String getMainClassByVersion(ClientProfile.Version version, MakePr return "net.minecraft.client.main.Main"; } + private static boolean isAffectedLog4jVersion(String version) { + if(version == null) { + return true; + } + String[] split = version.split("\\."); + if(split.length < 2) return true; + if(!split[0].equals("2")) return false; + return Integer.parseInt(split[1]) < 15; + } + + private static String getLog4jVersion(Path dir) throws IOException { + Path log4jCore = dir.resolve("org/apache/logging/log4j/log4j-core"); + if(Files.exists(log4jCore)) { + Path target = Files.list(log4jCore).findFirst().orElse(null); + if(target != null) { + return target.getFileName().toString(); + } + } + return null; + } + public static MakeProfileOption[] getMakeProfileOptionsFromDir(Path dir, ClientProfile.Version version) throws IOException { List options = new ArrayList<>(2); - if (version.compareTo(ClientProfile.Version.MC1122) <= 0) { - if (Files.exists(dir.resolve("forge.jar"))) { + if (Files.exists(dir.resolve("forge.jar"))) { + options.add(new MakeProfileOptionForge()); + } + else if (Files.exists(dir.resolve("libraries/net/minecraftforge/forge"))) { + if(version.compareTo(ClientProfile.Version.MC1122) > 0) { + options.add(new MakeProfileOptionForge(dir)); + } else { options.add(new MakeProfileOptionForge()); } - } else { - if (Files.exists(dir.resolve("libraries/net/minecraftforge/forge"))) { - options.add(new MakeProfileOptionForge(dir)); - } - if (Files.exists(dir.resolve("libraries/net/fabricmc/fabric-loader"))) { - options.add(new MakeProfileOptionFabric(dir)); + } + if (Files.exists(dir.resolve("libraries/net/fabricmc/fabric-loader"))) { + options.add(new MakeProfileOptionFabric(dir)); + } + { + String log4jVersion = getLog4jVersion(dir); + if(log4jVersion != null) { + + boolean affected = isAffectedLog4jVersion(log4jVersion); + if(Files.exists(dir.resolve("log4j2_custom.xml"))) { + options.add(new MakeProfileOptionLog4j(affected, "log4j2_custom.xml")); + } else { + options.add(new MakeProfileOptionLog4j(affected, null)); + } } } if (Files.exists(dir.resolve("liteloader.jar"))) { @@ -176,7 +221,7 @@ public static MakeProfileOption[] getMakeProfileOptionsFromDir(Path dir, ClientP if (Files.exists(dir.resolve("libraries/org/lwjgl/lwjgl/3.2.2")) && Files.exists(dir.resolve("libraries/org/lwjgl/lwjgl/3.2.1"))) { options.add(new MakeProfileOptionLwjgl()); } - if (version.compareTo(ClientProfile.Version.MC1122) <= 0) { + if (Files.exists(dir.resolve("libraries/forge/launchwrapper-1.12-launcherfixed.jar.jar")) || Files.exists(dir.resolve("libraries/net/minecraft/launchwrapper"))) { options.add(new MakeProfileOptionLaunchWrapper()); } return options.toArray(new MakeProfileOption[0]); @@ -193,6 +238,16 @@ private static Path findFirstMavenFile(Path path) throws IOException { public interface MakeProfileOption { } + public static class MakeProfileOptionLog4j implements MakeProfileOption { + public boolean affected; + public String logFile; + + public MakeProfileOptionLog4j(boolean lower15, String logFile) { + this.affected = lower15; + this.logFile = logFile; + } + } + public static class MakeProfileOptionForge implements MakeProfileOption { public String launchTarget; public String forgeVersion; diff --git a/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherEntryPoint.java b/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherEntryPoint.java index 8453a7d1..4c645a7b 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherEntryPoint.java +++ b/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherEntryPoint.java @@ -119,7 +119,8 @@ public static void main(String[] args) throws Throwable { // Verify ClientLauncher sign and classpath LogHelper.debug("Verifying ClientLauncher sign and classpath"); - List classpath = resolveClassPath(clientDir, params.actions, params.profile).map(IOHelper::toURL).collect(Collectors.toList()); + List classpath = resolveClassPath(clientDir, params.actions, params.profile).collect(Collectors.toList()); + List classpathURLs = classpath.stream().map(IOHelper::toURL).collect(Collectors.toList()); // Start client with WatchService monitoring boolean digest = !profile.isUpdateFastCheck(); RequestService service; @@ -145,7 +146,8 @@ public static void main(String[] args) throws Throwable { } ClientProfile.ClassLoaderConfig classLoaderConfig = profile.getClassLoaderConfig(); if (classLoaderConfig == ClientProfile.ClassLoaderConfig.LAUNCHER) { - ClientClassLoader classLoader = new ClientClassLoader(classpath.toArray(new URL[0]), ClassLoader.getSystemClassLoader()); + ClientClassLoader classLoader = new ClientClassLoader(classpathURLs.toArray(new URL[0]), ClassLoader.getSystemClassLoader()); + System.setProperty("java.class.path", classpath.stream().map(Path::toString).collect(Collectors.joining(File.pathSeparator))); ClientLauncherEntryPoint.classLoader = classLoader; Thread.currentThread().setContextClassLoader(classLoader); classLoader.nativePath = clientDir.resolve("natives").toString(); @@ -156,19 +158,19 @@ public static void main(String[] args) throws Throwable { ClientService.baseURLs = classLoader.getURLs(); } else if (classLoaderConfig == ClientProfile.ClassLoaderConfig.AGENT) { ClientLauncherEntryPoint.classLoader = ClassLoader.getSystemClassLoader(); - classpath.add(IOHelper.getCodeSource(ClientLauncherEntryPoint.class).toUri().toURL()); - for (URL url : classpath) { + classpathURLs.add(IOHelper.getCodeSource(ClientLauncherEntryPoint.class).toUri().toURL()); + for (URL url : classpathURLs) { LauncherAgent.addJVMClassPath(Paths.get(url.toURI())); } ClientService.instrumentation = LauncherAgent.inst; ClientService.nativePath = clientDir.resolve("natives").toString(); LauncherEngine.modulesManager.invokeEvent(new ClientProcessClassLoaderEvent(engine, classLoader, profile)); ClientService.classLoader = classLoader; - ClientService.baseURLs = classpath.toArray(new URL[0]); + ClientService.baseURLs = classpathURLs.toArray(new URL[0]); } else if (classLoaderConfig == ClientProfile.ClassLoaderConfig.SYSTEM_ARGS) { ClientLauncherEntryPoint.classLoader = ClassLoader.getSystemClassLoader(); ClientService.classLoader = ClassLoader.getSystemClassLoader(); - ClientService.baseURLs = classpath.toArray(new URL[0]); + ClientService.baseURLs = classpathURLs.toArray(new URL[0]); } AuthService.username = params.playerProfile.username; AuthService.uuid = params.playerProfile.uuid;