fix(leiste): mit Cross-Origin-Resource-Policy ausliefern
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 <noreply@anthropic.com>
This commit is contained in:
1 parent
05e56f4cd2
commit
5dbadf212f
2 files changed
+29
No files matched your search
@@ -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
|
sich selbst, aber wissen sollte man es. (Auflösbar, indem die Leiste ihre Stile
|
||||||
als eigene Datei ausliefert — steht in [IDEAS.md](IDEAS.md).)
|
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:**
|
**Was dabei zu erwarten ist:**
|
||||||
|
|
||||||
- **Das Layout der fremden App kennt die Leiste nicht.** Rechnet sie mit
|
- **Das Layout der fremden App kennt die Leiste nicht.** Rechnet sie mit
|
||||||
|
|||||||
@@ -240,6 +240,12 @@ func (s *Server) cors(next http.Handler) http.Handler {
|
|||||||
func noCache(next http.Handler) http.Handler {
|
func noCache(next http.Handler) http.Handler {
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.Header().Set("Cache-Control", "no-cache")
|
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)
|
next.ServeHTTP(w, r)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user