From 494495bb94143a2fb63130262180f557cfb90fc0 Mon Sep 17 00:00:00 2001 From: marcus hinz Date: Mon, 20 Jul 2026 12:22:32 +0200 Subject: [PATCH] =?UTF-8?q?Offene=20Punkte=20aufger=C3=A4umt;=20Projekt-Co?= =?UTF-8?q?nfig=20auf=20.ai-control/=20migriert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Erledigtes raus (Umbau .ai-control/UUID, Dialog-Redesign, Sicherheitsrunde II), ACL-Ergebnis dokumentiert, Punkte in 'Entscheidung nötig' und 'Go genügt' gruppiert. ai-control.json ist durch .ai-control/config.json + icon.png ersetzt (App-Migration). --- .ai-control/config.json | 9 ++ .ai-control/icon.png | Bin 0 -> 17955 bytes OFFENE-PUNKTE.md | 236 ++++++++++------------------------------ ai-control.json | 8 -- 4 files changed, 65 insertions(+), 188 deletions(-) create mode 100644 .ai-control/config.json create mode 100644 .ai-control/icon.png delete mode 100644 ai-control.json diff --git a/.ai-control/config.json b/.ai-control/config.json new file mode 100644 index 0000000..efe5acb --- /dev/null +++ b/.ai-control/config.json @@ -0,0 +1,9 @@ +{ + "id": "c816fc10-cd19-4e93-b680-5b8d3dfeaa7c", + "name": "ai-control", + "terminal": { + "theme": "monokai", + "icon": "icon.png" + }, + "archiveHome": "~/claude-projects/claude-ai-control/archive" +} diff --git a/.ai-control/icon.png b/.ai-control/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4c62dc3f05d0729bbb82da661f91829aab2c8305 GIT binary patch literal 17955 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 literal 0 HcmV?d00001 diff --git a/OFFENE-PUNKTE.md b/OFFENE-PUNKTE.md index a6f6a22..80d214b 100644 --- a/OFFENE-PUNKTE.md +++ b/OFFENE-PUNKTE.md @@ -1,196 +1,72 @@ # Offene Punkte — bei jedem Start prüfen und abhaken -- [x] **„Projekt hinzufügen" verliert `archiveHome` — Ursache gefunden, behoben.** - Der Verdacht (Add-Projekt-Pfad) war falsch. Ursache war ein verlustbehafteter - Config-Round-Trip: `read_project_config_in` deserialisiert in `ProjectConfig`, - serde verwirft dabei still jeden unbekannten Key, und `write_project_config_in` - schreibt die Datei komplett neu. Geschrieben hat die Pool-Zuweisung - (`ProjectList.vue:113` → `assign_pool_in`), ausgeführt von einem **älteren - Build ohne das Feld `archive_home`** — daher der Halbzustand mit erhaltener - Berechtigung in `.claude/settings.json` (anderer Schreibpfad). +Erledigt und rausgeräumt (2026-07-20, Details in der Git-Historie): Umbau auf +`.ai-control/config.json` mit Projekt-UUID + Name (Registry maschinenlokal +inkl. Pool, Icon im Projekt, Migration beim Start, Import-Prüfung); +Settings-Dialog-Redesign (Gruppen, fester Kopf/Fuß, feste Höhe); +Sicherheitsrunde II: `term_start`-Label-Prüfung, `archive_panel` ohne `dir`, +`write_panel(path)` mit Allowlist + 2-MB-Limit, `write_atomic` überall, +`write_secret_file` mit `create_new`+0600, PTY-Env ohne ANTHROPIC-Keys, +`check_name` in den Panel-Pfaden, Bidi-Filter in den Befehlskacheln. - Fix: `#[serde(flatten)] rest` in `ProjectConfig` reicht unbekannte Keys - unverändert durch; Regressionstest `pool_zuweisen_erhaelt_fremde_keys`. - Einschränkung: Die Versionsdifferenz ist aus Zeitstempeln erschlossen, das - alte Binary war schon überschrieben. Der Defekt selbst ist am Code belegt. +Die ACL-Frage aus der Sicherheitsrunde ist entschieden (gegen tauri 2.11.5 +verifiziert): **Die Fenster-ACL greift für App-Commands nicht** — ohne +`__app-acl__`-Manifest prüft Tauri eigene Commands bei lokalem Origin gar +nicht; die `windows`-Liste in den Capabilities beschränkt nur die +Plugin-Permissions. Daraus folgt der erste Punkt unten. - Ursprünglicher Befund 2026-07-19 (claude-ai-control): - - `archive/` existiert seit 21:03 samt Testdokument, war also gesetzt. - - `.claude/settings.json` hat den Eintrag noch: - `additionalDirectories: ~/claude-projects/claude-ai-control/archive` - (geschrieben von `add_archive_permission`, archive.rs:56). - - `ai-control.json` hat **kein** `archiveHome` mehr, mtime 21:18. - - Halbzustand Recht-ohne-Config kann nicht vom Abwählen-Button kommen: - `clear_project_archive_home` (archive.rs:96-104) nimmt beides zurück. - - Folge: `panel-wiring.ts:45` blendet Wiki- und Suche-Tab aus. +## Entscheidungen nötig - Zu prüfen war: Schreibpfade auf `PROJECT_FILE` in `domain/project.rs` - (`write_project_config_in`, project.rs:81) — welcher davon eine frische - Config ohne `archive_home` schreibt. +- [ ] **App-ACL-Manifest einführen?** Jedes Fenster darf derzeit jedes + App-Command rufen (`delete_project`, `set_archive_home_cmd`, …); + abgesichert ist nur der PTY-Pfad (Label-Prüfung in `term_start`). + Ein App-Manifest (eigene Permissions pro Command, in den Capabilities + pro Fenster zugeteilt) wäre die strukturelle Antwort — spürbarer + Umbau, Umfang festlegen. -- [ ] **Command-History braucht eine Identität statt Indizes.** - Aufgefallen beim Fix von `commands_delete` (Panik bei Doppelklick, Löschen - der falschen Kachel). Der Fix schickt jetzt den Befehlstext mit und gleicht - serverseitig ab — das verhindert Schaden, ist aber nur ein Notnagel: Zwei - identische Befehle im selben Record sind nicht unterscheidbar, und die - Panel-Indizes hinken der Datei weiter um bis zu ein Watcher-Intervall - (200 ms) hinterher. Sauber wäre eine ID je Eintrag beim Schreiben. +- [ ] **`csp: null` in `tauri.conf.json` ersetzen.** Zweite Schranke hinter + dem Markdown-Sanitizer; braucht eine Runde Prüfen, was inline nötig ist + (Themes, xterm). Schon `default-src 'self'` schnitte auswärtige + Requests und Fremdnavigation ab. -- [ ] **`csp: null` in `tauri.conf.json` ersetzen.** - Aufgefallen beim XSS-Fix: Es gibt keine zweite Schranke. Das Panel liegt im - selben Webview wie das Terminal, dessen `term_write` die PTY über das - Fensterlabel adressiert — eingeschleustes Skript könnte in die laufende - Shell schreiben. Das Markdown-Rendering ist jetzt entschärft - (`src/markdown.ts`), aber eine echte CSP wäre die Schranke dahinter. - Braucht eine Runde Prüfen, was inline benötigt wird (Themes, xterm). - Schon ein `default-src 'self'` würde auswärtige Requests und die - Fremdnavigation unabhängig vom Sanitizer abschneiden. +- [ ] **Archiv-Ordner-Handling.** Beim Setzen explizit bestätigen statt still + anlegen; Wechsel eines gesetzten Archiv-Homes braucht eine + Migrationsmöglichkeit (Dokumente mitnehmen oder liegen lassen). + Kritisch: echte Nutzerdaten, nichts implizit verschieben. -## Aus der Sicherheitsrunde 2026-07-19 (vier Angriffsflächen geprüft) +- [ ] **Projekt sauber löschen.** Alle Ressourcen des Projekts entfernen + (Config, Icon, Archiv-Rechte in `.claude/settings.json`, + Registry-Eintrag) — mit Vorschau, was entfernt wird. Umfang festlegen. -Behoben und gepusht (6d44f77): Befehlsinjektion im SessionStart-Hook über den -Projektpfad, ungeprüfter Pool-Name als `CLAUDE_CONFIG_DIR`, `check_name` gegen -Steuerzeichen (`.desktop`-Injektion), Bild-Beacon im Panel. Dazu `cargo audit` -nachgeholt: `plist` auf 1.10.0, `quick-xml` auf 0.41.0 im Laufzeitpfad. +- [ ] **macOS: API-Key kurz in der `security`-Kommandozeile sichtbar** + (`macos.rs`, `ps`-sichtbar). Bewusst zurückgestellt, bis eine + macOS-Session zum Testen verfügbar ist. -Offen sind die vier Punkte, die eine Designentscheidung brauchen: +## Go genügt (Weg ist klar) -- [ ] **`term_start` prüft das Fenster-Label nicht (`terminal.rs:96-211`).** - Jedes Fenster des Terminal-Prozesses kann sich selbst in die Terminals-Map - eintragen (Schlüssel ist `window.label()`, Zeile 207-210) und danach per - `term_write` in eine frisch gestartete Shell schreiben. Damit ist auch das - abgelöste Panel-Fenster gefährlich, nicht nur das angedockte — und jedes - Skript im Webview wird zu Codeausführung, auch ohne XSS. - Zu entscheiden: Soll das Panel-Fenster je ein eigenes Terminal starten - dürfen? Wenn nein, ist die Prüfung auf `term-*` ein enger Fix. +- [ ] **Command-History: stabile ID je Eintrag.** Der cmd-Text-Abgleich in + `commands_delete` ist ein Notnagel; ID beim Schreiben der JSONL + vergeben, Panel löscht über die ID. - Strukturell dahinter: Die Fenster-ACL scheint für App-Commands nicht zu - greifen (`gen/schemas/acl-manifests.json` enthält kein App-Manifest) — - **vor dem Bauen darauf verifizieren**, die beiden Prüfagenten waren sich - in diesem Punkt uneins. +- [ ] **`write_app_setting` verliert die übrigen App-Settings** + (`settings.rs`): `read_app_settings` wirft fehlende Datei, Lesefehler + und kaputtes JSON in denselben `None`; nur eine *fehlende* Datei + rechtfertigt ein frisches Objekt (Fix wie in `pool.rs` + `register_mcp_server`). -- [ ] **`write_panel(path)` liest jede Datei, ohne Rückfrage (`mcp.rs:256-259`).** - Keine Prüfung gegen Projektordner oder Archiv-Home. Das Tool steht in - `PANEL_PERMISSIONS` (`pool.rs:185-188`), läuft also prompt-frei — und - umgeht damit das Read-Permission-Modell von Claude Code (`~/.ssh/id_rsa`, - `.credentials.json`, fremde `.env`). Rückkanal zum Modell besteht über - `write_panel` → `archive_panel` → `search_archive`. - Zu entscheiden: Allowlist (Projektordner + Archiv-Home, nach - `canonicalize`) oder `path` aus der prompt-freien Freigabe nehmen. - Zusätzlich fehlt ein Größenlimit (`path=/dev/zero` hängt den Prozess). +- [ ] **`struct Pool` verliert unbekannte Keys beim Umbenennen** + (`pool.rs`). Entweder flatten-`rest` wie in `ProjectConfig` — oder + gleich der gemeinsame read-modify-write-Helfer auf + `serde_json::Value`, der die Fehlerklasse überall schließt. -- [ ] **`archive_panel(dir)` vergibt dauerhaft Schreibrechte (`archive.rs:33-91`).** - `dir` ist nicht nur Ablageort: Über `set_project_archive_home` → - `add_archive_permission` landet `additionalDirectories += dir` **und** - `allow += "Edit(dir/**)"` in der `.claude/settings.json` des Projekts. - Der einzige Guard (archive.rs:41) lehnt nur Vorfahren des Home ab — - `~/.claude` passiert, womit die nächste Session eigene **Hooks** schreiben - darf. `create_dir_all` legt das Ziel vorher an. - Vorschlag: `dir` aus dem MCP-Tool entfernen, Archiv-Home nur über die UI. +- [ ] **Archiv-Dateinamen: `create_new` statt `exists()`** (`free_path`, + TOCTOU). Beim Maschinen-Sync können zwei Rechner in derselben Minute + mit gleicher Titelzeile schreiben; Kollisionsfreiheit gehört ins + Dateisystem. Mitzudenken: was der Sync selbst bei Namensgleichheit tut. -- [ ] **Nicht-atomare Schreibvorgänge auf fremde Dateien.** - Überall `fs::write` (truncate + write), nirgends temp + `rename`. - Betrifft u. a. die `.claude/settings.json` der Projekte, Claudes - `.claude.json` in den Pools (`pool.rs:289`), die Registry und die - App-Settings. Die Leseseite haben wir gehärtet, die Schreibseite nicht: - Absturz oder volle Platte hinterlässt abgeschnittenes JSON in Dateien, - die der App nicht gehören. +## Hintergrund (unverändert gültig) -Kleinere Punkte aus derselben Runde, bewusst zurückgestellt: -`panel_file` und Geschwister (`paths.rs:55-84`) ohne `check_name` (zweite -Linie); `write_secret_file` (`unix.rs:48-55`) schreibt erst mit umask-Rechten -und setzt danach 0600, `create_new` mit Modus löst das samt Symlink-Frage; -API-Key steht unter macOS kurz in der Prozess-Kommandozeile -(`macos.rs:101-103`, `ps`-sichtbar, Linux/Windows nicht betroffen); die PTY-Umgebung -wird nicht bereinigt (`terminal.rs:134-144`, kein `env_clear` — ein -`ANTHROPIC_API_KEY` aus dem Shell-Profil sticht den Pool-`apiKeyHelper`); -Bidi-/Zero-Width-Zeichen in den Befehlskacheln (`commands-view.ts:123`), was -Anzeige und Zwischenablage auseinanderlaufen lässt. - -Ausdrücklich **kein** Handlungsbedarf (Stand 2026-07-19): `sync_all_desktops` -räumt `aicontrol-*.desktop` auf — der Präfix gehört uns. Falls es je stört, -wäre `art.lintus.`-Präfix die saubere Variante. - -Nicht als Sicherheitsgrenze missverstehen: Pools trennen Konfiguration, nicht -Zugriff. Die Keychain-Einträge sind bewusst über `/usr/bin/security` angelegt, -damit der `apiKeyHelper` promptfrei liest — womit jeder Prozess des Nutzers -jeden Pool-Key lesen kann. Beim Design so gewollt, aber nichts, worauf man -Isolationsversprechen bauen sollte. - -- [ ] **`write_app_setting` verliert die übrigen App-Settings (`settings.rs:71`).** - Dieselbe Fehlerklasse wie die `.claude.json` in `pool.rs`, nur eine Datei - weiter — beim Simplify-Review gefunden, bewusst nicht mitgefixt. - `read_app_settings` (settings.rs:11-14) wirft mit zweimal `.ok()?` fehlende - Datei, Lesefehler und kaputtes JSON in denselben `None`; `write_app_setting` - macht daraus `json!({})` und schreibt die Datei mit einem Key neu. - Konkret: halb geschriebene `~/.config/ai-control/settings.json`, dann einmal - Schriftgröße verstellen — `claudeCommand`, `poolSyncDir`, `syncOnSessionEnd` - und `spellcheckLang` sind endgültig weg. Fix wie in `pool.rs`: nur eine - *fehlende* Datei rechtfertigt ein frisches Objekt. - -- [ ] **`struct Pool` verliert unbekannte Keys beim Umbenennen (`pool.rs:20`).** - Dritte Stelle derselben Klasse. `rename_pool_in` (pool.rs:402-408) liest - typisiert in `Pool` (nur `name` + `credentialType`) und schreibt die ganze - `pool.json` über `write_pool_json` neu — jeder künftige Key stirbt beim - Umbenennen. `ProjectConfig` und `TerminalConfig` haben dafür inzwischen - `#[serde(flatten)] rest`. - - Grundsätzlicher: `flatten` bildet pro Struct nach, was read-modify-write auf - `serde_json::Value` von Natur aus kann (so macht es `add_archive_permission`, - archive.rs:56-90). Statt es an jedem Struct einzeln zu wiederholen, wäre ein - gemeinsamer Helfer die Lösung, die die Klasse wirklich schließt. - -- [ ] **Archiv-Dateinamen: `create_new` statt `exists()` (`archive.rs`, `free_path`).** - Die Kollisionsprüfung schaut vorab nach (`exists()`), die Garantie liegt aber - nicht im Schreibvorgang — klassisches TOCTOU. Als Einbenutzer-App folgenlos, - **aber nicht mehr beim Maschinen-Sync**: Zwei Rechner können in derselben - Minute mit derselben Titelzeile ins synchronisierte Archiv schreiben, und - dann greift der Vorabblick zu spät. `OpenOptions::new().create_new(true)` in - der Schleife gibt dieselbe Struktur, holt die Kollisionsfreiheit aber vom - Dateisystem. Mitzudenken: Was der Sync-Mechanismus selbst bei zwei gleichen - Namen macht (Konfliktkopien?) — der Fix deckt nur die lokale Seite. - -- [ ] **Projekt-Artefakte im Projektordner bündeln (`.ai-control/`?).** - `ai-control.json` und das Projekt-Icon liegen heute lose im Projektordner. - Idee: beides in ein Unterverzeichnis (z. B. `.ai-control/`) zusammenziehen, - damit der Projektordner sauber bleibt und alles an einem Ort steht. - Offen: Migrationspfad für bestehende Projekte, Rückwärtskompatibilität - beim Lesen (altes Layout weiter erkennen). - -- [ ] **Migrations-Assistent: Projekt sauber löschen.** - Löschen soll alle Ressourcen des Projekts aus dem Ordner entfernen - (Config, Icon, ggf. Archiv-Rechte in `.claude/settings.json`, - Registry-Eintrag in `projects.json`) — nicht nur den Registry-Eintrag. - Vorher anzeigen, was entfernt wird. - -- [ ] **Archiv-Ordner-Handling sauber aufsetzen.** - Beim Setzen eines Archiv-Homes explizit abfragen statt still anlegen: - Zielordner bestätigen, bestehenden Inhalt erkennen, klarmachen was passiert. - Wechsel eines bereits gesetzten Archiv-Homes braucht eine - Migrationsmöglichkeit (Dokumente mitnehmen oder liegen lassen) — - als kritisch einstufen: hier hängen echte Nutzerdaten dran, also - nichts implizit verschieben oder überschreiben. - -- [ ] **`pool` gehört nicht in die projektbezogene `ai-control.json`.** - Der Pool ist rechnerspezifisch: gleicher Claude-Account, aber pro Maschine - ein anderer Pool. Versioniert im Projekt trägt die Datei die Zuordnung - über Rechnergrenzen falsch weiter (aktuell steht dort die UUID - `c39d96c9-…`, gepusht mit 5081efc). - - Zu klären: Trennung projektbezogen (archiveHome, Theme, Icon) vs. - maschinenbezogen (pool). Optionen — projekt-lokale, nicht versionierte - Datei, oder Pool pro Rechner zentral in der `projects.json`-Registry - unter `~/.config/ai-control`. Nachdenken, noch keine Entscheidung. - -- [ ] **Settings-Dialog (⚙) neu gestalten — dringend, Plan liegt vor (2026-07-20).** - Ist-Zustand: sieben Felder untereinander, drei Zeilen-Layouts, rohe - Pfade, zwei gemischte Interaktionsmodelle (Ordner/Archiv schreiben - sofort, Titel/Theme/Icon/Todo erst beim Speichern). - Abgestimmter Plan: (1) drei Gruppen mit Eyebrows — Darstellung - (Titel/Theme/Dock-Icon), Ordner (Projekt/Arbeitsordner/Archiv), - Session (Todoliste); (2) einheitliche Zeile Label|Wert|Aktionen, - Pfade ~-kontrahiert mit Hover-Pop; (3) Sofort-Schreiber optisch als - eigene Gruppe, Speichern bezieht sich erkennbar nur auf Darstellung + - Session, „gilt ab nächstem Start"-Hinweis an die betroffene Gruppe; - (4) festes Dialog-Grid, Theme-Variablen des Hauptfensters. - Nur ProjectList.vue (Template + Styles), keine Backend-Änderung. +Pools trennen Konfiguration, nicht Zugriff: Die Keychain-Einträge sind +bewusst über `/usr/bin/security` bzw. Keyring promptfrei lesbar — jeder +Prozess des Nutzers kann jeden Pool-Key lesen. So gewollt, kein +Isolationsversprechen. diff --git a/ai-control.json b/ai-control.json deleted file mode 100644 index 725c8b9..0000000 --- a/ai-control.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "pool": "c39d96c9-ec88-4953-8d4e-23a2ea3ea388", - "archiveHome": "~/claude-projects/claude-ai-control/archive", - "terminal": { - "theme": "monokai", - "icon": "ai-control.png" - } -}