From 8f294e15dbe0fa8094251fe1865e4395c3d690b0 Mon Sep 17 00:00:00 2001 From: marc Date: Sat, 29 Aug 2026 01:28:12 +0200 Subject: [PATCH] feat(beispiel): die Leiste ueber die eigene Adresse der App ausliefern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Marcs BentoPDF-Image (ghcr.io/alam00000/bentopdf-simple) schickt eine strenge CSP — mit dem Image von Docker Hub, an dem ich zuerst geprueft hatte, war das nicht zu sehen. Statt fremde Kopfzeilen umzuschreiben, reicht der Einsetzer jetzt auch /honeybar/ und die zwei Abfragen der Leiste unter seiner eigenen Adresse durch. Damit ist fuer den Browser alles derselbe Ursprung: CSP unangetastet, kein CORS, kein COEP, und der Schluessel bleibt auf dem Server. Durchgereicht wird nur /api/apps und /api/weather, nur lesend. Ein pauschales /api/ haette die ganze Schnittstelle unter die Adresse der App gehaengt — beim Ausprobieren hat meine eigene Schreibprobe prompt die App-Liste geleert. Das Binden auf 127.0.0.1 ist raus: Es passt nur, wenn der Proxy auf demselben Wirt im Host-Netz laeuft, und nicht fuer Marcs Aufbau. Co-Authored-By: Claude Opus 5 --- README.md | 23 +++++- beispiele/bentopdf/docker-compose.yml | 103 +++++++++++++++++++++----- beispiele/bentopdf/leiste.conf | 34 --------- beispiele/mehrere-apps/leiste.conf | 1 - 4 files changed, 107 insertions(+), 54 deletions(-) delete mode 100644 beispiele/bentopdf/leiste.conf diff --git a/README.md b/README.md index 0e327fb..103b66b 100644 --- a/README.md +++ b/README.md @@ -231,9 +231,30 @@ 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. +**Zwei Bauarten.** Die zweite ist die bessere, sobald die App eine eigene CSP +schickt — und das tun die meisten: + +| | Skript von HoneyOS | Skript über die eigene Adresse | +|---|---|---| +| CSP der App | muss ersetzt werden | **unangetastet** (`'self'` genügt) | +| CORS | Ursprung muss eingetragen sein | entfällt | +| COEP der App | braucht `Cross-Origin-Resource-Policy` | entfällt | +| `HONEYOS_APPS_KEY` | steht im Quelltext der Seite | **bleibt auf dem Server** | +| Aufwand | eine `sub_filter`-Zeile | drei `location`-Blöcke | + +Bei der zweiten reicht der Einsetzer auch `/honeybar/` und die zwei Abfragen der +Leiste durch, unter *seiner* Adresse. Für den Browser ist damit alles derselbe +Ursprung, und die drei Hürden fallen auf einmal weg. Durchgereicht werden dabei +**nur** `/api/apps` und `/api/weather`, und nur lesend (`limit_except GET`) — +ein pauschales `/api/` hinge sonst die ganze HoneyOS-Schnittstelle unter die +Adresse der App. + **Fertige Beispiele:** -- [`beispiele/bentopdf/`](beispiele/bentopdf/) — ein Dienst, kürzestmöglich. +- [`beispiele/bentopdf/`](beispiele/bentopdf/) — ein Dienst, alles über die + eigene Adresse. Geprüft mit `ghcr.io/alam00000/bentopdf-simple`, das eine + strenge CSP und COEP mitbringt: Leiste, Apps und Wetter erscheinen, ohne dass + an dessen Kopfzeilen etwas geändert wird. - [`beispiele/mehrere-apps/`](beispiele/mehrere-apps/) — **HoneyOS und ein Einsetzer für alle Dienste in einem Stapel.** Am Host erkennt nginx, welcher Dienst gemeint ist; eine neue App sind zwei Zeilen in den Tabellen oben in diff --git a/beispiele/bentopdf/docker-compose.yml b/beispiele/bentopdf/docker-compose.yml index 3410c3f..f535b6f 100644 --- a/beispiele/bentopdf/docker-compose.yml +++ b/beispiele/bentopdf/docker-compose.yml @@ -1,35 +1,102 @@ -# ───────────────────────────────────────────────────────────── -# BentoPDF mit HoneyOS-Leiste +# ───────────────────────────────────────────────────────────────────────────── +# BentoPDF mit HoneyOS-Leiste — alles über den eigenen Ursprung. # -# Aufbau: Pangolin → leiste (nginx) → bentopdf +# Pangolin → leiste → bentopdf +# ↘ honeyos (nur /honeybar/ und zwei Abfragen) # -# Der nginx tut nichts weiter, als beim Durchreichen einen '; + } + } networks: - intern: + honeybar: + external: true diff --git a/beispiele/bentopdf/leiste.conf b/beispiele/bentopdf/leiste.conf deleted file mode 100644 index af376df..0000000 --- a/beispiele/bentopdf/leiste.conf +++ /dev/null @@ -1,34 +0,0 @@ -# Setzt die HoneyOS-Leiste in eine fremde App ein, die man nicht ändern kann. -# -# Angepasst werden müssen genau zwei Dinge: die Adresse von HoneyOS und -# data-app (der Name muss der id der App in HoneyOS entsprechen, sonst weiss -# die Leiste nicht, wo man gerade ist). -server { - listen 80; - - location / { - proxy_pass http://bentopdf:8080; - proxy_set_header Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_http_version 1.1; - - # Unkomprimiert anfordern — in einem gzip-Strom ist nichts zu ersetzen. - # Das betrifft nur die Strecke Einsetzer→App; nach draussen komprimiert - # Pangolin weiterhin. - proxy_set_header Accept-Encoding ""; - - # Nur HTML anfassen. Bilder, JSON und Downloads gehen unberührt durch. - sub_filter_types text/html; - sub_filter_once on; - sub_filter '' - ''; - - # Falls die App eine eigene CSP schickt (BentoPDF tut es nicht), muss - # sie ersetzt werden — zwei CSP-Kopfzeilen heissen nicht „mehr erlaubt", - # sondern „beide müssen zustimmen". Dann diese zwei Zeilen einschalten: - # - # proxy_hide_header Content-Security-Policy; - # add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://honeyos.duckdns.org; connect-src 'self' https://honeyos.duckdns.org; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:" always; - } -} diff --git a/beispiele/mehrere-apps/leiste.conf b/beispiele/mehrere-apps/leiste.conf index 88720a0..5fc96c6 100644 --- a/beispiele/mehrere-apps/leiste.conf +++ b/beispiele/mehrere-apps/leiste.conf @@ -62,7 +62,6 @@ server { proxy_set_header Accept-Encoding ""; # Nur HTML anfassen; alles andere geht unberührt durch. - sub_filter_types text/html; sub_filter_once on; sub_filter '' '';