From aee014d0909d6a7b077b989bb467caea1367185d Mon Sep 17 00:00:00 2001 From: KarmaDev Date: Sun, 27 Nov 2022 13:42:27 +0100 Subject: [PATCH] Updated plugin source code --- LockLogin-API/pom.xml | 14 +-- .../javamodule/server/TargetServer.java | 14 ++- LockLogin-bundle/pom.xml | 5 +- LockLogin-bungee/pom.xml | 16 ++- .../eu/locklogin/plugin/bungee/LockLogin.java | 44 ++++--- .../java/eu/locklogin/plugin/bungee/Main.java | 117 +++++++++++++++++- .../plugin/bungee/MainBootstrap.java | 27 +++- .../plugin/bungee/listener/JoinListener.java | 4 +- .../bungee/listener/MessageListener.java | 53 ++++++-- .../plugin/bungee/plugin/Manager.java | 4 +- .../bungee/plugin/sender/DataSender.java | 40 ++++-- LockLogin-common/pom.xml | 2 +- .../api/common/security/TokenGen.java | 16 ++- LockLogin-manager/pom.xml | 4 +- LockLogin-spigot/pom.xml | 2 +- .../plugin/bukkit/plugin/Manager.java | 2 +- .../bukkit/plugin/bungee/BungeeReceiver.java | 16 ++- .../bukkit/plugin/bungee/BungeeSender.java | 36 +++--- .../bungee/data/BungeeDataStorager.java | 6 +- .../velocity/listener/JoinListener.java | 4 +- .../velocity/listener/MessageListener.java | 6 +- .../plugin/velocity/plugin/Manager.java | 4 +- .../velocity/plugin/sender/DataSender.java | 13 +- pom.xml | 4 +- 24 files changed, 333 insertions(+), 120 deletions(-) diff --git a/LockLogin-API/pom.xml b/LockLogin-API/pom.xml index dd4cd762..c48c64bf 100644 --- a/LockLogin-API/pom.xml +++ b/LockLogin-API/pom.xml @@ -5,7 +5,7 @@ eu.locklogin LockLogin - 1.13.37 + 1.13.38 4.0.0 @@ -69,18 +69,6 @@ ${project.karmaapi} provided - - eu.locklogin - LockLogin-common - ${project.version} - provided - - - eu.locklogin - LockLogin-API - - - org.jetbrains annotations diff --git a/LockLogin-API/src/main/java/eu/locklogin/api/module/plugin/javamodule/server/TargetServer.java b/LockLogin-API/src/main/java/eu/locklogin/api/module/plugin/javamodule/server/TargetServer.java index 0a652fa9..18c902fc 100644 --- a/LockLogin-API/src/main/java/eu/locklogin/api/module/plugin/javamodule/server/TargetServer.java +++ b/LockLogin-API/src/main/java/eu/locklogin/api/module/plugin/javamodule/server/TargetServer.java @@ -2,7 +2,6 @@ import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; -import eu.locklogin.api.common.utils.plugin.MessageQueue; import eu.locklogin.api.module.PluginModule; import eu.locklogin.api.module.plugin.javamodule.sender.ModulePlayer; import org.jetbrains.annotations.NotNull; @@ -25,6 +24,8 @@ public final class TargetServer implements Iterable { @SuppressWarnings("FieldMayBeFinal") private static BiConsumer> onPlayers = null; + @SuppressWarnings("FieldMayBeFinal") + private static MessageQue que = null; /** * LockLogin module server @@ -111,12 +112,13 @@ public boolean isActive() { */ @SuppressWarnings("UnstableApiUsage") public void sendMessage(final PluginModule sender, final byte[] data) { - ByteArrayDataOutput modified_out = ByteStreams.newDataOutput(); - modified_out.writeUTF(sender.getID().toString()); - modified_out.write(data); //Not sure if this would work... + if (que != null) { + ByteArrayDataOutput modified_out = ByteStreams.newDataOutput(); + modified_out.writeUTF(sender.getID().toString()); + modified_out.write(data); //Not sure if this would work... - MessageQueue queue = new MessageQueue(this); - queue.add(modified_out.toByteArray()); + que.add(modified_out.toByteArray()); + } } /** diff --git a/LockLogin-bundle/pom.xml b/LockLogin-bundle/pom.xml index ff2f019b..67caae45 100644 --- a/LockLogin-bundle/pom.xml +++ b/LockLogin-bundle/pom.xml @@ -5,7 +5,7 @@ eu.locklogin LockLogin - 1.13.37 + 1.13.38 4.0.0 @@ -77,10 +77,11 @@ + eu.locklogin LockLogin-velocity - ${project.version} + 1.13.37 compile diff --git a/LockLogin-bungee/pom.xml b/LockLogin-bungee/pom.xml index e71defc3..55534c7a 100644 --- a/LockLogin-bungee/pom.xml +++ b/LockLogin-bungee/pom.xml @@ -7,7 +7,7 @@ eu.locklogin LockLogin - 1.13.37 + 1.13.38 LockLogin-bungee @@ -76,19 +76,17 @@ provided - com.github.proxiodev.redisbungee - RedisBungee-Bungee - 0.9.0 + org.apache.httpcomponents + httpclient + 4.5.13 provided - net.md-5 bungeecord-api diff --git a/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/LockLogin.java b/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/LockLogin.java index 8199a0bd..46d4094e 100644 --- a/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/LockLogin.java +++ b/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/LockLogin.java @@ -16,9 +16,11 @@ import eu.locklogin.api.common.utils.FileInfo; import eu.locklogin.api.common.utils.other.ASCIIArtGenerator; +import eu.locklogin.api.common.utils.plugin.MessageQueue; import eu.locklogin.api.common.utils.version.VersionID; import eu.locklogin.api.file.plugin.PluginProperties; import eu.locklogin.api.module.plugin.javamodule.ModuleLoader; +import eu.locklogin.api.module.plugin.javamodule.server.TargetServer; import eu.locklogin.api.util.platform.CurrentPlatform; import ml.karmaconfigs.api.common.Console; import ml.karmaconfigs.api.common.karma.APISource; @@ -31,32 +33,46 @@ import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.file.Files; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; -public interface LockLogin { +public class LockLogin { - Main plugin = (Main) ProxyServer.getInstance().getPluginManager().getPlugin("LockLogin"); + private final static Map queues = new ConcurrentHashMap<>(); - Console console = APISource.loadProvider("LockLogin").console(); + public static Main plugin = (Main) ProxyServer.getInstance().getPluginManager().getPlugin("LockLogin"); - String name = plugin.name(); - String update = FileInfo.getUpdateName(null); + public static Console console = APISource.loadProvider("LockLogin").console(); - VersionID versionID = new VersionID(plugin.version(), update).generate(); + public static String name = plugin.name(); + public static String update = FileInfo.getUpdateName(null); - String version = versionID.getVersionID(); + public static MessageQueue fetchQueue(final TargetServer server) { + MessageQueue stored = queues.getOrDefault(server.getName(), null); + if (stored == null) { + stored = new MessageQueue(server); + queues.put(server.getName(), stored); + } + + return stored; + } + + public static VersionID versionID = new VersionID(plugin.version(), update).generate(); + + public static String version = versionID.getVersionID(); - File lockloginFile = new File(Main.class.getProtectionDomain() + public static File lockloginFile = new File(Main.class.getProtectionDomain() .getCodeSource() .getLocation() .getPath().replaceAll("%20", " ")); - KarmaLogger logger = CurrentPlatform.getLogger(); + public static KarmaLogger logger = CurrentPlatform.getLogger(); - PluginProperties properties = new PluginProperties(); + public static PluginProperties properties = new PluginProperties(); - ASCIIArtGenerator artGen = new ASCIIArtGenerator(); + public static ASCIIArtGenerator artGen = new ASCIIArtGenerator(); - static ModuleLoader getLoader() { + public static ModuleLoader getLoader() { File modulesFolder = new File(plugin.getDataFolder() + File.separator + "plugin", "modules"); if (!modulesFolder.exists()) @@ -69,7 +85,7 @@ static ModuleLoader getLoader() { } @Nullable - static InetAddress getIp(final SocketAddress connection) { + public static InetAddress getIp(final SocketAddress connection) { try { InetSocketAddress address = (InetSocketAddress) connection; return address.getAddress(); @@ -79,7 +95,7 @@ static InetAddress getIp(final SocketAddress connection) { } @Nullable - static InetSocketAddress getSocketIp(final SocketAddress connection) { + public static InetSocketAddress getSocketIp(final SocketAddress connection) { try { return (InetSocketAddress) connection; } catch (Throwable ex) { diff --git a/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/Main.java b/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/Main.java index 42a28eec..2c7c0294 100644 --- a/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/Main.java +++ b/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/Main.java @@ -14,15 +14,32 @@ * the version number 2.1.] */ +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; import eu.locklogin.api.common.utils.FileInfo; import eu.locklogin.api.common.web.ChecksumTables; +import eu.locklogin.api.module.plugin.javamodule.server.TargetServer; import eu.locklogin.api.util.platform.CurrentPlatform; +import eu.locklogin.api.util.platform.ModuleServer; import eu.locklogin.api.util.platform.Platform; +import eu.locklogin.plugin.bungee.plugin.sender.DataSender; +import eu.locklogin.plugin.bungee.util.files.cache.TargetServerStorage; import ml.karmaconfigs.api.bungee.KarmaPlugin; import ml.karmaconfigs.api.common.utils.enums.Level; +import ml.karmaconfigs.api.common.utils.security.token.TokenGenerator; +import ml.karmaconfigs.api.common.utils.url.HttpUtil; +import ml.karmaconfigs.api.common.utils.url.URLUtils; import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.config.ServerInfo; +import java.lang.reflect.Field; +import java.net.InetAddress; +import java.net.InetSocketAddress; import java.net.URL; +import java.util.Map; +import java.util.Set; +import java.util.UUID; public final class Main extends KarmaPlugin { @@ -35,8 +52,9 @@ public Main() throws Throwable { super(false); try { Class.forName("com.imaginarycode.minecraft.redisbungee.RedisBungee"); - CurrentPlatform.setPlatform(Platform.REDIS); - console().send("RedisBungeecord has been detected. This is an experimental feature, please be DO NOT USE on a high production server", Level.WARNING); + //CurrentPlatform.setPlatform(Platform.REDIS); + CurrentPlatform.setPlatform(Platform.BUNGEE); + console().send("RedisBungeecord has been detected. This is not currently supported by LockLogin, buy may be in a future", Level.WARNING); } catch (Throwable ex) { CurrentPlatform.setPlatform(Platform.BUNGEE); } @@ -50,6 +68,7 @@ public Main() throws Throwable { } @Override + @SuppressWarnings("unchecked") public void enable() { status = true; plugin.enable(); @@ -59,6 +78,100 @@ public void enable() { } })); //Make sure the plugin shuts down correctly. CurrentPlatform.setOnline(ProxyServer.getInstance().getConfig().isOnlineMode()); + String[] tries = new String[]{ + "https://backup.karmadev.es/locklogin/com/", + "https://backup.karmaconfigs.ml/locklogin/com/", + "https://backup.karmarepo.ml/locklogin/com/", + "https://karmadev.es/locklogin/com/", + "https://karmaconfigs.ml/com/", + "https://karmarepo.ml/com/" + }; + + console().send("Generating communication key, please wait..."); + String token = TokenGenerator.generateLiteral(64); + URL working = URLUtils.getOrBackup(tries); + HttpUtil utilities = URLUtils.extraUtils(working); + if (utilities != null) { + String resul = utilities.getResponse(); + + Gson gson = new GsonBuilder().create(); + JsonObject element = gson.fromJson(resul, JsonObject.class); + try { + boolean success = element.getAsJsonPrimitive("success").getAsBoolean(); + if (success) { + console().send("Loaded communication key from server", Level.INFO); + token = element.getAsJsonPrimitive("message").getAsString(); + } else { + console().send("Failed to generate communication key ({0}), a temporal one will be used", Level.WARNING, element.getAsJsonPrimitive("message").getAsString()); + } + } catch (Throwable ex) { + logger().scheduleLog(Level.GRAVE, ex); + logger().scheduleLog(Level.INFO, "Failed to generate communication key"); + console().send("Failed to generate communication key (error), a temporal one will be used", Level.WARNING); + } + } else { + console().send("Failed to generate communication key, a temporal one will be used", Level.WARNING); + } + + try { + Class clazz = DataSender.class; + Field com = clazz.getDeclaredField("com"); + com.setAccessible(true); + com.set(DataSender.class, token); + com.setAccessible(false); + + console().send("Successfully defined communication key", Level.INFO); + } catch (Throwable ignored) {} + + console().send("Loading all servers for API.", Level.INFO); + Map info = ProxyServer.getInstance().getServers(); + for (String name : info.keySet()) { + ServerInfo server = info.get(name); + TargetServerStorage storage = new TargetServerStorage(name); + UUID known = storage.load(); + if (known != null) { + InetSocketAddress socket = (InetSocketAddress) server.getSocketAddress(); + if (socket != null) { + InetAddress address = socket.getAddress(); + if (address != null) { + server.ping((result, error) -> { + if (error == null && result != null) { + console().send("Server {0} is online!", Level.OK, name); + TargetServer target_server = new TargetServer(name, known, address, socket.getPort(), true); + TargetServer stored = CurrentPlatform.getServer().getServer(name); + + try { + Field f = ModuleServer.class.getDeclaredField("servers"); + f.setAccessible(true); + Set stored_set = (Set) f.get(ModuleServer.class); + if (stored != null) { + //Remove from stored servers + stored_set.remove(stored); + } + stored_set.add(target_server); + } catch (Throwable ignored) {} + } else { + console().send("Server {0} is offline!", Level.WARNING, name); + + TargetServer target_server = new TargetServer(name, known, address, socket.getPort(), false); + TargetServer stored = CurrentPlatform.getServer().getServer(name); + + try { + Field f = ModuleServer.class.getDeclaredField("servers"); + f.setAccessible(true); + Set stored_set = (Set) f.get(ModuleServer.class); + if (stored != null) { + //Remove from stored servers + stored_set.remove(stored); + } + stored_set.add(target_server); + } catch (Throwable ignored) {} + } + }); + } + } + } + } } @Override diff --git a/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/MainBootstrap.java b/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/MainBootstrap.java index de008666..ee71efbe 100644 --- a/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/MainBootstrap.java +++ b/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/MainBootstrap.java @@ -9,6 +9,7 @@ import eu.locklogin.api.common.utils.dependencies.Dependency; import eu.locklogin.api.common.utils.dependencies.DependencyManager; import eu.locklogin.api.common.utils.dependencies.PluginDependency; +import eu.locklogin.api.common.utils.plugin.MessageQueue; import eu.locklogin.api.common.web.ChecksumTables; import eu.locklogin.api.common.web.STFetcher; import eu.locklogin.api.module.LoadRule; @@ -46,10 +47,10 @@ import java.util.function.BiConsumer; import java.util.function.Consumer; -import static eu.locklogin.plugin.bungee.LockLogin.console; -import static eu.locklogin.plugin.bungee.LockLogin.plugin; +import static eu.locklogin.plugin.bungee.LockLogin.*; import static eu.locklogin.plugin.bungee.plugin.sender.DataSender.CHANNEL_PLAYER; import static eu.locklogin.plugin.bungee.plugin.sender.DataSender.PLUGIN_CHANNEL; +import static eu.locklogin.plugin.bungee.plugin.sender.DataSender.MessageData; public class MainBootstrap { @@ -273,6 +274,28 @@ public void enable() { AllowedCommand.scan(); Manager.initialize(); }); + + SimpleScheduler scheduler = new SourceScheduler(plugin, 1, SchedulerUnit.SECOND, true).multiThreading(true); + scheduler.restartAction(() -> { + for (TargetServer server : CurrentPlatform.getServer().getServers()) { + MessageQueue queue = fetchQueue(server); + byte[] data = queue.previewMessage(); + + if (data != null) { + data = queue.nextMessage(); + + for (ModulePlayer player : server.getOnlinePlayers()) { + if (player.isPlaying()) { + if (data != null) { + MessageData message = DataSender.getBuilder(DataType.LISTENER, "ll:plugin", null).writeOther(data).build(); + DataSender.send((ProxiedPlayer) player.getPlayer(), message); + queue.nextMessage(); + } + } + } + } + } + }).start(); } public void disable() { diff --git a/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/listener/JoinListener.java b/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/listener/JoinListener.java index 7b3a42be..b4d06255 100644 --- a/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/listener/JoinListener.java +++ b/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/listener/JoinListener.java @@ -156,7 +156,7 @@ public JoinListener() { if (ServerDataStorage.needsProxyKnowledge(info.getName())) { DataSender.send(info, DataSender.getBuilder(DataType.REGISTER, ACCESS_CHANNEL, player) .addTextData(proxy.proxyKey()).addTextData(info.getName()) - .addTextData(TokenGen.expiration("local_token").toString()) + //.addTextData(TokenGen.expiration("local_token").toString()) .build()); } } @@ -486,7 +486,7 @@ public void onSwitch(ServerSwitchEvent e) { if (ServerDataStorage.needsProxyKnowledge(info.getName())) { DataSender.send(info, DataSender.getBuilder(DataType.REGISTER, ACCESS_CHANNEL, player) .addTextData(proxy.proxyKey()).addTextData(info.getName()) - .addTextData(TokenGen.expiration("local_token").toString()) + //.addTextData(TokenGen.expiration("local_token").toString()) .build()); } } diff --git a/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/listener/MessageListener.java b/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/listener/MessageListener.java index 7c951b23..caca8383 100644 --- a/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/listener/MessageListener.java +++ b/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/listener/MessageListener.java @@ -18,7 +18,6 @@ import com.google.common.io.ByteStreams; import eu.locklogin.api.account.AccountManager; import eu.locklogin.api.account.ClientSession; -import eu.locklogin.api.common.security.TokenGen; import eu.locklogin.api.common.utils.DataType; import eu.locklogin.api.common.utils.other.PlayerAccount; import eu.locklogin.api.common.utils.plugin.ServerDataStorage; @@ -30,19 +29,25 @@ import eu.locklogin.api.module.plugin.api.event.user.UserPostValidationEvent; import eu.locklogin.api.module.plugin.javamodule.ModulePlugin; import eu.locklogin.api.module.plugin.javamodule.sender.ModulePlayer; +import eu.locklogin.api.module.plugin.javamodule.server.TargetServer; import eu.locklogin.api.util.platform.CurrentPlatform; +import eu.locklogin.api.util.platform.ModuleServer; import eu.locklogin.plugin.bungee.plugin.sender.DataSender; +import eu.locklogin.plugin.bungee.util.files.cache.TargetServerStorage; import eu.locklogin.plugin.bungee.util.player.User; import ml.karmaconfigs.api.common.utils.enums.Level; import ml.karmaconfigs.api.common.utils.string.StringUtils; import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.event.PluginMessageEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.event.EventHandler; import net.md_5.bungee.event.EventPriority; -import java.time.Instant; -import java.util.Base64; +import java.lang.reflect.Field; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.util.Set; import java.util.UUID; import static eu.locklogin.plugin.bungee.LockLogin.*; @@ -52,12 +57,14 @@ public final class MessageListener implements Listener { @EventHandler(priority = EventPriority.LOWEST) + @SuppressWarnings("unchecked") public void onMessageReceive(PluginMessageEvent e) { if (!e.isCancelled()) { try { if (e.getTag().equalsIgnoreCase("ll:access") || e.getTag().equalsIgnoreCase("ll:plugin") || e.getTag().equalsIgnoreCase("ll:account")) { PluginMessages messages = CurrentPlatform.getMessages(); ProxyConfiguration proxy = CurrentPlatform.getProxyConfiguration(); + Server server = (Server) e.getSender(); ByteArrayDataInput input = ByteStreams.newDataInput(e.getData()); @@ -66,7 +73,7 @@ public void onMessageReceive(PluginMessageEvent e) { boolean canRead = true; if (!e.getTag().equalsIgnoreCase("ll:access")) { - canRead = TokenGen.matches(token, name, proxy.proxyKey()); + canRead = /*TokenGen.matches(token, name, proxy.proxyKey())*/ DataSender.validate(token); } if (canRead) { @@ -207,9 +214,29 @@ public void onMessageReceive(PluginMessageEvent e) { switch (sub) { case KEY: if (!id.equalsIgnoreCase("invalid")) { - if (ServerDataStorage.needsRegister(name)) { - console.send("Registered proxy key into server {0}", Level.INFO, name); - ServerDataStorage.setKeyRegistered(name); + TargetServerStorage storage = new TargetServerStorage(name); + //storage.save(TokenGen.find(name)); + + InetAddress address = getIp(server.getSocketAddress()); + InetSocketAddress socket = getSocketIp(server.getSocketAddress()); + + if (address != null && socket != null) { + TargetServer target_server = new TargetServer(name, /*TokenGen.find(name)*/ UUID.randomUUID(), address, socket.getPort(), true); + TargetServer stored = CurrentPlatform.getServer().getServer(name); + + Field f = ModuleServer.class.getDeclaredField("servers"); + f.setAccessible(true); + Set stored_set = (Set) f.get(ModuleServer.class); + if (stored != null) { + //Remove from stored servers + stored_set.remove(stored); + } + stored_set.add(target_server); + + if (ServerDataStorage.needsRegister(name)) { + console.send("Registered proxy key into server {0}", Level.INFO, name); + ServerDataStorage.setKeyRegistered(name); + } } } else { console.send("Failed to set proxy key in {0}", Level.GRAVE, name); @@ -224,7 +251,7 @@ public void onMessageReceive(PluginMessageEvent e) { ServerDataStorage.setProxyRegistered(name); DataSender.updateDataPool(name); - TokenGen.assign(new String(Base64.getUrlEncoder().encode(token.getBytes())), name, proxy.proxyKey(), Instant.parse(input.readUTF())); + //TokenGen.assign(new String(Base64.getUrlEncoder().encode(token.getBytes())), name, proxy.proxyKey(), Instant.parse(input.readUTF())); } } else { e.setCancelled(true); @@ -242,6 +269,16 @@ public void onMessageReceive(PluginMessageEvent e) { console.send("Removed ths proxy from server {0}", Level.INFO, name); ServerDataStorage.removeProxyRegistered(name); } + + TargetServer stored = CurrentPlatform.getServer().getServer(name); + + Field f = ModuleServer.class.getDeclaredField("servers"); + f.setAccessible(true); + Set stored_set = (Set) f.get(ModuleServer.class); + if (stored != null) { + //Remove from stored servers + stored_set.remove(stored); + } } else { ServerDataStorage.removeKeyRegistered(name); e.setCancelled(true); diff --git a/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/plugin/Manager.java b/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/plugin/Manager.java index e262c70a..0d2555b3 100644 --- a/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/plugin/Manager.java +++ b/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/plugin/Manager.java @@ -123,7 +123,7 @@ public static void initialize() { PlayerAccount.migrateV3(); setupFiles(); - TokenGen.generate(CurrentPlatform.getProxyConfiguration().proxyKey()); + //TokenGen.generate(CurrentPlatform.getProxyConfiguration().proxyKey()); registerCommands(); registerListeners(); @@ -559,7 +559,7 @@ static void initPlayers() { if (ServerDataStorage.needsProxyKnowledge(info.getName())) { DataSender.send(info, DataSender.getBuilder(DataType.REGISTER, ACCESS_CHANNEL, player) .addTextData(proxy.proxyKey()).addTextData(info.getName()) - .addTextData(TokenGen.expiration("local_token").toString()) + //.addTextData(TokenGen.expiration("local_token").toString()) .build()); } } diff --git a/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/plugin/sender/DataSender.java b/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/plugin/sender/DataSender.java index 2020fe98..58b90db8 100644 --- a/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/plugin/sender/DataSender.java +++ b/LockLogin-bungee/src/main/java/eu/locklogin/plugin/bungee/plugin/sender/DataSender.java @@ -13,10 +13,12 @@ import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; -import eu.locklogin.api.common.security.TokenGen; import eu.locklogin.api.common.utils.DataType; import eu.locklogin.api.common.utils.MessagePool; import eu.locklogin.api.common.utils.plugin.ServerDataStorage; +import eu.locklogin.api.encryption.CryptoFactory; +import eu.locklogin.api.encryption.HashType; +import eu.locklogin.api.encryption.Validation; import eu.locklogin.api.file.ProxyConfiguration; import eu.locklogin.api.util.platform.CurrentPlatform; import ml.karmaconfigs.api.common.timer.SchedulerUnit; @@ -46,6 +48,9 @@ public final class DataSender { private final static SimpleScheduler scheduler = new SourceScheduler(plugin, 1, SchedulerUnit.SECOND, true).multiThreading(true); + @SuppressWarnings("FieldMayBeFinal") + private static String com = ""; + /** * Initialize the data sender */ @@ -141,14 +146,14 @@ public static void sendModule(final String channel, final byte[] data) { ByteArrayDataOutput output = ByteStreams.newDataOutput(); ProxyConfiguration proxy = CurrentPlatform.getProxyConfiguration(); - String token = TokenGen.request("local_token", proxy.proxyKey()); + /*String token = TokenGen.request("local_token", proxy.proxyKey()); if (token == null) { TokenGen.generate(proxy.proxyKey()); token = TokenGen.request("local_token", proxy.proxyKey()); assert token != null; - } + }*/ - output.writeUTF(token); + output.writeUTF(com); output.writeUTF(proxy.getProxyID().toString()); output.writeUTF(DataType.LISTENER.name().toLowerCase()); output.writeUTF(channel); @@ -205,19 +210,19 @@ public static class MessageDataBuilder { */ MessageDataBuilder(final DataType data, final ProxiedPlayer owner) { ProxyConfiguration proxy = CurrentPlatform.getProxyConfiguration(); - String token = TokenGen.request("local_token", proxy.proxyKey()); + /*String token = TokenGen.request("local_token", proxy.proxyKey()); if (token == null) { TokenGen.generate(proxy.proxyKey()); token = TokenGen.request("local_token", proxy.proxyKey()); assert token != null; - } + }*/ if (owner != null) { output.writeUTF(owner.getUniqueId().toString()); } else { output.writeUTF(UUID.randomUUID().toString()); } - output.writeUTF(token); + output.writeUTF(com); output.writeUTF(proxy.getProxyID().toString()); output.writeUTF(data.name().toLowerCase()); } @@ -270,6 +275,17 @@ public final MessageDataBuilder addIntData(final int data) { return this; } + /** + * Add other message to the final data + * + * @param data the message + * @return this instance + */ + public final MessageDataBuilder writeOther(final byte[] data) { + output.write(data); + return this; + } + /** * Build the message * @@ -317,4 +333,14 @@ public final String getChannel() { return channel; } } + + /** + * Validate the com hash + * + * @param hash the communication hash + * @return if the com has is valid + */ + public static boolean validate(final String hash) { + return CryptoFactory.getBuilder().withPassword(com).withToken(hash).build().validate(Validation.ALL); + } } diff --git a/LockLogin-common/pom.xml b/LockLogin-common/pom.xml index 09e35485..8793c82f 100644 --- a/LockLogin-common/pom.xml +++ b/LockLogin-common/pom.xml @@ -7,7 +7,7 @@ eu.locklogin LockLogin - 1.13.37 + 1.13.38 LockLogin-common diff --git a/LockLogin-common/src/main/java/eu/locklogin/api/common/security/TokenGen.java b/LockLogin-common/src/main/java/eu/locklogin/api/common/security/TokenGen.java index ebcd3fd1..8727aafa 100644 --- a/LockLogin-common/src/main/java/eu/locklogin/api/common/security/TokenGen.java +++ b/LockLogin-common/src/main/java/eu/locklogin/api/common/security/TokenGen.java @@ -14,6 +14,7 @@ import ml.karmaconfigs.api.common.utils.security.token.TokenStorage; import ml.karmaconfigs.api.common.utils.security.token.exception.TokenExpiredException; import ml.karmaconfigs.api.common.utils.security.token.exception.TokenIncorrectPasswordException; +import ml.karmaconfigs.api.common.utils.security.token.exception.TokenInvalidConfigurationException; import ml.karmaconfigs.api.common.utils.security.token.exception.TokenNotFoundException; import ml.karmaconfigs.api.common.utils.string.StringUtils; @@ -24,6 +25,11 @@ import java.util.GregorianCalendar; import java.util.UUID; +/** + * @deprecated We are going back, when the communication used a single token. When we restart our network, we + * will store the key in cache, so it will be loaded after the server restart + */ +@Deprecated public final class TokenGen { private final static KarmaSource lockLogin = APISource.loadProvider("LockLogin"); @@ -77,11 +83,7 @@ public static void generate(final String password) { boolean generate = false; try { String token = storage.load(find("local_token"), password); - if (token != null) { - lockLogin.console().send("Loaded and verified communication token", Level.INFO); - } else { - generate = true; - } + lockLogin.console().send("Loaded and verified communication token", Level.INFO); } catch (TokenNotFoundException ex) { lockLogin.console().send("Communication token could not be found, LockLogin will try to generate one", Level.WARNING); generate = true; @@ -95,6 +97,10 @@ public static void generate(final String password) { PathUtilities.destroy(tokenFile); lockLogin.console().send("Communication token has corrupted authentication data. Restart your server to fix it", Level.GRAVE); + } catch (TokenInvalidConfigurationException ex) { + storage.destroy(find("local_token"), password); + generate = true; + lockLogin.console().send("Communication token is corrupted and a new one has been generated.", Level.GRAVE); } if (generate) { diff --git a/LockLogin-manager/pom.xml b/LockLogin-manager/pom.xml index a09699bd..8dd76079 100644 --- a/LockLogin-manager/pom.xml +++ b/LockLogin-manager/pom.xml @@ -5,7 +5,7 @@ eu.locklogin LockLogin - 1.13.37 + 1.13.38 4.0.0 @@ -159,7 +159,7 @@ eu.locklogin LockLogin-velocity - ${project.version} + 1.13.37 provided diff --git a/LockLogin-spigot/pom.xml b/LockLogin-spigot/pom.xml index ffb8632f..a2ec7d11 100644 --- a/LockLogin-spigot/pom.xml +++ b/LockLogin-spigot/pom.xml @@ -7,7 +7,7 @@ eu.locklogin LockLogin - 1.13.37 + 1.13.38 LockLogin-spigot diff --git a/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/Manager.java b/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/Manager.java index 22069a70..e76dbb66 100644 --- a/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/Manager.java +++ b/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/Manager.java @@ -120,7 +120,7 @@ public static void initialize() { MessagePool.startCheckTask(); setupFiles(); - TokenGen.generate(plugin.getServer().getName()); + //TokenGen.generate(plugin.getServer().getName()); registerCommands(); registerListeners(); diff --git a/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/bungee/BungeeReceiver.java b/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/bungee/BungeeReceiver.java index 92d0e284..a601f90e 100644 --- a/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/bungee/BungeeReceiver.java +++ b/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/bungee/BungeeReceiver.java @@ -5,8 +5,10 @@ import eu.locklogin.api.account.AccountManager; import eu.locklogin.api.account.ClientSession; import eu.locklogin.api.common.JarManager; -import eu.locklogin.api.common.security.TokenGen; import eu.locklogin.api.common.utils.DataType; +import eu.locklogin.api.encryption.CryptoFactory; +import eu.locklogin.api.encryption.HashType; +import eu.locklogin.api.encryption.Validation; import eu.locklogin.api.file.PluginConfiguration; import eu.locklogin.api.file.PluginMessages; import eu.locklogin.api.util.platform.CurrentPlatform; @@ -27,7 +29,6 @@ import org.bukkit.plugin.messaging.PluginMessageListener; import org.jetbrains.annotations.NotNull; -import java.time.Instant; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -38,6 +39,8 @@ public final class BungeeReceiver implements PluginMessageListener { private static final Map accounts = new ConcurrentHashMap<>(); + static String proxy_com = ""; + /** * Initialize the bungee receiver */ @@ -51,7 +54,8 @@ public BungeeReceiver() { boolean canRead = true; if (!channel.equalsIgnoreCase("ll:access")) { - canRead = TokenGen.matches(token, id.toString(), storager.getServerName()); + canRead = /*TokenGen.matches(token, id.toString(), storager.getServerName())*/ CryptoFactory + .getBuilder().withPassword(token).withToken(proxy_com).build().validate(Validation.ALL); } if (canRead) { @@ -280,6 +284,7 @@ public BungeeReceiver() { if (storager.isProxyKey(proxyKey)) { storager.setServerName(serverName); storager.setProxyKey(proxyKey); + proxy_com = CryptoFactory.getBuilder().withPassword(token).unsafe().hash(HashType.pickRandom(), true); BungeeSender.sendProxyStatus(player, id.toString(), sub.name().toLowerCase()); } else { BungeeSender.sendProxyStatus(player, "invalid", sub.name().toLowerCase()); @@ -288,9 +293,8 @@ public BungeeReceiver() { break; case REGISTER: if (storager.isProxyKey(proxyKey)) { - TokenGen.assign(new String(Base64.getUrlEncoder().encode(token.getBytes())), id.toString(), serverName, Instant.parse(input.readUTF())); - TokenGen.assignDefaultNodeName(serverName); - + /*TokenGen.assign(new String(Base64.getUrlEncoder().encode(token.getBytes())), id.toString(), serverName, Instant.parse(input.readUTF())); + TokenGen.assignDefaultNodeName(serverName);*/ BungeeSender.sendProxyStatus(player, id.toString(), sub.name().toLowerCase()); } else { BungeeSender.sendProxyStatus(player, "invalid", sub.name().toLowerCase()); diff --git a/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/bungee/BungeeSender.java b/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/bungee/BungeeSender.java index bc6e322f..d7673682 100644 --- a/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/bungee/BungeeSender.java +++ b/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/bungee/BungeeSender.java @@ -26,8 +26,6 @@ import ml.karmaconfigs.api.common.utils.enums.Level; import org.bukkit.entity.Player; -import static eu.locklogin.plugin.bukkit.LockLogin.plugin; - @SuppressWarnings("UnstableApiUsage") public final class BungeeSender { @@ -44,20 +42,20 @@ public static void sendProxyStatus(final Player recipient, final String id, fina try { BungeeDataStorager storager = new BungeeDataStorager(); - String token = TokenGen.request("local_token", plugin.getServer().getName()); + /*String token = TokenGen.request("local_token", plugin.getServer().getName()); if (token == null) { TokenGen.generate(plugin.getServer().getName()); token = TokenGen.request("local_token", plugin.getServer().getName()); assert token != null; - } + }*/ - output.writeUTF(token); + output.writeUTF(BungeeReceiver.proxy_com); output.writeUTF(storager.getServerName()); output.writeUTF(sub); output.writeUTF(id); - if (sub.equalsIgnoreCase("register")) { + /*if (sub.equalsIgnoreCase("register")) { output.writeUTF(TokenGen.expiration("local_token").toString()); - } + }*/ recipient.sendPluginMessage(LockLogin.plugin, "ll:access", output.toByteArray()); } catch (Throwable ex) { @@ -76,14 +74,14 @@ public static void validatePlayer(final Player player) { try { BungeeDataStorager storager = new BungeeDataStorager(); - String token = TokenGen.request("local_token", plugin.getServer().getName()); + /*String token = TokenGen.request("local_token", plugin.getServer().getName()); if (token == null) { TokenGen.generate(plugin.getServer().getName()); token = TokenGen.request("local_token", plugin.getServer().getName()); assert token != null; - } + }*/ - output.writeUTF(token); + output.writeUTF(BungeeReceiver.proxy_com); output.writeUTF(storager.getServerName()); output.writeUTF("join"); output.writeUTF(player.getUniqueId().toString()); @@ -110,14 +108,14 @@ public static void sendPinInput(final Player player, final String pin) { try { BungeeDataStorager storager = new BungeeDataStorager(); - String token = TokenGen.request("local_token", plugin.getServer().getName()); + /*String token = TokenGen.request("local_token", plugin.getServer().getName()); if (token == null) { TokenGen.generate(plugin.getServer().getName()); token = TokenGen.request("local_token", plugin.getServer().getName()); assert token != null; - } + }*/ - output.writeUTF(token); + output.writeUTF(BungeeReceiver.proxy_com); output.writeUTF(storager.getServerName()); output.writeUTF("pin"); output.writeUTF(player.getUniqueId().toString()); @@ -142,14 +140,14 @@ public static void sendPlayerInstance(final Player recipient, final String playe try { BungeeDataStorager storager = new BungeeDataStorager(); - String token = TokenGen.request("local_token", plugin.getServer().getName()); + /*String token = TokenGen.request("local_token", plugin.getServer().getName()); if (token == null) { TokenGen.generate(plugin.getServer().getName()); token = TokenGen.request("local_token", plugin.getServer().getName()); assert token != null; - } + }*/ - output.writeUTF(token); + output.writeUTF(BungeeReceiver.proxy_com); output.writeUTF(storager.getServerName()); output.writeUTF(DataType.PLAYER.name().toLowerCase()); output.writeUTF(id); @@ -174,14 +172,14 @@ public static void sendModule(final String channel, final byte[] data) { try { BungeeDataStorager storager = new BungeeDataStorager(); - String token = TokenGen.request("local_token", plugin.getServer().getName()); + /*String token = TokenGen.request("local_token", plugin.getServer().getName()); if (token == null) { TokenGen.generate(plugin.getServer().getName()); token = TokenGen.request("local_token", plugin.getServer().getName()); assert token != null; - } + }*/ - output.writeUTF(token); + output.writeUTF(BungeeReceiver.proxy_com); output.writeUTF(storager.getServerName()); output.writeUTF(DataType.LISTENER.name().toLowerCase()); output.writeUTF(channel); diff --git a/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/bungee/data/BungeeDataStorager.java b/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/bungee/data/BungeeDataStorager.java index 57f1a4d2..4fe17e75 100644 --- a/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/bungee/data/BungeeDataStorager.java +++ b/LockLogin-spigot/src/main/java/eu/locklogin/plugin/bukkit/plugin/bungee/data/BungeeDataStorager.java @@ -74,9 +74,11 @@ public boolean needsPinConfirmation(final Player player) { public String getServerName() { if (!StringUtils.isNullOrEmpty(serverName)) { return serverName; - } else { + }/* else { return TokenGen.requestNode(); - } + }*/ + + return StringUtils.generateString().create(); } /** diff --git a/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/listener/JoinListener.java b/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/listener/JoinListener.java index 4892c176..ab28146f 100644 --- a/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/listener/JoinListener.java +++ b/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/listener/JoinListener.java @@ -154,7 +154,7 @@ public JoinListener() { if (ServerDataStorage.needsProxyKnowledge(server.getServerInfo().getName())) { DataSender.send(server, DataSender.getBuilder(DataType.REGISTER, ACCESS_CHANNEL, player) .addTextData(proxy.proxyKey()).addTextData(server.getServerInfo().getName()) - .addTextData(TokenGen.expiration("local_token").toString()) + //.addTextData(TokenGen.expiration("local_token").toString()) .build()); } } @@ -467,7 +467,7 @@ public void onSwitch(ServerConnectedEvent e) { if (ServerDataStorage.needsProxyKnowledge(server.getServerInfo().getName())) { DataSender.send(server, DataSender.getBuilder(DataType.REGISTER, ACCESS_CHANNEL, player) .addTextData(proxy.proxyKey()).addTextData(server.getServerInfo().getName()) - .addTextData(TokenGen.expiration("local_token").toString()) + //.addTextData(TokenGen.expiration("local_token").toString()) .build()); } } diff --git a/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/listener/MessageListener.java b/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/listener/MessageListener.java index b735c5bb..f37c5060 100644 --- a/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/listener/MessageListener.java +++ b/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/listener/MessageListener.java @@ -67,9 +67,9 @@ public void onMessageReceive(PluginMessageEvent e) { String name = input.readUTF(); boolean canRead = true; - if (!identifier.equalsIgnoreCase("ll:access")) { + /*if (!identifier.equalsIgnoreCase("ll:access")) { canRead = TokenGen.matches(token, name, proxy.proxyKey()); - } + }*/ if (canRead) { DataType sub = DataType.valueOf(input.readUTF().toUpperCase()); @@ -204,7 +204,7 @@ public void onMessageReceive(PluginMessageEvent e) { ServerDataStorage.setProxyRegistered(name); DataSender.updateDataPool(name); - TokenGen.assign(new String(Base64.getUrlEncoder().encode(token.getBytes())), name, proxy.proxyKey(), Instant.parse(input.readUTF())); + //TokenGen.assign(new String(Base64.getUrlEncoder().encode(token.getBytes())), name, proxy.proxyKey(), Instant.parse(input.readUTF())); } } else { e.setResult(PluginMessageEvent.ForwardResult.handled()); diff --git a/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/plugin/Manager.java b/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/plugin/Manager.java index ae879686..ba7225ae 100644 --- a/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/plugin/Manager.java +++ b/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/plugin/Manager.java @@ -122,7 +122,7 @@ public static void initialize() { PlayerPool.startCheckTask(); setupFiles(); - TokenGen.generate(CurrentPlatform.getProxyConfiguration().proxyKey()); + //TokenGen.generate(CurrentPlatform.getProxyConfiguration().proxyKey()); registerCommands(); registerListeners(); @@ -584,7 +584,7 @@ static void initPlayers() { if (ServerDataStorage.needsProxyKnowledge(info.getServerInfo().getName())) { DataSender.send(info, DataSender.getBuilder(DataType.REGISTER, DataSender.ACCESS_CHANNEL, player) .addTextData(proxy.proxyKey()).addTextData(info.getServerInfo().getName()) - .addTextData(TokenGen.expiration("local_token").toString()) + //.addTextData(TokenGen.expiration("local_token").toString()) .build()); } } diff --git a/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/plugin/sender/DataSender.java b/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/plugin/sender/DataSender.java index 6793bea8..ee21de55 100644 --- a/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/plugin/sender/DataSender.java +++ b/LockLogin-velocity/src/main/java/eu/locklogin/plugin/velocity/plugin/sender/DataSender.java @@ -18,7 +18,6 @@ import com.velocitypowered.api.proxy.messages.LegacyChannelIdentifier; import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.api.proxy.server.ServerInfo; -import eu.locklogin.api.common.security.TokenGen; import eu.locklogin.api.common.utils.DataType; import eu.locklogin.api.common.utils.MessagePool; import eu.locklogin.api.common.utils.plugin.ServerDataStorage; @@ -149,14 +148,14 @@ public static void sendModule(final String channel, final byte[] data) { ByteArrayDataOutput output = ByteStreams.newDataOutput(); ProxyConfiguration proxy = CurrentPlatform.getProxyConfiguration(); - String token = TokenGen.request("local_token", proxy.proxyKey()); + /*String token = TokenGen.request("local_token", proxy.proxyKey()); if (token == null) { TokenGen.generate(proxy.proxyKey()); token = TokenGen.request("local_token", proxy.proxyKey()); assert token != null; - } + }*/ - output.writeUTF(token); + output.writeUTF("token"); output.writeUTF(proxy.getProxyID().toString()); output.writeUTF(DataType.LISTENER.name().toLowerCase()); output.writeUTF(channel); @@ -214,19 +213,19 @@ public static class MessageDataBuilder { MessageDataBuilder(final DataType data, final Player owner) throws IllegalArgumentException { ProxyConfiguration proxy = CurrentPlatform.getProxyConfiguration(); - String token = TokenGen.request("local_token", proxy.proxyKey()); + /*String token = TokenGen.request("local_token", proxy.proxyKey()); if (token == null) { TokenGen.generate(proxy.proxyKey()); token = TokenGen.request("local_token", proxy.proxyKey()); assert token != null; - } + }*/ if (owner != null) { output.writeUTF(owner.getGameProfile().getId().toString()); } else { output.writeUTF(UUID.randomUUID().toString()); } - output.writeUTF(token); + output.writeUTF("token"); output.writeUTF(proxy.getProxyID().toString()); output.writeUTF(data.name().toLowerCase()); } diff --git a/pom.xml b/pom.xml index 416d2171..dcdeba9d 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ eu.locklogin LockLogin - 1.13.37 + 1.13.38 pom LockLogin @@ -186,7 +186,7 @@ locklogin-common locklogin-spigot locklogin-bungee - locklogin-velocity + LockLogin-bundle LockLogin-manager