lastModified = resource.getLastModified();
if (lastModified.isPresent() && modified == lastModified.get()) {
return browserCachedNotChangedResponse();
} else {
return publicHtmlResourceResponse(fileName, mimeType);
}
}
public Response publicHtmlResourceResponse(@Untrusted String fileName, String mimeType) {
try {
WebResource resource = publicHtmlFiles.findPublicHtmlResource(fileName)
.map(Resource::asWebResource)
.orElse(null);
if (resource == null) return null;
byte[] content = resource.asBytes();
ResponseBuilder responseBuilder = Response.builder()
.setMimeType(mimeType)
.setContent(content)
.setStatus(200);
if (fileName.contains(STATIC_BUNDLE_FOLDER)) {
resource.getLastModified().ifPresent(lastModified -> responseBuilder
// Can't cache css bundles in browser since base path might change
.setHeader(HttpHeader.CACHE_CONTROL.asString(), CacheStrategy.CHECK_ETAG)
.setHeader(HttpHeader.LAST_MODIFIED.asString(), httpLastModifiedFormatter.apply(lastModified))
.setHeader(HttpHeader.ETAG.asString(), lastModified));
}
return responseBuilder.build();
} catch (UncheckedIOException e) {
return notFound404("CSS File not found");
}
}
public Response redirectResponse(String location) {
return Response.builder().redirectTo(location).build();
}
public Response faviconResponse() {
try {
return Response.builder()
.setMimeType(MimeType.FAVICON)
.setContent(getResource("favicon.ico"))
.build();
} catch (UncheckedIOException e) {
return forInternalError(e, "Could not read favicon");
}
}
public Response robotsResponse() {
try {
WebResource resource = getResource("robots.txt");
Long lastModified = resource.getLastModified().orElseGet(System::currentTimeMillis);
return Response.builder()
.setMimeType("text/plain")
.setContent(resource)
.setHeader(HttpHeader.CACHE_CONTROL.asString(), CacheStrategy.CACHE_IN_BROWSER)
.setHeader(HttpHeader.LAST_MODIFIED.asString(), httpLastModifiedFormatter.apply(lastModified))
.setHeader(HttpHeader.ETAG.asString(), lastModified)
.build();
} catch (UncheckedIOException e) {
return forInternalError(e, "Could not read robots.txt");
}
}
public Response pageNotFound404() {
return notFound404(locale.getString(ErrorPageLang.UNKNOWN_PAGE_404));
}
public Response uuidNotFound404() {
return notFound404(locale.getString(ErrorPageLang.UUID_404));
}
public Response playerNotFound404() {
return notFound404(locale.getString(ErrorPageLang.NOT_PLAYED_404));
}
public Response notFound404(String message) {
try {
return Response.builder()
.setMimeType(MimeType.HTML)
.setContent(pageFactory.errorPage(Icon.called("map-signs").build(), "404 " + message, message).toHtml())
.setStatus(404)
.build();
} catch (IOException e) {
return forInternalError(e, "Failed to generate 404 page with message '" + message + "'");
}
}
public Response 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 Response forbidden403(String message) {
try {
return Response.builder()
.setMimeType(MimeType.HTML)
.setContent(pageFactory.errorPage(Icon.called("hand-paper").of(Family.REGULAR).build(), "403 Forbidden", message).toHtml())
.setStatus(403)
.build();
} catch (IOException e) {
return forInternalError(e, "Failed to generate 403 page");
}
}
public Response failedLoginAttempts403() {
return Response.builder()
.setMimeType(MimeType.HTML)
.setContent("403 Forbidden
" +
"You have too many failed login attempts. Please wait 2 minutes until attempting again.
" +
"")
.setStatus(403)
.build();
}
public Response ipWhitelist403(@Untrusted String accessor) {
return Response.builder()
.setMimeType(MimeType.HTML)
.setContent("403 Forbidden
" +
"IP-whitelist enabled, \"" + StringEscapeUtils.escapeHtml4(accessor) + "\" is not on the list!
")
.setStatus(403)
.build();
}
public Response badRequest(String errorMessage, String target) {
return Response.builder()
.setMimeType(MimeType.JSON)
.setJSONContent(Maps.builder(String.class, Object.class)
.put("status", 400)
.put("error", errorMessage)
.put("requestedTarget", target)
.build())
.setStatus(400)
.build();
}
public Response playerPageResponse(@Untrusted Request request, UUID playerUUID) {
try {
return forPage(request, pageFactory.playerPage(playerUUID));
} catch (IllegalStateException e) {
return playerNotFound404();
} catch (IOException e) {
return forInternalError(e, "Failed to generate player page");
}
}
public Response loginPageResponse(@Untrusted Request request) {
try {
return forPage(request, pageFactory.loginPage());
} catch (IOException e) {
return forInternalError(e, "Failed to generate login page");
}
}
public Response registerPageResponse(@Untrusted Request request) {
try {
return forPage(request, pageFactory.registerPage());
} catch (IOException e) {
return forInternalError(e, "Failed to generate register page");
}
}
public Response queryPageResponse(@Untrusted Request request) {
try {
return forPage(request, pageFactory.queryPage());
} catch (IOException e) {
return forInternalError(e, "Failed to generate query page");
}
}
public Response errorsPageResponse(@Untrusted Request request) {
try {
return forPage(request, pageFactory.errorsPage());
} catch (IOException e) {
return forInternalError(e, "Failed to generate errors page");
}
}
public Response jsonFileResponse(String file) {
try {
return Response.builder()
.setMimeType(MimeType.JSON)
.setContent(getResource(file))
.build();
} catch (UncheckedIOException e) {
return forInternalError(e, "Could not read " + file);
}
}
public Response reactPageResponse(Request request) {
try {
return forPage(request, pageFactory.reactPage());
} catch (UncheckedIOException | IOException e) {
return forInternalError(e, "Could not read index.html");
}
}
}