diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java index 0b60e7f8..67fae76b 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java @@ -36,7 +36,8 @@ import java.io.BufferedReader; import java.io.IOException; import java.lang.ProcessBuilder.Redirect; -import java.lang.reflect.InvocationTargetException; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.security.InvalidAlgorithmParameterException; @@ -390,9 +391,8 @@ public LaunchServer(LaunchServerDirectories directories, LaunchServerEnv env, La private LauncherBinary binary() { if (launcherEXEBinaryClass != null) { try { - return launcherEXEBinaryClass.getConstructor(LaunchServer.class).newInstance(this); - } catch (InstantiationException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException | NoSuchMethodException | SecurityException e) { + return (LauncherBinary) MethodHandles.publicLookup().findConstructor(launcherEXEBinaryClass, MethodType.methodType(void.class, LaunchServer.class)).invoke(this); + } catch (Throwable e) { LogHelper.error(e); } } diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/config/LaunchServerConfig.java b/LaunchServer/src/main/java/pro/gravit/launchserver/config/LaunchServerConfig.java index d37031be..e2f20159 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/config/LaunchServerConfig.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/config/LaunchServerConfig.java @@ -319,7 +319,12 @@ public static LaunchServerConfig getDefault(LaunchServer.LaunchServerEnv env) { newConfig.netty.fileServerEnabled = true; newConfig.netty.binds = new NettyBindAddress[]{new NettyBindAddress("0.0.0.0", 9274)}; newConfig.netty.performance = new NettyPerformanceConfig(); - newConfig.netty.performance.usingEpoll = Epoll.isAvailable(); + try { + newConfig.netty.performance.usingEpoll = Epoll.isAvailable(); + } catch (Throwable e) { + // Epoll class line 51+ catch (Exception) but Error will be thrown by System.load + newConfig.netty.performance.usingEpoll = false; + } // such as on ARM newConfig.netty.performance.bossThread = 2; newConfig.netty.performance.workerThread = 8; diff --git a/Launcher/src/main/java/pro/gravit/launcher/ClientLauncherWrapper.java b/Launcher/src/main/java/pro/gravit/launcher/ClientLauncherWrapper.java index a7aafb6a..6c97efcf 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/ClientLauncherWrapper.java +++ b/Launcher/src/main/java/pro/gravit/launcher/ClientLauncherWrapper.java @@ -82,7 +82,7 @@ public static void main(String[] arguments) throws IOException, InterruptedExcep Collections.addAll(args, MAGIC_ARG); Collections.addAll(args, "-XX:+DisableAttachMechanism"); Collections.addAll(args, "-Xmx256M"); - Collections.addAll(args, "-javaagent:".concat(pathLauncher)); + //Collections.addAll(args, "-javaagent:".concat(pathLauncher)); Collections.addAll(args, "-cp"); Collections.addAll(args, pathLauncher); Collections.addAll(args, LauncherEngine.class.getName()); diff --git a/Launcher/src/main/java/pro/gravit/launcher/LauncherEngine.java b/Launcher/src/main/java/pro/gravit/launcher/LauncherEngine.java index 5b4fbb9b..f0339e74 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/LauncherEngine.java +++ b/Launcher/src/main/java/pro/gravit/launcher/LauncherEngine.java @@ -54,6 +54,7 @@ public static void main(String... args) throws Throwable { JVMHelper.verifySystemProperties(Launcher.class, true); EnvHelper.checkDangerousParams(); //if(!LauncherAgent.isStarted()) throw new SecurityException("JavaAgent not set"); + JVMHelper.verifyNoAgent(); LogHelper.printVersion("Launcher"); LogHelper.printLicense("Launcher"); LauncherEngine.checkClass(LauncherEngine.class); diff --git a/Launcher/src/main/java/pro/gravit/launcher/client/events/ClientPreGuiPhase.java b/Launcher/src/main/java/pro/gravit/launcher/client/events/ClientPreGuiPhase.java index b7077cdd..ebbad380 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/client/events/ClientPreGuiPhase.java +++ b/Launcher/src/main/java/pro/gravit/launcher/client/events/ClientPreGuiPhase.java @@ -4,7 +4,7 @@ import pro.gravit.launcher.modules.LauncherModule; public class ClientPreGuiPhase extends LauncherModule.Event { - public final RuntimeProvider runtimeProvider; + public RuntimeProvider runtimeProvider; public ClientPreGuiPhase(RuntimeProvider runtimeProvider) { this.runtimeProvider = runtimeProvider; diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/modules/impl/SimpleModuleManager.java b/LauncherAPI/src/main/java/pro/gravit/launcher/modules/impl/SimpleModuleManager.java index 740fe8b4..16737cd1 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/modules/impl/SimpleModuleManager.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/modules/impl/SimpleModuleManager.java @@ -10,6 +10,8 @@ import pro.gravit.utils.verify.LauncherTrustManager; import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.net.URL; import java.nio.file.FileVisitResult; import java.nio.file.Files; @@ -29,6 +31,7 @@ import java.util.jar.JarFile; public class SimpleModuleManager implements LauncherModulesManager { + private static final MethodType VOID_TYPE = MethodType.methodType(void.class); protected final List modules = new ArrayList<>(); protected final List moduleNames = new ArrayList<>(); protected final SimpleModuleContext context; @@ -149,10 +152,17 @@ public LauncherModule loadModule(Path file) throws IOException { @SuppressWarnings("unchecked") Class clazz = (Class) Class.forName(moduleClass, false, classLoader); checkModuleClass(clazz, checkMode); - LauncherModule module = clazz.newInstance(); + if (!LauncherModule.class.isAssignableFrom(clazz)) + throw new ClassNotFoundException("Invalid module class... Not contains LauncherModule in hierarchy."); + LauncherModule module; + try { + module = (LauncherModule) MethodHandles.publicLookup().findConstructor(clazz, VOID_TYPE).invoke(); + } catch (Throwable e) { + throw (InstantiationException) new InstantiationException("Error on instancing...").initCause(e); + } loadModule(module); return module; - } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { + } catch (ClassNotFoundException | InstantiationException e) { LogHelper.error(e); LogHelper.error("In module %s Module-Main-Class incorrect", file.toString()); return null; diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/StandartClientWebSocketService.java b/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/StandartClientWebSocketService.java index 728ec40b..8af049ab 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/StandartClientWebSocketService.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/StandartClientWebSocketService.java @@ -65,7 +65,7 @@ public WebSocketEvent get() throws InterruptedException, ExecutionException { } WebSocketEvent result = event.result; waitEventHandler.requests.remove(event); - if (event.result.getType().equals("error") || event.result.getType().equals("exception")) { + if (event.result.getType().equals("error")) { ErrorRequestEvent errorRequestEvent = (ErrorRequestEvent) event.result; throw new ExecutionException(new RequestException(errorRequestEvent.error)); } diff --git a/LauncherCore/src/main/java/pro/gravit/utils/helper/JVMHelper.java b/LauncherCore/src/main/java/pro/gravit/utils/helper/JVMHelper.java index d5a140cc..fef77d80 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/helper/JVMHelper.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/helper/JVMHelper.java @@ -180,4 +180,8 @@ public static void verifySystemProperties(Class mainClass, boolean requireSys private JVMHelper() { } + + public static void verifyNoAgent() { + if (RUNTIME_MXBEAN.getInputArguments().stream().filter(e -> e != null && !e.isEmpty()).anyMatch(e -> e.contains("javaagent"))) throw new SecurityException("JavaAgent found"); + } }