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 37a303ff..6e6b2681 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/WebSocketService.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/WebSocketService.java @@ -22,6 +22,7 @@ import pro.gravit.launchserver.socket.response.profile.ProfileByUUIDResponse; import pro.gravit.launchserver.socket.response.profile.ProfileByUsername; import pro.gravit.launchserver.socket.response.secure.GetSecureLevelInfoResponse; +import pro.gravit.launchserver.socket.response.secure.HardwareReportResponse; import pro.gravit.launchserver.socket.response.secure.SecurityReportResponse; import pro.gravit.launchserver.socket.response.secure.VerifySecureLevelKeyResponse; import pro.gravit.launchserver.socket.response.update.LauncherResponse; @@ -72,6 +73,7 @@ public static void registerResponses() { providers.register("getSecureLevelInfo", GetSecureLevelInfoResponse.class); providers.register("verifySecureLevelKey", VerifySecureLevelKeyResponse.class); providers.register("securityReport", SecurityReportResponse.class); + providers.register("hardwareReport", HardwareReportResponse.class); } public void process(ChannelHandlerContext ctx, TextWebSocketFrame frame, Client client, String ip) { diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/secure/HardwareReportResponse.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/secure/HardwareReportResponse.java new file mode 100644 index 00000000..c9aa8db2 --- /dev/null +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/secure/HardwareReportResponse.java @@ -0,0 +1,20 @@ +package pro.gravit.launchserver.socket.response.secure; + +import io.netty.channel.ChannelHandlerContext; +import pro.gravit.launcher.request.secure.HardwareReportRequest; +import pro.gravit.launchserver.socket.Client; +import pro.gravit.launchserver.socket.response.SimpleResponse; + +public class HardwareReportResponse extends SimpleResponse { + public HardwareReportRequest.HardwareInfo hardware; + + @Override + public String getType() { + return "hardwareReport"; + } + + @Override + public void execute(ChannelHandlerContext ctx, Client client) throws Exception { + + } +} diff --git a/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherProcess.java b/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherProcess.java index 24a4bd0c..a10dd91d 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherProcess.java +++ b/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherProcess.java @@ -34,6 +34,7 @@ public class ClientLauncherProcess { public Path executeFile; public Path workDir; public Path javaDir; + public boolean useLegacyJavaClassPathProperty; public boolean isStarted; private transient Process process; @@ -103,9 +104,16 @@ public void start(boolean pipeOutput) throws IOException, InterruptedException { List processArgs = new LinkedList<>(); processArgs.add(executeFile.toString()); processArgs.addAll(jvmArgs); - processArgs.add("-cp"); //ADD CLASSPATH - processArgs.add(String.join(getPathSeparator(), systemClassPath)); + if(useLegacyJavaClassPathProperty) + { + processArgs.add("-Djava.class.path=".concat(String.join(getPathSeparator(), systemClassPath))); + } + else + { + processArgs.add("-cp"); + processArgs.add(String.join(getPathSeparator(), systemClassPath)); + } processArgs.add(mainClass); processArgs.addAll(systemClientArgs); synchronized (waitWriteParams) { diff --git a/Launcher/src/main/java/pro/gravit/launcher/console/test/PrintHardwareInfoCommand.java b/Launcher/src/main/java/pro/gravit/launcher/console/test/PrintHardwareInfoCommand.java new file mode 100644 index 00000000..2d7a879e --- /dev/null +++ b/Launcher/src/main/java/pro/gravit/launcher/console/test/PrintHardwareInfoCommand.java @@ -0,0 +1,48 @@ +package pro.gravit.launcher.console.test; + +import pro.gravit.launcher.utils.HWIDProvider; +import pro.gravit.utils.command.Command; +import pro.gravit.utils.helper.LogHelper; + +public class PrintHardwareInfoCommand extends Command { + @Override + public String getArgsDescription() { + return "[]"; + } + + @Override + public String getUsageDescription() { + return "print your hardware info and timings"; + } + + @Override + public void invoke(String... args) throws Exception { + LogHelper.info("Your Hardware ID:"); + long startTime = System.currentTimeMillis(); + long currentTime; + HWIDProvider provider = new HWIDProvider(); + currentTime = System.currentTimeMillis(); + LogHelper.info("Create HWIDProvider instance: %d ms", currentTime - startTime); + startTime = System.currentTimeMillis(); + int bitness = provider.getBitness(); + long totalMemory = provider.getTotalMemory(); + boolean isBattery = provider.isBattery(); + currentTime = System.currentTimeMillis(); + LogHelper.info("Bitness: %d, totalMemory: %d(%.3f GB), battery %s, TIME: %d ms", bitness, totalMemory, (double)totalMemory / (1024.0*1024.0*1024.0), Boolean.toString(isBattery), currentTime - startTime); + startTime = System.currentTimeMillis(); + int logicalProcessors = provider.getProcessorLogicalCount(); + int physicalProcessors = provider.getProcessorPhysicalCount(); + long processorMaxFreq = provider.getProcessorMaxFreq(); + currentTime = System.currentTimeMillis(); + LogHelper.info("Processors || logical: %d physical %d freq %d, TIME: %d ms", logicalProcessors, physicalProcessors, processorMaxFreq, currentTime - startTime); + startTime = System.currentTimeMillis(); + String hwDiskID = provider.getHWDiskID(); + currentTime = System.currentTimeMillis(); + LogHelper.info("HWDiskID %s, TIME: %d ms", hwDiskID, currentTime - startTime); + startTime = System.currentTimeMillis(); + String baseboardSerial = provider.getBaseboardSerialNumber(); + currentTime = System.currentTimeMillis(); + LogHelper.info("BaseboardSerial %s, TIME: %d ms", baseboardSerial, currentTime - startTime); + LogHelper.info("Hardware ID end"); + } +} diff --git a/Launcher/src/main/java/pro/gravit/launcher/guard/LauncherWrapperGuard.java b/Launcher/src/main/java/pro/gravit/launcher/guard/LauncherWrapperGuard.java index 22c10b02..762449a6 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/guard/LauncherWrapperGuard.java +++ b/Launcher/src/main/java/pro/gravit/launcher/guard/LauncherWrapperGuard.java @@ -34,6 +34,7 @@ public void applyGuardParams(ClientLauncherProcess process) { String projectName = Launcher.getConfig().projectName; String wrapperUnpackName = JVMHelper.JVM_BITS == 64 ? projectName.concat("64.exe") : projectName.concat("32.exe"); process.executeFile = DirBridge.getGuardDir().resolve(wrapperUnpackName); + process.useLegacyJavaClassPathProperty = true; } } } diff --git a/Launcher/src/main/java/pro/gravit/launcher/managers/ConsoleManager.java b/Launcher/src/main/java/pro/gravit/launcher/managers/ConsoleManager.java index c0d6543d..641be710 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/managers/ConsoleManager.java +++ b/Launcher/src/main/java/pro/gravit/launcher/managers/ConsoleManager.java @@ -4,6 +4,7 @@ import pro.gravit.launcher.LauncherEngine; import pro.gravit.launcher.client.events.ClientUnlockConsoleEvent; import pro.gravit.launcher.console.UnlockCommand; +import pro.gravit.launcher.console.test.PrintHardwareInfoCommand; import pro.gravit.utils.command.CommandHandler; import pro.gravit.utils.command.JLineCommandHandler; import pro.gravit.utils.command.StdCommandHandler; @@ -44,6 +45,7 @@ public static void registerCommands() { handler.registerCommand("gc", new GCCommand()); handler.registerCommand("clear", new ClearCommand(handler)); handler.registerCommand("unlock", new UnlockCommand()); + handler.registerCommand("printhardware", new PrintHardwareInfoCommand()); } public static boolean checkUnlockKey(String key) { diff --git a/Launcher/src/main/java/pro/gravit/launcher/utils/HWIDProvider.java b/Launcher/src/main/java/pro/gravit/launcher/utils/HWIDProvider.java new file mode 100644 index 00000000..bdf41d46 --- /dev/null +++ b/Launcher/src/main/java/pro/gravit/launcher/utils/HWIDProvider.java @@ -0,0 +1,98 @@ +package pro.gravit.launcher.utils; + +import oshi.SystemInfo; +import oshi.hardware.Display; +import oshi.hardware.HWDiskStore; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.hardware.PowerSource; +import oshi.software.os.OperatingSystem; +import pro.gravit.launcher.request.secure.HardwareReportRequest; + +public class HWIDProvider { + public SystemInfo systemInfo; + public OperatingSystem system; + public HardwareAbstractionLayer hardware; + public HWIDProvider() + { + systemInfo = new SystemInfo(); + system = systemInfo.getOperatingSystem(); + hardware = systemInfo.getHardware(); + } + //Statistic information + public int getBitness() + { + return system.getBitness(); + } + public long getTotalMemory() + { + return hardware.getMemory().getTotal(); + } + public long getProcessorMaxFreq() + { + return hardware.getProcessor().getMaxFreq(); + } + public int getProcessorPhysicalCount() + { + return hardware.getProcessor().getPhysicalProcessorCount(); + } + public int getProcessorLogicalCount() + { + return hardware.getProcessor().getLogicalProcessorCount(); + } + public boolean isBattery() + { + PowerSource[] powerSources = hardware.getPowerSources(); + return powerSources != null && powerSources.length != 0; + } + //Hardware Information + public String getHWDiskID() + { + HWDiskStore[] hwDiskStore = hardware.getDiskStores(); + long size = 0; + HWDiskStore maxStore = null; + for(HWDiskStore store : hwDiskStore) + { + if(store.getSize() > size) + { + maxStore = store; + size = store.getSize(); + } + } + if(maxStore != null) + { + return maxStore.getSerial(); + } + return null; + } + public byte[] getDisplayID() + { + Display[] displays = hardware.getDisplays(); + if(displays == null || displays.length == 0) return null; + for(Display display : displays) + { + return display.getEdid(); + } + return null; + } + public String getBaseboardSerialNumber() + { + return hardware.getComputerSystem().getBaseboard().getSerialNumber(); + } + public HardwareReportRequest.HardwareInfo getHardwareInfo(boolean needSerial) + { + HardwareReportRequest.HardwareInfo info = new HardwareReportRequest.HardwareInfo(); + info.bitness = getBitness(); + info.logicalProcessors = getProcessorLogicalCount(); + info.physicalProcessors = getProcessorPhysicalCount(); + info.processorMaxFreq = getProcessorMaxFreq(); + info.totalMemory = getTotalMemory(); + info.battery = isBattery(); + if(needSerial) + { + info.hwDiskId = getHWDiskID(); + info.displayId = getDisplayID(); + info.baseboardSerialNumber = getBaseboardSerialNumber(); + } + return info; + } +} diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/ClientPermissions.java b/LauncherAPI/src/main/java/pro/gravit/launcher/ClientPermissions.java index fe6d34fa..040b88a8 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/ClientPermissions.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/ClientPermissions.java @@ -7,7 +7,9 @@ public class ClientPermissions { public static final ClientPermissions DEFAULT = new ClientPermissions(); + @LauncherNetworkAPI public long permissions; + @LauncherNetworkAPI public long flags; public ClientPermissions(HInput input) throws IOException { diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/HardwareReportRequestEvent.java b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/HardwareReportRequestEvent.java new file mode 100644 index 00000000..7305eca8 --- /dev/null +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/HardwareReportRequestEvent.java @@ -0,0 +1,10 @@ +package pro.gravit.launcher.events.request; + +import pro.gravit.launcher.events.RequestEvent; + +public class HardwareReportRequestEvent extends RequestEvent { + @Override + public String getType() { + return "hardwareReport"; + } +} diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/request/secure/HardwareReportRequest.java b/LauncherAPI/src/main/java/pro/gravit/launcher/request/secure/HardwareReportRequest.java new file mode 100644 index 00000000..2f7fd075 --- /dev/null +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/request/secure/HardwareReportRequest.java @@ -0,0 +1,24 @@ +package pro.gravit.launcher.request.secure; + +import pro.gravit.launcher.events.request.HardwareReportRequestEvent; +import pro.gravit.launcher.request.Request; + +public class HardwareReportRequest extends Request { + public HardwareInfo hardware; + @Override + public String getType() { + return "hardwareReport"; + } + + public static class HardwareInfo { + public int bitness; + public long totalMemory; + public int logicalProcessors; + public int physicalProcessors; + public long processorMaxFreq; + public boolean battery; + public String hwDiskId; + public byte[] displayId; + public String baseboardSerialNumber; + } +} 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 a21f0077..d1d5948a 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 @@ -101,6 +101,7 @@ public void registerResults() { results.register("getSecureLevelInfo", GetSecureLevelInfoRequestEvent.class); results.register("verifySecureLevelKey", VerifySecureLevelKeyRequestEvent.class); results.register("securityReport", SecurityReportRequestEvent.class); + results.register("hardwareReport", HardwareReportRequestEvent.class); } public void waitIfNotConnected() {