diff --git a/Plan/src/main/java/com/djrapitops/plan/system/info/connection/InfoRequestPageHandler.java b/Plan/src/main/java/com/djrapitops/plan/system/info/connection/InfoRequestPageHandler.java index 45bde5dd8..c30d3877a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/info/connection/InfoRequestPageHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/info/connection/InfoRequestPageHandler.java @@ -8,12 +8,11 @@ import com.djrapitops.plan.api.exceptions.connection.NotFoundException; import com.djrapitops.plan.api.exceptions.connection.WebException; import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.info.request.InfoRequest; -import com.djrapitops.plan.system.locale.lang.ErrorPageLang; import com.djrapitops.plan.system.webserver.Request; import com.djrapitops.plan.system.webserver.pages.PageHandler; import com.djrapitops.plan.system.webserver.response.Response; +import com.djrapitops.plan.system.webserver.response.ResponseFactory; import com.djrapitops.plan.system.webserver.response.errors.BadRequestResponse; -import com.djrapitops.plan.system.webserver.response.errors.NotFoundResponse; import com.djrapitops.plugin.logging.console.PluginLogger; import com.djrapitops.plugin.utilities.Verify; @@ -35,16 +34,18 @@ public class InfoRequestPageHandler implements PageHandler { private final Database database; private final ConnectionSystem connectionSystem; + private final ResponseFactory responseFactory; private final PluginLogger logger; @Inject public InfoRequestPageHandler( Database database, ConnectionSystem connectionSystem, - PluginLogger logger + ResponseFactory responseFactory, PluginLogger logger ) { this.database = database; this.connectionSystem = connectionSystem; + this.responseFactory = responseFactory; this.logger = logger; } @@ -54,7 +55,7 @@ public class InfoRequestPageHandler implements PageHandler { try { if (target.isEmpty()) { - return new NotFoundResponse(request.getLocale().getString(ErrorPageLang.UNKNOWN_PAGE_404)); + return responseFactory.pageNotFound404(); } if (!request.getRequestMethod().equals("POST")) { diff --git a/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateInspectPageRequest.java b/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateInspectPageRequest.java index 1b2ae3c34..3bd3f3002 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateInspectPageRequest.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateInspectPageRequest.java @@ -10,7 +10,7 @@ import com.djrapitops.plan.api.exceptions.database.DBException; import com.djrapitops.plan.system.info.InfoSystem; import com.djrapitops.plan.system.webserver.response.DefaultResponses; import com.djrapitops.plan.system.webserver.response.Response; -import com.djrapitops.plan.system.webserver.response.errors.NotFoundResponse; +import com.djrapitops.plan.system.webserver.response.ResponseFactory; import com.djrapitops.plan.utilities.html.pages.PageFactory; import com.djrapitops.plugin.utilities.Verify; @@ -25,6 +25,7 @@ import java.util.UUID; public class GenerateInspectPageRequest extends InfoRequestWithVariables implements GenerateRequest { private final InfoRequestFactory infoRequestFactory; + private final ResponseFactory responseFactory; private final PageFactory pageFactory; private final InfoSystem infoSystem; @@ -32,21 +33,23 @@ public class GenerateInspectPageRequest extends InfoRequestWithVariables impleme GenerateInspectPageRequest( InfoRequestFactory infoRequestFactory, - PageFactory pageFactory, + ResponseFactory responseFactory, PageFactory pageFactory, InfoSystem infoSystem ) { this.infoRequestFactory = infoRequestFactory; + this.responseFactory = responseFactory; this.pageFactory = pageFactory; this.infoSystem = infoSystem; } - public GenerateInspectPageRequest( + GenerateInspectPageRequest( UUID uuid, InfoRequestFactory infoRequestFactory, - PageFactory pageFactory, + ResponseFactory responseFactory, PageFactory pageFactory, InfoSystem infoSystem ) { this.infoRequestFactory = infoRequestFactory; + this.responseFactory = responseFactory; this.pageFactory = pageFactory; this.infoSystem = infoSystem; @@ -75,7 +78,7 @@ public class GenerateInspectPageRequest extends InfoRequestWithVariables impleme html = getHtml(uuid); infoSystem.getConnectionSystem().sendWideInfoRequest(infoRequestFactory.generateInspectPluginsTabRequest(uuid)); } catch (NotFoundException e) { - html = new NotFoundResponse(e.getMessage()).getContent(); + html = responseFactory.notFound404(e.getMessage()).getContent(); } infoSystem.sendRequest(infoRequestFactory.cacheInspectPageRequest(uuid, html)); } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/info/request/InfoRequestFactory.java b/Plan/src/main/java/com/djrapitops/plan/system/info/request/InfoRequestFactory.java index 28f52d5ea..a00b3e75a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/info/request/InfoRequestFactory.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/info/request/InfoRequestFactory.java @@ -6,6 +6,7 @@ import com.djrapitops.plan.system.info.connection.ConnectionSystem; import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.processing.Processing; import com.djrapitops.plan.system.settings.config.PlanConfig; +import com.djrapitops.plan.system.webserver.response.ResponseFactory; import com.djrapitops.plan.utilities.file.export.HtmlExport; import com.djrapitops.plan.utilities.html.pages.PageFactory; import com.djrapitops.plugin.logging.console.PluginLogger; @@ -31,6 +32,7 @@ public class InfoRequestFactory { private final Lazy connectionSystem; private final Lazy serverInfo; private final Lazy infoRequestFactory; + private final Lazy responseFactory; private final Lazy pageFactory; private final Lazy htmlExport; private final Lazy logger; @@ -45,6 +47,7 @@ public class InfoRequestFactory { Lazy connectionSystem, Lazy serverInfo, Lazy infoRequestFactory, + Lazy responseFactory, Lazy pageFactory, Lazy htmlExport, Lazy logger, @@ -57,6 +60,7 @@ public class InfoRequestFactory { this.connectionSystem = connectionSystem; this.serverInfo = serverInfo; this.infoRequestFactory = infoRequestFactory; + this.responseFactory = responseFactory; this.pageFactory = pageFactory; this.htmlExport = htmlExport; this.logger = logger; @@ -84,7 +88,7 @@ public class InfoRequestFactory { } public GenerateRequest generateInspectPageRequest(UUID uuid) { - return new GenerateInspectPageRequest(uuid, this, pageFactory.get(), infoSystem.get()); + return new GenerateInspectPageRequest(uuid, this, responseFactory.get(), pageFactory.get(), infoSystem.get()); } public GenerateInspectPluginsTabRequest generateInspectPluginsTabRequest(UUID uuid) { diff --git a/Plan/src/main/java/com/djrapitops/plan/system/info/request/InfoRequestHandlerFactory.java b/Plan/src/main/java/com/djrapitops/plan/system/info/request/InfoRequestHandlerFactory.java index 0819bdf69..0d3eefef4 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/info/request/InfoRequestHandlerFactory.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/info/request/InfoRequestHandlerFactory.java @@ -6,6 +6,7 @@ import com.djrapitops.plan.system.info.connection.ConnectionSystem; import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.processing.Processing; import com.djrapitops.plan.system.settings.config.PlanConfig; +import com.djrapitops.plan.system.webserver.response.ResponseFactory; import com.djrapitops.plan.utilities.file.export.HtmlExport; import com.djrapitops.plan.utilities.html.pages.PageFactory; import com.djrapitops.plugin.logging.console.PluginLogger; @@ -30,6 +31,7 @@ public class InfoRequestHandlerFactory { private final Lazy connectionSystem; private final Lazy serverInfo; private final Lazy infoRequestFactory; + private final Lazy responseFactory; private final Lazy pageFactory; private final Lazy htmlExport; private final Lazy logger; @@ -44,6 +46,7 @@ public class InfoRequestHandlerFactory { Lazy connectionSystem, Lazy serverInfo, Lazy infoRequestFactory, + Lazy responseFactory, Lazy pageFactory, Lazy htmlExport, Lazy logger, @@ -56,6 +59,7 @@ public class InfoRequestHandlerFactory { this.connectionSystem = connectionSystem; this.serverInfo = serverInfo; this.infoRequestFactory = infoRequestFactory; + this.responseFactory = responseFactory; this.pageFactory = pageFactory; this.htmlExport = htmlExport; this.logger = logger; @@ -87,7 +91,7 @@ public class InfoRequestHandlerFactory { } GenerateRequest generateInspectPageRequest() { - return new GenerateInspectPageRequest(infoRequestFactory.get(), pageFactory.get(), infoSystem.get()); + return new GenerateInspectPageRequest(infoRequestFactory.get(), responseFactory.get(), pageFactory.get(), infoSystem.get()); } GenerateRequest generateInspectPluginsTabRequest() { diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/ResponseHandler.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/ResponseHandler.java index 3504b4315..340e42e6d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/ResponseHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/ResponseHandler.java @@ -11,11 +11,9 @@ import com.djrapitops.plan.system.webserver.auth.Authentication; import com.djrapitops.plan.system.webserver.cache.PageId; import com.djrapitops.plan.system.webserver.cache.ResponseCache; import com.djrapitops.plan.system.webserver.pages.*; -import com.djrapitops.plan.system.webserver.response.DefaultResponses; -import com.djrapitops.plan.system.webserver.response.PromptAuthorizationResponse; import com.djrapitops.plan.system.webserver.response.Response; import com.djrapitops.plan.system.webserver.response.ResponseFactory; -import com.djrapitops.plan.system.webserver.response.errors.*; +import com.djrapitops.plan.system.webserver.response.errors.BadRequestResponse; import com.djrapitops.plugin.logging.L; import com.djrapitops.plugin.logging.error.ErrorHandler; import dagger.Lazy; @@ -35,8 +33,6 @@ import java.util.Optional; @Singleton public class ResponseHandler extends TreePageHandler { - private final ResponseFactory responseFactory; - private final DebugPageHandler debugPageHandler; private final PlayersPageHandler playersPageHandler; private final PlayerPageHandler playerPageHandler; @@ -59,8 +55,8 @@ public class ResponseHandler extends TreePageHandler { ErrorHandler errorHandler ) { + super(responseFactory); this.webServer = webServer; - this.responseFactory = responseFactory; this.debugPageHandler = debugPageHandler; this.playersPageHandler = playersPageHandler; this.playerPageHandler = playerPageHandler; @@ -79,7 +75,7 @@ public class ResponseHandler extends TreePageHandler { registerPage("server", serverPageHandler); if (webServer.get().isAuthRequired()) { - registerPage("", new RootPageHandler()); + registerPage("", new RootPageHandler(responseFactory)); } else { registerPage("", responseFactory.redirectResponse("/server"), 5); } @@ -96,26 +92,26 @@ public class ResponseHandler extends TreePageHandler { try { return getResponse(request, targetString, target); } catch (NoServersException | NotFoundException e) { - return new NotFoundResponse(e.getMessage()); + return responseFactory.notFound404(e.getMessage()); } catch (WebUserAuthException e) { - return PromptAuthorizationResponse.getBasicAuthResponse(e); + return responseFactory.basicAuthFail(e); } catch (ForbiddenException e) { - return new ForbiddenResponse(e.getMessage()); + return responseFactory.forbidden403(e.getMessage()); } catch (BadRequestException e) { return new BadRequestResponse(e.getMessage()); } catch (UnauthorizedServerException e) { - return new UnauthorizedServerResponse(e.getMessage()); + return responseFactory.unauthorizedServer(e.getMessage()); } catch (GatewayException e) { - return new GatewayErrorResponse(e.getMessage()); + return responseFactory.gatewayError504(e.getMessage()); } catch (InternalErrorException e) { if (e.getCause() != null) { - return new InternalErrorResponse(request.getTarget(), e.getCause()); + return responseFactory.internalErrorResponse(e.getCause(), request.getTarget()); } else { - return new InternalErrorResponse(request.getTarget(), e); + return responseFactory.internalErrorResponse(e, request.getTarget()); } } catch (Exception e) { errorHandler.log(L.ERROR, this.getClass(), e); - return new InternalErrorResponse(request.getTarget(), e); + return responseFactory.internalErrorResponse(e, request.getTarget()); } } @@ -134,9 +130,9 @@ public class ResponseHandler extends TreePageHandler { authentication = request.getAuth(); if (!authentication.isPresent()) { if (webServer.get().isUsingHTTPS()) { - return DefaultResponses.BASIC_AUTH.get(); + return responseFactory.basicAuth(); } else { - return DefaultResponses.FORBIDDEN.get(); + return responseFactory.forbidden403(); } } } @@ -148,7 +144,7 @@ public class ResponseHandler extends TreePageHandler { if (!isAuthRequired || isAuthorized) { return pageHandler.getResponse(request, target); } - return DefaultResponses.FORBIDDEN.get(); + return responseFactory.forbidden403(); } } } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/PlayerPageHandler.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/PlayerPageHandler.java index 952a2bc26..28df3bb0c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/PlayerPageHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/PlayerPageHandler.java @@ -16,7 +16,6 @@ import com.djrapitops.plan.system.webserver.cache.PageId; import com.djrapitops.plan.system.webserver.cache.ResponseCache; import com.djrapitops.plan.system.webserver.response.Response; import com.djrapitops.plan.system.webserver.response.ResponseFactory; -import com.djrapitops.plan.system.webserver.response.errors.NotFoundResponse; import com.djrapitops.plan.system.webserver.response.pages.InspectPageResponse; import com.djrapitops.plan.utilities.uuid.UUIDUtility; @@ -76,9 +75,9 @@ public class PlayerPageHandler implements PageHandler { return responseFactory.playerNotFound404(); } } catch (NoServersException e) { - ResponseCache.loadResponse(PageId.PLAYER.of(uuid), () -> new NotFoundResponse(e.getMessage())); + ResponseCache.loadResponse(PageId.PLAYER.of(uuid), () -> responseFactory.notFound404(e.getMessage())); } - return InspectPageResponse.getRefreshing(); + return responseFactory.serverNotFound404(); } private Response playerResponseOrNotFound(UUID uuid) throws WebException { diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/RootPageHandler.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/RootPageHandler.java index 7701200a4..95bcd5822 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/RootPageHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/RootPageHandler.java @@ -8,9 +8,9 @@ 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.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 com.djrapitops.plan.system.webserver.response.ResponseFactory; import java.util.List; import java.util.Optional; @@ -24,11 +24,17 @@ import java.util.Optional; */ public class RootPageHandler implements PageHandler { + private final ResponseFactory responseFactory; + + public RootPageHandler(ResponseFactory responseFactory) { + this.responseFactory = responseFactory; + } + @Override public Response getResponse(Request request, List target) throws WebException { Optional auth = request.getAuth(); if (!auth.isPresent()) { - return DefaultResponses.BASIC_AUTH.get(); + return responseFactory.basicAuth(); } WebUser webUser = auth.get().getWebUser(); @@ -42,7 +48,7 @@ public class RootPageHandler implements PageHandler { case 2: return new RedirectResponse("/player/" + webUser.getName()); default: - return DefaultResponses.FORBIDDEN.get(); + return responseFactory.forbidden403(); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/TreePageHandler.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/TreePageHandler.java index 7fb4cf75e..46ee9d53b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/TreePageHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/TreePageHandler.java @@ -6,11 +6,10 @@ package com.djrapitops.plan.system.webserver.pages; import com.djrapitops.plan.api.exceptions.WebUserAuthException; import com.djrapitops.plan.api.exceptions.connection.WebException; -import com.djrapitops.plan.system.locale.lang.ErrorPageLang; import com.djrapitops.plan.system.webserver.Request; import com.djrapitops.plan.system.webserver.auth.Authentication; import com.djrapitops.plan.system.webserver.response.Response; -import com.djrapitops.plan.system.webserver.response.errors.NotFoundResponse; +import com.djrapitops.plan.system.webserver.response.ResponseFactory; import java.util.HashMap; import java.util.List; @@ -23,9 +22,12 @@ import java.util.Map; */ public abstract class TreePageHandler implements PageHandler { + protected final ResponseFactory responseFactory; + private Map pages; - public TreePageHandler() { + public TreePageHandler(ResponseFactory responseFactory) { + this.responseFactory = responseFactory; pages = new HashMap<>(); } @@ -52,7 +54,7 @@ public abstract class TreePageHandler implements PageHandler { PageHandler pageHandler = getPageHandler(target); return pageHandler != null ? pageHandler.getResponse(request, target) - : new NotFoundResponse(request.getLocale().getString(ErrorPageLang.UNKNOWN_PAGE_404)); + : responseFactory.pageNotFound404(); } public PageHandler getPageHandler(List target) { diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/CSSResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/CSSResponse.java index 0f665a135..2613bf3af 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/CSSResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/CSSResponse.java @@ -1,12 +1,14 @@ package com.djrapitops.plan.system.webserver.response; +import java.io.IOException; + /** * @author Rsl1122 * @since 4.0.0 */ public class CSSResponse extends FileResponse { - public CSSResponse(String fileName) { + public CSSResponse(String fileName) throws IOException { super(format(fileName)); super.setType(ResponseType.CSS); setContent(getContent()); diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/DefaultResponses.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/DefaultResponses.java index 15e6ac89f..367e73d21 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/DefaultResponses.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/DefaultResponses.java @@ -4,18 +4,13 @@ */ 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. * * @author Rsl1122 */ public enum DefaultResponses { - BASIC_AUTH(PromptAuthorizationResponse.getBasicAuthResponse()), - SUCCESS(new TextResponse("Success")), - FORBIDDEN(new ForbiddenResponse("Your user is not authorized to view this page.
" - + "If you believe this is an error contact staff to change your access level.")); + SUCCESS(new TextResponse("Success")); private final Response response; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/FileResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/FileResponse.java index 4bac6817a..58c5ce4df 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/FileResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/FileResponse.java @@ -5,7 +5,6 @@ package com.djrapitops.plan.system.webserver.response; import com.djrapitops.plan.system.file.PlanFiles; -import com.djrapitops.plan.system.webserver.response.errors.NotFoundResponse; import com.djrapitops.plugin.utilities.Verify; import java.io.IOException; @@ -23,13 +22,9 @@ public class FileResponse extends Response { // TODO private PlanFiles planFiles; - public FileResponse(String fileName) { + public FileResponse(String fileName) throws IOException { super.setHeader("HTTP/1.1 200 OK"); - try { - super.setContent(planFiles.readCustomizableResourceFlat(fileName)); - } catch (IOException e) { - super.setContent(new NotFoundResponse(fileName + " was not found inside the .jar or /plugins/Plan/ folder").getContent()); - } + super.setContent(planFiles.readCustomizableResourceFlat(fileName)); } public static String format(String fileName) { diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/JavaScriptResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/JavaScriptResponse.java index c194c1e32..997606845 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/JavaScriptResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/JavaScriptResponse.java @@ -1,12 +1,14 @@ package com.djrapitops.plan.system.webserver.response; +import java.io.IOException; + /** * @author Rsl1122 * @since 3.5.2 */ public class JavaScriptResponse extends FileResponse { - JavaScriptResponse(String fileName) { + JavaScriptResponse(String fileName) throws IOException { super(format(fileName)); super.setType(ResponseType.JAVASCRIPT); } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/PromptAuthorizationResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/PromptAuthorizationResponse.java index aa0647a14..1e8bd4a36 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/PromptAuthorizationResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/PromptAuthorizationResponse.java @@ -1,10 +1,12 @@ package com.djrapitops.plan.system.webserver.response; import com.djrapitops.plan.api.exceptions.WebUserAuthException; +import com.djrapitops.plan.system.file.PlanFiles; import com.djrapitops.plan.system.webserver.auth.FailReason; import com.djrapitops.plan.system.webserver.response.errors.ErrorResponse; import com.djrapitops.plan.utilities.html.icon.Icon; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -19,12 +21,13 @@ public class PromptAuthorizationResponse extends ErrorResponse { + "- Username and password are case-sensitive
" + "
If you have forgotten your password, ask a staff member to delete your old user and re-register."; - private PromptAuthorizationResponse() { + private PromptAuthorizationResponse(String version, PlanFiles files) throws IOException { + super(version, files); super.setTitle(Icon.called("lock").build() + " 401 Unauthorized"); } - public static PromptAuthorizationResponse getBasicAuthResponse() { - PromptAuthorizationResponse response = new PromptAuthorizationResponse(); + public static PromptAuthorizationResponse getBasicAuthResponse(String version, PlanFiles files) throws IOException { + PromptAuthorizationResponse response = new PromptAuthorizationResponse(version, files); response.setHeader("HTTP/1.1 401 Access Denied\r\n" + "WWW-Authenticate: Basic realm=\"/\";"); @@ -33,8 +36,8 @@ public class PromptAuthorizationResponse extends ErrorResponse { return response; } - public static PromptAuthorizationResponse getBasicAuthResponse(WebUserAuthException e) { - PromptAuthorizationResponse response = new PromptAuthorizationResponse(); + public static PromptAuthorizationResponse getBasicAuthResponse(WebUserAuthException e, String version, PlanFiles files) throws IOException { + PromptAuthorizationResponse response = new PromptAuthorizationResponse(version, files); response.setHeader("HTTP/1.1 401 Access Denied\r\n" + "WWW-Authenticate: Basic realm=\"/\";"); diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/Response.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/Response.java index 3ddd69927..8a002a9d6 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/Response.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/Response.java @@ -90,6 +90,7 @@ public abstract class Response { exchange.sendResponseHeaders(getCode(), 0); String sentContent = getContent(); + // TODO Smell if (!(this instanceof JavaScriptResponse)) { sentContent = locale.replaceMatchingLanguage(sentContent); } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/ResponseFactory.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/ResponseFactory.java index 53566f453..1775b1488 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/ResponseFactory.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/ResponseFactory.java @@ -1,17 +1,21 @@ package com.djrapitops.plan.system.webserver.response; import com.djrapitops.plan.api.exceptions.ParseException; +import com.djrapitops.plan.api.exceptions.WebUserAuthException; import com.djrapitops.plan.system.database.databases.Database; +import com.djrapitops.plan.system.file.PlanFiles; import com.djrapitops.plan.system.locale.Locale; import com.djrapitops.plan.system.locale.lang.ErrorPageLang; -import com.djrapitops.plan.system.webserver.response.errors.ErrorResponse; -import com.djrapitops.plan.system.webserver.response.errors.InternalErrorResponse; -import com.djrapitops.plan.system.webserver.response.errors.NotFoundResponse; +import com.djrapitops.plan.system.webserver.response.errors.*; import com.djrapitops.plan.system.webserver.response.pages.*; import com.djrapitops.plan.utilities.html.pages.PageFactory; +import com.djrapitops.plugin.logging.L; +import com.djrapitops.plugin.logging.error.ErrorHandler; import javax.inject.Inject; +import javax.inject.Named; import javax.inject.Singleton; +import java.io.IOException; import java.util.UUID; /** @@ -22,30 +26,56 @@ import java.util.UUID; @Singleton public class ResponseFactory { + private final String version; + private final PlanFiles files; private final PageFactory pageFactory; private final Locale locale; private final Database database; + private final ErrorHandler errorHandler; @Inject public ResponseFactory( + @Named("currentVersion") String version, + PlanFiles files, PageFactory pageFactory, Locale locale, - Database database + Database database, + ErrorHandler errorHandler ) { + this.version = version; + this.files = files; this.pageFactory = pageFactory; this.locale = locale; this.database = database; + this.errorHandler = errorHandler; } public Response debugPageResponse() { - return new DebugPageResponse(pageFactory.debugPage()); + try { + return new DebugPageResponse(pageFactory.debugPage(), version, files); + } catch (IOException e) { + return internalErrorResponse(e, "Failed to parse debug page"); + } } public Response playersPageResponse() { try { return new PlayersPageResponse(pageFactory.playersPage()); } catch (ParseException e) { - return new InternalErrorResponse("Failed to parse players page", e); + return internalErrorResponse(e, "Failed to parse players page"); + } + } + + public ErrorResponse internalErrorResponse(Throwable e, String s) { + try { + errorHandler.log(L.WARN, this.getClass(), e); + return new InternalErrorResponse(s, e, version, files); + } catch (IOException improperRestartException) { + return new ErrorResponse( + "Error occurred: " + e.toString() + + ", additional error occurred when attempting to send error page to user: " + + improperRestartException.toString() + ); } } @@ -53,7 +83,7 @@ public class ResponseFactory { try { return new NetworkPageResponse(pageFactory.networkPage()); } catch (ParseException e) { - return new InternalErrorResponse("Failed to parse network page", e); + return internalErrorResponse(e, "Failed to parse network page"); } } @@ -66,11 +96,19 @@ public class ResponseFactory { } public Response javaScriptResponse(String fileName) { - return new JavaScriptResponse(fileName); + try { + return new JavaScriptResponse(fileName); + } catch (IOException e) { + return notFound404("JS File not found from jar: " + fileName + ", " + e.toString()); + } } public Response cssResponse(String fileName) { - return new CSSResponse(fileName); + try { + return new CSSResponse(fileName); + } catch (IOException e) { + return notFound404("CSS File not found from jar: " + fileName + ", " + e.toString()); + } } public Response redirectResponse(String location) { @@ -78,18 +116,71 @@ public class ResponseFactory { } public ErrorResponse pageNotFound404() { - return new NotFoundResponse(locale.getString(ErrorPageLang.UNKNOWN_PAGE_404)); + return notFound404(locale.getString(ErrorPageLang.UNKNOWN_PAGE_404)); } public ErrorResponse uuidNotFound404() { - return new NotFoundResponse(locale.getString(ErrorPageLang.UUID_404)); + return notFound404(locale.getString(ErrorPageLang.UUID_404)); } public ErrorResponse playerNotFound404() { - return new NotFoundResponse(locale.getString(ErrorPageLang.NOT_PLAYED_404)); + return notFound404(locale.getString(ErrorPageLang.NOT_PLAYED_404)); } public ErrorResponse serverNotFound404() { - return new NotFoundResponse(locale.getString(ErrorPageLang.NO_SERVERS_404)); + return notFound404(locale.getString(ErrorPageLang.NO_SERVERS_404)); + } + + public ErrorResponse notFound404(String message) { + try { + return new NotFoundResponse(message, version, files); + } catch (IOException e) { + return internalErrorResponse(e, "Failed to parse 404 page"); + } + } + + public ErrorResponse basicAuthFail(WebUserAuthException e) { + try { + return PromptAuthorizationResponse.getBasicAuthResponse(e, version, files); + } catch (IOException e1) { + return internalErrorResponse(e, "Failed to parse PromptAuthorizationResponse"); + } + } + + public ErrorResponse forbidden403() { + return forbidden403("Your user is not authorized to view this page.
" + + "If you believe this is an error contact staff to change your access level."); + } + + public ErrorResponse forbidden403(String message) { + try { + return new ForbiddenResponse(message, version, files); + } catch (IOException e) { + return internalErrorResponse(e, "Failed to parse ForbiddenResponse"); + } + } + + public ErrorResponse unauthorizedServer(String message) { + try { + return new UnauthorizedServerResponse(message, version, files); + } catch (IOException e) { + return internalErrorResponse(e, "Failed to parse UnauthorizedServerResponse"); + } + } + + public ErrorResponse gatewayError504(String message) { + try { + return new GatewayErrorResponse(message, version, files); + } catch (IOException e) { + return internalErrorResponse(e, "Failed to parse GatewayErrorResponse"); + } + } + + public ErrorResponse basicAuth() { + try { + return PromptAuthorizationResponse.getBasicAuthResponse(version, files); + } catch (IOException e) { + return internalErrorResponse(e, "Failed to parse PromptAuthorizationResponse"); + } } } \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/ErrorResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/ErrorResponse.java index cf490e762..b1f6d6c4c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/ErrorResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/ErrorResponse.java @@ -6,8 +6,6 @@ package com.djrapitops.plan.system.webserver.response.errors; import com.djrapitops.plan.system.file.PlanFiles; import com.djrapitops.plan.system.webserver.response.Response; -import com.djrapitops.plugin.logging.L; -import com.djrapitops.plugin.logging.error.ErrorHandler; import org.apache.commons.text.StringSubstitutor; import java.io.IOException; @@ -24,17 +22,15 @@ public class ErrorResponse extends Response { private String title; private String paragraph; - // TODO private String version; - private PlanFiles planFiles; - private ErrorHandler errorHandler; - public ErrorResponse() { - try { - setContent(planFiles.readCustomizableResourceFlat("web/error.html")); - } catch (IOException e) { - errorHandler.log(L.WARN, this.getClass(), e); - } + public ErrorResponse(String version, PlanFiles planFiles) throws IOException { + this.version = version; + setContent(planFiles.readCustomizableResourceFlat("web/error.html")); + } + + public ErrorResponse(String message) { + setContent(message); } public void replacePlaceholders() { diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/ForbiddenResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/ForbiddenResponse.java index 3ac171516..aef136e8f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/ForbiddenResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/ForbiddenResponse.java @@ -1,15 +1,18 @@ package com.djrapitops.plan.system.webserver.response.errors; +import com.djrapitops.plan.system.file.PlanFiles; import com.djrapitops.plan.utilities.html.icon.Family; import com.djrapitops.plan.utilities.html.icon.Icon; +import java.io.IOException; + /** * @author Rsl1122 * @since 3.5.2 */ public class ForbiddenResponse extends ErrorResponse { - - public ForbiddenResponse(String msg) { + public ForbiddenResponse(String msg, String version, PlanFiles files) throws IOException { + super(version, files); super.setHeader("HTTP/1.1 403 Forbidden"); super.setTitle(Icon.called("hand-paper").of(Family.REGULAR) + " 403 Forbidden - Access Denied"); super.setParagraph(msg); diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/GatewayErrorResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/GatewayErrorResponse.java index b595e95ff..3370821d3 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/GatewayErrorResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/GatewayErrorResponse.java @@ -4,6 +4,10 @@ */ package com.djrapitops.plan.system.webserver.response.errors; +import com.djrapitops.plan.system.file.PlanFiles; + +import java.io.IOException; + /** * ErrorResponse for GatewayException. * @@ -11,7 +15,8 @@ package com.djrapitops.plan.system.webserver.response.errors; */ public class GatewayErrorResponse extends ErrorResponse { - public GatewayErrorResponse(String message) { + public GatewayErrorResponse(String message, String version, PlanFiles files) throws IOException { + super(version, files); super.setHeader("HTTP/1.1 504 Gateway Error"); super.setTitle("Failed to Connect (Gateway Error)"); super.setParagraph(message); diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/InternalErrorResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/InternalErrorResponse.java index 958857df3..beca23099 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/InternalErrorResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/InternalErrorResponse.java @@ -1,15 +1,19 @@ package com.djrapitops.plan.system.webserver.response.errors; +import com.djrapitops.plan.system.file.PlanFiles; import com.djrapitops.plan.utilities.html.Html; import com.djrapitops.plan.utilities.html.icon.Icon; +import java.io.IOException; + /** * @author Rsl1122 * @since 3.5.2 */ public class InternalErrorResponse extends ErrorResponse { - public InternalErrorResponse(String cause, Throwable e) { + public InternalErrorResponse(String cause, Throwable e, String version, PlanFiles files) throws IOException { + super(version, files); super.setHeader("HTTP/1.1 500 Internal Error"); super.setTitle(Icon.called("bug") + " 500 Internal Error occurred"); diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/NotFoundResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/NotFoundResponse.java index 35c94faa8..9947a9f8b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/NotFoundResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/NotFoundResponse.java @@ -1,24 +1,24 @@ package com.djrapitops.plan.system.webserver.response.errors; +import com.djrapitops.plan.system.file.PlanFiles; import com.djrapitops.plan.utilities.html.icon.Icon; +import java.io.IOException; + /** + * Generic 404 response. + * * @author Rsl1122 * @since 3.5.2 */ public class NotFoundResponse extends ErrorResponse { - public NotFoundResponse() { - super.setHeader("HTTP/1.1 404 Not Found"); - super.setTitle(Icon.called("map-signs") + " 404 Not Found"); - super.setParagraph("Page does not exist."); - super.replacePlaceholders(); - } - - public NotFoundResponse(String msg) { + public NotFoundResponse(String msg, String version, PlanFiles files) throws IOException { + super(version, files); super.setHeader("HTTP/1.1 404 Not Found"); super.setTitle(Icon.called("map-signs") + " 404 Not Found"); super.setParagraph(msg); super.replacePlaceholders(); } + } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/UnauthorizedServerResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/UnauthorizedServerResponse.java index 0443674fd..fc1eb8632 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/UnauthorizedServerResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/errors/UnauthorizedServerResponse.java @@ -4,14 +4,18 @@ */ package com.djrapitops.plan.system.webserver.response.errors; +import com.djrapitops.plan.system.file.PlanFiles; + +import java.io.IOException; + /** * Response when Server is not found in database when attempting to InfoRequest. * * @author Rsl1122 */ public class UnauthorizedServerResponse extends ErrorResponse { - - public UnauthorizedServerResponse(String message) { + public UnauthorizedServerResponse(String message, String version, PlanFiles files) throws IOException { + super(version, files); super.setHeader("HTTP/1.1 412 Unauthorized"); super.setTitle("Unauthorized Server"); super.setParagraph(message); diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/AnalysisPageResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/AnalysisPageResponse.java index 7f1d95d34..607042aa7 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/AnalysisPageResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/AnalysisPageResponse.java @@ -8,7 +8,7 @@ import com.djrapitops.plan.system.processing.Processing; import com.djrapitops.plan.system.webserver.cache.PageId; import com.djrapitops.plan.system.webserver.cache.ResponseCache; import com.djrapitops.plan.system.webserver.response.Response; -import com.djrapitops.plan.system.webserver.response.errors.NotFoundResponse; +import com.djrapitops.plan.system.webserver.response.ResponseFactory; import com.djrapitops.plan.utilities.html.pages.AnalysisPage; import com.djrapitops.plugin.api.utility.log.Log; @@ -23,11 +23,12 @@ public class AnalysisPageResponse extends Response { // TODO Split responsibility so that this method does not call system to refresh and also render a refresh page. @Deprecated public static AnalysisPageResponse refreshNow(UUID serverUUID, Processing processing, InfoSystem infoSystem) { + ResponseFactory responseFactory = null; // TODO processing.submitNonCritical(() -> { try { infoSystem.generateAnalysisPage(serverUUID); } catch (NoServersException | ConnectionFailException e) { - ResponseCache.cacheResponse(PageId.SERVER.of(serverUUID), () -> new NotFoundResponse(e.getMessage())); + ResponseCache.cacheResponse(PageId.SERVER.of(serverUUID), () -> responseFactory.notFound404(e.getMessage())); } catch (WebException e) { Log.toLog(AnalysisPageResponse.class.getName(), e); } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/DebugPageResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/DebugPageResponse.java index 3cf640ba1..7b0c38124 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/DebugPageResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/DebugPageResponse.java @@ -4,10 +4,13 @@ */ package com.djrapitops.plan.system.webserver.response.pages; +import com.djrapitops.plan.system.file.PlanFiles; import com.djrapitops.plan.system.webserver.response.errors.ErrorResponse; import com.djrapitops.plan.utilities.html.icon.Icon; import com.djrapitops.plan.utilities.html.pages.DebugPage; +import java.io.IOException; + /** * WebServer response for /debug-page used for easing issue reporting. * @@ -15,7 +18,8 @@ import com.djrapitops.plan.utilities.html.pages.DebugPage; */ public class DebugPageResponse extends ErrorResponse { - public DebugPageResponse(DebugPage debugPage) { + public DebugPageResponse(DebugPage debugPage, String version, PlanFiles files) throws IOException { + super(version, files); super.setHeader("HTTP/1.1 200 OK"); super.setTitle(Icon.called("bug") + " Debug Information"); super.setParagraph(debugPage.toHtml()); diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/InspectPageResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/InspectPageResponse.java index ffa8c4034..f11f93823 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/InspectPageResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/InspectPageResponse.java @@ -3,7 +3,6 @@ package com.djrapitops.plan.system.webserver.response.pages; import com.djrapitops.plan.system.webserver.cache.PageId; import com.djrapitops.plan.system.webserver.cache.ResponseCache; import com.djrapitops.plan.system.webserver.response.Response; -import com.djrapitops.plan.system.webserver.response.errors.ErrorResponse; import com.djrapitops.plan.system.webserver.response.pages.parts.InspectPagePluginsContent; import org.apache.commons.text.StringSubstitutor; @@ -40,12 +39,4 @@ public class InspectPageResponse extends Response { private String[] getCalculating() { return new String[]{"
  • Calculating...
  • ", ""}; } - - public static InspectPageResponse getRefreshing() { - ErrorResponse refreshPage = new ErrorResponse(); - refreshPage.setTitle("Player page request is being processed.."); - refreshPage.setParagraph(" Page will refresh automatically.."); - refreshPage.replacePlaceholders(); - return new InspectPageResponse(null, refreshPage.getContent()); - } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/AnalysisPage.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/AnalysisPage.java index ae782d3fa..c7c7d7b5d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/AnalysisPage.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/AnalysisPage.java @@ -42,7 +42,13 @@ public class AnalysisPage implements Page { } public static String getRefreshingHtml() { - ErrorResponse refreshPage = new ErrorResponse(); + // TODO Work this out + ErrorResponse refreshPage = null; + try { + refreshPage = new ErrorResponse("", null); + } catch (IOException e) { + + } refreshPage.setTitle("Analysis is being refreshed.."); refreshPage.setParagraph(" Analysis is being run, refresh the page after a few seconds.. (F5)"); refreshPage.replacePlaceholders();