diff --git a/svelte/src/filesystem/ErrorPage.svelte b/svelte/src/filesystem/ErrorPage.svelte
new file mode 100644
index 0000000..0bfc6b5
--- /dev/null
+++ b/svelte/src/filesystem/ErrorPage.svelte
@@ -0,0 +1,48 @@
+
+
+{#snippet breadcrumbs()}
+ {$nav.navigation_error}
+{/snippet}
+
+
+ {#if $nav.navigation_error === "not_found" || $nav.navigation_error === "path_not_found"}
+ Page not found
+
+ This page could not be found.
+
+ {:else if $nav.navigation_error === "permission_denied" || $nav.navigation_error === "forbidden"}
+ Permission denied
+
+ You are not allowed to access this resource.
+
+ {:else if $nav.navigation_error === "unavailable_for_legal_reasons"}
+ Unavailable for legal reasons
+
+ This content has been removed for breaking the law.
+
+ {:else}
+ Unknown error code
+
+ {$nav.navigation_error}
+
+ {/if}
+
diff --git a/svelte/src/filesystem/FSNavigator.ts b/svelte/src/filesystem/FSNavigator.ts
index f841561..66867e6 100644
--- a/svelte/src/filesystem/FSNavigator.ts
+++ b/svelte/src/filesystem/FSNavigator.ts
@@ -54,6 +54,7 @@ export class FSNavigator {
}
last_requested_path: string = ""
+ navigation_error: string = ""
navigate = async (path: string, push_history: boolean) => {
if (path === this.last_requested_path) {
console.debug("FSNavigator: Requested path ", path, " is equal to current path. Debouncing")
@@ -72,14 +73,14 @@ export class FSNavigator {
const resp = await fs_get_node(path)
this.open_node(resp, push_history)
} catch (err: any) {
- if (err.value && err.value === "path_not_found") {
+ if (err.value !== undefined && err.value === "path_not_found") {
if (path !== this.path[0].path && path !== "/" && path !== "") {
console.debug("Path", path, "was not found, trying to navigate to parent")
this.navigate(fs_split_path(path).parent, push_history)
}
- } else if (err.message) {
- console.error(err)
- alert("Error: " + err.message)
+ } else if (err.value !== undefined) {
+ this.navigation_error = err.value
+ this.notify_subscribers()
} else {
console.error(err)
alert("Error: " + err)
@@ -133,6 +134,7 @@ export class FSNavigator {
this.children = node.children
this.permissions = node.permissions
this.context = node.context
+ this.navigation_error = "" // Clear the error value
this.initialized = true
console.debug("Opened node", node)
diff --git a/svelte/src/filesystem/Filesystem.svelte b/svelte/src/filesystem/Filesystem.svelte
index 7931e0d..e660b0a 100644
--- a/svelte/src/filesystem/Filesystem.svelte
+++ b/svelte/src/filesystem/Filesystem.svelte
@@ -11,6 +11,7 @@ import { css_from_path } from "filesystem/edit_window/Branding";
import AffiliatePrompt from "user_home/AffiliatePrompt.svelte";
import { current_page_store } from "wrap/RouterStore";
import SearchBar from "./SearchBar.svelte";
+import ErrorPage from "./ErrorPage.svelte";
let file_preview: FilePreview = $state()
let toolbar: Toolbar = $state()
@@ -141,6 +142,7 @@ const keydown = (e: KeyboardEvent) => {
+{#if $nav.navigation_error === ""}
@@ -164,6 +166,10 @@ const keydown = (e: KeyboardEvent) => {
/>
+{:else}
+
+{/if}
+
diff --git a/webcontroller/filesystem.go b/webcontroller/filesystem.go
index 3d0e671..9448250 100644
--- a/webcontroller/filesystem.go
+++ b/webcontroller/filesystem.go
@@ -25,22 +25,31 @@ func (wc *WebController) serveDirectory(w http.ResponseWriter, r *http.Request,
return
}
- pdapi := wc.api.RealIP(util.RemoteAddress(r)).RealAgent(r.UserAgent())
+ var pdapi = wc.api.RealIP(util.RemoteAddress(r)).RealAgent(r.UserAgent())
+
+ if apikey, err := wc.getAPIKey(r); err == nil {
+ pdapi = pdapi.Login(apikey)
+ }
node, err := pdapi.GetFilesystemPath(path)
if err != nil {
if apiErr, ok := errors.AsType[pixelapi.Error](err); ok {
+ // Set the proper response code for the error message
switch apiErr.StatusCode {
case "not_found", "path_not_found":
- wc.serveNotFound(w, r)
- case "forbidden":
- wc.serveForbidden(w, r)
+ w.WriteHeader(http.StatusNotFound)
+ case "forbidden", "permission_denied":
+ w.WriteHeader(http.StatusForbidden)
+ case "unavailable_for_legal_reasons":
+ w.WriteHeader(http.StatusUnavailableForLegalReasons)
case "authentication_required":
http.Redirect(w, r, "/login", http.StatusSeeOther)
- case "unavailable_for_legal_reasons":
- wc.serveUnavailableForLegalReasons(w, r)
- case "permission_denied":
- wc.serveForbidden(w, r)
+ return
+ }
+
+ // Let the JS figure it out
+ if err = wc.templates.Run(w, r, "wrap", td); err != nil {
+ log.Error("Failed to run template: %s", err)
}
} else {
log.Error("Failed to get path: %s", err)
@@ -57,21 +66,3 @@ func (wc *WebController) serveDirectory(w http.ResponseWriter, r *http.Request,
log.Error("Error executing template filesystem: %s", err)
}
}
-
-func (wc *WebController) serveForbidden(w http.ResponseWriter, r *http.Request) {
- log.Debug("Forbidden: %s", r.URL)
- w.WriteHeader(http.StatusForbidden)
- if err := wc.templates.Run(w, r, "wrap", wc.newTemplateData(r)); err != nil {
- log.Error("Failed to run template 403: %s", err)
- }
-}
-
-func (wc *WebController) serveNotFound(w http.ResponseWriter, r *http.Request) {
- log.Debug("Not Found: %s", r.URL)
- w.WriteHeader(http.StatusNotFound)
- wc.templates.Run(w, r, "404", wc.newTemplateData(r))
-}
-func (wc *WebController) serveUnavailableForLegalReasons(w http.ResponseWriter, r *http.Request) {
- w.WriteHeader(http.StatusUnavailableForLegalReasons)
- wc.templates.Run(w, r, "451", wc.newTemplateData(r))
-}