docs: durchgaengig ID statt Kennung

In der Oberflaeche hiess das Feld Kennung, in der Konfiguration id, in der
README beides. Drei Namen fuer dieselbe Sache, und man muss sie beim Eintragen
zusammenbringen — jetzt ueberall ID.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-08-29 15:41:05 +02:00
1 parent 7c8a4b8c9a
commit 3b7367944b
6 files changed
+12 -12

No files matched your search

+3 -3
View File
@@ -104,7 +104,7 @@ entfällt der Schlüssel und alles funktioniert ohne Einschränkung.
| Feld | wofür | | Feld | wofür |
|---|---| |---|---|
| Kennung | klein, ohne Leerzeichen — muss zu `data-app` der Leiste passen | | ID | klein, ohne Leerzeichen — muss zu `data-app` der Leiste passen |
| Name, Untertitel | Beschriftung auf Kachel und Symbol | | Name, Untertitel | Beschriftung auf Kachel und Symbol |
| Adresse | wohin der Start springt | | Adresse | wohin der Start springt |
| Symbol | cloud · note · box · chip · folder · gear · globe · disk | | Symbol | cloud · note · box · chip · folder · gear · globe · disk |
@@ -191,7 +191,7 @@ HTML geschrieben wird, lässt sich hinterher nicht mehr ändern. Und der Service
Worker einer PWA hebt ganze Antworten auf, samt Kopfzeilen; eine ins HTML Worker einer PWA hebt ganze Antworten auf, samt Kopfzeilen; eine ins HTML
eingefrorene Adresse überlebt dort jede Konfigurationsänderung. eingefrorene Adresse überlebt dort jede Konfigurationsänderung.
`data-app` ist die Kennung aus der App-Liste. Die Liste holt sich die Leiste selbst von `data-app` ist die ID aus der App-Liste. Die Liste holt sich die Leiste selbst von
`/api/apps` — mit deiner HoneyOS-Sitzung, weil alle Adressen unter derselben Domain liegen. `/api/apps` — mit deiner HoneyOS-Sitzung, weil alle Adressen unter derselben Domain liegen.
**Freigegeben sind nur die Ursprünge, die selbst als App eingetragen sind**: die App-Liste **Freigegeben sind nur die Ursprünge, die selbst als App eingetragen sind**: die App-Liste
ist zugleich ihre eigene CORS-Freigabe. ist zugleich ihre eigene CORS-Freigabe.
@@ -346,7 +346,7 @@ Nicht viel, aber nicht nichts:
Einsetzer für beliebig viele Dienste in einem Stapel.** Zwei Tabellen oben in Einsetzer für beliebig viele Dienste in einem Stapel.** Zwei Tabellen oben in
der Datei sagen, welcher Name zu welchem Behälter gehört und welche App das der Datei sagen, welcher Name zu welchem Behälter gehört und welche App das
für HoneyOS ist; eine neue App sind zwei Zeilen. Die Leiste hebt die aktuelle für HoneyOS ist; eine neue App sind zwei Zeilen. Die Leiste hebt die aktuelle
App hervor, sobald `$appid` der `id` in der App-Liste entspricht — genau wie App hervor, sobald `$appid` der `ID` in der App-Liste entspricht — genau wie
in Aether und InkNote. Am Host erkennt nginx, welcher in Aether und InkNote. Am Host erkennt nginx, welcher
Dienst gemeint ist; eine neue App sind zwei Zeilen in den Tabellen oben in Dienst gemeint ist; eine neue App sind zwei Zeilen in den Tabellen oben in
`leiste.conf`. Das ist der Aufbau, den man haben will, sobald es mehr als ein `leiste.conf`. Das ist der Aufbau, den man haben will, sobald es mehr als ein
+2 -2
View File
@@ -283,8 +283,8 @@ func TestAppsAnlegenUndPrüfen(t *testing.T) {
{"leere Adresse", `[{"id":"x","url":""}]`}, {"leere Adresse", `[{"id":"x","url":""}]`},
{"Adresse ohne Schema", `[{"id":"x","url":"cloud.example.test"}]`}, {"Adresse ohne Schema", `[{"id":"x","url":"cloud.example.test"}]`},
{"javascript:", `[{"id":"x","url":"javascript:alert(1)"}]`}, {"javascript:", `[{"id":"x","url":"javascript:alert(1)"}]`},
{"Kennung mit Leerzeichen", `[{"id":"mein app","url":"https://a.test"}]`}, {"ID mit Leerzeichen", `[{"id":"mein app","url":"https://a.test"}]`},
{"Kennung doppelt", `[{"id":"a","url":"https://a.test"},{"id":"a","url":"https://b.test"}]`}, {"ID doppelt", `[{"id":"a","url":"https://a.test"},{"id":"a","url":"https://b.test"}]`},
} }
for _, c := range schlecht { for _, c := range schlecht {
if rec := put(c.body); rec.Code != http.StatusBadRequest { if rec := put(c.body); rec.Code != http.StatusBadRequest {
+1 -1
View File
@@ -17,7 +17,7 @@
# #
# docker compose up -d # docker compose up -d
# → in Pangolin die Ressource auf leiste:80 zeigen lassen, # → in Pangolin die Ressource auf leiste:80 zeigen lassen,
# und in HoneyOS BentoPDF als App eintragen (id: bentopdf, URL: die # und in HoneyOS BentoPDF als App eintragen (ID: bentopdf, URL: die
# öffentliche Adresse, exakt so, wie du sie im Browser aufrufst). # öffentliche Adresse, exakt so, wie du sie im Browser aufrufst).
# ───────────────────────────────────────────────────────────────────────────── # ─────────────────────────────────────────────────────────────────────────────
services: services:
+2 -2
View File
@@ -17,7 +17,7 @@
# docker compose up -d # docker compose up -d
# #
# Danach in Pangolin: honeyos.… → honeyos:8080, jede App → leiste:80. # Danach in Pangolin: honeyos.… → honeyos:8080, jede App → leiste:80.
# Und in HoneyOS jede App eintragen — die `id` dort muss dem `$appid` hier # Und in HoneyOS jede App eintragen — die `ID` dort muss dem `$appid` hier
# entsprechen, sonst weiß die Leiste nicht, in welcher App man gerade ist. # entsprechen, sonst weiß die Leiste nicht, in welcher App man gerade ist.
# ───────────────────────────────────────────────────────────────────────────── # ─────────────────────────────────────────────────────────────────────────────
@@ -74,7 +74,7 @@ configs:
} }
# ── Und welche App das für HoneyOS ist ──────────────────────────────── # ── Und welche App das für HoneyOS ist ────────────────────────────────
# Muss der `id` in der App-Liste entsprechen. Daran erkennt die Leiste, # Muss der `ID` in der App-Liste entsprechen. Daran erkennt die Leiste,
# wo man gerade ist, und hebt den Eintrag hervor — wie in Aether. # wo man gerade ist, und hebt den Eintrag hervor — wie in Aether.
map $$host $$appid { map $$host $$appid {
default ""; default "";
+2 -2
View File
@@ -121,10 +121,10 @@ func (s *Store) SetApps(apps []App) error {
a.TokenKey = strings.TrimSpace(a.TokenKey) a.TokenKey = strings.TrimSpace(a.TokenKey)
if !idPattern.MatchString(a.ID) { if !idPattern.MatchString(a.ID) {
return fmt.Errorf("App %d: Kennung muss klein geschrieben sein und mit Buchstabe oder Ziffer beginnen", i+1) return fmt.Errorf("App %d: ID muss klein geschrieben sein und mit Buchstabe oder Ziffer beginnen", i+1)
} }
if seen[a.ID] { if seen[a.ID] {
return fmt.Errorf("Kennung %q kommt doppelt vor", a.ID) return fmt.Errorf("ID %q kommt doppelt vor", a.ID)
} }
seen[a.ID] = true seen[a.ID] = true
+2 -2
View File
@@ -1167,7 +1167,7 @@ function openApps() {
<span class="ae-url">${escapeHtml(a.url || "")}</span> <span class="ae-url">${escapeHtml(a.url || "")}</span>
</summary> </summary>
<div class="ae-body"> <div class="ae-body">
<label class="ae-field"><span>Kennung</span> <label class="ae-field"><span>ID</span>
<input data-i="${i}" data-f="id" value="${escapeAttr(a.id || "")}" placeholder="aether" spellcheck="false" /></label> <input data-i="${i}" data-f="id" value="${escapeAttr(a.id || "")}" placeholder="aether" spellcheck="false" /></label>
<p class="ae-hint">klein, ohne Leerzeichen — muss zu <code>data-app</code> der Leiste passen</p> <p class="ae-hint">klein, ohne Leerzeichen — muss zu <code>data-app</code> der Leiste passen</p>
<label class="ae-field"><span>Name</span> <label class="ae-field"><span>Name</span>
@@ -1355,7 +1355,7 @@ const LOGIN_ERRORS = {
abgelaufen: "Der Versuch hat zu lange gedauert. Noch einmal.", abgelaufen: "Der Versuch hat zu lange gedauert. Noch einmal.",
state: "Die Antwort passte nicht zur Anfrage. Noch einmal.", state: "Die Antwort passte nicht zur Anfrage. Noch einmal.",
kein_code: "Der Anbieter hat keinen Code geschickt.", kein_code: "Der Anbieter hat keinen Code geschickt.",
tausch: "Der Code ließ sich nicht einlösen — Client-Kennung oder Geheimnis prüfen.", tausch: "Der Code ließ sich nicht einlösen — Client-ID oder Geheimnis prüfen.",
kein_id_token: "Der Anbieter hat kein ID-Token geschickt.", kein_id_token: "Der Anbieter hat kein ID-Token geschickt.",
token: "Das ID-Token war ungültig.", token: "Das ID-Token war ungültig.",
claims: "Das ID-Token nannte keinen Nutzer.", claims: "Das ID-Token nannte keinen Nutzer.",