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) }) }