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.command.PlanCommand;
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.ServerDataCacheModule;
import com.djrapitops.plan.modules.server.ServerInfoSystemModule;
@ -64,7 +67,6 @@ import java.util.logging.Logger;
BukkitInfoModule.class,
BukkitDatabaseModule.class,
ServerDataCacheModule.class,
WebServerSystemModule.class,
ServerInfoSystemModule.class,
PluginHookModule.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.BungeeConfigModule;
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.system.BungeeSystem;
import com.djrapitops.plan.system.locale.Locale;
@ -41,8 +45,8 @@ import java.io.InputStream;
VersionCheckModule.class,
BungeeConfigModule.class,
LocaleModule.class,
BungeeInfoModule.class,
BungeeDatabaseModule.class,
WebServerSystemModule.class,
ServerInfoSystemModule.class,
PluginHookModule.class,
BungeeAPIModule.class

View File

@ -3,7 +3,10 @@ package com.djrapitops.plan;
import com.djrapitops.plan.api.exceptions.EnableException;
import com.djrapitops.plan.command.PlanCommand;
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.ServerDataCacheModule;
import com.djrapitops.plan.modules.server.ServerInfoSystemModule;
@ -51,7 +54,6 @@ import java.io.InputStream;
LocaleModule.class,
SpongeDatabaseModule.class,
ServerDataCacheModule.class,
WebServerSystemModule.class,
ServerInfoSystemModule.class,
SpongeInfoModule.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.tasks.BukkitTaskSystem;
import com.djrapitops.plan.system.update.VersionCheckSystem;
import com.djrapitops.plan.system.webserver.WebServerSystem;
import javax.inject.Inject;
@ -36,6 +37,7 @@ public class BukkitSystem extends PlanSystem implements ServerSystem {
InfoSystem serverInfoSystem,
BukkitServerInfo serverInfo,
DBSystem databaseSystem,
WebServerSystem webServerSystem,
BukkitListenerSystem bukkitListenerSystem,
BukkitTaskSystem bukkitTaskSystem,
ExportSystem exportSystem,
@ -43,6 +45,7 @@ public class BukkitSystem extends PlanSystem implements ServerSystem {
PlanAPI planAPI,
ShutdownHook shutdownHook
) {
super(webServerSystem);
this.versionCheckSystem = versionCheckSystem;
this.fileSystem = fileSystem;
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.tasks.BungeeTaskSystem;
import com.djrapitops.plan.system.update.VersionCheckSystem;
import com.djrapitops.plan.system.webserver.WebServerSystem;
import javax.inject.Inject;
@ -34,12 +35,15 @@ public class BungeeSystem extends PlanSystem {
VersionCheckSystem versionCheckSystem,
FileSystem fileSystem,
BungeeConfigSystem bungeeConfigSystem,
BungeeServerInfo bungeeServerInfo,
BungeeCacheSystem bungeeCacheSystem,
DBSystem databaseSystem,
WebServerSystem webServerSystem,
HookHandler hookHandler,
ExportSystem exportSystem,
PlanAPI planAPI
) {
super(webServerSystem);
setTestSystem(this);
this.versionCheckSystem = versionCheckSystem;
@ -52,7 +56,7 @@ public class BungeeSystem extends PlanSystem {
taskSystem = new BungeeTaskSystem(plugin.getRunnableFactory());
infoSystem = new BungeeInfoSystem();
serverInfo = new BungeeServerInfo(plugin);
serverInfo = bungeeServerInfo;
this.hookHandler = hookHandler;
this.planAPI = planAPI;

View File

@ -61,11 +61,11 @@ public abstract class PlanSystem implements SubSystem {
// Not a SubSystem.
protected PlanAPI planAPI;
public PlanSystem() {
public PlanSystem(WebServerSystem webServerSystem) {
this.webServerSystem = webServerSystem;
Supplier<Locale> localeSupplier = () -> getLocaleSystem().getLocale();
processing = new Processing(localeSupplier);
webServerSystem = new WebServerSystem(localeSupplier);
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.tasks.SpongeTaskSystem;
import com.djrapitops.plan.system.update.VersionCheckSystem;
import com.djrapitops.plan.system.webserver.WebServerSystem;
import javax.inject.Inject;
@ -36,14 +37,16 @@ public class SpongeSystem extends PlanSystem implements ServerSystem {
ConfigSystem serverConfigSystem,
InfoSystem serverInfoSystem,
SpongeServerInfo serverInfo,
DBSystem databaseSystem,
WebServerSystem webServerSystem,
SpongeListenerSystem spongeListenerSystem,
SpongeTaskSystem spongeTaskSystem,
DBSystem databaseSystem,
ExportSystem exportSystem,
HookHandler hookHandler,
PlanAPI planAPI,
ShutdownHook shutdownHook
) {
super(webServerSystem);
setTestSystem(this);
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.settings.Settings;
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 java.io.IOException;
@ -26,15 +26,23 @@ import java.util.UUID;
*/
public class BukkitServerInfo extends ServerInfo {
private final WebServer webServer;
private final PlanConfig config;
private ServerInfoFile serverInfoFile;
private Database database;
@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);
this.serverInfoFile = serverInfoFile;
this.database = database;
this.webServer = webServer;
this.config = config;
}
@ -67,7 +75,7 @@ public class BukkitServerInfo extends ServerInfo {
return registerServer(serverUUID);
}
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)) {
name = "Server " + serverID.get();
}
@ -83,7 +91,7 @@ public class BukkitServerInfo extends ServerInfo {
}
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]", "_");
int maxPlayers = serverProperties.getMaxPlayers();
@ -103,7 +111,12 @@ public class BukkitServerInfo extends ServerInfo {
}
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());
}
}

View File

@ -4,15 +4,14 @@
*/
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.database.DBOpException;
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.webserver.WebServerSystem;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plan.system.webserver.WebServer;
import com.djrapitops.plugin.logging.console.PluginLogger;
import javax.inject.Inject;
import java.util.Optional;
import java.util.UUID;
@ -23,8 +22,21 @@ import java.util.UUID;
*/
public class BungeeServerInfo extends ServerInfo {
public BungeeServerInfo(PlanBungee plugin) {
super(new BungeeServerProperties(plugin.getProxy()));
private final Database database;
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
@ -32,13 +44,12 @@ public class BungeeServerInfo extends ServerInfo {
checkIfDefaultIP();
try {
Database db = Database.getActive();
Optional<Server> bungeeInfo = db.fetch().getBungeeInformation();
Optional<Server> bungeeInfo = database.fetch().getBungeeInformation();
if (bungeeInfo.isPresent()) {
server = bungeeInfo.get();
updateServerInfo(db);
updateServerInfo(database);
} else {
server = registerBungeeInfo(db);
server = registerBungeeInfo(database);
}
} catch (DBOpException e) {
throw new EnableException("Failed to read Server information from Database.");
@ -47,7 +58,7 @@ public class BungeeServerInfo extends ServerInfo {
}
private void updateServerInfo(Database db) {
String accessAddress = WebServerSystem.getInstance().getWebServer().getAccessAddress();
String accessAddress = webServer.getAccessAddress();
if (!accessAddress.equals(server.getWebAddress())) {
server.setWebAddress(accessAddress);
db.save().serverInfoForThisServer(server);
@ -55,20 +66,19 @@ public class BungeeServerInfo extends ServerInfo {
}
private void checkIfDefaultIP() throws EnableException {
String ip = ServerInfo.getServerProperties_Old().getIp();
String ip = serverProperties.getIp();
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.");
Log.info("Player Analytics partially enabled (Use /planbungee to reload config)");
logger.error("IP setting still 0.0.0.0 - Configure AlternativeIP/IP that connects to the Proxy server.");
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.");
}
}
private Server registerBungeeInfo(Database db) throws EnableException {
ServerProperties properties = ServerInfo.getServerProperties_Old();
UUID serverUUID = generateNewUUID(properties);
String accessAddress = WebServerSystem.getInstance().getWebServer().getAccessAddress();
UUID serverUUID = generateNewUUID();
String accessAddress = webServer.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);
Optional<Server> bungeeInfo = db.fetch().getBungeeInformation();
@ -78,8 +88,12 @@ public class BungeeServerInfo extends ServerInfo {
throw new EnableException("BungeeCord registration failed (DB)");
}
private UUID generateNewUUID(ServerProperties properties) {
String seed = properties.getName() + properties.getIp() + properties.getPort() + properties.getVersion() + properties.getImplVersion();
private UUID generateNewUUID() {
String seed = serverProperties.getName() +
serverProperties.getIp() +
serverProperties.getPort() +
serverProperties.getVersion() +
serverProperties.getImplVersion();
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.info.server.properties.ServerProperties;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.webserver.WebServer;
import javax.inject.Inject;
public class SpongeServerInfo extends BukkitServerInfo {
@Inject
public SpongeServerInfo(ServerProperties serverProperties, ServerInfoFile serverInfoFile, Database database, PlanConfig config) {
super(serverProperties, serverInfoFile, database, config);
public SpongeServerInfo(
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.HttpHandler;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.List;
import java.util.function.Supplier;
/**
* HttpHandler for WebServer request management.
*
* @author Rsl1122
*/
@Singleton
public class RequestHandler implements HttpHandler {
private final Supplier<Locale> locale;
private final Locale locale;
private final ResponseHandler responseHandler;
RequestHandler(WebServer webServer) {
responseHandler = new ResponseHandler(webServer);
locale = webServer.getLocaleSupplier();
@Inject
RequestHandler(Locale locale, ResponseHandler responseHandler) {
this.locale = locale;
this.responseHandler = responseHandler;
}
@Override
public void handle(HttpExchange exchange) {
Headers requestHeaders = exchange.getRequestHeaders();
Headers responseHeaders = exchange.getResponseHeaders();
Request request = new Request(exchange, locale.get());
Request request = new Request(exchange, locale);
request.setAuth(getAuthorization(requestHeaders));
String requestString = request.toString();
@ -53,7 +56,7 @@ public class RequestHandler implements HttpHandler {
}
response.setResponseHeaders(responseHeaders);
response.send(exchange, locale.get());
response.send(exchange, locale);
} catch (Exception e) {
if (Settings.DEV_MODE.isTrue()) {
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.response.*;
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.Arrays;
import java.util.List;
@ -26,15 +29,22 @@ import java.util.Optional;
*
* @author Rsl1122
*/
@Singleton
public class ResponseHandler extends TreePageHandler {
private final WebServer webServer;
private final ErrorHandler errorHandler;
public ResponseHandler(WebServer webServer) {
this.webServer = webServer;
private 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("debug", new DebugPageHandler());
registerPage("players", new PlayersPageHandler());
@ -44,7 +54,7 @@ public class ResponseHandler extends TreePageHandler {
registerPage("network", serverPageHandler);
registerPage("server", serverPageHandler);
registerPage("", webServer.isAuthRequired()
? new RootPageHandler(this)
? new RootPageHandler()
: new PageHandler() {
@Override
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());
}
@ -84,7 +94,7 @@ public class ResponseHandler extends TreePageHandler {
return new InternalErrorResponse(request.getTarget(), e);
}
} catch (Exception e) {
Log.toLog(this.getClass(), e);
errorHandler.log(L.ERROR, this.getClass(), e);
return new InternalErrorResponse(request.getTarget(), e);
}
}
@ -106,7 +116,7 @@ public class ResponseHandler extends TreePageHandler {
if (webServer.isUsingHTTPS()) {
return DefaultResponses.BASIC_AUTH.get();
} else {
return forbiddenResponse();
return DefaultResponses.FORBIDDEN.get();
}
}
}
@ -118,13 +128,11 @@ public class ResponseHandler extends TreePageHandler {
if (!isAuthRequired || isAuthorized) {
return pageHandler.getResponse(request, target);
}
return forbiddenResponse();
return DefaultResponses.FORBIDDEN.get();
}
}
public Response forbiddenResponse() {
return ResponseCache.loadResponse(PageId.FORBIDDEN.id(), () ->
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."));
public void setWebServer(WebServer webServer) {
this.webServer = webServer;
}
}

View File

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

View File

@ -7,11 +7,10 @@ package com.djrapitops.plan.system.webserver;
import com.djrapitops.plan.api.exceptions.EnableException;
import com.djrapitops.plan.system.PlanSystem;
import com.djrapitops.plan.system.SubSystem;
import com.djrapitops.plan.system.locale.Locale;
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.
@ -20,16 +19,21 @@ import java.util.function.Supplier;
*/
public class WebServerSystem implements SubSystem {
private WebServer webServer;
private final WebServer webServer;
private Timings timings;
public WebServerSystem(Supplier<Locale> locale) {
webServer = new WebServer(locale);
@Inject
public WebServerSystem(WebServer webServer, Timings timings) {
this.webServer = webServer;
this.timings = timings;
}
@Deprecated
public static WebServerSystem getInstance() {
return PlanSystem.getInstance().getWebServerSystem();
}
@Deprecated
public static boolean isWebServerEnabled() {
WebServer webServer = getInstance().webServer;
return webServer != null && webServer.isEnabled();
@ -37,12 +41,9 @@ public class WebServerSystem implements SubSystem {
@Override
public void enable() throws EnableException {
Benchmark.start("WebServer Initialization");
timings.start("WebServer Initialization");
webServer.enable();
ResponseHandler responseHandler = webServer.getResponseHandler();
responseHandler.registerWebAPIPages();
responseHandler.registerDefaultPages();
Benchmark.stop("Enable", "WebServer Initialization");
timings.end("WebServer Initialization");
}
@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.data.WebUser;
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.response.DefaultResponses;
import com.djrapitops.plan.system.webserver.response.RedirectResponse;
import com.djrapitops.plan.system.webserver.response.Response;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
@ -25,12 +24,6 @@ import java.util.Optional;
*/
public class RootPageHandler extends PageHandler {
private final ResponseHandler responseHandler;
public RootPageHandler(ResponseHandler responseHandler) {
this.responseHandler = responseHandler;
}
@Override
public Response getResponse(Request request, List<String> target) throws WebException {
Optional<Authentication> auth = request.getAuth();
@ -43,13 +36,13 @@ public class RootPageHandler extends PageHandler {
int permLevel = webUser.getPermLevel();
switch (permLevel) {
case 0:
return responseHandler.getPageHandler("server").getResponse(request, Collections.emptyList());
return new RedirectResponse("/server");
case 1:
return responseHandler.getPageHandler("players").getResponse(request, Collections.emptyList());
return new RedirectResponse("/players");
case 2:
return responseHandler.getPageHandler("player").getResponse(request, Collections.singletonList(webUser.getName()));
return new RedirectResponse("/player/" + webUser.getName());
default:
return responseHandler.forbiddenResponse();
return DefaultResponses.FORBIDDEN.get();
}
}

View File

@ -4,6 +4,8 @@
*/
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.
*
@ -11,7 +13,9 @@ package com.djrapitops.plan.system.webserver.response;
*/
public enum DefaultResponses {
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;