From fd9e2f9bd88d8672ac6f24ead8cd68b0b7225f03 Mon Sep 17 00:00:00 2001 From: Gravit Date: Sat, 6 Jul 2019 17:39:17 +0700 Subject: [PATCH 01/11] =?UTF-8?q?[FIX]=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20Legacy=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/pro/gravit/launchserver/LaunchServer.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java index 72c2f2ef..4e898384 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java @@ -142,11 +142,6 @@ public AuthProviderPair getAuthProviderPair() { public Map components; - // Misc options - public int threadCount; - - public int threadCoreCount; - public ExeConf launch4j; public NettyConfig netty; public GuardLicenseConf guardLicense; @@ -752,9 +747,6 @@ private void generateConfigIfNotExists(boolean testEnv) throws IOException { newConfig.launcher = new LauncherConf(); newConfig.launcher.guardType = "no"; - newConfig.threadCoreCount = 0; // on your own - newConfig.threadCount = JVMHelper.OPERATING_SYSTEM_MXBEAN.getAvailableProcessors() >= 4 ? JVMHelper.OPERATING_SYSTEM_MXBEAN.getAvailableProcessors() / 2 : JVMHelper.OPERATING_SYSTEM_MXBEAN.getAvailableProcessors(); - newConfig.enabledRadon = true; newConfig.genMappings = true; newConfig.enabledProGuard = true; From 752fb9e87932f3b4949dcbd5c16c8902a3b874e3 Mon Sep 17 00:00:00 2001 From: Gravit Date: Sat, 6 Jul 2019 17:58:25 +0700 Subject: [PATCH 02/11] =?UTF-8?q?[FEATURE]=20=D0=90=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B0=D0=BD=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pro/gravit/utils/command/Command.java | 26 +++++++++++++++++++ .../utils/command/JLineCommandHandler.java | 20 +++++++++----- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/LauncherCore/src/main/java/pro/gravit/utils/command/Command.java b/LauncherCore/src/main/java/pro/gravit/utils/command/Command.java index 6deff0d9..ebeb96dc 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/command/Command.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/command/Command.java @@ -1,7 +1,10 @@ package pro.gravit.utils.command; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; +import org.jline.reader.Candidate; import pro.gravit.utils.helper.VerifyHelper; public abstract class Command { @@ -29,6 +32,29 @@ protected static UUID parseUUID(String s) throws CommandException { public abstract String getUsageDescription(); + public Candidate buildCandidate(CommandHandler.Category category, String commandName) + { + return new Candidate(commandName); + } + + public List complete(List words, int wordIndex, String word) + { + return new ArrayList<>(); + } + + public List subCommandComplete(String word, List commands) + { + List candidates = new ArrayList<>(); + for(String s : commands) + { + if(word.startsWith(s)) + { + candidates.add(new Candidate(s)); + } + } + return candidates; + } + public abstract void invoke(String... args) throws Exception; diff --git a/LauncherCore/src/main/java/pro/gravit/utils/command/JLineCommandHandler.java b/LauncherCore/src/main/java/pro/gravit/utils/command/JLineCommandHandler.java index 97566b37..a795c571 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/command/JLineCommandHandler.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/command/JLineCommandHandler.java @@ -36,12 +36,20 @@ public class JLineConsoleCompleter implements Completer { @Override public void complete(LineReader reader, ParsedLine line, List candidates) { String completeWord = line.word(); - if (line.wordIndex() != 0) return; - walk((category, name, command) -> { - if (name.startsWith(completeWord)) { - candidates.add(new Candidate(name)); - } - }); + if (line.wordIndex() == 0) + { + walk((category, name, command) -> { + if (name.startsWith(completeWord)) { + candidates.add(command.buildCandidate(category, name)); + } + }); + } + else + { + Command target = findCommand(line.words().get(0)); + List candidates1 = target.complete(line.words(), line.wordIndex(), completeWord); + candidates.addAll(candidates1); + } } } From 5b7ae04fbdd247b865b4819cd960bffbb5931d12 Mon Sep 17 00:00:00 2001 From: Gravit Date: Sat, 6 Jul 2019 18:42:29 +0700 Subject: [PATCH 03/11] =?UTF-8?q?[FEATURE]=20=D0=A1=D1=83=D0=B1=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BC=D0=B0=D0=BD=D0=B4=D1=8B=20=D0=B8=20=D0=B0?= =?UTF-8?q?=D0=B2=D1=82=D0=BE=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=B8=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pro/gravit/utils/command/Command.java | 39 ++++++++++++------- .../utils/command/JLineCommandHandler.java | 4 +- .../pro/gravit/utils/command/SubCommand.java | 13 +++++++ 3 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 LauncherCore/src/main/java/pro/gravit/utils/command/SubCommand.java diff --git a/LauncherCore/src/main/java/pro/gravit/utils/command/Command.java b/LauncherCore/src/main/java/pro/gravit/utils/command/Command.java index ebeb96dc..10d03a4f 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/command/Command.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/command/Command.java @@ -1,14 +1,12 @@ package pro.gravit.utils.command; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; +import java.util.*; import org.jline.reader.Candidate; import pro.gravit.utils.helper.VerifyHelper; public abstract class Command { - + public Map childCommands = new HashMap<>(); protected static String parseUsername(String username) throws CommandException { try { @@ -39,20 +37,31 @@ public Candidate buildCandidate(CommandHandler.Category category, String command public List complete(List words, int wordIndex, String word) { - return new ArrayList<>(); + if(wordIndex == 0) + { + List candidates = new ArrayList<>(); + childCommands.forEach((k,v) -> { + if(k.startsWith(word)) + { + candidates.add(new Candidate(k)); + } + }); + return candidates; + } + else + { + Command cmd = childCommands.get(words.get(0)); + if(cmd == null) return new ArrayList<>(); + return cmd.complete(words.subList(1, words.size()), wordIndex - 1, word); + } } - public List subCommandComplete(String word, List commands) + public void invokeSubcommands(String... args) throws Exception { - List candidates = new ArrayList<>(); - for(String s : commands) - { - if(word.startsWith(s)) - { - candidates.add(new Candidate(s)); - } - } - return candidates; + verifyArgs(args, 1); + Command command = childCommands.get(args[0]); + if(command == null) throw new CommandException(String.format("Unknown sub command: '%s'", args[0])); + command.invoke(Arrays.copyOfRange(args, 1, args.length)); } diff --git a/LauncherCore/src/main/java/pro/gravit/utils/command/JLineCommandHandler.java b/LauncherCore/src/main/java/pro/gravit/utils/command/JLineCommandHandler.java index a795c571..25767e33 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/command/JLineCommandHandler.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/command/JLineCommandHandler.java @@ -1,6 +1,7 @@ package pro.gravit.utils.command; import java.io.IOException; +import java.util.Arrays; import java.util.List; import org.jline.reader.Candidate; @@ -47,7 +48,8 @@ public void complete(LineReader reader, ParsedLine line, List candida else { Command target = findCommand(line.words().get(0)); - List candidates1 = target.complete(line.words(), line.wordIndex(), completeWord); + List words = line.words(); + List candidates1 = target.complete(words.subList(1, words.size()), line.wordIndex() - 1, completeWord); candidates.addAll(candidates1); } } diff --git a/LauncherCore/src/main/java/pro/gravit/utils/command/SubCommand.java b/LauncherCore/src/main/java/pro/gravit/utils/command/SubCommand.java new file mode 100644 index 00000000..54bd51fe --- /dev/null +++ b/LauncherCore/src/main/java/pro/gravit/utils/command/SubCommand.java @@ -0,0 +1,13 @@ +package pro.gravit.utils.command; + +public abstract class SubCommand extends Command { + @Override + public String getArgsDescription() { + return null; + } + + @Override + public String getUsageDescription() { + return null; + } +} From 97bf5816c0c1311d6f28cc9c5a0819184d00e2c3 Mon Sep 17 00:00:00 2001 From: Gravit Date: Sat, 6 Jul 2019 18:48:13 +0700 Subject: [PATCH 04/11] =?UTF-8?q?[FEATURE]=20=D0=A2=D0=B5=D1=81=D1=82=20?= =?UTF-8?q?=D1=81=D1=83=D0=B1=D0=BA=D0=BE=D0=BC=D0=BC=D0=B0=D0=BD=D0=B4=20?= =?UTF-8?q?=D0=B2=20dumpSessions=20=D0=B8=20dumpEntryCache?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/dump/DumpEntryCacheCommand.java | 79 +++++++++++-------- .../command/dump/DumpSessionsCommand.java | 50 +++++++----- 2 files changed, 78 insertions(+), 51 deletions(-) diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/dump/DumpEntryCacheCommand.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/dump/DumpEntryCacheCommand.java index 4fe70d76..fba4e1ff 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/dump/DumpEntryCacheCommand.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/dump/DumpEntryCacheCommand.java @@ -11,12 +11,59 @@ import pro.gravit.launchserver.auth.AuthProviderPair; import pro.gravit.launchserver.auth.handler.CachedAuthHandler; import pro.gravit.launchserver.command.Command; +import pro.gravit.utils.command.SubCommand; import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.LogHelper; public class DumpEntryCacheCommand extends Command { public DumpEntryCacheCommand(LaunchServer server) { super(server); + childCommands.put("load", new SubCommand() { + @Override + public void invoke(String... args) throws Exception { + verifyArgs(args, 2); + AuthProviderPair pair = server.config.getAuthProviderPair(args[0]); + if (pair == null) throw new IllegalStateException(String.format("Auth %s not found", args[0])); + if (!(pair.handler instanceof CachedAuthHandler)) + throw new UnsupportedOperationException("This command used only CachedAuthHandler"); + CachedAuthHandler authHandler = (CachedAuthHandler) pair.handler; + + LogHelper.info("CachedAuthHandler read from %s", args[0]); + int size_entry; + int size_username; + try (Reader reader = IOHelper.newReader(Paths.get(args[1]))) { + EntryAndUsername entryAndUsername = Launcher.gsonManager.configGson.fromJson(reader, EntryAndUsername.class); + size_entry = entryAndUsername.entryCache.size(); + size_username = entryAndUsername.usernameCache.size(); + authHandler.loadEntryCache(entryAndUsername.entryCache); + authHandler.loadUsernameCache(entryAndUsername.usernameCache); + + } + LogHelper.subInfo("Readed %d entryCache %d usernameCache", size_entry, size_username); + } + }); + childCommands.put("unload", new SubCommand() { + @Override + public void invoke(String... args) throws Exception { + verifyArgs(args, 2); + AuthProviderPair pair = server.config.getAuthProviderPair(args[0]); + if (pair == null) throw new IllegalStateException(String.format("Auth %s not found", args[0])); + if (!(pair.handler instanceof CachedAuthHandler)) + throw new UnsupportedOperationException("This command used only CachedAuthHandler"); + CachedAuthHandler authHandler = (CachedAuthHandler) pair.handler; + + LogHelper.info("CachedAuthHandler write to %s", args[1]); + Map entryCache = authHandler.getEntryCache(); + Map usernamesCache = authHandler.getUsernamesCache(); + EntryAndUsername serializable = new EntryAndUsername(); + serializable.entryCache = entryCache; + serializable.usernameCache = usernamesCache; + try (Writer writer = IOHelper.newWriter(Paths.get(args[1]))) { + Launcher.gsonManager.configGson.toJson(serializable, writer); + } + LogHelper.subInfo("Write %d entryCache, %d usernameCache", entryCache.size(), usernamesCache.size()); + } + }); } @Override @@ -31,37 +78,7 @@ public String getUsageDescription() { @Override public void invoke(String... args) throws Exception { - verifyArgs(args, 3); - AuthProviderPair pair = server.config.getAuthProviderPair(args[1]); - if (pair == null) throw new IllegalStateException(String.format("Auth %s not found", args[1])); - if (!(pair.handler instanceof CachedAuthHandler)) - throw new UnsupportedOperationException("This command used only CachedAuthHandler"); - CachedAuthHandler authHandler = (CachedAuthHandler) pair.handler; - if (args[0].equals("unload")) { - LogHelper.info("CachedAuthHandler write to %s", args[2]); - Map entryCache = authHandler.getEntryCache(); - Map usernamesCache = authHandler.getUsernamesCache(); - EntryAndUsername serializable = new EntryAndUsername(); - serializable.entryCache = entryCache; - serializable.usernameCache = usernamesCache; - try (Writer writer = IOHelper.newWriter(Paths.get(args[1]))) { - Launcher.gsonManager.configGson.toJson(serializable, writer); - } - LogHelper.subInfo("Write %d entryCache, %d usernameCache", entryCache.size(), usernamesCache.size()); - } else if (args[0].equals("load")) { - LogHelper.info("CachedAuthHandler read from %s", args[1]); - int size_entry; - int size_username; - try (Reader reader = IOHelper.newReader(Paths.get(args[1]))) { - EntryAndUsername entryAndUsername = Launcher.gsonManager.configGson.fromJson(reader, EntryAndUsername.class); - size_entry = entryAndUsername.entryCache.size(); - size_username = entryAndUsername.usernameCache.size(); - authHandler.loadEntryCache(entryAndUsername.entryCache); - authHandler.loadUsernameCache(entryAndUsername.usernameCache); - - } - LogHelper.subInfo("Readed %d entryCache %d usernameCache", size_entry, size_username); - } + invokeSubcommands(args); } public class EntryAndUsername { diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/dump/DumpSessionsCommand.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/dump/DumpSessionsCommand.java index 234b72d2..350e7515 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/dump/DumpSessionsCommand.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/dump/DumpSessionsCommand.java @@ -13,12 +13,41 @@ import pro.gravit.launchserver.LaunchServer; import pro.gravit.launchserver.command.Command; import pro.gravit.launchserver.socket.Client; +import pro.gravit.utils.command.SubCommand; import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.LogHelper; public class DumpSessionsCommand extends Command { public DumpSessionsCommand(LaunchServer server) { super(server); + childCommands.put("load", new SubCommand() { + @Override + public void invoke(String... args) throws Exception { + verifyArgs(args, 1); + LogHelper.info("Sessions read from %s", args[0]); + int size; + try (Reader reader = IOHelper.newReader(Paths.get(args[0]))) { + Type setType = new TypeToken>() { + }.getType(); + Set clientSet = Launcher.gsonManager.configGson.fromJson(reader, setType); + size = clientSet.size(); + server.sessionManager.loadSessions(clientSet); + } + LogHelper.subInfo("Readed %d sessions", size); + } + }); + childCommands.put("unload", new SubCommand() { + @Override + public void invoke(String... args) throws Exception { + verifyArgs(args, 1); + LogHelper.info("Sessions write to %s", args[0]); + Set clientSet = server.sessionManager.getSessions(); + try (Writer writer = IOHelper.newWriter(Paths.get(args[0]))) { + Launcher.gsonManager.configGson.toJson(clientSet, writer); + } + LogHelper.subInfo("Write %d sessions", clientSet.size()); + } + }); } @Override @@ -33,25 +62,6 @@ public String getUsageDescription() { @Override public void invoke(String... args) throws Exception { - verifyArgs(args, 2); - if (args[0].equals("unload")) { - LogHelper.info("Sessions write to %s", args[1]); - Set clientSet = server.sessionManager.getSessions(); - try (Writer writer = IOHelper.newWriter(Paths.get(args[1]))) { - Launcher.gsonManager.configGson.toJson(clientSet, writer); - } - LogHelper.subInfo("Write %d sessions", clientSet.size()); - } else if (args[0].equals("load")) { - LogHelper.info("Sessions read from %s", args[1]); - int size; - try (Reader reader = IOHelper.newReader(Paths.get(args[1]))) { - Type setType = new TypeToken>() { - }.getType(); - Set clientSet = Launcher.gsonManager.configGson.fromJson(reader, setType); - size = clientSet.size(); - server.sessionManager.loadSessions(clientSet); - } - LogHelper.subInfo("Readed %d sessions", size); - } + invokeSubcommands(args); } } From aac9aef821d375f5561f5fd0b296d6d59b729e7f Mon Sep 17 00:00:00 2001 From: Gravit Date: Sat, 6 Jul 2019 19:17:23 +0700 Subject: [PATCH 05/11] =?UTF-8?q?[FEATURE]=20Help=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=81=D1=83=D0=B1=D0=BA=D0=BE=D0=BC=D0=BC=D0=B0=D0=BD=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utils/command/basic/HelpCommand.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/LauncherCore/src/main/java/pro/gravit/utils/command/basic/HelpCommand.java b/LauncherCore/src/main/java/pro/gravit/utils/command/basic/HelpCommand.java index 77c819d1..95f00723 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/command/basic/HelpCommand.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/command/basic/HelpCommand.java @@ -1,5 +1,6 @@ package pro.gravit.utils.command.basic; +import java.util.Arrays; import java.util.Map.Entry; import org.fusesource.jansi.Ansi; @@ -13,7 +14,7 @@ public final class HelpCommand extends Command { private CommandHandler handler; - private static void printCommand(String name, Command command) { + public static void printCommand(String name, Command command) { String args = command.getArgsDescription(); //LogHelper.subInfo("%s %s - %s", name, args == null ? "[nothing]" : args, command.getUsageDescription()); LogHelper.rawLog(() -> FormatHelper.rawFormat(LogHelper.Level.INFO, LogHelper.getDataTime(), true) + String.format("%s %s - %s", name, args == null ? "[nothing]" : args, command.getUsageDescription()), () -> { @@ -31,6 +32,27 @@ private static void printCommand(String name, Command command) { }, () -> LogHelper.htmlFormatLog(LogHelper.Level.INFO, LogHelper.getDataTime(), String.format("%s %s - %s", name, args == null ? "[nothing]" : args, command.getUsageDescription()), true)); } + public static void printSubCommandsHelp(String base, Command command) + { + command.childCommands.forEach((k, v) -> { + printCommand(base.concat(" ").concat(k), v); + }); + } + + public static void printSubCommandsHelp(String name, String[] args, Command command) throws CommandException + { + if(args.length == 0) + { + printSubCommandsHelp(name, command); + } + else + { + Command child = command.childCommands.get(args[0]); + if(child == null) throw new CommandException(String.format("Unknown sub command: '%s'", args[0])); + printSubCommandsHelp(name.concat(" ").concat(args[0]), Arrays.copyOfRange(args,1 , args.length), child); + } + } + private static void printCategory(String name, String description) { if (description != null) LogHelper.info("Category: %s - %s", name, description); else LogHelper.info("Category: %s", name); @@ -58,7 +80,9 @@ public void invoke(String... args) throws CommandException { } // Print command help - printCommand(args[0]); + if(args.length == 1) + printCommand(args[0]); + printSubCommandsHelp(args[0], Arrays.copyOfRange(args, 1 , args.length), handler.lookup(args[0])); } private void printCommand(String name) throws CommandException { From 198b7037d5f64e8372ac2b1c5e648141e769eb68 Mon Sep 17 00:00:00 2001 From: Gravit Date: Sat, 6 Jul 2019 19:54:10 +0700 Subject: [PATCH 06/11] =?UTF-8?q?[FEATURE]=20=D0=9F=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20Reconfigurable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pro/gravit/launchserver/LaunchServer.java | 3 +- .../gravit/launchserver/Reconfigurable.java | 8 ++- .../auth/provider/RejectAuthProvider.java | 36 ++++-------- .../gravit/launchserver/command/Command.java | 8 +++ .../command/handler/CommandHandler.java | 2 - .../command/service/ConfigCommand.java | 9 +-- .../command/service/ConfigHelpCommand.java | 28 ---------- .../command/service/ConfigListCommand.java | 25 --------- .../manangers/ReconfigurableManager.java | 56 ++++++++++++++----- .../pro/gravit/utils/command/Command.java | 10 +++- 10 files changed, 82 insertions(+), 103 deletions(-) delete mode 100644 LaunchServer/src/main/java/pro/gravit/launchserver/command/service/ConfigHelpCommand.java delete mode 100644 LaunchServer/src/main/java/pro/gravit/launchserver/command/service/ConfigListCommand.java diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java index 4e898384..fbbe1527 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java @@ -510,7 +510,6 @@ public LaunchServer(Path dir, boolean testEnv, String[] args) throws IOException localCommandHandler = new StdCommandHandler(true); LogHelper.warning("JLine2 isn't in classpath, using std"); } - pro.gravit.launchserver.command.handler.CommandHandler.registerCommands(localCommandHandler, this); commandHandler = localCommandHandler; // Set key pair @@ -607,6 +606,8 @@ public LaunchServer(Path dir, boolean testEnv, String[] args) throws IOException Arrays.stream(config.mirrors).forEach(mirrorManager::addMirror); + pro.gravit.launchserver.command.handler.CommandHandler.registerCommands(localCommandHandler, this); + // init modules modulesManager.initModules(); if (config.components != null) { diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/Reconfigurable.java b/LaunchServer/src/main/java/pro/gravit/launchserver/Reconfigurable.java index 45ee0193..acb00ba4 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/Reconfigurable.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/Reconfigurable.java @@ -1,7 +1,9 @@ package pro.gravit.launchserver; -public interface Reconfigurable { - void reconfig(String action, String[] args); +import pro.gravit.utils.command.Command; - void printConfigHelp(); +import java.util.Map; + +public interface Reconfigurable { + Map getCommands(); } diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/auth/provider/RejectAuthProvider.java b/LaunchServer/src/main/java/pro/gravit/launchserver/auth/provider/RejectAuthProvider.java index 4a707288..f6025060 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/auth/provider/RejectAuthProvider.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/auth/provider/RejectAuthProvider.java @@ -1,9 +1,13 @@ package pro.gravit.launchserver.auth.provider; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import pro.gravit.launchserver.Reconfigurable; import pro.gravit.launchserver.auth.AuthException; +import pro.gravit.utils.command.Command; +import pro.gravit.utils.command.SubCommand; import pro.gravit.utils.helper.LogHelper; import pro.gravit.utils.helper.SecurityHelper; @@ -36,31 +40,15 @@ public void close() { } @Override - public void reconfig(String action, String[] args) { - switch (action) { - case "message": + public Map getCommands() { + Map commands = new HashMap<>(); + commands.put("message", new SubCommand() { + @Override + public void invoke(String... args) throws Exception { message = args[0]; LogHelper.info("New reject message: %s", message); - break; - case "whitelist.add": - if (whitelist == null) whitelist = new ArrayList<>(); - whitelist.add(args[0]); - break; - case "whitelist.remove": - if (whitelist == null) whitelist = new ArrayList<>(); - whitelist.remove(args[0]); - break; - case "whitelist.clear": - whitelist.clear(); - break; - } - } - - @Override - public void printConfigHelp() { - LogHelper.info("message [new message] - set message"); - LogHelper.info("whitelist.add [username] - add username to whitelist"); - LogHelper.info("whitelist.remove [username] - remove username into whitelist"); - LogHelper.info("whitelist.clear - clear whitelist"); + } + }); + return commands; } } diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/Command.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/Command.java index 83c28838..32ed911e 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/Command.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/Command.java @@ -2,6 +2,8 @@ import pro.gravit.launchserver.LaunchServer; +import java.util.Map; + public abstract class Command extends pro.gravit.utils.command.Command { @@ -9,6 +11,12 @@ public abstract class Command extends pro.gravit.utils.command.Command { protected Command(LaunchServer server) { + super(); + this.server = server; + } + + public Command(Map childCommands, LaunchServer server) { + super(childCommands); this.server = server; } } diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/handler/CommandHandler.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/handler/CommandHandler.java index 69c16655..7af943e6 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/handler/CommandHandler.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/handler/CommandHandler.java @@ -105,8 +105,6 @@ public static void registerCommands(pro.gravit.utils.command.CommandHandler hand service.registerCommand("reloadAll", new ReloadAllCommand(server)); service.registerCommand("reloadList", new ReloadListCommand(server)); service.registerCommand("config", new ConfigCommand(server)); - service.registerCommand("configHelp", new ConfigHelpCommand(server)); - service.registerCommand("configList", new ConfigListCommand(server)); service.registerCommand("serverStatus", new ServerStatusCommand(server)); service.registerCommand("checkInstall", new CheckInstallCommand(server)); service.registerCommand("multi", new MultiCommand(server)); diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/ConfigCommand.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/ConfigCommand.java index 3c546609..ce6a295e 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/ConfigCommand.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/ConfigCommand.java @@ -2,11 +2,12 @@ import pro.gravit.launchserver.LaunchServer; import pro.gravit.launchserver.command.Command; +import pro.gravit.launchserver.manangers.ReconfigurableManager; import pro.gravit.utils.helper.LogHelper; public class ConfigCommand extends Command { public ConfigCommand(LaunchServer server) { - super(server); + super(server.reconfigurableManager.getCommands(), server); } @Override @@ -21,10 +22,6 @@ public String getUsageDescription() { @Override public void invoke(String... args) throws Exception { - verifyArgs(args, 2); - LogHelper.info("Call %s module %s action", args[0], args[1]); - String[] new_args = new String[args.length - 2]; - System.arraycopy(args, 2, new_args, 0, args.length - 2); - server.reconfigurableManager.call(args[0], args[1], new_args); + invokeSubcommands(args); } } diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/ConfigHelpCommand.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/ConfigHelpCommand.java deleted file mode 100644 index b1a0b749..00000000 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/ConfigHelpCommand.java +++ /dev/null @@ -1,28 +0,0 @@ -package pro.gravit.launchserver.command.service; - -import pro.gravit.launchserver.LaunchServer; -import pro.gravit.launchserver.command.Command; -import pro.gravit.utils.helper.LogHelper; - -public class ConfigHelpCommand extends Command { - public ConfigHelpCommand(LaunchServer server) { - super(server); - } - - @Override - public String getArgsDescription() { - return "[name]"; - } - - @Override - public String getUsageDescription() { - return "print help for config command"; - } - - @Override - public void invoke(String... args) throws Exception { - verifyArgs(args, 1); - LogHelper.info("Help %s module", args[0]); - server.reconfigurableManager.printHelp(args[0]); - } -} diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/ConfigListCommand.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/ConfigListCommand.java deleted file mode 100644 index 9af0aee9..00000000 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/ConfigListCommand.java +++ /dev/null @@ -1,25 +0,0 @@ -package pro.gravit.launchserver.command.service; - -import pro.gravit.launchserver.LaunchServer; -import pro.gravit.launchserver.command.Command; - -public class ConfigListCommand extends Command { - public ConfigListCommand(LaunchServer server) { - super(server); - } - - @Override - public String getArgsDescription() { - return "[name]"; - } - - @Override - public String getUsageDescription() { - return "print help for config command"; - } - - @Override - public void invoke(String... args) { - server.reconfigurableManager.printReconfigurables(); - } -} diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/ReconfigurableManager.java b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/ReconfigurableManager.java index 59e4d054..227ec8d0 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/ReconfigurableManager.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/ReconfigurableManager.java @@ -1,35 +1,65 @@ package pro.gravit.launchserver.manangers; import java.util.HashMap; +import java.util.Map; import java.util.Objects; import pro.gravit.launchserver.Reconfigurable; +import pro.gravit.utils.command.Command; +import pro.gravit.utils.command.CommandException; +import pro.gravit.utils.command.basic.HelpCommand; import pro.gravit.utils.helper.LogHelper; import pro.gravit.utils.helper.VerifyHelper; public class ReconfigurableManager { - private final HashMap RECONFIGURABLE = new HashMap<>(); + private class ReconfigurableVirtualCommand extends Command { + public ReconfigurableVirtualCommand(Map childs) { + super(childs); + } + + @Override + public String getArgsDescription() { + return null; + } + + @Override + public String getUsageDescription() { + return null; + } + + @Override + public void invoke(String... args) throws Exception { + invokeSubcommands(args); + } + } + private final HashMap RECONFIGURABLE = new HashMap<>(); public void registerReconfigurable(String name, Reconfigurable reconfigurable) { - VerifyHelper.putIfAbsent(RECONFIGURABLE, name.toLowerCase(), Objects.requireNonNull(reconfigurable, "adapter"), + VerifyHelper.putIfAbsent(RECONFIGURABLE, name.toLowerCase(), new ReconfigurableVirtualCommand(reconfigurable.getCommands()), String.format("Reloadable has been already registered: '%s'", name)); } - public Reconfigurable unregisterReconfigurable(String name) { - return RECONFIGURABLE.remove(name); + public void unregisterReconfigurable(String name) { + RECONFIGURABLE.remove(name); } - public void printHelp(String name) { - RECONFIGURABLE.get(name.toLowerCase()).printConfigHelp(); + public void call(String name, String action, String[] args) throws Exception + { + Command commands = RECONFIGURABLE.get(name); + if(commands == null) throw new CommandException(String.format("Reconfigurable %s not found", name)); + Command command = commands.childCommands.get(action); + if(command == null) throw new CommandException(String.format("Action %s.%s not found", name, action)); + command.invoke(args); } - public void call(String name, String action, String[] args) { - RECONFIGURABLE.get(name.toLowerCase()).reconfig(action.toLowerCase(), args); + public void printHelp(String name) throws CommandException + { + Command commands = RECONFIGURABLE.get(name); + if(commands == null) throw new CommandException(String.format("Reconfigurable %s not found", name)); + HelpCommand.printSubCommandsHelp(name, commands); } - - public void printReconfigurables() { - LogHelper.info("Print reconfigurables"); - RECONFIGURABLE.forEach((k, v) -> LogHelper.subInfo(k)); - LogHelper.info("Found %d reconfigurables", RECONFIGURABLE.size()); + public Map getCommands() + { + return RECONFIGURABLE; } } diff --git a/LauncherCore/src/main/java/pro/gravit/utils/command/Command.java b/LauncherCore/src/main/java/pro/gravit/utils/command/Command.java index 10d03a4f..aa1470ac 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/command/Command.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/command/Command.java @@ -6,7 +6,15 @@ import pro.gravit.utils.helper.VerifyHelper; public abstract class Command { - public Map childCommands = new HashMap<>(); + public Map childCommands; + + public Command() { + childCommands = new HashMap<>(); + } + + public Command(Map childCommands) { + this.childCommands = childCommands; + } protected static String parseUsername(String username) throws CommandException { try { From e1f07cdfc8576ec407e6a0c80baec7c665222eba Mon Sep 17 00:00:00 2001 From: Gravit Date: Sat, 6 Jul 2019 19:56:26 +0700 Subject: [PATCH 07/11] =?UTF-8?q?[ANY]=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9?= 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 dba4f013..f7cf0576 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit dba4f0132cdb49cbc6cb7356fb6a54a063aba8b5 +Subproject commit f7cf0576033cd413b99e8180610d586e370c9351 From e3ec15b2709451bc89c681178033414ae95e5056 Mon Sep 17 00:00:00 2001 From: LoomeL <44950511+LoomeL@users.noreply.github.com> Date: Sat, 6 Jul 2019 19:06:00 +0600 Subject: [PATCH 08/11] =?UTF-8?q?=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B0=20=D0=BF=D0=BE=20=D1=83=D0=BC=D0=BE=D0=BB?= =?UTF-8?q?=D1=87=D0=B0=D0=BD=D0=B8=D1=8E=20=D0=B4=D0=BB=D1=8F=20featureSt?= =?UTF-8?q?ore=20(#304)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Launcher/runtime/config.js | 1 + Launcher/runtime/engine/settings.js | 1 + 2 files changed, 2 insertions(+) diff --git a/Launcher/runtime/config.js b/Launcher/runtime/config.js index 7966e1ee..c5fa5bc1 100644 --- a/Launcher/runtime/config.js +++ b/Launcher/runtime/config.js @@ -15,6 +15,7 @@ var config = { settingsMagic: 0xC0DE5, // Magic, don't touch autoEnterDefault: false, // Should autoEnter be enabled by default? fullScreenDefault: false, // Should fullScreen be enabled by default? + featureStoreDefault: true, // Should featureStore be enabled by default? ramDefault: 1024, // Default RAM amount (0 for auto) jvm: { diff --git a/Launcher/runtime/engine/settings.js b/Launcher/runtime/engine/settings.js index 8e8b34b6..d37463cf 100644 --- a/Launcher/runtime/engine/settings.js +++ b/Launcher/runtime/engine/settings.js @@ -10,6 +10,7 @@ var settingsManagerClass = Java.extend(SettingsManagerClass.static, { new_settings.fullScreen = config.fullScreenDefault; new_settings.ram = config.ramDefault; + new_settings.featureStore = config.featureStoreDefault; new_settings.lastDigest = null; new_settings.lastProfiles.clear(); new_settings.lastHDirs.clear(); From b67d1d502943b674e0772e2c5bc0e9c864db9248 Mon Sep 17 00:00:00 2001 From: Gravit Date: Sat, 6 Jul 2019 20:26:16 +0700 Subject: [PATCH 09/11] [ANY] 5.0.5b1 Stable --- LauncherCore/src/main/java/pro/gravit/utils/Version.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LauncherCore/src/main/java/pro/gravit/utils/Version.java b/LauncherCore/src/main/java/pro/gravit/utils/Version.java index be65d7db..08176b4b 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/Version.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/Version.java @@ -22,7 +22,7 @@ public final class Version { public final Type release; public static final int MAJOR = 5; public static final int MINOR = 0; - public static final int PATCH = 4; + public static final int PATCH = 5; public static final int BUILD = 1; public static final Version.Type RELEASE = Version.Type.STABLE; From d008dc7217a4e0f42e213b8ca612ed15096fc6dc Mon Sep 17 00:00:00 2001 From: Gravit Date: Wed, 10 Jul 2019 20:02:46 +0700 Subject: [PATCH 10/11] =?UTF-8?q?[FIX]=20=D0=98=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=80=D0=BE=D0=B1=D0=BB=D0=B5?= =?UTF-8?q?=D0=BC=D0=B0=20=D1=81=20reconnectCallback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gravit/launcher/server/ServerWrapper.java | 42 ++++++++----------- .../server/setup/ServerWrapperSetup.java | 4 +- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/ServerWrapper/src/main/java/pro/gravit/launcher/server/ServerWrapper.java b/ServerWrapper/src/main/java/pro/gravit/launcher/server/ServerWrapper.java index b32ac0d6..8c7bba1c 100644 --- a/ServerWrapper/src/main/java/pro/gravit/launcher/server/ServerWrapper.java +++ b/ServerWrapper/src/main/java/pro/gravit/launcher/server/ServerWrapper.java @@ -157,21 +157,19 @@ public void run(String... args) throws Throwable { else mainClass = Class.forName(classname); MethodHandle mainMethod = MethodHandles.publicLookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)); modulesManager.postInitModules(); - if (config.websocket.enabled) { - Request.service.reconnectCallback = () -> - { - LogHelper.debug("WebSocket connect closed. Try reconnect"); - try { - Request.service.open(); - LogHelper.debug("Connect to %s", config.websocket.address); - } catch (Exception e) { - LogHelper.error(e); - throw new RequestException(String.format("Connect error: %s", e.getMessage() != null ? e.getMessage() : "null")); - } - auth(); - }; - } - LogHelper.info("ServerWrapper: Project %s, LaunchServer address: %s. Title: %s", config.projectname, config.websocket.address, config.title); + Request.service.reconnectCallback = () -> + { + LogHelper.debug("WebSocket connect closed. Try reconnect"); + try { + Request.service.open(); + LogHelper.debug("Connect to %s", config.address); + } catch (Exception e) { + LogHelper.error(e); + throw new RequestException(String.format("Connect error: %s", e.getMessage() != null ? e.getMessage() : "null")); + } + auth(); + }; + LogHelper.info("ServerWrapper: Project %s, LaunchServer address: %s. Title: %s", config.projectname, config.address, config.title); 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()); @@ -192,11 +190,9 @@ public void updateLauncherConfig() { LauncherConfig cfg = null; try { - cfg = new LauncherConfig(config.websocket.address, SecurityHelper.toPublicRSAKey(IOHelper.read(publicKeyFile)), new HashMap<>(), config.projectname); - if (config.websocket != null && config.websocket.enabled) { - cfg.isNettyEnabled = true; - cfg.address = config.websocket.address; - } + cfg = new LauncherConfig(config.address, SecurityHelper.toPublicRSAKey(IOHelper.read(publicKeyFile)), new HashMap<>(), config.projectname); + cfg.isNettyEnabled = true; + cfg.address = config.address; } catch (InvalidKeySpecException | IOException e) { LogHelper.error(e); } @@ -228,8 +224,7 @@ public Config getDefaultConfig() { newConfig.reconnectCount = 10; newConfig.reconnectSleep = 1000; newConfig.websocket = new WebSocketConf(); - newConfig.websocket.address = "ws://localhost:9274/api"; - newConfig.websocket.enabled = false; + newConfig.address = "ws://localhost:9274/api"; newConfig.env = LauncherConfig.LauncherEnvironment.STD; return newConfig; } @@ -242,6 +237,7 @@ public void setConfig(Config config) { public static final class Config { public String title; public String projectname; + public String address; public WebSocketConf websocket; public int reconnectCount; public int reconnectSleep; @@ -261,8 +257,6 @@ public static final class Config { } public static final class WebSocketConf { - public boolean enabled; - public String address; } public ClientProfile profile; diff --git a/ServerWrapper/src/main/java/pro/gravit/launcher/server/setup/ServerWrapperSetup.java b/ServerWrapper/src/main/java/pro/gravit/launcher/server/setup/ServerWrapperSetup.java index ad6c0174..6a63ffae 100644 --- a/ServerWrapper/src/main/java/pro/gravit/launcher/server/setup/ServerWrapperSetup.java +++ b/ServerWrapper/src/main/java/pro/gravit/launcher/server/setup/ServerWrapperSetup.java @@ -41,10 +41,10 @@ public void run() throws IOException { } } LogHelper.info("Found MainClass %s", mainClassName); - System.out.println("Print launchserver websocket host:"); + System.out.println("Print launchserver websocket host( ws://host:port/api ):"); String address = commands.commandHandler.readLine(); wrapper.config.mainclass = mainClassName; - wrapper.config.websocket.address = address; + wrapper.config.address = address; if (!Files.exists(ServerWrapper.publicKeyFile)) { LogHelper.error("public.key not found"); for (int i = 0; i < 10; ++i) { From 5a889e047161ef0dba183098972304b7babe0b87 Mon Sep 17 00:00:00 2001 From: Gravit Date: Thu, 11 Jul 2019 01:45:05 +0700 Subject: [PATCH 11/11] =?UTF-8?q?[FEATURE]=20=D0=A7=D1=82=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D0=B5=D1=80=D1=82=D0=B8=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/basic/TestCommand.java | 4 +++ .../manangers/CertificateManager.java | 33 +++++++++++++++---- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/TestCommand.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/TestCommand.java index c5deec73..be1c528a 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/TestCommand.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/TestCommand.java @@ -44,6 +44,10 @@ public void invoke(String... args) throws Exception { server.certificateManager.writePrivateKey(Paths.get("ca.key"), server.certificateManager.caKey); server.certificateManager.writeCertificate(Paths.get("ca.crt"), server.certificateManager.ca); } + if(args[0].equals("readCA")) { + server.certificateManager.ca = server.certificateManager.readCertificate(Paths.get("ca.crt")); + server.certificateManager.caKey = server.certificateManager.readPrivateKey(Paths.get("ca.key")); + } if(args[0].equals("genCert")) { verifyArgs(args, 2); String name = args[1]; diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/CertificateManager.java b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/CertificateManager.java index cae36ff7..f2a15df4 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/CertificateManager.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/CertificateManager.java @@ -7,32 +7,29 @@ import org.bouncycastle.asn1.x500.style.BCStyle; import org.bouncycastle.asn1.x509.AlgorithmIdentifier; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; -import org.bouncycastle.cert.CertIOException; import org.bouncycastle.cert.X509CertificateHolder; import org.bouncycastle.cert.X509v3CertificateBuilder; import org.bouncycastle.crypto.params.AsymmetricKeyParameter; -import org.bouncycastle.crypto.params.ECKeyParameters; import org.bouncycastle.crypto.util.PrivateKeyFactory; import org.bouncycastle.crypto.util.PrivateKeyInfoFactory; -import org.bouncycastle.jce.ECNamedCurveTable; -import org.bouncycastle.jce.spec.ECParameterSpec; -import org.bouncycastle.openssl.PEMWriter; import org.bouncycastle.operator.ContentSigner; import org.bouncycastle.operator.DefaultDigestAlgorithmIdentifierFinder; import org.bouncycastle.operator.OperatorCreationException; import org.bouncycastle.operator.bc.BcECContentSignerBuilder; import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; import org.bouncycastle.util.io.pem.PemObject; +import org.bouncycastle.util.io.pem.PemReader; import org.bouncycastle.util.io.pem.PemWriter; import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.SecurityHelper; -import java.io.FileWriter; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.math.BigInteger; import java.nio.file.Path; import java.security.*; import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; import java.security.spec.ECGenParameterSpec; import java.time.Instant; import java.time.LocalDate; @@ -114,4 +111,28 @@ public void writeCertificate(Path file, X509CertificateHolder holder) throws IOE writer.writeObject(new PemObject("CERTIFICATE", holder.toASN1Structure().getEncoded())); } } + + public AsymmetricKeyParameter readPrivateKey(Path file) throws IOException { + AsymmetricKeyParameter ret; + try(PemReader reader = new PemReader(IOHelper.newReader(file))) + { + byte[] bytes = reader.readPemObject().getContent(); + try(ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) + { + + ret = PrivateKeyFactory.createKey(inputStream); + } + } + return ret; + } + + public X509CertificateHolder readCertificate(Path file) throws IOException { + X509CertificateHolder ret; + try(PemReader reader = new PemReader(IOHelper.newReader(file))) + { + byte[] bytes = reader.readPemObject().getContent(); + ret = new X509CertificateHolder(bytes); + } + return ret; + } }