diff --git a/LaunchServer/source/auth/handler/FileAuthHandler.java b/LaunchServer/source/auth/handler/FileAuthHandler.java index c29c161..11b5132 100644 --- a/LaunchServer/source/auth/handler/FileAuthHandler.java +++ b/LaunchServer/source/auth/handler/FileAuthHandler.java @@ -141,6 +141,11 @@ } @LauncherAPI + public final Set> entrySet() { + return Collections.unmodifiableMap(entryMap).entrySet(); + } + + @LauncherAPI protected abstract void readAuthFile() throws IOException; @LauncherAPI @@ -160,11 +165,6 @@ } } - @LauncherAPI - protected final Set> entrySet() { - return Collections.unmodifiableMap(entryMap).entrySet(); - } - private UUID genUUIDFor(String username) { if (offlineUUIDs) { UUID md5UUID = PlayerProfile.offlineUUID(username); diff --git a/LaunchServer/source/command/auth/CheckServerCommand.java b/LaunchServer/source/command/auth/CheckServerCommand.java new file mode 100644 index 0000000..2231885 --- /dev/null +++ b/LaunchServer/source/command/auth/CheckServerCommand.java @@ -0,0 +1,34 @@ +package launchserver.command.auth; + +import java.util.UUID; + +import launcher.helper.LogHelper; +import launchserver.LaunchServer; +import launchserver.command.Command; + +public final class CheckServerCommand extends Command { + public CheckServerCommand(LaunchServer server) { + super(server); + } + + @Override + public String getArgsDescription() { + return " "; + } + + @Override + public String getUsageDescription() { + return "Try to check server with specified credentials"; + } + + @Override + public void invoke(String... args) throws Exception { + verifyArgs(args, 2); + String username = args[0]; + String serverID = args[1]; + + // Print result message + UUID uuid = server.config.authHandler.checkServer(username, serverID); + LogHelper.subInfo("Check server request result: " + uuid); + } +} diff --git a/LaunchServer/source/command/auth/JoinServerCommand.java b/LaunchServer/source/command/auth/JoinServerCommand.java new file mode 100644 index 0000000..0c66a34 --- /dev/null +++ b/LaunchServer/source/command/auth/JoinServerCommand.java @@ -0,0 +1,33 @@ +package launchserver.command.auth; + +import launcher.helper.LogHelper; +import launchserver.LaunchServer; +import launchserver.command.Command; + +public final class JoinServerCommand extends Command { + public JoinServerCommand(LaunchServer server) { + super(server); + } + + @Override + public String getArgsDescription() { + return " "; + } + + @Override + public String getUsageDescription() { + return "Try to join server with specified credentials"; + } + + @Override + public void invoke(String... args) throws Exception { + verifyArgs(args, 3); + String username = args[0]; + String accessToken = args[1]; + String serverID = args[2]; + + // Print result message + boolean success = server.config.authHandler.joinServer(username, accessToken, serverID); + LogHelper.subInfo(success ? "Join server request succeeded" : "Join server request failed"); + } +} diff --git a/LaunchServer/source/command/handler/CommandHandler.java b/LaunchServer/source/command/handler/CommandHandler.java index f3fb0fe..16af2a9 100644 --- a/LaunchServer/source/command/handler/CommandHandler.java +++ b/LaunchServer/source/command/handler/CommandHandler.java @@ -18,6 +18,8 @@ import launchserver.command.Command; import launchserver.command.CommandException; import launchserver.command.auth.AuthCommand; +import launchserver.command.auth.CheckServerCommand; +import launchserver.command.auth.JoinServerCommand; import launchserver.command.auth.UUIDToUsernameCommand; import launchserver.command.auth.UsernameToUUIDCommand; import launchserver.command.basic.BuildCommand; @@ -36,6 +38,7 @@ import launchserver.command.hash.SyncProfilesCommand; import launchserver.command.hash.SyncUpdatesCommand; import launchserver.command.hash.UnindexAssetCommand; +import launchserver.command.legacy.DumpBinaryAuthHandler; public abstract class CommandHandler implements Runnable { private final Map commands = new ConcurrentHashMap<>(32); @@ -63,8 +66,13 @@ // Register auth commands registerCommand("auth", new AuthCommand(server)); + registerCommand("joinServer", new JoinServerCommand(server)); + registerCommand("checkServer", new CheckServerCommand(server)); registerCommand("usernameToUUID", new UsernameToUUIDCommand(server)); registerCommand("uuidToUsername", new UUIDToUsernameCommand(server)); + + // Register legacy commands + registerCommand("dumpBinaryAuthHandler", new DumpBinaryAuthHandler(server)); } @Override diff --git a/LaunchServer/source/command/legacy/DumpBinaryAuthHandler.java b/LaunchServer/source/command/legacy/DumpBinaryAuthHandler.java new file mode 100644 index 0000000..e7396dc --- /dev/null +++ b/LaunchServer/source/command/legacy/DumpBinaryAuthHandler.java @@ -0,0 +1,90 @@ +package launchserver.command.legacy; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import launcher.helper.IOHelper; +import launcher.helper.LogHelper; +import launcher.serialize.config.TextConfigWriter; +import launcher.serialize.config.entry.BlockConfigEntry; +import launcher.serialize.config.entry.ConfigEntry; +import launcher.serialize.config.entry.StringConfigEntry; +import launchserver.LaunchServer; +import launchserver.auth.handler.BinaryFileAuthHandler; +import launchserver.auth.handler.FileAuthHandler.Entry; +import launchserver.command.Command; + +public final class DumpBinaryAuthHandler extends Command { + public DumpBinaryAuthHandler(LaunchServer server) { + super(server); + } + + @Override + public String getArgsDescription() { + return null; + } + + @Override + public String getUsageDescription() { + return "Dumps BinaryAuthHandler to text file"; + } + + @Override + public void invoke(String... args) { + LogHelper.subInfo("Dumping BinaryAuthHandler file..."); + BinaryFileAuthHandler handler = (BinaryFileAuthHandler) server.config.authHandler; + boolean next = false; + + // Write auth blocks to map + Set> entrySet = handler.entrySet(); + Map> map = new LinkedHashMap<>(entrySet.size()); + for (Map.Entry entry : entrySet) { + UUID uuid = entry.getKey(); + Entry auth = entry.getValue(); + + // Set auth entry data + Map> authMap = new LinkedHashMap<>(entrySet.size()); + authMap.put("username", cc(auth.getUsername())); + String accessToken = auth.getAccessToken(); + if (accessToken != null) { + authMap.put("accessToken", cc(accessToken)); + } + String serverID = auth.getServerID(); + if (serverID != null) { + authMap.put("serverID", cc(serverID)); + } + + // Create and add auth block + BlockConfigEntry authBlock = new BlockConfigEntry(authMap, true, 5); + if (next) { + authBlock.setComment(0, "\n"); // Pre-name + } else { + next = true; + } + authBlock.setComment(2, " "); // Pre-value + authBlock.setComment(4, "\n"); // Post-comment + map.put(uuid.toString(), authBlock); + } + + // Write auth handler file + try (BufferedWriter writer = IOHelper.newWriter(Paths.get("authHandler.dump.cfg"))) { + BlockConfigEntry authFile = new BlockConfigEntry(map, true, 1); + authFile.setComment(0, "\n"); + TextConfigWriter.write(authFile, writer, true); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static StringConfigEntry cc(String value) { + StringConfigEntry entry = new StringConfigEntry(value, true, 4); + entry.setComment(0, "\n\t"); // Pre-name + entry.setComment(2, " "); // Pre-value + return entry; + } +}