From 394cd4474e1abd46623995fd20d81754e11735b6 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Sun, 1 Oct 2017 21:07:30 +0300 Subject: [PATCH] [4.0.0] Fixed Set-up issue --- .../main/java/com/djrapitops/plan/Plan.java | 6 +- .../java/com/djrapitops/plan/PlanBungee.java | 5 +- .../plan/ServerSpecificSettings.java | 27 ++++---- .../plan/command/commands/AnalyzeCommand.java | 8 ++- .../plan/command/commands/ManageCommand.java | 1 + .../commands/manage/ManageSetupCommand.java | 64 +++++++++++++++++++ .../info/BukkitInformationManager.java | 8 ++- .../BukkitPluginChannelListener.java | 1 + .../BungeePluginChannelListener.java | 13 +++- .../info/server/BukkitServerInfoManager.java | 8 +++ .../info/server/BungeeServerInfoManager.java | 18 +++++- .../systems/listeners/PlanPlayerListener.java | 13 ++-- .../BungeePluginChannelSenderProcessor.java | 1 + .../systems/webserver/APIRequestHandler.java | 3 + .../systems/webserver/APIResponseHandler.java | 38 ++++++++--- .../systems/webserver/ResponseHandler.java | 2 + .../plan/systems/webserver/WebServer.java | 5 +- .../plan/systems/webserver/webapi/WebAPI.java | 10 +-- .../webserver/webapi/WebAPIManager.java | 2 +- .../webapi/bukkit/ConfigurationWebAPI.java | 32 +++++++--- .../webapi/bungee/RequestSetupWebAPI.java | 59 +++++++++++++++++ .../webapi/universal/PingWebAPI.java | 34 ++++++---- .../plan/utilities/html/HtmlStructure.java | 6 +- Plan/src/main/resources/plugin.yml | 2 +- 24 files changed, 290 insertions(+), 76 deletions(-) create mode 100644 Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageSetupCommand.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/bungee/RequestSetupWebAPI.java diff --git a/Plan/src/main/java/com/djrapitops/plan/Plan.java b/Plan/src/main/java/com/djrapitops/plan/Plan.java index 1fdf8e66f..9dac999a0 100644 --- a/Plan/src/main/java/com/djrapitops/plan/Plan.java +++ b/Plan/src/main/java/com/djrapitops/plan/Plan.java @@ -201,9 +201,9 @@ public class Plan extends BukkitPlugin implements IPlan { ImporterManager.registerImporter(new OfflinePlayerImporter()); - if (Settings.BUNGEE_OVERRIDE_STANDALONE_MODE.isFalse()) { - registerPluginChannelListener(); - } +// if (Settings.BUNGEE_OVERRIDE_STANDALONE_MODE.isFalse()) { +// registerPluginChannelListener(); +// } BStats bStats = new BStats(this); bStats.registerMetrics(); diff --git a/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java b/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java index 4f8820276..bcb2a32f3 100644 --- a/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java +++ b/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java @@ -16,7 +16,6 @@ import main.java.com.djrapitops.plan.locale.Locale; import main.java.com.djrapitops.plan.locale.Msg; import main.java.com.djrapitops.plan.systems.info.BungeeInformationManager; import main.java.com.djrapitops.plan.systems.info.InformationManager; -import main.java.com.djrapitops.plan.systems.info.pluginchannel.BungeePluginChannelListener; import main.java.com.djrapitops.plan.systems.info.server.BungeeServerInfoManager; import main.java.com.djrapitops.plan.systems.listeners.BungeePlayerListener; import main.java.com.djrapitops.plan.systems.processing.Processor; @@ -96,8 +95,8 @@ public class PlanBungee extends BungeePlugin implements IPlan { } }).runTaskAsynchronously(); - getProxy().registerChannel("Plan"); - registerListener(new BungeePluginChannelListener(this)); +// getProxy().registerChannel("Plan"); +// registerListener(new BungeePluginChannelListener(this)); processingQueue = new ProcessingQueue(); diff --git a/Plan/src/main/java/com/djrapitops/plan/ServerSpecificSettings.java b/Plan/src/main/java/com/djrapitops/plan/ServerSpecificSettings.java index 752737fa1..70845b88a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/ServerSpecificSettings.java +++ b/Plan/src/main/java/com/djrapitops/plan/ServerSpecificSettings.java @@ -42,22 +42,27 @@ public class ServerSpecificSettings { public static void updateSettings(Plan plugin, Map settings) { Log.debug("Checking new settings.."); FileConfiguration config = plugin.getConfig(); + boolean changedSomething = false; for (Map.Entry setting : settings.entrySet()) { - String path = setting.getKey(); - if ("sender".equals(path)) { - continue; + try { + String path = setting.getKey(); + if ("sender".equals(path)) { + continue; + } + String stringValue = setting.getValue(); + Object value = getValue(stringValue); + String currentValue = config.get(path).toString(); + if (stringValue.equals(currentValue)) { + continue; + } + config.set(path, value); + Log.debug(" " + path + ": " + value); + } catch (NullPointerException e) { } - String stringValue = setting.getValue(); - Object value = getValue(stringValue); - String currentValue = config.getString(path); - if (currentValue.equals(stringValue)) { - continue; - } - config.set(path, value); - Log.debug(" " + path + ": " + value); changedSomething = true; } + if (changedSomething) { plugin.saveConfig(); Log.info("----------------------------------"); diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/AnalyzeCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/AnalyzeCommand.java index a221a407e..466aeacab 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/AnalyzeCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/AnalyzeCommand.java @@ -88,7 +88,13 @@ public class AnalyzeCommand extends SubCommand { try { List bukkitServers = plugin.getDB().getServerTable().getBukkitServers(); Optional server = bukkitServers.stream().filter(info -> { - String serverIdentifier = args[0]; + StringBuilder idBuilder = new StringBuilder(args[0]); + if (args.length > 1) { + for (int i = 1; i < args.length; i++) { + idBuilder.append(" ").append(args[i]); + } + } + String serverIdentifier = idBuilder.toString(); return Integer.toString(info.getId()).equals(serverIdentifier) || info.getName().equalsIgnoreCase(serverIdentifier); }).findFirst(); if (server.isPresent()) { diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/ManageCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/ManageCommand.java index c519d4baa..0f4e1009a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/ManageCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/ManageCommand.java @@ -43,5 +43,6 @@ public class ManageCommand extends TreeCommand { commands.add(new ManageRemoveCommand(plugin)); commands.add(new ManageClearCommand(plugin)); commands.add(new ManageDumpCommand(plugin)); + commands.add(new ManageSetupCommand(plugin)); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageSetupCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageSetupCommand.java new file mode 100644 index 000000000..2cdc6acfa --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageSetupCommand.java @@ -0,0 +1,64 @@ +package main.java.com.djrapitops.plan.command.commands.manage; + +import com.djrapitops.plugin.command.CommandType; +import com.djrapitops.plugin.command.ISender; +import com.djrapitops.plugin.command.SubCommand; +import main.java.com.djrapitops.plan.Log; +import main.java.com.djrapitops.plan.Permissions; +import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.api.exceptions.WebAPIException; +import main.java.com.djrapitops.plan.locale.Locale; +import main.java.com.djrapitops.plan.locale.Msg; +import main.java.com.djrapitops.plan.systems.webserver.webapi.bungee.RequestSetupWebAPI; +import main.java.com.djrapitops.plan.systems.webserver.webapi.universal.PingWebAPI; +import main.java.com.djrapitops.plan.utilities.Check; + +/** + * This manage subcommand is used to swap to a different database and reload the + * plugin if the connection to the new database can be established. + * + * @author Rsl1122 + * @since 2.3.0 + */ +public class ManageSetupCommand extends SubCommand { + + private final Plan plugin; + + /** + * Class Constructor. + * + * @param plugin Current instance of Plan + */ + public ManageSetupCommand(Plan plugin) { + super("setup", + CommandType.CONSOLE_WITH_ARGUMENTS, + Permissions.MANAGE.getPermission(), + "Set-Up Bungee WebServer connection", + ""); + + this.plugin = plugin; + + } + + @Override + public String[] addHelp() { + return Locale.get(Msg.CMD_HELP_MANAGE_HOTSWAP).toArray(); + } + + @Override + public boolean onCommand(ISender sender, String commandLabel, String[] args) { + if (!Check.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString(), sender)) { + return true; + } + String address = args[0].toLowerCase(); + try { + plugin.getWebServer().getWebAPI().getAPI(PingWebAPI.class).sendRequest(address); + plugin.getWebServer().getWebAPI().getAPI(RequestSetupWebAPI.class).sendRequest(address); + sender.sendMessage("§aConnection successful, Plan may restart in a few seconds."); + } catch (WebAPIException e) { + Log.toLog(this.getClass().getName(), e); + sender.sendMessage("§cConnection to Bungee WebServer failed: More info on console"); + } + return true; + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java index 4b77d9c4c..df182e15d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java @@ -64,6 +64,10 @@ public class BukkitInformationManager extends InformationManager { analysis = new Analysis(plugin); pluginsTabContents = new HashMap<>(); + updateConnection(); + } + + public void updateConnection() { Optional bungeeConnectionAddress = plugin.getServerInfoManager().getBungeeConnectionAddress(); if (bungeeConnectionAddress.isPresent() && Settings.BUNGEE_OVERRIDE_STANDALONE_MODE.isFalse()) { webServerAddress = bungeeConnectionAddress.get(); @@ -71,7 +75,6 @@ public class BukkitInformationManager extends InformationManager { } else { usingAnotherWebServer = false; } - } @Override @@ -216,6 +219,7 @@ public class BukkitInformationManager extends InformationManager { if (usingAnotherWebServer) { try { getWebAPI().getAPI(AnalysisReadyWebAPI.class).sendRequest(webServerAddress, serverUUID); + updateNetworkPageContent(); return; } catch (WebAPIException e) { attemptConnection(); @@ -299,8 +303,6 @@ public class BukkitInformationManager extends InformationManager { try { getWebAPI().getAPI(PostNetworkPageContentWebAPI.class).sendNetworkContent(webServerAddress, HtmlStructure.createServerContainer(plugin)); } catch (WebAPIException e) { - attemptConnection(); - updateNetworkPageContent(); } } } diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/pluginchannel/BukkitPluginChannelListener.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/pluginchannel/BukkitPluginChannelListener.java index 02cb0b344..72ce5537e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/pluginchannel/BukkitPluginChannelListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/pluginchannel/BukkitPluginChannelListener.java @@ -37,6 +37,7 @@ public class BukkitPluginChannelListener implements PluginMessageListener { try (DataInputStream in = new DataInputStream(new ByteArrayInputStream(message))) { String subChannel = in.readUTF(); + Log.debug("Received plugin message, channel: " + subChannel); String[] data = in.readUTF().split(""); String address = data[0]; accessKey = data[1]; diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/pluginchannel/BungeePluginChannelListener.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/pluginchannel/BungeePluginChannelListener.java index 789891e9b..c67680357 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/pluginchannel/BungeePluginChannelListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/pluginchannel/BungeePluginChannelListener.java @@ -28,13 +28,16 @@ public class BungeePluginChannelListener implements Listener { @EventHandler public void onPluginMessage(PluginMessageEvent e) { - if (!e.getTag().equalsIgnoreCase("BungeeCord")) { + String tag = e.getTag(); + Log.debug(tag); + if (!tag.equalsIgnoreCase("BungeeCord")) { return; } try (DataInputStream in = new DataInputStream(new ByteArrayInputStream(e.getData()))) { - String channel = in.readUTF(); // channel we delivered - if (channel.equals("bungee_address_get")) { + String channel = in.readUTF(); + Log.debug("Received plugin channel message on channel: " + channel); + if ("bungee_address_get".equals(channel)) { ServerInfo server = plugin.getProxy().getPlayer(e.getReceiver().toString()).getServer().getInfo(); sendToBukkit(server); } @@ -44,10 +47,14 @@ public class BungeePluginChannelListener implements Listener { } private void sendToBukkit(ServerInfo server) { + Log.debug("Sending data to bukkit through plugin channel"); try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) { String accessKey = plugin.getWebServer().getWebAPI().generateNewAccessKey(); try (DataOutputStream out = new DataOutputStream(stream)) { + out.writeUTF("Forward"); + out.writeUTF(server.getName()); + out.writeUTF("Plan"); out.writeUTF("bungee_address"); out.writeUTF(plugin.getWebServer().getAccessAddress() + "" + accessKey); } diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BukkitServerInfoManager.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BukkitServerInfoManager.java index f9292ca16..1bbdc7300 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BukkitServerInfoManager.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BukkitServerInfoManager.java @@ -110,6 +110,14 @@ public class BukkitServerInfoManager { } catch (Exception ignored) { /* Ignored */ } + try { + Optional bungeeInfo = plugin.getDB().getServerTable().getBungeeInfo(); + if (bungeeInfo.isPresent()) { + return Optional.of(bungeeInfo.get().getWebAddress()); + } + } catch (SQLException e) { + Log.toLog(this.getClass().getName(), e); + } return Optional.empty(); } diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BungeeServerInfoManager.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BungeeServerInfoManager.java index 2817fea6d..00377188b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BungeeServerInfoManager.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BungeeServerInfoManager.java @@ -80,7 +80,7 @@ public class BungeeServerInfoManager { return serverInfo.getUuid(); } - public boolean attemptConnection(ServerInfo server) { + public boolean attemptConnection(ServerInfo server, String accessCode) { if (server == null) { Log.debug("Attempted a connection to a null ServerInfo"); return false; @@ -88,7 +88,13 @@ public class BungeeServerInfoManager { try { String webAddress = server.getWebAddress(); Log.debug("Attempting to connect to Bukkit server.. (" + webAddress + ")"); - plugin.getWebServer().getWebAPI().getAPI(PingWebAPI.class).sendRequest(webAddress); + PingWebAPI pingApi = plugin.getWebServer().getWebAPI().getAPI(PingWebAPI.class); + if (accessCode != null) { + pingApi.sendRequest(webAddress, accessCode); + plugin.getWebServer().getWebAPI().getAPI(ConfigurationWebAPI.class).sendRequest(webAddress, server.getUuid(), accessCode); + } else { + pingApi.sendRequest(webAddress); + } connectedToServer(server); return true; } catch (WebAPIException e) { @@ -97,6 +103,10 @@ public class BungeeServerInfoManager { } } + public boolean attemptConnection(ServerInfo server) { + return attemptConnection(server, null); + } + public void sendConfigSettings(UUID serverUUID) { try { ServerInfo server = bukkitServers.get(serverUUID); @@ -119,6 +129,10 @@ public class BungeeServerInfoManager { public void serverConnected(UUID serverUUID) { Log.info("Received a connection from a Bukkit server.."); + if (onlineServers.contains(serverUUID)) { + sendConfigSettings(serverUUID); + return; + } try { Optional serverInfo = db.getServerTable().getServerInfo(serverUUID); serverInfo.ifPresent(server -> { diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/listeners/PlanPlayerListener.java b/Plan/src/main/java/com/djrapitops/plan/systems/listeners/PlanPlayerListener.java index 00a603733..d5fa2fd18 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/listeners/PlanPlayerListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/listeners/PlanPlayerListener.java @@ -2,10 +2,8 @@ package main.java.com.djrapitops.plan.systems.listeners; import com.djrapitops.plugin.utilities.player.Fetch; import main.java.com.djrapitops.plan.Plan; -import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.data.Session; import main.java.com.djrapitops.plan.systems.cache.DataCache; -import main.java.com.djrapitops.plan.systems.processing.info.BungeePluginChannelSenderProcessor; import main.java.com.djrapitops.plan.systems.processing.info.NetworkPageUpdateProcessor; import main.java.com.djrapitops.plan.systems.processing.player.*; import main.java.com.djrapitops.plan.utilities.MiscUtils; @@ -95,16 +93,15 @@ public class PlanPlayerListener implements Listener { int playersOnline = plugin.getTpsCountTimer().getLatestPlayersOnline(); - BungeePluginChannelSenderProcessor bungeePluginChannelSenderProcessor = null; - if (!plugin.getInfoManager().isUsingAnotherWebServer() && Settings.BUNGEE_OVERRIDE_STANDALONE_MODE.isFalse()) { - bungeePluginChannelSenderProcessor = new BungeePluginChannelSenderProcessor(player); - } +// BungeePluginChannelSenderProcessor bungeePluginChannelSenderProcessor = null; +// if (!plugin.getInfoManager().isUsingAnotherWebServer() && Settings.BUNGEE_OVERRIDE_STANDALONE_MODE.isFalse()) { +// bungeePluginChannelSenderProcessor = new BungeePluginChannelSenderProcessor(player); +// } cache.cacheSession(uuid, Session.start(time, world, gm)); plugin.addToProcessQueue( new RegisterProcessor(uuid, player.getFirstPlayed(), time, playerName, playersOnline, new IPUpdateProcessor(uuid, ip), - new NameProcessor(uuid, playerName, displayName), - bungeePluginChannelSenderProcessor + new NameProcessor(uuid, playerName, displayName) ), new NetworkPageUpdateProcessor(plugin.getInfoManager()) ); diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/processing/info/BungeePluginChannelSenderProcessor.java b/Plan/src/main/java/com/djrapitops/plan/systems/processing/info/BungeePluginChannelSenderProcessor.java index a7501a1a5..bc62c6f0a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/processing/info/BungeePluginChannelSenderProcessor.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/processing/info/BungeePluginChannelSenderProcessor.java @@ -26,6 +26,7 @@ public class BungeePluginChannelSenderProcessor extends Processor { @Override public void process() { + Log.debug("Sending a Bungee Address get Request through plugin channel"); try (ByteArrayOutputStream b = new ByteArrayOutputStream()) { try (DataOutputStream out = new DataOutputStream(b)) { out.writeUTF("bungee_address_get"); diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/APIRequestHandler.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/APIRequestHandler.java index 34d048cbf..02a790552 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/APIRequestHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/APIRequestHandler.java @@ -7,6 +7,7 @@ package main.java.com.djrapitops.plan.systems.webserver; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; +import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.systems.webserver.response.Response; import main.java.com.djrapitops.plan.systems.webserver.webapi.WebAPIManager; @@ -33,6 +34,8 @@ public class APIRequestHandler implements HttpHandler { Response response = responseHandler.getAPIResponse(request); response.setResponseHeaders(responseHeaders); response.send(exchange); + } catch (Exception e) { + Log.toLog(this.getClass().getName(), e); } finally { exchange.close(); } diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/APIResponseHandler.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/APIResponseHandler.java index 20b5b94f9..59b67c1f1 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/APIResponseHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/APIResponseHandler.java @@ -72,14 +72,36 @@ public class APIResponseHandler { Map variables = WebAPI.readVariables(requestBody); String sender = variables.get("sender"); Log.debug("Received WebAPI Request" + target + " from " + sender); - if (!checkKey(sender)) { - String error = "Server Key not given or invalid"; - Log.debug("Request had invalid Server key"); - return PageCache.loadPage(error, () -> { - ForbiddenResponse forbidden = new ForbiddenResponse(); - forbidden.setContent(error); - return forbidden; - }); + + boolean isPing = "pingwebapi".equalsIgnoreCase(method); + boolean isSetupRequest = "requestsetupwebapi".equalsIgnoreCase(method); + boolean isPostOriginalSettings = "postoriginalbukkitsettingswebapi".equalsIgnoreCase(method); + boolean skipAuthCheck = isPing || isSetupRequest || isPostOriginalSettings; + + // TODO refactor to more methods + if (!skipAuthCheck) { + String accessKey = variables.get("accessKey"); + if (accessKey == null) { + if (!checkKey(sender)) { + String error = "Server Key not given or invalid"; + Log.debug("Request had invalid Server key: " + sender); + return PageCache.loadPage(error, () -> { + ForbiddenResponse forbidden = new ForbiddenResponse(); + forbidden.setContent(error); + return forbidden; + }); + } + } else { + if (!webAPI.isAuthorized(accessKey)) { + String error = "Access Key invalid"; + Log.debug("Request had invalid Access key: " + accessKey); + return PageCache.loadPage(error, () -> { + ForbiddenResponse forbidden = new ForbiddenResponse(); + forbidden.setContent(error); + return forbidden; + }); + } + } } WebAPI api = webAPI.getAPI(method); diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/ResponseHandler.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/ResponseHandler.java index b2ca0547f..dc1ba14e8 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/ResponseHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/ResponseHandler.java @@ -4,6 +4,7 @@ */ package main.java.com.djrapitops.plan.systems.webserver; +import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.api.IPlan; import main.java.com.djrapitops.plan.api.exceptions.WebUserAuthException; import main.java.com.djrapitops.plan.data.WebUser; @@ -103,6 +104,7 @@ public class ResponseHandler extends APIResponseHandler { } catch (WebUserAuthException e) { return PageCache.loadPage("promptAuthorization", PromptAuthorizationResponse::new); } catch (Exception e) { + Log.toLog(this.getClass().getName(), e); return new InternalErrorResponse(e, request.getTarget()); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/WebServer.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/WebServer.java index ef5dfa366..0f439286b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/WebServer.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/WebServer.java @@ -70,7 +70,8 @@ public class WebServer { new PostInspectPluginsTabWebAPI(), new PostNetworkPageContentWebAPI(), new PostOriginalBukkitSettingsWebAPI(), - new RequestPluginsTabWebAPI() + new RequestPluginsTabWebAPI(), + new RequestSetupWebAPI() ); } @@ -105,7 +106,7 @@ public class WebServer { enabled = true; - Log.info(Locale.get(Msg.ENABLE_WEBSERVER_INFO).parse(server.getAddress().getPort())); + Log.info(Locale.get(Msg.ENABLE_WEBSERVER_INFO).parse(server.getAddress().getPort()) + " (" + getAccessAddress() + ")"); } catch (IllegalArgumentException | IllegalStateException | IOException e) { Log.toLog(this.getClass().getName(), e); enabled = false; diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/WebAPI.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/WebAPI.java index dfa8308b0..09eb06efb 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/WebAPI.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/WebAPI.java @@ -46,14 +46,8 @@ public abstract class WebAPI { public Response processRequest(IPlan plugin, Map variables) { String sender = variables.get("sender"); if (sender == null) { - String accessKey = variables.get("accessKey"); - WebAPIManager apiManager = MiscUtils.getIPlan().getWebServer().getWebAPI(); - if (apiManager.isAuthorized(accessKey)) { - apiManager.authorize(accessKey); - } else { - Log.debug(getClass().getSimpleName() + ": Sender not Found"); - return badRequest("Sender not present"); - } + Log.debug(getClass().getSimpleName() + ": Sender not Found"); + return badRequest("Sender not present"); } else { try { UUID.fromString(sender); diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/WebAPIManager.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/WebAPIManager.java index f59d1b541..8d94025dc 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/WebAPIManager.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/WebAPIManager.java @@ -39,7 +39,7 @@ public class WebAPIManager { } public String generateNewAccessKey() throws Exception { - String key = PassEncryptUtil.createHash(UUID.randomUUID().toString()).split(":")[4]; + String key = PassEncryptUtil.createHash(UUID.randomUUID().toString().substring(0, 5)).split(":")[4]; accessKeys.add(key); return key; } diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/bukkit/ConfigurationWebAPI.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/bukkit/ConfigurationWebAPI.java index 31aa5881e..80e71a2b0 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/bukkit/ConfigurationWebAPI.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/bukkit/ConfigurationWebAPI.java @@ -6,10 +6,7 @@ package main.java.com.djrapitops.plan.systems.webserver.webapi.bukkit; import com.djrapitops.plugin.utilities.Compatibility; import com.djrapitops.plugin.utilities.Verify; -import main.java.com.djrapitops.plan.Log; -import main.java.com.djrapitops.plan.Plan; -import main.java.com.djrapitops.plan.ServerSpecificSettings; -import main.java.com.djrapitops.plan.Settings; +import main.java.com.djrapitops.plan.*; import main.java.com.djrapitops.plan.api.IPlan; import main.java.com.djrapitops.plan.api.exceptions.WebAPIException; import main.java.com.djrapitops.plan.systems.webserver.response.Response; @@ -43,9 +40,17 @@ public class ConfigurationWebAPI extends WebAPI { throw new IllegalStateException("Wrong method call for this WebAPI, call sendRequest(String, UUID, UUID) instead."); } + public void sendRequest(String address, UUID serverUUID, String accessKey) throws WebAPIException { + if (accessKey != null) { + addVariable("accessKey", accessKey); + } + addVariable("webAddress", PlanBungee.getInstance().getWebServer().getAccessAddress()); + + sendRequest(address, serverUUID); + } + public void sendRequest(String address, UUID serverUUID) throws WebAPIException { Map configValues = getConfigValues(serverUUID); - Log.debug("Sending config values: " + configValues); for (Map.Entry entry : configValues.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); @@ -87,8 +92,19 @@ public class ConfigurationWebAPI extends WebAPI { private void addServerSpecificValues(Map configValues, UUID serverUUID) { ServerSpecificSettings settings = Settings.serverSpecific(); - addConfigValue(configValues, Settings.THEME_BASE, settings.getString(serverUUID, Settings.THEME_BASE)); - addConfigValue(configValues, Settings.WEBSERVER_PORT, settings.getInt(serverUUID, Settings.WEBSERVER_PORT)); - addConfigValue(configValues, Settings.SERVER_NAME, settings.getString(serverUUID, Settings.SERVER_NAME)); + + String theme = settings.getString(serverUUID, Settings.THEME_BASE); + Integer port = settings.getInt(serverUUID, Settings.WEBSERVER_PORT); + String name = settings.getString(serverUUID, Settings.SERVER_NAME); + + if (!Verify.isEmpty(theme)) { + addConfigValue(configValues, Settings.THEME_BASE, theme); + } + if (port != null && port != 0) { + addConfigValue(configValues, Settings.WEBSERVER_PORT, port); + } + if (!Verify.isEmpty(name)) { + addConfigValue(configValues, Settings.SERVER_NAME, name); + } } } diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/bungee/RequestSetupWebAPI.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/bungee/RequestSetupWebAPI.java new file mode 100644 index 000000000..98db92a80 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/bungee/RequestSetupWebAPI.java @@ -0,0 +1,59 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package main.java.com.djrapitops.plan.systems.webserver.webapi.bungee; + +import com.djrapitops.plugin.utilities.Compatibility; +import com.djrapitops.plugin.utilities.Verify; +import main.java.com.djrapitops.plan.Log; +import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.PlanBungee; +import main.java.com.djrapitops.plan.api.IPlan; +import main.java.com.djrapitops.plan.api.exceptions.WebAPIException; +import main.java.com.djrapitops.plan.systems.info.server.ServerInfo; +import main.java.com.djrapitops.plan.systems.webserver.response.Response; +import main.java.com.djrapitops.plan.systems.webserver.webapi.WebAPI; + +import java.util.Map; +import java.util.UUID; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public class RequestSetupWebAPI extends WebAPI { + + @Override + public Response onRequest(IPlan plugin, Map variables) { + if (!Compatibility.isBungeeAvailable()) { + return badRequest("Called a Bukkit server."); + } + String serverUUIDS = variables.get("sender"); + String webAddress = variables.get("webAddress"); + String accessCode = variables.get("accessKey"); + if (!Verify.notNull(serverUUIDS, webAddress, accessCode)) { + return badRequest("Variable was null"); + } + ServerInfo serverInfo = new ServerInfo(-1, UUID.fromString(serverUUIDS), "", webAddress, 0); + PlanBungee.getInstance().getServerInfoManager().attemptConnection(serverInfo, accessCode); + return success(); + } + + @Override + public void sendRequest(String address) throws WebAPIException { + if (!Compatibility.isBukkitAvailable()) { + throw new IllegalStateException("Not supposed to be called on Bungee"); + } + + Plan plugin = Plan.getInstance(); + try { + addVariable("accessKey", plugin.getWebServer().getWebAPI().generateNewAccessKey()); + } catch (Exception e) { + Log.toLog(this.getClass().getName(), e); + } + addVariable("webAddress", plugin.getWebServer().getAccessAddress()); + super.sendRequest(address); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/universal/PingWebAPI.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/universal/PingWebAPI.java index c9cf110bc..f3126c0a9 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/universal/PingWebAPI.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/webapi/universal/PingWebAPI.java @@ -5,13 +5,16 @@ package main.java.com.djrapitops.plan.systems.webserver.webapi.universal; import com.djrapitops.plugin.utilities.Compatibility; +import main.java.com.djrapitops.plan.Log; +import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.PlanBungee; import main.java.com.djrapitops.plan.api.IPlan; import main.java.com.djrapitops.plan.api.exceptions.WebAPIException; -import main.java.com.djrapitops.plan.systems.info.pluginchannel.BukkitPluginChannelListener; +import main.java.com.djrapitops.plan.systems.info.BukkitInformationManager; import main.java.com.djrapitops.plan.systems.webserver.response.Response; import main.java.com.djrapitops.plan.systems.webserver.webapi.WebAPI; +import java.io.IOException; import java.util.Map; import java.util.UUID; @@ -23,9 +26,17 @@ public class PingWebAPI extends WebAPI { public Response onRequest(IPlan plugin, Map variables) { if (Compatibility.isBungeeAvailable()) { ((PlanBungee) plugin).getServerInfoManager().serverConnected(UUID.fromString(variables.get("sender"))); - } - if (Compatibility.isBukkitAvailable() && !plugin.getInfoManager().isUsingAnotherWebServer()) { - plugin.getInfoManager().attemptConnection(); + } else if (!plugin.getInfoManager().isUsingAnotherWebServer()) { + try { + String webAddress = variables.get("webAddress"); + if (webAddress != null) { + ((Plan) plugin).getServerInfoManager().saveBungeeConnectionAddress(webAddress); + } + + ((BukkitInformationManager) plugin.getInfoManager()).updateConnection(); + } catch (IOException e) { + Log.toLog(this.getClass().getName(), e); + } } return success(); } @@ -33,18 +44,15 @@ public class PingWebAPI extends WebAPI { @Override public void sendRequest(String address) throws WebAPIException { if (Compatibility.isBukkitAvailable()) { - String accessKey = BukkitPluginChannelListener.getAccessKey(); - if (accessKey != null) { - addVariable("accessKey", accessKey); - } - super.sendRequest(address); - - if (accessKey != null) { - BukkitPluginChannelListener.usedAccessKey(); - } } else { + addVariable("webAddress", PlanBungee.getInstance().getWebServer().getAccessAddress()); super.sendRequest(address); } } + + public void sendRequest(String address, String accessCode) throws WebAPIException { + addVariable("accessKey", accessCode); + sendRequest(address); + } } \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java index c1b81403b..1e25d7c6f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java @@ -385,8 +385,12 @@ public class HtmlStructure { } int i = 0; StringBuilder b = new StringBuilder(); - Collection values = networkPageContents.values(); + List values = new ArrayList<>(networkPageContents.values()); int size = values.size(); + int extra = size % 3; + for (int j = 0; j < extra; j++) { + values.add("
"); + } for (String server : values) { if (i % 3 == 0) { b.append("
"); diff --git a/Plan/src/main/resources/plugin.yml b/Plan/src/main/resources/plugin.yml index a783a4589..153ce3dba 100644 --- a/Plan/src/main/resources/plugin.yml +++ b/Plan/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ name: Plan author: Rsl1122 main: main.java.com.djrapitops.plan.Plan -version: 3.9.9 +version: 4.0.0 softdepend: - OnTime - EssentialsX