Sicherheitsrunde II: PTY-Label, Tool-Grenzen, atomare Schreibvorgänge
- term_start nur noch für das eigene term-<projekt>-Fenster — das (abgelöste) Panel-Fenster kann keine Shell mehr starten und beschreiben. Die Tauri-ACL greift für App-Commands nachweislich nicht (kein __app-acl__-Manifest, Prüfung gegen tauri 2.11.5); die Label-Prüfung ist damit die Schranke, nicht deren Verdopplung. - archive_panel verliert das dir-Argument: Archiv-Home samt dauerhafter Rechtevergabe (additionalDirectories + Edit-Allow) setzt nur noch die UI mit Nutzer-Dialog, kein Tool-Argument des Modells. - write_panel(path) liest nur noch aus Projekt-, Arbeits- und Archiv-Ordnern (canonicalize, symlink-fest), reguläre Dateien bis 2 MB mit hartem Byte-Cap — der promptfreie Weg umgeht das Read-Permission-Modell von Claude Code nicht mehr. - write_atomic (temp + rename) für alle JSON-Config-Schreiber: Projekt- Config, .claude/settings.json, Registry, App-Settings, pool.json, Pool-settings.json, claudes .claude.json, Todo-Hook. - write_secret_file: create_new mit 0600 statt schreiben-und-abdichten; kein umask-Fenster, Symlinks werden nicht gefolgt. - PTY-Umgebung: geerbte ANTHROPIC_API_KEY/ANTHROPIC_AUTH_TOKEN entfernt. - panel_file & Geschwister prüfen die Projekt-ID (zweite Linie). - Befehlskacheln filtern Bidi-/Zero-Width-Zeichen aus Anzeige und Zwischenablage; der Lösch-Abgleich behält den Originaltext.
This commit is contained in:
@@ -102,6 +102,12 @@ pub fn build_window(
|
||||
/// (settings.json: claudeCommand, Default claude) im Projektordner, mit dem
|
||||
/// Pool-Verzeichnis als CLAUDE_CONFIG_DIR. Die Login-Shell aus $SHELL (-l)
|
||||
/// baut den PATH aus ihren Profil-Dateien auf — shell-agnostisch.
|
||||
///
|
||||
/// Nur das Terminal-Fenster selbst darf seine PTY starten: Die Terminals-Map
|
||||
/// ist über das Fensterlabel adressiert, und `term_write` schreibt danach in
|
||||
/// die laufende Shell. Ohne die Label-Prüfung könnte auch das abgelöste
|
||||
/// Panel-Fenster — und damit jedes Skript in dessen Webview — eine Shell
|
||||
/// starten und beschreiben.
|
||||
#[tauri::command]
|
||||
pub fn term_start(
|
||||
window: tauri::WebviewWindow,
|
||||
@@ -110,6 +116,9 @@ pub fn term_start(
|
||||
rows: u16,
|
||||
cols: u16,
|
||||
) -> Result<(), String> {
|
||||
if window.label() != format!("term-{project}") {
|
||||
return Err(format!("PTY nur für das Terminal-Fenster: {}", window.label()));
|
||||
}
|
||||
let paths = Paths::real();
|
||||
let cwd = project_dir(&paths, &project)?;
|
||||
|
||||
@@ -143,6 +152,11 @@ pub fn term_start(
|
||||
|
||||
let mut cmd = crate::platform::shell_command(&claude_command(&paths));
|
||||
cmd.cwd(&cwd);
|
||||
// Aus der App-Umgebung geerbte Anthropic-Credentials rausnehmen — ein
|
||||
// ANTHROPIC_API_KEY sticht sonst den apiKeyHelper des Pools. Variablen, die
|
||||
// erst das Shell-Profil der Login-Shell setzt, erreicht das nicht.
|
||||
cmd.env_remove("ANTHROPIC_API_KEY");
|
||||
cmd.env_remove("ANTHROPIC_AUTH_TOKEN");
|
||||
cmd.env("TERM", "xterm-256color");
|
||||
cmd.env("AI_CONTROL_PANEL", &panel_path);
|
||||
cmd.env("AI_CONTROL_COMMANDS", &commands_path);
|
||||
|
||||
Reference in New Issue
Block a user