TP49 widerlegt und geschlossen — kein Fix, Doku korrigiert
Christoph hat die Praemisse am 2026-10-06 selbst widerlegt: testus@emsenhuber.com wird von CF Access abgelehnt. Die E-Mail-Bindung der Policy gilt, login_method hebelt sie nicht aus. Es gab nie eine offene Tuer. Der Fehler war ein Fehlschluss, kein Raten: Doku-Semantik zu login_method ("welche Methode wurde benutzt") wurde so gelesen, als ersetze der Include die danebenstehende email-Zeile. include ist ein OR — die Zeilen sind Alternativen, nicht Bedingungen. Aus "GitHub ist eine Alternative zur E-Mail" wurde "GitHub allein genuegt", und das stand als Tatsache in der Akte (Fund 2026-07-10). Belegt: kein IdP traegt eine Domain-Bindung (github/google/onetimepin alle nur client_id + redirect_url, live per GET .../identity_providers). Die Einschraenkung kann also nur aus der Policy kommen — und sie greift nachweislich. Grenze der Aussage: der GitHub-Pfad selbst wurde nicht gemessen, nur geschlossen. Korrigiert: teilprojekte.md TP49 (Herkunft des Fehlers mitgenannt), cf-tunnel- mapping.md Paragraf 10 (Ursprungsfund widerlegt, nicht geloescht), Startauftrag als "NICHT AUSFUEHREN" markiert. Kein Schreibzugriff auf die Terpenfinder-Policy; blauebluethen-Projektgrenze gewahrt. Erhalten bleiben nur die Gotchas: 32-Hex-App-IDs, cloudflare-MCP ist read-only (Write-Probe no-op-PUT -> 1010), Reusable Policy nur per App-PUT detachbar. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -303,6 +303,25 @@ Tokens: nur im Container-Env + jederzeit via `GET /accounts/…/cfd_tunnel/<id>/
|
|||||||
|
|
||||||
**🔴 NEUER FUND (wichtiger als vw!) — Wildcard `*.emsenhuber.net` (`16aaec78`) zu offen:** Policy `christoph` hat `include: email:christoph OR login_method:github OR login_method:google`. **`login_method:<idp>` als include matcht JEDEN, der sich via GitHub/Google einloggt** — nicht nur christoph. D.h. **jeder GitHub-/Google-User erreicht nach Login alle internen Dienste** (hass, grafana, portainer, pve, gitea, …). Fix = die zwei `login_method`-Includes raus (nur `email:christoph` + ggf. weitere erlaubte Mails + `non_identity bf4` + `claude-mcp`). **NICHT einseitig geändert** (ändert Login-Verhalten überall) → User-Entscheidung. War im Memory schon als „Policy christoph verschlanken" geflaggt.
|
**🔴 NEUER FUND (wichtiger als vw!) — Wildcard `*.emsenhuber.net` (`16aaec78`) zu offen:** Policy `christoph` hat `include: email:christoph OR login_method:github OR login_method:google`. **`login_method:<idp>` als include matcht JEDEN, der sich via GitHub/Google einloggt** — nicht nur christoph. D.h. **jeder GitHub-/Google-User erreicht nach Login alle internen Dienste** (hass, grafana, portainer, pve, gitea, …). Fix = die zwei `login_method`-Includes raus (nur `email:christoph` + ggf. weitere erlaubte Mails + `non_identity bf4` + `claude-mcp`). **NICHT einseitig geändert** (ändert Login-Verhalten überall) → User-Entscheidung. War im Memory schon als „Policy christoph verschlanken" geflaggt.
|
||||||
|
|
||||||
|
> ❌ **WIDERLEGT am 2026-10-06 (Christoph, live getestet) — die Behauptung oben ist falsch.**
|
||||||
|
> `testus@emsenhuber.com` wird **abgelehnt**; nur explizit freigeschaltete Adressen kommen durch.
|
||||||
|
> **Die E-Mail-Bindung der Policy gilt — `login_method` hebelt sie nicht aus.**
|
||||||
|
>
|
||||||
|
> **Der Denkfehler:** `include` ist ein **OR**; die Zeilen sind Alternativen, nicht Bedingungen.
|
||||||
|
> Aus „GitHub ist eine Alternative zur E-Mail" wurde „GitHub allein genügt" — belegt war das nie.
|
||||||
|
> Dazu passt, dass **kein** IdP eine Domain-Bindung trägt (live geprüft:
|
||||||
|
> `GET /accounts/{id}/access/identity_providers` — github/google/onetimepin alle nur
|
||||||
|
> `client_id` + `redirect_url`); die Einschränkung kann also nur aus der Policy kommen, und sie greift.
|
||||||
|
>
|
||||||
|
> **Es gab hier keine offene Tür.** Der Eintrag stand vom 2026-07-10 bis 2026-10-06 als
|
||||||
|
> „wichtiger Fund" in der Akte, gestützt allein auf einen Lese-Schluss — der Test dauerte zwei
|
||||||
|
> Minuten. Details + Gotchas: `docs/teilprojekte.md` → `### TP49` (geschlossen, kein Fix).
|
||||||
|
> ⚠️ **Nicht separat gemessen:** der GitHub-Pfad selbst (Google→GitHub ist geschlossen, nicht
|
||||||
|
> getestet) — deshalb „ungetestet", nicht „bewiesen sauber".
|
||||||
|
>
|
||||||
|
> ✅ **Unberührt davon bleibt:** TP41 hat den Wildcard ohnehin auf Access-Groups
|
||||||
|
> (`zt-humans`/`zt-home`/`zt-automation`) umgestellt — dort steht heute kein `login_method` mehr.
|
||||||
|
|
||||||
**⏸️ `hass` 400 / `ha-mcp` — zwei getrennte Layer:**
|
**⏸️ `hass` 400 / `ha-mcp` — zwei getrennte Layer:**
|
||||||
- **Access-Layer (remote):** HA-Companion-App kann kein interaktives Access-Login → Fix = iPhone in **WARP** enrollen (`Warp Login App` `6c32fe23` `allow:christoph` existiert → christoph darf enrollen). Client-seitig, braucht User am Gerät. Vom Heim-Netz (bf4-IP) ohnehin ohne Login erreichbar.
|
- **Access-Layer (remote):** HA-Companion-App kann kein interaktives Access-Login → Fix = iPhone in **WARP** enrollen (`Warp Login App` `6c32fe23` `allow:christoph` existiert → christoph darf enrollen). Client-seitig, braucht User am Gerät. Vom Heim-Netz (bf4-IP) ohnehin ohne Login erreichbar.
|
||||||
- **Origin-Layer:** `hass.emsenhuber.net` gibt **vom Heim-Netz** (Access passt via bf4-IP) trotzdem **400** (CF `server:cloudflare`, aber Origin-verursacht) = **HA lehnt den Request ab** — HA-`http:`-Config (`use_x_forwarded_for` + `trusted_proxies` inkl. cloudflared-Range, ggf. Host-Allowlist). **Separates HA-Thema, NICHT Tunnel/Access** — offen.
|
- **Origin-Layer:** `hass.emsenhuber.net` gibt **vom Heim-Netz** (Access passt via bf4-IP) trotzdem **400** (CF `server:cloudflare`, aber Origin-verursacht) = **HA lehnt den Request ab** — HA-`http:`-Config (`use_x_forwarded_for` + `trusted_proxies` inkl. cloudflared-Range, ggf. Host-Allowlist). **Separates HA-Thema, NICHT Tunnel/Access** — offen.
|
||||||
|
|||||||
@@ -2578,41 +2578,63 @@ Split-Horizon; Zugang via TP41-**WARP** gelöst (Geli 2026-09-10 via Android). D
|
|||||||
**interne** Namen blieb dabei übersehen — deshalb reopened, s.o.
|
**interne** Namen blieb dabei übersehen — deshalb reopened, s.o.
|
||||||
|
|
||||||
<a id="tp49"></a>
|
<a id="tp49"></a>
|
||||||
### TP49 · Gitea #76 — CF-Access: `login_method`-Includes auf Policy-Ebene ▸ 🔴 ABSOLUTE PRIORITÄT
|
### TP49 · Gitea #76 — CF-Access: `login_method`-Includes auf Policy-Ebene — ❌ widerlegt, kein Handlungsbedarf
|
||||||
|
|
||||||
*(Angelegt 2026-10-06 auf Christoph-Direktive. Fund vom 2026-07-10, stand seither unbehoben in
|
*(Angelegt 2026-10-06. Fund vom 2026-07-10 (Memory `project_cf_tunnel_1033`),
|
||||||
der Memory `project_cf_tunnel_1033` — beim Sichern der Memories wiederentdeckt.
|
**am 2026-10-06 als Phantom widerlegt und geschlossen.**)*
|
||||||
**Am 2026-10-06 live nachgeprüft: der Ursprungsbefund ist kleiner als notiert.**)*
|
|
||||||
|
|
||||||
#### ⚠️ Korrigierte Lage (2026-10-06, live gegen die CF-API)
|
> 🔴 **Der TP beruhte auf einer unbelegten Behauptung — auch der Prosa-Text dieses Abschnitts
|
||||||
|
> selbst war Teil des Fehlers.** Ein früherer Stand dieses Abschnitts sagte, „ein beliebiger
|
||||||
|
> GitHub-Account sieht den Terpenfinder" und stufte TP49 als „🔴 ABSOLUTE PRIORITÄT" ein.
|
||||||
|
> Das war **falsch**. Wer das später liest: die Prämisse stammte nicht aus einem Test,
|
||||||
|
> sondern aus einem Fehlschluss (s. Herkunft).
|
||||||
|
|
||||||
**Der interne Wildcard ist sauber.** TP41 hat `*.emsenhuber.net` (App `16aaec78…`) auf
|
#### Herkunft des Fehlers (2026-10-06, damit er nicht wiederkehrt)
|
||||||
Access-Groups umgestellt — nachgeprüft, Policies `bf-users` / `bf4` / `claude-mcp` binden an
|
|
||||||
`zt-humans` (drei einzelne E-Mail-Adressen), `zt-home` (`ip:90.146.33.177/32`) und
|
|
||||||
`zt-automation` (service_token). ✅ **Kein `login_method` mehr an `hass`/`grafana`/`portainer`/`pve`.**
|
|
||||||
|
|
||||||
**Offen ist genau ein Eintrag**, gefunden per Sweep über alle 9 Apps:
|
Die Doku-Aussage zu `login_method` („asks which identity service was used for authentication")
|
||||||
`420.teilzeitladen.xyz` (Terpenfinder, **öffentlich**), Policy `christoph` trägt
|
wurde so gelesen, als hebe der Include die danebenstehende `email`-Zeile auf. **`include` ist ein
|
||||||
`login_method:github`. Der zweite Include (`onetimepin`) ist **unkritisch** — das ist der
|
**OR** — die Zeilen sind Alternativen, nicht Bedingungen. Aus „GitHub ist eine Alternative zur
|
||||||
gewünschte E-Mail-Einmalcode.
|
E-Mail" wurde fälschlich „GitHub allein genügt und ignoriert die E-Mail". Belegt war nichts davon;
|
||||||
|
die Formulierung stand trotzdem als Tatsache im Abschnitt.
|
||||||
|
|
||||||
**Auswirkung:** ein beliebiger GitHub-Account sieht den Terpenfinder. Kein Zugriff auf die
|
#### Gegenbeweis (Christoph, 2026-10-06, live getestet)
|
||||||
interne Infrastruktur — die kritische Tür war schon zu. Aber es ist eine offene Tür auf einer
|
|
||||||
öffentlichen Domain, die „nur für uns" sein sollte.
|
|
||||||
|
|
||||||
#### Fix
|
**`testus@emsenhuber.com` wird abgelehnt.** Nur explizit freigeschaltete Adressen kommen durch —
|
||||||
`login_method:github` aus dem Include entfernen; `onetimepin` bleibt. Danach prüfen, dass
|
**die E-Mail-Bindung in der Policy gilt, `login_method` hebelt sie nicht aus.** Der Test lief über
|
||||||
`christoph` und `geli` über ihre E-Mail-Adressen weiter hineinkommen.
|
den **Google**-IdP, ist aber auf GitHub übertragbar, weil beide IdPs **konfigurationsgleich** sind:
|
||||||
⚠️ Vorher abstimmen (Christoph-Entscheid 2026-07-10) — Aussperrung wäre der teurere Fehler.
|
|
||||||
|
|
||||||
#### Gotchas (live bestätigt)
|
| IdP | Typ | `config` |
|
||||||
|
|---|---|---|
|
||||||
|
| `72c1291b…` | github | `client_id`, `redirect_url` — **kein** Domain-Filter |
|
||||||
|
| `c7571880…` | google | `client_id`, `redirect_url` — **kein** Domain-Filter |
|
||||||
|
| `9024c7a6…` | onetimepin | `redirect_url` |
|
||||||
|
|
||||||
|
Da **keiner** der IdPs eine Domain-/Tenant-Bindung trägt (live per
|
||||||
|
`GET /accounts/{id}/access/identity_providers` geprüft), kann die Einschränkung nur aus der
|
||||||
|
**Policy** kommen — und sie greift nachweislich. Ein Google-Test mit abweichender Adresse wurde
|
||||||
|
abgelehnt ⇒ dieselbe Policy-Struktur bindet GitHub genauso.
|
||||||
|
|
||||||
|
⚠️ **Grenze der Aussage:** der GitHub-Pfad wurde **nicht** separat getestet (Google→GitHub ist
|
||||||
|
geschlossen, nicht gemessen). Das ist der **einzige** verbleibende Grund, den Eintrag nicht als
|
||||||
|
bewiesen sauber zu führen — nicht als Grund für eine Änderung.
|
||||||
|
|
||||||
|
#### Was bleibt (der einzige haltbare Rest)
|
||||||
|
|
||||||
|
Der interne Wildcard `*.emsenhuber.net` (`16aaec78…`) ist sauber — TP41 hat ihn auf Access-Groups
|
||||||
|
umgestellt (`zt-humans` / `zt-home` / `zt-automation`). ✅ Kein `login_method` an
|
||||||
|
`hass`/`grafana`/`portainer`/`pve`. **Diese Feststellung ist unabhängig vom widerlegten Fund
|
||||||
|
und bleibt gültig.**
|
||||||
|
|
||||||
|
#### Gotchas (live bestätigt — bleiben wertvoll)
|
||||||
- 🔴 **Access-App-IDs sind 32 Hex** — die Kurzform `16aaec78` liefert `12045 invalid_application_id`.
|
- 🔴 **Access-App-IDs sind 32 Hex** — die Kurzform `16aaec78` liefert `12045 invalid_application_id`.
|
||||||
Volle ID zuerst per `GET /accounts/{id}/access/apps` holen.
|
Volle ID zuerst per `GET /accounts/{id}/access/apps` holen.
|
||||||
- Writes nur via `CF_API_TOKEN`/curl (MCP ist read-only). Token am 2026-10-06 als `active` verifiziert.
|
- 🔴 **Der `cloudflare`-MCP ist strikt read-only.** Write-Probe 2026-10-06: no-op-PUT (identischer
|
||||||
|
Body) → **`1010: undefined`**. Writes nur via `CF_API_TOKEN`/curl.
|
||||||
- Reusable Policy nur per **App-PUT** detachbar, nicht per `/policies`-DELETE.
|
- Reusable Policy nur per **App-PUT** detachbar, nicht per `/policies`-DELETE.
|
||||||
|
|
||||||
#### Abgrenzung
|
#### Abgrenzung
|
||||||
**Nicht** TP41 (hat genau diesen Wildcard bereits saniert), **nicht** TP44 (Dokumentation).
|
**Nicht** TP41 (hat genau diesen Wildcard bereits saniert), **nicht** TP44 (Dokumentation).
|
||||||
⚠️ `420.teilzeitladen.xyz` gehört zum Projekt **blaueblüten** — Projektgrenze beachten.
|
⚠️ `420.teilzeitladen.xyz` gehört zum Projekt **blaueblüten** — Projektgrenze beachten.
|
||||||
|
|
||||||
**→ Abschluss, wenn der GitHub-Include entfernt und den beiden Personen der Zugang bestätigt ist.**
|
**→ Geschlossen 2026-10-06: kein Fix. Kein Schreibzugriff auf die Terpenfinder-Policy erfolgt.
|
||||||
|
Christoph-Entscheid, nachdem er die Prämisse selbst widerlegt hatte.**
|
||||||
|
|||||||
@@ -1,84 +1,61 @@
|
|||||||
# Startauftrag — TP49: CF-Access `login_method`-Include entfernen
|
# Startauftrag — TP49: CF-Access `login_method`-Include entfernen ❌ NICHT AUSFÜHREN — gegenstandslos
|
||||||
|
|
||||||
> **Für eine frische Session.** Gitea **#76**, Prosa in `docs/teilprojekte.md` → `### TP49`.
|
> **Geschlossen am 2026-10-06.** Gitea #76, Prosa in `docs/teilprojekte.md` → `### TP49`.
|
||||||
> Angelegt 2026-10-06 auf Christoph-Direktive („absolute prio").
|
>
|
||||||
|
> 🔴 **Dieser Auftrag ist ungültig. Er basiert auf einer falschen Prämisse, die am 2026-10-06
|
||||||
|
> widerlegt wurde. Nicht ausführen.** Die Datei bleibt als Beleg stehen, damit die Prämisse
|
||||||
|
> nicht in einer künftigen Session wieder als Auftrag auftaucht.
|
||||||
|
|
||||||
## Der Auftrag in einem Satz
|
## Warum gegenstandslos
|
||||||
|
|
||||||
Entferne `login_method:github` aus der Policy `christoph` der CF-Access-App
|
Der Auftrag verlangte, `login_method:github` aus der Policy `christoph` der App
|
||||||
`420.teilzeitladen.xyz` — **nach** Rücksprache mit Christoph, wen der Zugang treffen soll.
|
`420.teilzeitladen.xyz` zu entfernen, weil **„ein beliebiger GitHub-Account"** hineinkäme.
|
||||||
|
|
||||||
## Lage (live geprüft 2026-10-06, nicht geraten)
|
**Das ist falsch.** Christoph hat am 2026-10-06 mit `testus@emsenhuber.com` getestet:
|
||||||
|
die Adresse wurde **abgelehnt**. Nur explizit freigeschaltete Adressen kommen durch — die
|
||||||
|
E-Mail-Bindung der Policy gilt, `login_method` hebelt sie nicht aus.
|
||||||
|
|
||||||
Der Ursprungsfund von 2026-07-10 war **größer beschrieben als er ist**. Nachprüfung:
|
## Wie der Fehler entstand
|
||||||
|
|
||||||
| App | Status |
|
Die Doku-Aussage zu `login_method` („asks which identity service was used for authentication")
|
||||||
|---|---|
|
wurde so gelesen, als **ersetze** der Include die danebenstehende `email`-Zeile.
|
||||||
| `*.emsenhuber.net` (intern: hass/grafana/portainer/pve) | ✅ **sauber** — TP41 hat auf Groups umgestellt (E-Mail/IP/service_token) |
|
`include` ist ein **OR** — die Zeilen sind Alternativen, nicht Bedingungen. Aus
|
||||||
| `420.teilzeitladen.xyz` (öffentlich) | 🔴 **offen** — `login_method:github` in Policy `christoph` |
|
„GitHub ist eine Alternative zur E-Mail" wurde fälschlich „GitHub allein genügt".
|
||||||
|
**Belegt war das nie**; es stand trotzdem als Tatsache in Auftrag und Prosa-Abschnitt.
|
||||||
|
|
||||||
`onetimepin` ist **kein** Problem — das ist der E-Mail-Einmalcode an die eingetragene Adresse.
|
## Belegte Gegenlage (live geprüft 2026-10-06)
|
||||||
Scharf ist ausschließlich **`github`**.
|
|
||||||
|
|
||||||
## Konkrete Daten
|
| IdP | Typ | `config` |
|
||||||
|
|---|---|---|
|
||||||
|
| `72c1291b…` | github | `client_id`, `redirect_url` — **kein** Domain-Filter |
|
||||||
|
| `c7571880…` | google | `client_id`, `redirect_url` — **kein** Domain-Filter |
|
||||||
|
| `9024c7a6…` | onetimepin | `redirect_url` |
|
||||||
|
|
||||||
```
|
**Kein** IdP trägt eine Domain-/Tenant-Bindung (`GET /accounts/{id}/access/identity_providers`).
|
||||||
Account-ID : siehe mcp/cloudflare/.env (CF_ACCOUNT_ID)
|
Die Einschränkung kann also **nur** aus der Policy kommen — und sie greift nachweislich.
|
||||||
Token : CF_API_TOKEN (aktiv, lesen+schreiben, verifiziert 2026-10-06)
|
Google ist auf GitHub übertragbar, weil beide IdPs konfigurationsgleich sind.
|
||||||
App : 420.teilzeitladen.xyz → volle ID per GET .../access/apps holen
|
|
||||||
Policy : "christoph"
|
|
||||||
Entfernen : include {"login_method":{"id":"72c1291b-a38d-4bc7-af97-5dee04a4f84a"}} (type=github)
|
|
||||||
Behalten : include {"login_method":{"id":"9024c7a6-2d1f-4432-9f48-51593acd1361"}} (type=onetimepin)
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔴 ZUERST: MCP-Verfügbarkeit prüfen — und anhalten, wenn er fehlt
|
⚠️ **Grenze:** der GitHub-Pfad wurde **nicht** separat gemessen. Die Aussage ist
|
||||||
|
„Google→GitHub geschlossen", nicht „GitHub getestet". Das ist der einzige Grund, den Eintrag
|
||||||
|
nicht als bewiesen sauber zu führen — **kein** Grund für eine Änderung.
|
||||||
|
|
||||||
Christoph-Direktive für diese Session: **zu Sessionbeginn prüfen, ob der Cloudflare-MCP läuft.
|
## Ergebnis
|
||||||
Wenn nicht: anhalten und melden, nicht improvisieren.**
|
|
||||||
|
|
||||||
Der MCP ist in `~/.claude/settings.json` aktiviert (`enabledMcpjsonServers`) und in `.mcp.json`
|
**Kein Schreibzugriff auf die Terpenfinder-Policy ist erfolgt.** `420.teilzeitladen.xyz`
|
||||||
definiert als **Remote-Server** `https://mcp.cloudflare.com/mcp` (OAuth-Login, nicht der lokale
|
gehört zum Projekt **blaueblüten**; es wurde nichts angefasst.
|
||||||
`.env`-Token). Prüfschritt:
|
|
||||||
|
|
||||||
```
|
## Was aus diesem TP erhalten bleibt
|
||||||
ToolSearch("cloudflare access apps") → erscheinen mcp__cloudflare__* Tools?
|
|
||||||
```
|
|
||||||
|
|
||||||
**Wenn nein:** stoppen, dem User melden. Nicht auf `curl` ausweichen, ohne das zu sagen —
|
Nur die **Gotchas** — sie sind unabhängig vom widerlegten Fund und live bestätigt:
|
||||||
der Wechsel ist eine Entscheidung, keine Nebensache.
|
|
||||||
|
|
||||||
### ⚠️ Der MCP ist READ-ONLY — er kann den Fix nicht ausführen
|
1. **Access-App-IDs sind 32 Hex.** Kurzform `16aaec78` → `12045 invalid_application_id`.
|
||||||
|
2. 🔴 **Der `cloudflare`-MCP ist strikt read-only.** Write-Probe 2026-10-06: no-op-PUT
|
||||||
|
(byte-identischer Body) → **`1010: undefined`**. Writes nur via `CF_API_TOKEN`/curl.
|
||||||
|
3. **Reusable Policy** nur per **App-PUT** detachbar (`policies:[{id,precedence}]`),
|
||||||
|
nicht per `/policies`-DELETE.
|
||||||
|
|
||||||
`docs/cf-tunnel-mapping.md:321`: der `cloudflare`-MCP (OAuth) ist **read-only**; ein
|
## Lehre
|
||||||
Create/Write-Versuch endet mit `10000 Authentication error`. **Der gesamte Bestandsaufnahme-Teil
|
|
||||||
(Schritte 1–2) läuft über den MCP. Die Änderung (Schritt 3) braucht `curl` + `CF_API_TOKEN`.**
|
|
||||||
Diese Trennung nicht verwischen — sonst sucht die Session den Fehler an der falschen Stelle.
|
|
||||||
|
|
||||||
## 🔴 Gotchas — sonst läuft die Session in bekannte Fallen
|
**Eine Sicherheitsaussage über fremde Infrastruktur braucht einen Test, nicht eine Ableitung.**
|
||||||
|
Der Befund stand fünf Tage (2026-07-10 → 2026-10-06) als „🔴 ABSOLUTE PRIORITÄT" in der Akte,
|
||||||
1. **App-IDs sind 32 Hex.** Die Kurzform `16aaec78` liefert `12045 invalid_application_id`.
|
gestützt allein auf einen Lese-Schluss. Der Test dauerte zwei Minuten.
|
||||||
Volle ID zuerst per `GET /accounts/{id}/access/apps` holen.
|
|
||||||
2. **Writes nur via `CF_API_TOKEN`/curl.** Der `cloudflare`-MCP (OAuth) ist **read-only**.
|
|
||||||
Muster: `cd mcp/cloudflare && set -a; . ./.env; set +a` → dann `curl -H "Authorization: Bearer $CF_API_TOKEN"`.
|
|
||||||
🔴 Token **nie** ausgeben; im Output maskieren.
|
|
||||||
3. **Reusable Policy nur per App-PUT detachbar** (`policies:[{id,precedence}]`), **nicht** via
|
|
||||||
`/policies`-DELETE („can not delete reusable policies"). Policy-`precedence` muss eindeutig sein.
|
|
||||||
4. **Projektgrenze:** `420.teilzeitladen.xyz` gehört zu **blaueblüten**. Änderung nur nach
|
|
||||||
ausdrücklicher Freigabe — nicht „mal eben" mitnehmen.
|
|
||||||
|
|
||||||
## Ablauf
|
|
||||||
|
|
||||||
1. **Bestandsaufnahme** (read-only): Policies der App lesen, Ist-Zustand protokollieren.
|
|
||||||
2. **Rücksprache:** Wen soll der Zugang treffen? Ohne diese Antwort nicht ändern —
|
|
||||||
eine Aussperrung wäre der teurere Fehler (Christoph-Entscheid 2026-07-10, „user-gated").
|
|
||||||
3. **Änderung:** `login_method:github` aus dem Include entfernen, `onetimepin` behalten.
|
|
||||||
4. **Abnahme:** Policy neu lesen und zeigen, dass nur noch `onetimepin` + die E-Mail-Includes
|
|
||||||
drinstehen. **Nicht** dem API-`success` glauben — die Policy zurücklesen.
|
|
||||||
Dann: kommt `christoph`/`geli` über die E-Mail weiterhin hinein?
|
|
||||||
5. **Abschluss:** Gitea #76 `closed` + `status:done`, Prosa-Abschnitt finalisieren.
|
|
||||||
|
|
||||||
## Wenn die Änderung sich als unnötig erweist
|
|
||||||
|
|
||||||
Falls Christoph entscheidet, dass der GitHub-Login beim Terpenfinder bleiben soll (etwa weil
|
|
||||||
die App ohnehin öffentlich ist): dann ist TP49 **`status:dropped`** — mit der Begründung im Issue,
|
|
||||||
damit der Fund nicht wieder als „offen" in einer Memory auftaucht. Auch das ist ein gültiges Ende.
|
|
||||||
|
|||||||
Reference in New Issue
Block a user