From f044166b81f248dccf51c855037b596f616e2f51 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sat, 29 Apr 2023 17:13:50 +0100 Subject: [PATCH] More qdnBase improvements, to hopefully handle all cases correctly. --- src/main/java/org/qortal/api/HTMLParser.java | 14 +++++++++----- .../qortal/arbitrary/ArbitraryDataRenderer.java | 6 ++++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/qortal/api/HTMLParser.java b/src/main/java/org/qortal/api/HTMLParser.java index 72a35ed9..03cdb066 100644 --- a/src/main/java/org/qortal/api/HTMLParser.java +++ b/src/main/java/org/qortal/api/HTMLParser.java @@ -13,8 +13,8 @@ public class HTMLParser { private static final Logger LOGGER = LogManager.getLogger(HTMLParser.class); - private String linkPrefix; private String qdnBase; + private String qdnBaseWithPath; private byte[] data; private String qdnContext; private String resourceId; @@ -22,12 +22,13 @@ public class HTMLParser { private String identifier; private String path; private String theme; + private boolean usingCustomRouting; public HTMLParser(String resourceId, String inPath, String prefix, boolean usePrefix, byte[] data, - String qdnContext, Service service, String identifier, String theme) { + String qdnContext, Service service, String identifier, String theme, boolean usingCustomRouting) { String inPathWithoutFilename = inPath.contains("/") ? inPath.substring(0, inPath.lastIndexOf('/')) : ""; - this.linkPrefix = usePrefix ? String.format("%s/%s%s", prefix, resourceId, inPathWithoutFilename) : ""; this.qdnBase = usePrefix ? String.format("%s/%s", prefix, resourceId) : ""; + this.qdnBaseWithPath = usePrefix ? String.format("%s/%s%s", prefix, resourceId, inPathWithoutFilename) : ""; this.data = data; this.qdnContext = qdnContext; this.resourceId = resourceId; @@ -35,6 +36,7 @@ public class HTMLParser { this.identifier = identifier; this.path = inPath; this.theme = theme; + this.usingCustomRouting = usingCustomRouting; } public void addAdditionalHeaderTags() { @@ -58,11 +60,13 @@ public class HTMLParser { String identifier = this.identifier != null ? this.identifier.replace("\"","\\\"") : ""; String path = this.path != null ? this.path.replace("\"","\\\"") : ""; String theme = this.theme != null ? this.theme.replace("\"","\\\"") : ""; - String qdnContextVar = String.format("", this.qdnContext, theme, service, name, identifier, path, this.qdnBase); + String qdnContextVar = String.format("", this.qdnContext, theme, service, name, identifier, path, this.qdnBase, this.qdnBaseWithPath); head.get(0).prepend(qdnContextVar); // Add base href tag - String baseElement = String.format("", this.linkPrefix); + // Exclude the path if this request was routed back to the index automatically + String baseHref = this.usingCustomRouting ? this.qdnBase : this.qdnBaseWithPath; + String baseElement = String.format("", baseHref); head.get(0).prepend(baseElement); // Add meta charset tag diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java index 66fc7b98..97641f32 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java @@ -126,7 +126,8 @@ public class ArbitraryDataRenderer { try { String filename = this.getFilename(unzippedPath, inPath); Path filePath = Paths.get(unzippedPath, filename); - + boolean usingCustomRouting = false; + // If the file doesn't exist, we may need to route the request elsewhere, or cleanup if (!Files.exists(filePath)) { if (inPath.equals("/")) { @@ -148,6 +149,7 @@ public class ArbitraryDataRenderer { // Forward request to index file filePath = indexPath; filename = indexFile; + usingCustomRouting = true; break; } } @@ -157,7 +159,7 @@ public class ArbitraryDataRenderer { if (HTMLParser.isHtmlFile(filename)) { // HTML file - needs to be parsed byte[] data = Files.readAllBytes(filePath); // TODO: limit file size that can be read into memory - HTMLParser htmlParser = new HTMLParser(resourceId, inPath, prefix, usePrefix, data, qdnContext, service, identifier, theme); + HTMLParser htmlParser = new HTMLParser(resourceId, inPath, prefix, usePrefix, data, qdnContext, service, identifier, theme, usingCustomRouting); htmlParser.addAdditionalHeaderTags(); response.addHeader("Content-Security-Policy", "default-src 'self' 'unsafe-inline' 'unsafe-eval'; media-src 'self' data: blob:; img-src 'self' data: blob:;"); response.setContentType(context.getMimeType(filename));