From c5086db223c1a9dcdacbb912c5d025175c31e5af Mon Sep 17 00:00:00 2001 From: Christoph Emsenhuber Date: Tue, 6 Oct 2026 06:49:22 +0200 Subject: [PATCH] TP49-Startauftrag: Vorbereitung fuer die Durchfuehrungs-Session MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Live geprueft: interner Wildcard ist durch TP41 sauber (Groups statt login_method). Offen ist genau ein Eintrag — login_method:github in Policy 'christoph' auf 420.teilzeitladen.xyz (oeffentlich, Projekt blaueblueten). Enthaelt konkrete IDs, die vier bekannten Gotchas (32-Hex-App-IDs, Schreib-Token, Reusable-Policy-Detach, Projektgrenze) und den Ablauf inkl. Ruecksprache-Pflicht. Co-Authored-By: Claude Code --- docs/tp49-cf-access-startauftrag.md | 61 +++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 docs/tp49-cf-access-startauftrag.md diff --git a/docs/tp49-cf-access-startauftrag.md b/docs/tp49-cf-access-startauftrag.md new file mode 100644 index 0000000..72c74f3 --- /dev/null +++ b/docs/tp49-cf-access-startauftrag.md @@ -0,0 +1,61 @@ +# Startauftrag — TP49: CF-Access `login_method`-Include entfernen + +> **Für eine frische Session.** Gitea **#76**, Prosa in `docs/teilprojekte.md` → `### TP49`. +> Angelegt 2026-10-06 auf Christoph-Direktive („absolute prio"). + +## Der Auftrag in einem Satz + +Entferne `login_method:github` aus der Policy `christoph` der CF-Access-App +`420.teilzeitladen.xyz` — **nach** Rücksprache mit Christoph, wen der Zugang treffen soll. + +## Lage (live geprüft 2026-10-06, nicht geraten) + +Der Ursprungsfund von 2026-07-10 war **größer beschrieben als er ist**. Nachprüfung: + +| App | Status | +|---|---| +| `*.emsenhuber.net` (intern: hass/grafana/portainer/pve) | ✅ **sauber** — TP41 hat auf Groups umgestellt (E-Mail/IP/service_token) | +| `420.teilzeitladen.xyz` (öffentlich) | 🔴 **offen** — `login_method:github` in Policy `christoph` | + +`onetimepin` ist **kein** Problem — das ist der E-Mail-Einmalcode an die eingetragene Adresse. +Scharf ist ausschließlich **`github`**. + +## Konkrete Daten + +``` +Account-ID : siehe mcp/cloudflare/.env (CF_ACCOUNT_ID) +Token : CF_API_TOKEN (aktiv, lesen+schreiben, verifiziert 2026-10-06) +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) +``` + +## 🔴 Gotchas — sonst läuft die Session in bekannte Fallen + +1. **App-IDs sind 32 Hex.** Die Kurzform `16aaec78` liefert `12045 invalid_application_id`. + 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.