From 6695a61e0494a5228ca44fd00659399c96109b90 Mon Sep 17 00:00:00 2001 From: DragonSlayer_14 Date: Tue, 15 Sep 2026 23:06:28 +0200 Subject: [PATCH] Fix: default_mount_base_dir() ohne festen "user"-Platzhalter-Fallback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bei fehlendem $USER (z. B. unter systemd --user) fiel die Funktion auf den festen String "user" zurück - zwei verschiedene reale Nutzer hätten sich dadurch denselben Mountpoint-Namensraum /run/media/user/smart-mount geteilt, obwohl die Aufteilung nach Nutzername genau das verhindern soll. Fällt jetzt zuerst auf `id -un`, dann auf eine UID-basierte Kennung zurück, bevor als letzter Ausweg weiterhin "user" verwendet wird. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01LjyzpGWECyKSBWz5DtkTGz --- src/config/schema.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/config/schema.rs b/src/config/schema.rs index 0b14b7f..cfb536d 100644 --- a/src/config/schema.rs +++ b/src/config/schema.rs @@ -19,7 +19,29 @@ fn default_mount_base_dir() -> PathBuf { if sudo_ctdra::is_run_as_root() { PathBuf::from("/run/media/smart-mount") } else { - let user = std::env::var("USER").unwrap_or_else(|_| "user".to_string()); + // Absichtlich KEIN Fallback auf einen festen Platzhalter wie "user": unter `systemd + // --user` (wo $USER nicht immer gesetzt ist) würden dann zwei verschiedene reale + // Nutzer denselben Mountpoint-Namensraum `/run/media/user/smart-mount` teilen - genau + // die Kollision, die die Aufteilung nach Nutzername eigentlich verhindern soll. `id + // -un` liest den Nutzernamen stattdessen direkt vom Kernel. + let run_id = |flag: &str| { + std::process::Command::new("id") + .arg(flag) + .output() + .ok() + .filter(|o| o.status.success()) + .map(|o| String::from_utf8_lossy(&o.stdout).trim().to_string()) + .filter(|s| !s.is_empty()) + }; + let user = std::env::var("USER") + .ok() + .filter(|u| !u.is_empty()) + .or_else(|| run_id("-un")) + // Letzter Ausweg: die numerische UID ist immer verfügbar und auf jedem System + // eindeutig, anders als ein fest codierter Platzhalter-String wie "user", der bei + // mehreren betroffenen Nutzern denselben Namensraum kollidieren ließe. + .or_else(|| run_id("-u").map(|uid| format!("uid-{uid}"))) + .unwrap_or_else(|| "user".to_string()); PathBuf::from("/run/media").join(user).join("smart-mount") } }