WebServer initialized by Dagger

This commit is contained in:
Rsl1122 2018-08-22 10:19:52 +03:00
parent 81a6ed7365
commit 20b651f909
18 changed files with 229 additions and 169 deletions

View File

@ -22,7 +22,10 @@ package com.djrapitops.plan;
import com.djrapitops.plan.api.exceptions.EnableException; import com.djrapitops.plan.api.exceptions.EnableException;
import com.djrapitops.plan.command.PlanCommand; import com.djrapitops.plan.command.PlanCommand;
import com.djrapitops.plan.modules.APFModule; import com.djrapitops.plan.modules.APFModule;
import com.djrapitops.plan.modules.common.*; import com.djrapitops.plan.modules.common.ExportModule;
import com.djrapitops.plan.modules.common.LocaleModule;
import com.djrapitops.plan.modules.common.PluginHookModule;
import com.djrapitops.plan.modules.common.VersionCheckModule;
import com.djrapitops.plan.modules.server.ServerAPIModule; import com.djrapitops.plan.modules.server.ServerAPIModule;
import com.djrapitops.plan.modules.server.ServerDataCacheModule; import com.djrapitops.plan.modules.server.ServerDataCacheModule;
import com.djrapitops.plan.modules.server.ServerInfoSystemModule; import com.djrapitops.plan.modules.server.ServerInfoSystemModule;
@ -64,7 +67,6 @@ import java.util.logging.Logger;
BukkitInfoModule.class, BukkitInfoModule.class,
BukkitDatabaseModule.class, BukkitDatabaseModule.class,
ServerDataCacheModule.class, ServerDataCacheModule.class,
WebServerSystemModule.class,
ServerInfoSystemModule.class, ServerInfoSystemModule.class,
PluginHookModule.class, PluginHookModule.class,
ServerAPIModule.class ServerAPIModule.class

View File

@ -10,7 +10,11 @@ import com.djrapitops.plan.modules.APFModule;
import com.djrapitops.plan.modules.bungee.BungeeAPIModule; import com.djrapitops.plan.modules.bungee.BungeeAPIModule;
import com.djrapitops.plan.modules.bungee.BungeeConfigModule; import com.djrapitops.plan.modules.bungee.BungeeConfigModule;
import com.djrapitops.plan.modules.bungee.BungeeDatabaseModule; import com.djrapitops.plan.modules.bungee.BungeeDatabaseModule;
import com.djrapitops.plan.modules.common.*; import com.djrapitops.plan.modules.bungee.BungeeInfoModule;
import com.djrapitops.plan.modules.common.ExportModule;
import com.djrapitops.plan.modules.common.LocaleModule;
import com.djrapitops.plan.modules.common.PluginHookModule;
import com.djrapitops.plan.modules.common.VersionCheckModule;
import com.djrapitops.plan.modules.server.ServerInfoSystemModule; import com.djrapitops.plan.modules.server.ServerInfoSystemModule;
import com.djrapitops.plan.system.BungeeSystem; import com.djrapitops.plan.system.BungeeSystem;
import com.djrapitops.plan.system.locale.Locale; import com.djrapitops.plan.system.locale.Locale;
@ -41,8 +45,8 @@ import java.io.InputStream;
VersionCheckModule.class, VersionCheckModule.class,
BungeeConfigModule.class, BungeeConfigModule.class,
LocaleModule.class, LocaleModule.class,
BungeeInfoModule.class,
BungeeDatabaseModule.class, BungeeDatabaseModule.class,
WebServerSystemModule.class,
ServerInfoSystemModule.class, ServerInfoSystemModule.class,
PluginHookModule.class, PluginHookModule.class,
BungeeAPIModule.class BungeeAPIModule.class

View File

@ -3,7 +3,10 @@ package com.djrapitops.plan;
import com.djrapitops.plan.api.exceptions.EnableException; import com.djrapitops.plan.api.exceptions.EnableException;
import com.djrapitops.plan.command.PlanCommand; import com.djrapitops.plan.command.PlanCommand;
import com.djrapitops.plan.modules.APFModule; import com.djrapitops.plan.modules.APFModule;
import com.djrapitops.plan.modules.common.*; import com.djrapitops.plan.modules.common.ExportModule;
import com.djrapitops.plan.modules.common.LocaleModule;
import com.djrapitops.plan.modules.common.PluginHookModule;
import com.djrapitops.plan.modules.common.VersionCheckModule;
import com.djrapitops.plan.modules.server.ServerAPIModule; import com.djrapitops.plan.modules.server.ServerAPIModule;
import com.djrapitops.plan.modules.server.ServerDataCacheModule; import com.djrapitops.plan.modules.server.ServerDataCacheModule;
import com.djrapitops.plan.modules.server.ServerInfoSystemModule; import com.djrapitops.plan.modules.server.ServerInfoSystemModule;
@ -51,7 +54,6 @@ import java.io.InputStream;
LocaleModule.class, LocaleModule.class,
SpongeDatabaseModule.class, SpongeDatabaseModule.class,
ServerDataCacheModule.class, ServerDataCacheModule.class,
WebServerSystemModule.class,
ServerInfoSystemModule.class, ServerInfoSystemModule.class,
SpongeInfoModule.class, SpongeInfoModule.class,
PluginHookModule.class, PluginHookModule.class,

View File

@ -0,0 +1,21 @@
package com.djrapitops.plan.modules.bungee;
import com.djrapitops.plan.PlanBungee;
import com.djrapitops.plan.system.info.server.properties.BungeeServerProperties;
import com.djrapitops.plan.system.info.server.properties.ServerProperties;
import dagger.Module;
import dagger.Provides;
/**
* Dagger module for Bukkit ServerInfo.
*
* @author Rsl1122
*/
@Module
public class BungeeInfoModule {
@Provides
ServerProperties provideServerProperties(PlanBungee plugin) {
return new BungeeServerProperties(plugin.getProxy());
}
}

View File

@ -1,27 +0,0 @@
package com.djrapitops.plan.modules.common;
import com.djrapitops.plan.system.locale.Locale;
import com.djrapitops.plan.system.webserver.WebServer;
import com.djrapitops.plan.system.webserver.WebServerSystem;
import dagger.Module;
import dagger.Provides;
/**
* Dagger module for WebServerSystem.
*
* @author Rsl1122
*/
@Module
public class WebServerSystemModule {
@Provides
WebServerSystem provideWebServerSystem(Locale locale) {
return new WebServerSystem(() -> locale);
}
@Provides
WebServer provideWebServer(WebServerSystem webServerSystem) {
return webServerSystem.getWebServer();
}
}

View File

@ -19,6 +19,7 @@ import com.djrapitops.plan.system.settings.config.ConfigSystem;
import com.djrapitops.plan.system.settings.network.NetworkSettings; import com.djrapitops.plan.system.settings.network.NetworkSettings;
import com.djrapitops.plan.system.tasks.BukkitTaskSystem; import com.djrapitops.plan.system.tasks.BukkitTaskSystem;
import com.djrapitops.plan.system.update.VersionCheckSystem; import com.djrapitops.plan.system.update.VersionCheckSystem;
import com.djrapitops.plan.system.webserver.WebServerSystem;
import javax.inject.Inject; import javax.inject.Inject;
@ -36,6 +37,7 @@ public class BukkitSystem extends PlanSystem implements ServerSystem {
InfoSystem serverInfoSystem, InfoSystem serverInfoSystem,
BukkitServerInfo serverInfo, BukkitServerInfo serverInfo,
DBSystem databaseSystem, DBSystem databaseSystem,
WebServerSystem webServerSystem,
BukkitListenerSystem bukkitListenerSystem, BukkitListenerSystem bukkitListenerSystem,
BukkitTaskSystem bukkitTaskSystem, BukkitTaskSystem bukkitTaskSystem,
ExportSystem exportSystem, ExportSystem exportSystem,
@ -43,6 +45,7 @@ public class BukkitSystem extends PlanSystem implements ServerSystem {
PlanAPI planAPI, PlanAPI planAPI,
ShutdownHook shutdownHook ShutdownHook shutdownHook
) { ) {
super(webServerSystem);
this.versionCheckSystem = versionCheckSystem; this.versionCheckSystem = versionCheckSystem;
this.fileSystem = fileSystem; this.fileSystem = fileSystem;
this.configSystem = serverConfigSystem; this.configSystem = serverConfigSystem;

View File

@ -19,6 +19,7 @@ import com.djrapitops.plan.system.settings.config.BungeeConfigSystem;
import com.djrapitops.plan.system.settings.network.NetworkSettings; import com.djrapitops.plan.system.settings.network.NetworkSettings;
import com.djrapitops.plan.system.tasks.BungeeTaskSystem; import com.djrapitops.plan.system.tasks.BungeeTaskSystem;
import com.djrapitops.plan.system.update.VersionCheckSystem; import com.djrapitops.plan.system.update.VersionCheckSystem;
import com.djrapitops.plan.system.webserver.WebServerSystem;
import javax.inject.Inject; import javax.inject.Inject;
@ -34,12 +35,15 @@ public class BungeeSystem extends PlanSystem {
VersionCheckSystem versionCheckSystem, VersionCheckSystem versionCheckSystem,
FileSystem fileSystem, FileSystem fileSystem,
BungeeConfigSystem bungeeConfigSystem, BungeeConfigSystem bungeeConfigSystem,
BungeeServerInfo bungeeServerInfo,
BungeeCacheSystem bungeeCacheSystem, BungeeCacheSystem bungeeCacheSystem,
DBSystem databaseSystem, DBSystem databaseSystem,
WebServerSystem webServerSystem,
HookHandler hookHandler, HookHandler hookHandler,
ExportSystem exportSystem, ExportSystem exportSystem,
PlanAPI planAPI PlanAPI planAPI
) { ) {
super(webServerSystem);
setTestSystem(this); setTestSystem(this);
this.versionCheckSystem = versionCheckSystem; this.versionCheckSystem = versionCheckSystem;
@ -52,7 +56,7 @@ public class BungeeSystem extends PlanSystem {
taskSystem = new BungeeTaskSystem(plugin.getRunnableFactory()); taskSystem = new BungeeTaskSystem(plugin.getRunnableFactory());
infoSystem = new BungeeInfoSystem(); infoSystem = new BungeeInfoSystem();
serverInfo = new BungeeServerInfo(plugin); serverInfo = bungeeServerInfo;
this.hookHandler = hookHandler; this.hookHandler = hookHandler;
this.planAPI = planAPI; this.planAPI = planAPI;

View File

@ -61,11 +61,11 @@ public abstract class PlanSystem implements SubSystem {
// Not a SubSystem. // Not a SubSystem.
protected PlanAPI planAPI; protected PlanAPI planAPI;
public PlanSystem() { public PlanSystem(WebServerSystem webServerSystem) {
this.webServerSystem = webServerSystem;
Supplier<Locale> localeSupplier = () -> getLocaleSystem().getLocale(); Supplier<Locale> localeSupplier = () -> getLocaleSystem().getLocale();
processing = new Processing(localeSupplier); processing = new Processing(localeSupplier);
webServerSystem = new WebServerSystem(localeSupplier);
localeSystem = new LocaleSystem(); localeSystem = new LocaleSystem();
} }

View File

@ -19,6 +19,7 @@ import com.djrapitops.plan.system.settings.config.ConfigSystem;
import com.djrapitops.plan.system.settings.network.NetworkSettings; import com.djrapitops.plan.system.settings.network.NetworkSettings;
import com.djrapitops.plan.system.tasks.SpongeTaskSystem; import com.djrapitops.plan.system.tasks.SpongeTaskSystem;
import com.djrapitops.plan.system.update.VersionCheckSystem; import com.djrapitops.plan.system.update.VersionCheckSystem;
import com.djrapitops.plan.system.webserver.WebServerSystem;
import javax.inject.Inject; import javax.inject.Inject;
@ -36,14 +37,16 @@ public class SpongeSystem extends PlanSystem implements ServerSystem {
ConfigSystem serverConfigSystem, ConfigSystem serverConfigSystem,
InfoSystem serverInfoSystem, InfoSystem serverInfoSystem,
SpongeServerInfo serverInfo, SpongeServerInfo serverInfo,
DBSystem databaseSystem,
WebServerSystem webServerSystem,
SpongeListenerSystem spongeListenerSystem, SpongeListenerSystem spongeListenerSystem,
SpongeTaskSystem spongeTaskSystem, SpongeTaskSystem spongeTaskSystem,
DBSystem databaseSystem,
ExportSystem exportSystem, ExportSystem exportSystem,
HookHandler hookHandler, HookHandler hookHandler,
PlanAPI planAPI, PlanAPI planAPI,
ShutdownHook shutdownHook ShutdownHook shutdownHook
) { ) {
super(webServerSystem);
setTestSystem(this); setTestSystem(this);
this.versionCheckSystem = versionCheckSystem; this.versionCheckSystem = versionCheckSystem;

View File

@ -10,7 +10,7 @@ import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.info.server.properties.ServerProperties; import com.djrapitops.plan.system.info.server.properties.ServerProperties;
import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.config.PlanConfig; import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.webserver.WebServerSystem; import com.djrapitops.plan.system.webserver.WebServer;
import javax.inject.Inject; import javax.inject.Inject;
import java.io.IOException; import java.io.IOException;
@ -26,15 +26,23 @@ import java.util.UUID;
*/ */
public class BukkitServerInfo extends ServerInfo { public class BukkitServerInfo extends ServerInfo {
private final WebServer webServer;
private final PlanConfig config; private final PlanConfig config;
private ServerInfoFile serverInfoFile; private ServerInfoFile serverInfoFile;
private Database database; private Database database;
@Inject @Inject
public BukkitServerInfo(ServerProperties serverProperties, ServerInfoFile serverInfoFile, Database database, PlanConfig config) { public BukkitServerInfo(
ServerProperties serverProperties,
ServerInfoFile serverInfoFile,
Database database,
WebServer webServer,
PlanConfig config
) {
super(serverProperties); super(serverProperties);
this.serverInfoFile = serverInfoFile; this.serverInfoFile = serverInfoFile;
this.database = database; this.database = database;
this.webServer = webServer;
this.config = config; this.config = config;
} }
@ -67,7 +75,7 @@ public class BukkitServerInfo extends ServerInfo {
return registerServer(serverUUID); return registerServer(serverUUID);
} }
String name = config.getString(Settings.SERVER_NAME).replaceAll("[^a-zA-Z0-9_\\s]", "_"); String name = config.getString(Settings.SERVER_NAME).replaceAll("[^a-zA-Z0-9_\\s]", "_");
String webAddress = WebServerSystem.getInstance().getWebServer().getAccessAddress(); String webAddress = webServer.getAccessAddress();
if ("plan".equalsIgnoreCase(name)) { if ("plan".equalsIgnoreCase(name)) {
name = "Server " + serverID.get(); name = "Server " + serverID.get();
} }
@ -83,7 +91,7 @@ public class BukkitServerInfo extends ServerInfo {
} }
private Server registerServer(UUID serverUUID) throws IOException { private Server registerServer(UUID serverUUID) throws IOException {
String webAddress = WebServerSystem.getInstance().getWebServer().getAccessAddress(); String webAddress = webServer.getAccessAddress();
String name = config.getString(Settings.SERVER_NAME).replaceAll("[^a-zA-Z0-9_\\s]", "_"); String name = config.getString(Settings.SERVER_NAME).replaceAll("[^a-zA-Z0-9_\\s]", "_");
int maxPlayers = serverProperties.getMaxPlayers(); int maxPlayers = serverProperties.getMaxPlayers();
@ -103,7 +111,12 @@ public class BukkitServerInfo extends ServerInfo {
} }
private UUID generateNewUUID() { private UUID generateNewUUID() {
String seed = serverProperties.getServerId() + serverProperties.getName() + serverProperties.getIp() + serverProperties.getPort() + serverProperties.getVersion() + serverProperties.getImplVersion(); String seed = serverProperties.getServerId() +
serverProperties.getName() +
serverProperties.getIp() +
serverProperties.getPort() +
serverProperties.getVersion() +
serverProperties.getImplVersion();
return UUID.nameUUIDFromBytes(seed.getBytes()); return UUID.nameUUIDFromBytes(seed.getBytes());
} }
} }

View File

@ -4,15 +4,14 @@
*/ */
package com.djrapitops.plan.system.info.server; package com.djrapitops.plan.system.info.server;
import com.djrapitops.plan.PlanBungee;
import com.djrapitops.plan.api.exceptions.EnableException; import com.djrapitops.plan.api.exceptions.EnableException;
import com.djrapitops.plan.api.exceptions.database.DBOpException; import com.djrapitops.plan.api.exceptions.database.DBOpException;
import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.info.server.properties.BungeeServerProperties;
import com.djrapitops.plan.system.info.server.properties.ServerProperties; import com.djrapitops.plan.system.info.server.properties.ServerProperties;
import com.djrapitops.plan.system.webserver.WebServerSystem; import com.djrapitops.plan.system.webserver.WebServer;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.logging.console.PluginLogger;
import javax.inject.Inject;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
@ -23,8 +22,21 @@ import java.util.UUID;
*/ */
public class BungeeServerInfo extends ServerInfo { public class BungeeServerInfo extends ServerInfo {
public BungeeServerInfo(PlanBungee plugin) { private final Database database;
super(new BungeeServerProperties(plugin.getProxy())); private final WebServer webServer;
private final PluginLogger logger;
@Inject
public BungeeServerInfo(
ServerProperties serverProperties,
Database database,
WebServer webServer,
PluginLogger logger
) {
super(serverProperties);
this.database = database;
this.webServer = webServer;
this.logger = logger;
} }
@Override @Override
@ -32,13 +44,12 @@ public class BungeeServerInfo extends ServerInfo {
checkIfDefaultIP(); checkIfDefaultIP();
try { try {
Database db = Database.getActive(); Optional<Server> bungeeInfo = database.fetch().getBungeeInformation();
Optional<Server> bungeeInfo = db.fetch().getBungeeInformation();
if (bungeeInfo.isPresent()) { if (bungeeInfo.isPresent()) {
server = bungeeInfo.get(); server = bungeeInfo.get();
updateServerInfo(db); updateServerInfo(database);
} else { } else {
server = registerBungeeInfo(db); server = registerBungeeInfo(database);
} }
} catch (DBOpException e) { } catch (DBOpException e) {
throw new EnableException("Failed to read Server information from Database."); throw new EnableException("Failed to read Server information from Database.");
@ -47,7 +58,7 @@ public class BungeeServerInfo extends ServerInfo {
} }
private void updateServerInfo(Database db) { private void updateServerInfo(Database db) {
String accessAddress = WebServerSystem.getInstance().getWebServer().getAccessAddress(); String accessAddress = webServer.getAccessAddress();
if (!accessAddress.equals(server.getWebAddress())) { if (!accessAddress.equals(server.getWebAddress())) {
server.setWebAddress(accessAddress); server.setWebAddress(accessAddress);
db.save().serverInfoForThisServer(server); db.save().serverInfoForThisServer(server);
@ -55,20 +66,19 @@ public class BungeeServerInfo extends ServerInfo {
} }
private void checkIfDefaultIP() throws EnableException { private void checkIfDefaultIP() throws EnableException {
String ip = ServerInfo.getServerProperties_Old().getIp(); String ip = serverProperties.getIp();
if ("0.0.0.0".equals(ip)) { if ("0.0.0.0".equals(ip)) {
Log.error("IP setting still 0.0.0.0 - Configure AlternativeIP/IP that connects to the Proxy server."); logger.error("IP setting still 0.0.0.0 - Configure AlternativeIP/IP that connects to the Proxy server.");
Log.info("Player Analytics partially enabled (Use /planbungee to reload config)"); logger.info("Player Analytics partially enabled (Use /planbungee to reload config)");
throw new EnableException("IP setting still 0.0.0.0 - Configure AlternativeIP/IP that connects to the Proxy server."); throw new EnableException("IP setting still 0.0.0.0 - Configure AlternativeIP/IP that connects to the Proxy server.");
} }
} }
private Server registerBungeeInfo(Database db) throws EnableException { private Server registerBungeeInfo(Database db) throws EnableException {
ServerProperties properties = ServerInfo.getServerProperties_Old(); UUID serverUUID = generateNewUUID();
UUID serverUUID = generateNewUUID(properties); String accessAddress = webServer.getAccessAddress();
String accessAddress = WebServerSystem.getInstance().getWebServer().getAccessAddress();
Server bungeeCord = new Server(-1, serverUUID, "BungeeCord", accessAddress, properties.getMaxPlayers()); Server bungeeCord = new Server(-1, serverUUID, "BungeeCord", accessAddress, serverProperties.getMaxPlayers());
db.save().serverInfoForThisServer(bungeeCord); db.save().serverInfoForThisServer(bungeeCord);
Optional<Server> bungeeInfo = db.fetch().getBungeeInformation(); Optional<Server> bungeeInfo = db.fetch().getBungeeInformation();
@ -78,8 +88,12 @@ public class BungeeServerInfo extends ServerInfo {
throw new EnableException("BungeeCord registration failed (DB)"); throw new EnableException("BungeeCord registration failed (DB)");
} }
private UUID generateNewUUID(ServerProperties properties) { private UUID generateNewUUID() {
String seed = properties.getName() + properties.getIp() + properties.getPort() + properties.getVersion() + properties.getImplVersion(); String seed = serverProperties.getName() +
serverProperties.getIp() +
serverProperties.getPort() +
serverProperties.getVersion() +
serverProperties.getImplVersion();
return UUID.nameUUIDFromBytes(seed.getBytes()); return UUID.nameUUIDFromBytes(seed.getBytes());
} }
} }

View File

@ -3,13 +3,20 @@ package com.djrapitops.plan.system.info.server;
import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.info.server.properties.ServerProperties; import com.djrapitops.plan.system.info.server.properties.ServerProperties;
import com.djrapitops.plan.system.settings.config.PlanConfig; import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.webserver.WebServer;
import javax.inject.Inject; import javax.inject.Inject;
public class SpongeServerInfo extends BukkitServerInfo { public class SpongeServerInfo extends BukkitServerInfo {
@Inject @Inject
public SpongeServerInfo(ServerProperties serverProperties, ServerInfoFile serverInfoFile, Database database, PlanConfig config) { public SpongeServerInfo(
super(serverProperties, serverInfoFile, database, config); ServerProperties serverProperties,
ServerInfoFile serverInfoFile,
Database database,
WebServer webServer,
PlanConfig config
) {
super(serverProperties, serverInfoFile, database, webServer, config);
} }
} }

View File

@ -17,29 +17,32 @@ import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpHandler;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.List; import java.util.List;
import java.util.function.Supplier;
/** /**
* HttpHandler for WebServer request management. * HttpHandler for WebServer request management.
* *
* @author Rsl1122 * @author Rsl1122
*/ */
@Singleton
public class RequestHandler implements HttpHandler { public class RequestHandler implements HttpHandler {
private final Supplier<Locale> locale; private final Locale locale;
private final ResponseHandler responseHandler; private final ResponseHandler responseHandler;
RequestHandler(WebServer webServer) { @Inject
responseHandler = new ResponseHandler(webServer); RequestHandler(Locale locale, ResponseHandler responseHandler) {
locale = webServer.getLocaleSupplier(); this.locale = locale;
this.responseHandler = responseHandler;
} }
@Override @Override
public void handle(HttpExchange exchange) { public void handle(HttpExchange exchange) {
Headers requestHeaders = exchange.getRequestHeaders(); Headers requestHeaders = exchange.getRequestHeaders();
Headers responseHeaders = exchange.getResponseHeaders(); Headers responseHeaders = exchange.getResponseHeaders();
Request request = new Request(exchange, locale.get()); Request request = new Request(exchange, locale);
request.setAuth(getAuthorization(requestHeaders)); request.setAuth(getAuthorization(requestHeaders));
String requestString = request.toString(); String requestString = request.toString();
@ -53,7 +56,7 @@ public class RequestHandler implements HttpHandler {
} }
response.setResponseHeaders(responseHeaders); response.setResponseHeaders(responseHeaders);
response.send(exchange, locale.get()); response.send(exchange, locale);
} catch (Exception e) { } catch (Exception e) {
if (Settings.DEV_MODE.isTrue()) { if (Settings.DEV_MODE.isTrue()) {
Log.warn("THIS ERROR IS ONLY LOGGED IN DEV MODE:"); Log.warn("THIS ERROR IS ONLY LOGGED IN DEV MODE:");

View File

@ -14,8 +14,11 @@ import com.djrapitops.plan.system.webserver.cache.ResponseCache;
import com.djrapitops.plan.system.webserver.pages.*; import com.djrapitops.plan.system.webserver.pages.*;
import com.djrapitops.plan.system.webserver.response.*; import com.djrapitops.plan.system.webserver.response.*;
import com.djrapitops.plan.system.webserver.response.errors.*; import com.djrapitops.plan.system.webserver.response.errors.*;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.error.ErrorHandler;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -26,15 +29,22 @@ import java.util.Optional;
* *
* @author Rsl1122 * @author Rsl1122
*/ */
@Singleton
public class ResponseHandler extends TreePageHandler { public class ResponseHandler extends TreePageHandler {
private final WebServer webServer; private final ErrorHandler errorHandler;
public ResponseHandler(WebServer webServer) { private WebServer webServer;
this.webServer = webServer;
@Inject
public ResponseHandler(ErrorHandler errorHandler) {
this.errorHandler = errorHandler;
registerWebAPIPages();
registerDefaultPages();
} }
public void registerDefaultPages() { private void registerDefaultPages() {
registerPage("favicon.ico", new RedirectResponse("https://puu.sh/tK0KL/6aa2ba141b.ico"), 5); registerPage("favicon.ico", new RedirectResponse("https://puu.sh/tK0KL/6aa2ba141b.ico"), 5);
registerPage("debug", new DebugPageHandler()); registerPage("debug", new DebugPageHandler());
registerPage("players", new PlayersPageHandler()); registerPage("players", new PlayersPageHandler());
@ -44,7 +54,7 @@ public class ResponseHandler extends TreePageHandler {
registerPage("network", serverPageHandler); registerPage("network", serverPageHandler);
registerPage("server", serverPageHandler); registerPage("server", serverPageHandler);
registerPage("", webServer.isAuthRequired() registerPage("", webServer.isAuthRequired()
? new RootPageHandler(this) ? new RootPageHandler()
: new PageHandler() { : new PageHandler() {
@Override @Override
public Response getResponse(Request request, List<String> target) { public Response getResponse(Request request, List<String> target) {
@ -53,7 +63,7 @@ public class ResponseHandler extends TreePageHandler {
}); });
} }
public void registerWebAPIPages() { private void registerWebAPIPages() {
registerPage("info", new InfoRequestPageHandler()); registerPage("info", new InfoRequestPageHandler());
} }
@ -84,7 +94,7 @@ public class ResponseHandler extends TreePageHandler {
return new InternalErrorResponse(request.getTarget(), e); return new InternalErrorResponse(request.getTarget(), e);
} }
} catch (Exception e) { } catch (Exception e) {
Log.toLog(this.getClass(), e); errorHandler.log(L.ERROR, this.getClass(), e);
return new InternalErrorResponse(request.getTarget(), e); return new InternalErrorResponse(request.getTarget(), e);
} }
} }
@ -106,7 +116,7 @@ public class ResponseHandler extends TreePageHandler {
if (webServer.isUsingHTTPS()) { if (webServer.isUsingHTTPS()) {
return DefaultResponses.BASIC_AUTH.get(); return DefaultResponses.BASIC_AUTH.get();
} else { } else {
return forbiddenResponse(); return DefaultResponses.FORBIDDEN.get();
} }
} }
} }
@ -118,13 +128,11 @@ public class ResponseHandler extends TreePageHandler {
if (!isAuthRequired || isAuthorized) { if (!isAuthRequired || isAuthorized) {
return pageHandler.getResponse(request, target); return pageHandler.getResponse(request, target);
} }
return forbiddenResponse(); return DefaultResponses.FORBIDDEN.get();
} }
} }
public Response forbiddenResponse() { public void setWebServer(WebServer webServer) {
return ResponseCache.loadResponse(PageId.FORBIDDEN.id(), () -> this.webServer = webServer;
new ForbiddenResponse("Your user is not authorized to view this page.<br>"
+ "If you believe this is an error contact staff to change your access level."));
} }
} }

View File

@ -1,22 +1,25 @@
package com.djrapitops.plan.system.webserver; package com.djrapitops.plan.system.webserver;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.api.exceptions.EnableException; import com.djrapitops.plan.api.exceptions.EnableException;
import com.djrapitops.plan.system.SubSystem; import com.djrapitops.plan.system.SubSystem;
import com.djrapitops.plan.system.file.FileSystem; import com.djrapitops.plan.system.file.FileSystem;
import com.djrapitops.plan.system.locale.Locale; import com.djrapitops.plan.system.locale.Locale;
import com.djrapitops.plan.system.locale.lang.PluginLang; import com.djrapitops.plan.system.locale.lang.PluginLang;
import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.utilities.html.HtmlUtils; import com.djrapitops.plan.utilities.html.HtmlUtils;
import com.djrapitops.plugin.StaticHolder;
import com.djrapitops.plugin.api.Check; import com.djrapitops.plugin.api.Check;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.console.PluginLogger;
import com.djrapitops.plugin.logging.error.ErrorHandler;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpsConfigurator; import com.sun.net.httpserver.HttpsConfigurator;
import com.sun.net.httpserver.HttpsParameters; import com.sun.net.httpserver.HttpsParameters;
import com.sun.net.httpserver.HttpsServer; import com.sun.net.httpserver.HttpsServer;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.net.ssl.*; import javax.net.ssl.*;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@ -30,14 +33,21 @@ import java.security.cert.CertificateException;
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
/** /**
* @author Rsl1122 * @author Rsl1122
*/ */
@Singleton
public class WebServer implements SubSystem { public class WebServer implements SubSystem {
private final Supplier<Locale> locale; private final Locale locale;
private final FileSystem fileSystem;
private final PlanConfig config;
private final RequestHandler requestHandler;
private final PluginLogger logger;
private final ErrorHandler errorHandler;
private int port; private int port;
private boolean enabled = false; private boolean enabled = false;
@ -45,13 +55,27 @@ public class WebServer implements SubSystem {
private boolean usingHttps = false; private boolean usingHttps = false;
private RequestHandler requestHandler; @Inject
private ResponseHandler responseHandler; public WebServer(
Locale locale,
public WebServer(Supplier<Locale> locale) { FileSystem fileSystem,
PlanConfig config,
PluginLogger logger,
ErrorHandler errorHandler,
RequestHandler requestHandler
) {
this.locale = locale; this.locale = locale;
this.fileSystem = fileSystem;
this.config = config;
this.requestHandler = requestHandler;
requestHandler.getResponseHandler().setWebServer(this);
this.logger = logger;
this.errorHandler = errorHandler;
} }
@Deprecated
public static WebServer getInstance() { public static WebServer getInstance() {
WebServer webServer = WebServerSystem.getInstance().getWebServer(); WebServer webServer = WebServerSystem.getInstance().getWebServer();
Verify.nullCheck(webServer, () -> new IllegalStateException("WebServer was not initialized.")); Verify.nullCheck(webServer, () -> new IllegalStateException("WebServer was not initialized."));
@ -60,25 +84,18 @@ public class WebServer implements SubSystem {
@Override @Override
public void enable() throws EnableException { public void enable() throws EnableException {
this.port = Settings.WEBSERVER_PORT.getNumber(); this.port = config.getNumber(Settings.WEBSERVER_PORT);
requestHandler = new RequestHandler(this);
responseHandler = requestHandler.getResponseHandler();
PlanPlugin plugin = PlanPlugin.getInstance();
StaticHolder.saveInstance(RequestHandler.class, plugin.getClass());
StaticHolder.saveInstance(ResponseHandler.class, plugin.getClass());
initServer(); initServer();
if (!isEnabled()) { if (!isEnabled()) {
if (Check.isBungeeAvailable()) { if (Check.isBungeeAvailable()) {
throw new EnableException(locale.get().getString(PluginLang.ENABLE_FAIL_NO_WEB_SERVER_BUNGEE)); throw new EnableException(locale.getString(PluginLang.ENABLE_FAIL_NO_WEB_SERVER_BUNGEE));
} }
if (Settings.WEBSERVER_DISABLED.isTrue()) { if (config.isTrue(Settings.WEBSERVER_DISABLED)) {
Log.warn(locale.get().getString(PluginLang.ENABLE_NOTIFY_WEB_SERVER_DISABLED)); logger.warn(locale.getString(PluginLang.ENABLE_NOTIFY_WEB_SERVER_DISABLED));
} else { } else {
Log.error(locale.get().getString(PluginLang.WEB_SERVER_FAIL_PORT_BIND, port)); logger.error(locale.getString(PluginLang.WEB_SERVER_FAIL_PORT_BIND, port));
} }
} }
} }
@ -87,24 +104,24 @@ public class WebServer implements SubSystem {
* Starts up the WebServer in a new Thread Pool. * Starts up the WebServer in a new Thread Pool.
*/ */
private void initServer() { private void initServer() {
// Check if Bukkit WebServer has been disabled. if (!Check.isBungeeAvailable() && config.isTrue(Settings.WEBSERVER_DISABLED)) {
if (!Check.isBungeeAvailable() && Settings.WEBSERVER_DISABLED.isTrue()) { // Bukkit WebServer has been disabled.
return; return;
} }
// Server is already enabled stop code
if (enabled) { if (enabled) {
// Server is already enabled stop code
return; return;
} }
try { try {
usingHttps = startHttpsServer(); usingHttps = startHttpsServer();
Log.debug(usingHttps ? "Https Start Successful." : "Https Start Failed."); logger.debug(usingHttps ? "Https Start Successful." : "Https Start Failed.");
if (!usingHttps) { if (!usingHttps) {
Log.infoColor("§e" + locale.get().getString(PluginLang.WEB_SERVER_NOTIFY_HTTP_USER_AUTH)); logger.log(L.INFO_COLOR, "§e" + locale.getString(PluginLang.WEB_SERVER_NOTIFY_HTTP_USER_AUTH));
server = HttpServer.create(new InetSocketAddress(Settings.WEBSERVER_IP.toString(), port), 10); server = HttpServer.create(new InetSocketAddress(config.getString(Settings.WEBSERVER_IP), port), 10);
} }
server.createContext("/", requestHandler); server.createContext("/", requestHandler);
@ -113,22 +130,22 @@ public class WebServer implements SubSystem {
enabled = true; enabled = true;
Log.info(locale.get().getString(PluginLang.ENABLED_WEB_SERVER, server.getAddress().getPort(), getAccessAddress())); logger.info(locale.getString(PluginLang.ENABLED_WEB_SERVER, server.getAddress().getPort(), getAccessAddress()));
} catch (IllegalArgumentException | IllegalStateException | IOException e) { } catch (IllegalArgumentException | IllegalStateException | IOException e) {
Log.toLog(this.getClass(), e); errorHandler.log(L.ERROR, this.getClass(), e);
enabled = false; enabled = false;
} }
} }
private boolean startHttpsServer() { private boolean startHttpsServer() {
String keyStorePath = Settings.WEBSERVER_CERTIFICATE_PATH.toString(); String keyStorePath = config.getString(Settings.WEBSERVER_CERTIFICATE_PATH);
if (!Paths.get(keyStorePath).isAbsolute()) { if (!Paths.get(keyStorePath).isAbsolute()) {
keyStorePath = FileSystem.getDataFolder_Old() + File.separator + keyStorePath; keyStorePath = fileSystem.getDataFolder() + File.separator + keyStorePath;
} }
char[] storepass = Settings.WEBSERVER_CERTIFICATE_STOREPASS.toString().toCharArray(); char[] storepass = config.getString(Settings.WEBSERVER_CERTIFICATE_STOREPASS).toCharArray();
char[] keypass = Settings.WEBSERVER_CERTIFICATE_KEYPASS.toString().toCharArray(); char[] keypass = config.getString(Settings.WEBSERVER_CERTIFICATE_KEYPASS).toCharArray();
String alias = Settings.WEBSERVER_CERTIFICATE_ALIAS.toString(); String alias = config.getString(Settings.WEBSERVER_CERTIFICATE_ALIAS);
boolean startSuccessful = false; boolean startSuccessful = false;
try (FileInputStream fIn = new FileInputStream(keyStorePath)) { try (FileInputStream fIn = new FileInputStream(keyStorePath)) {
@ -141,7 +158,7 @@ public class WebServer implements SubSystem {
throw new IllegalStateException("Certificate with Alias: " + alias + " was not found in the Keystore."); throw new IllegalStateException("Certificate with Alias: " + alias + " was not found in the Keystore.");
} }
Log.info("Certificate: " + cert.getType()); logger.info("Certificate: " + cert.getType());
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
keyManagerFactory.init(keystore, keypass); keyManagerFactory.init(keystore, keypass);
@ -149,7 +166,7 @@ public class WebServer implements SubSystem {
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509"); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
trustManagerFactory.init(keystore); trustManagerFactory.init(keystore);
server = HttpsServer.create(new InetSocketAddress(Settings.WEBSERVER_IP.toString(), port), 10); server = HttpsServer.create(new InetSocketAddress(config.getString(Settings.WEBSERVER_IP), port), 10);
SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(keyManagerFactory.getKeyManagers(), null/*trustManagerFactory.getTrustManagers()*/, null); sslContext.init(keyManagerFactory.getKeyManagers(), null/*trustManagerFactory.getTrustManagers()*/, null);
@ -168,20 +185,20 @@ public class WebServer implements SubSystem {
}); });
startSuccessful = true; startSuccessful = true;
} catch (IllegalStateException e) { } catch (IllegalStateException e) {
Log.error(e.getMessage()); logger.error(e.getMessage());
Log.toLog(this.getClass(), e); errorHandler.log(L.ERROR, this.getClass(), e);
} catch (KeyManagementException | NoSuchAlgorithmException e) { } catch (KeyManagementException | NoSuchAlgorithmException e) {
Log.error(locale.get().getString(PluginLang.WEB_SERVER_FAIL_SSL_CONTEXT)); logger.error(locale.getString(PluginLang.WEB_SERVER_FAIL_SSL_CONTEXT));
Log.toLog(this.getClass(), e); errorHandler.log(L.ERROR, this.getClass(), e);
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
Log.infoColor("§e" + locale.get().getString(PluginLang.WEB_SERVER_NOTIFY_NO_CERT_FILE, keyStorePath)); logger.log(L.INFO_COLOR, "§e" + locale.getString(PluginLang.WEB_SERVER_NOTIFY_NO_CERT_FILE, keyStorePath));
Log.info(locale.get().getString(PluginLang.WEB_SERVER_NOTIFY_HTTP)); logger.info(locale.getString(PluginLang.WEB_SERVER_NOTIFY_HTTP));
} catch (IOException e) { } catch (IOException e) {
Log.error("WebServer: " + e); logger.error("WebServer: " + e);
Log.toLog(this.getClass(), e); errorHandler.log(L.ERROR, this.getClass(), e);
} catch (KeyStoreException | CertificateException | UnrecoverableKeyException e) { } catch (KeyStoreException | CertificateException | UnrecoverableKeyException e) {
Log.error(locale.get().getString(PluginLang.WEB_SERVER_FAIL_STORE_LOAD)); logger.error(locale.getString(PluginLang.WEB_SERVER_FAIL_STORE_LOAD));
Log.toLog(this.getClass(), e); errorHandler.log(L.ERROR, this.getClass(), e);
} }
return startSuccessful; return startSuccessful;
} }
@ -199,7 +216,7 @@ public class WebServer implements SubSystem {
@Override @Override
public void disable() { public void disable() {
if (server != null) { if (server != null) {
Log.info(locale.get().getString(PluginLang.DISABLED_WEB_SERVER)); logger.info(locale.getString(PluginLang.DISABLED_WEB_SERVER));
server.stop(0); server.stop(0);
} }
enabled = false; enabled = false;
@ -218,18 +235,6 @@ public class WebServer implements SubSystem {
} }
public String getAccessAddress() { public String getAccessAddress() {
return isEnabled() ? getProtocol() + "://" + HtmlUtils.getIP() : Settings.EXTERNAL_WEBSERVER_LINK.toString(); return isEnabled() ? getProtocol() + "://" + HtmlUtils.getIP() : config.getString(Settings.EXTERNAL_WEBSERVER_LINK);
}
public RequestHandler getRequestHandler() {
return requestHandler;
}
public ResponseHandler getResponseHandler() {
return responseHandler;
}
Supplier<Locale> getLocaleSupplier() {
return locale;
} }
} }

View File

@ -7,11 +7,10 @@ package com.djrapitops.plan.system.webserver;
import com.djrapitops.plan.api.exceptions.EnableException; import com.djrapitops.plan.api.exceptions.EnableException;
import com.djrapitops.plan.system.PlanSystem; import com.djrapitops.plan.system.PlanSystem;
import com.djrapitops.plan.system.SubSystem; import com.djrapitops.plan.system.SubSystem;
import com.djrapitops.plan.system.locale.Locale;
import com.djrapitops.plan.system.webserver.cache.ResponseCache; import com.djrapitops.plan.system.webserver.cache.ResponseCache;
import com.djrapitops.plugin.api.Benchmark; import com.djrapitops.plugin.benchmarking.Timings;
import java.util.function.Supplier; import javax.inject.Inject;
/** /**
* WebServer subsystem for managing WebServer initialization. * WebServer subsystem for managing WebServer initialization.
@ -20,16 +19,21 @@ import java.util.function.Supplier;
*/ */
public class WebServerSystem implements SubSystem { public class WebServerSystem implements SubSystem {
private WebServer webServer; private final WebServer webServer;
private Timings timings;
public WebServerSystem(Supplier<Locale> locale) { @Inject
webServer = new WebServer(locale); public WebServerSystem(WebServer webServer, Timings timings) {
this.webServer = webServer;
this.timings = timings;
} }
@Deprecated
public static WebServerSystem getInstance() { public static WebServerSystem getInstance() {
return PlanSystem.getInstance().getWebServerSystem(); return PlanSystem.getInstance().getWebServerSystem();
} }
@Deprecated
public static boolean isWebServerEnabled() { public static boolean isWebServerEnabled() {
WebServer webServer = getInstance().webServer; WebServer webServer = getInstance().webServer;
return webServer != null && webServer.isEnabled(); return webServer != null && webServer.isEnabled();
@ -37,12 +41,9 @@ public class WebServerSystem implements SubSystem {
@Override @Override
public void enable() throws EnableException { public void enable() throws EnableException {
Benchmark.start("WebServer Initialization"); timings.start("WebServer Initialization");
webServer.enable(); webServer.enable();
ResponseHandler responseHandler = webServer.getResponseHandler(); timings.end("WebServer Initialization");
responseHandler.registerWebAPIPages();
responseHandler.registerDefaultPages();
Benchmark.stop("Enable", "WebServer Initialization");
} }
@Override @Override

View File

@ -7,12 +7,11 @@ package com.djrapitops.plan.system.webserver.pages;
import com.djrapitops.plan.api.exceptions.connection.WebException; import com.djrapitops.plan.api.exceptions.connection.WebException;
import com.djrapitops.plan.data.WebUser; import com.djrapitops.plan.data.WebUser;
import com.djrapitops.plan.system.webserver.Request; import com.djrapitops.plan.system.webserver.Request;
import com.djrapitops.plan.system.webserver.ResponseHandler;
import com.djrapitops.plan.system.webserver.auth.Authentication; import com.djrapitops.plan.system.webserver.auth.Authentication;
import com.djrapitops.plan.system.webserver.response.DefaultResponses; import com.djrapitops.plan.system.webserver.response.DefaultResponses;
import com.djrapitops.plan.system.webserver.response.RedirectResponse;
import com.djrapitops.plan.system.webserver.response.Response; import com.djrapitops.plan.system.webserver.response.Response;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@ -25,12 +24,6 @@ import java.util.Optional;
*/ */
public class RootPageHandler extends PageHandler { public class RootPageHandler extends PageHandler {
private final ResponseHandler responseHandler;
public RootPageHandler(ResponseHandler responseHandler) {
this.responseHandler = responseHandler;
}
@Override @Override
public Response getResponse(Request request, List<String> target) throws WebException { public Response getResponse(Request request, List<String> target) throws WebException {
Optional<Authentication> auth = request.getAuth(); Optional<Authentication> auth = request.getAuth();
@ -43,13 +36,13 @@ public class RootPageHandler extends PageHandler {
int permLevel = webUser.getPermLevel(); int permLevel = webUser.getPermLevel();
switch (permLevel) { switch (permLevel) {
case 0: case 0:
return responseHandler.getPageHandler("server").getResponse(request, Collections.emptyList()); return new RedirectResponse("/server");
case 1: case 1:
return responseHandler.getPageHandler("players").getResponse(request, Collections.emptyList()); return new RedirectResponse("/players");
case 2: case 2:
return responseHandler.getPageHandler("player").getResponse(request, Collections.singletonList(webUser.getName())); return new RedirectResponse("/player/" + webUser.getName());
default: default:
return responseHandler.forbiddenResponse(); return DefaultResponses.FORBIDDEN.get();
} }
} }

View File

@ -4,6 +4,8 @@
*/ */
package com.djrapitops.plan.system.webserver.response; package com.djrapitops.plan.system.webserver.response;
import com.djrapitops.plan.system.webserver.response.errors.ForbiddenResponse;
/** /**
* Enum containing default responses that don't need to be cached because they're always the same. * Enum containing default responses that don't need to be cached because they're always the same.
* *
@ -11,7 +13,9 @@ package com.djrapitops.plan.system.webserver.response;
*/ */
public enum DefaultResponses { public enum DefaultResponses {
BASIC_AUTH(PromptAuthorizationResponse.getBasicAuthResponse()), BASIC_AUTH(PromptAuthorizationResponse.getBasicAuthResponse()),
SUCCESS(new TextResponse("Success")); SUCCESS(new TextResponse("Success")),
FORBIDDEN(new ForbiddenResponse("Your user is not authorized to view this page.<br>"
+ "If you believe this is an error contact staff to change your access level."));
private final Response response; private final Response response;