From 5dbadf212f5be8bfc61f315eefbd6c9da3b313d3 Mon Sep 17 00:00:00 2001 From: marc Date: Fri, 28 Aug 2026 19:35:21 +0200 Subject: [PATCH] fix(leiste): mit Cross-Origin-Resource-Policy ausliefern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apps, die COEP „require-corp" setzen — alles mit WASM oder SharedArrayBuffer, etwa BentoPDF — lehnen jede fremde Datei ab, die sich nicht ausdruecklich zur Einbettung bekennt. Genau das ist der Zweck der Leiste, also sagt sie es jetzt. Die Alternative waere gewesen, im Proxy das COEP der App zu entfernen. Das haette ihr die Faehigkeiten genommen, fuer die sie es setzt. Gefunden beim Einsetzen in BentoPDF hinter einem nginx. Co-Authored-By: Claude Opus 5 --- README.md | 23 +++++++++++++++++++++++ main.go | 6 ++++++ 2 files changed, 29 insertions(+) diff --git a/README.md b/README.md index 1ce4c7c..d185d30 100644 --- a/README.md +++ b/README.md @@ -221,6 +221,29 @@ CSP dieser App; viele fertige Werkzeuge brauchen `unsafe-inline` ohnehin für sich selbst, aber wissen sollte man es. (Auflösbar, indem die Leiste ihre Stile als eigene Datei ausliefert — steht in [IDEAS.md](IDEAS.md).) +**Apps mit COEP** (alles mit WASM oder SharedArrayBuffer — BentoPDF etwa) +lehnen fremde Dateien ab, die sich nicht zur Einbettung bekennen. HoneyOS +liefert die Leiste deshalb mit `Cross-Origin-Resource-Policy: cross-origin` +aus. Ohne das erscheint dort keine Leiste, und in der Konsole steht nur +`ERR_BLOCKED_BY_RESPONSE.NotSameOriginAfterDefaultedToSameOriginByCoep`. +Das COEP der App bleibt dabei unangetastet — ihre eigenen Fähigkeiten also auch. + +**Nur Pangolin davor?** Traefik kann Antwortkörper nicht von sich aus ändern; +dafür bräuchte es ein Plugin. Der kürzere Weg ist ein kleiner nginx *zwischen* +Pangolin und der App, der nichts tut außer einsetzen: + +```yaml + leiste: + image: nginx:alpine + restart: unless-stopped + volumes: [./leiste.conf:/etc/nginx/conf.d/default.conf:ro] + # Pangolin zeigt jetzt hierher statt direkt auf die App. +``` + +Geprüft mit BentoPDF: Es schickt keine CSP, also genügen `proxy_pass`, +`Accept-Encoding ""` und die `sub_filter`-Zeile — die CSP-Zeilen oben braucht +nur, wessen App selbst eine schickt. + **Was dabei zu erwarten ist:** - **Das Layout der fremden App kennt die Leiste nicht.** Rechnet sie mit diff --git a/main.go b/main.go index 9b3480e..ea78fa5 100644 --- a/main.go +++ b/main.go @@ -240,6 +240,12 @@ func (s *Server) cors(next http.Handler) http.Handler { func noCache(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Cache-Control", "no-cache") + // Die Leiste wird von fremden Ursprüngen geladen — das ist ihr Zweck. + // Apps, die selbst COEP „require-corp" setzen (alles mit WASM oder + // SharedArrayBuffer, etwa BentoPDF), lehnen sonst jede fremde Datei ab, + // die sich nicht ausdrücklich dazu bekennt. Ohne diese Zeile erscheint + // dort keine Leiste, und im Fehlerprotokoll steht nur ein Kürzel. + w.Header().Set("Cross-Origin-Resource-Policy", "cross-origin") next.ServeHTTP(w, r) }) }