From 39e0019ce3c56b5bed46482a209b6877373ae8de Mon Sep 17 00:00:00 2001 From: Wim Brand Date: Thu, 30 Jul 2026 21:31:35 +0200 Subject: [PATCH] Move error handling for filesystem to frontend --- svelte/src/filesystem/ErrorPage.svelte | 48 +++++++++++++++++++++++++ svelte/src/filesystem/FSNavigator.ts | 10 +++--- svelte/src/filesystem/Filesystem.svelte | 6 ++++ webcontroller/filesystem.go | 43 +++++++++------------- 4 files changed, 77 insertions(+), 30 deletions(-) create mode 100644 svelte/src/filesystem/ErrorPage.svelte 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)) -}