Fix: default_mount_base_dir() ohne festen "user"-Platzhalter-Fallback

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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjyzpGWECyKSBWz5DtkTGz
This commit is contained in:
2026-09-15 23:06:28 +02:00
co-authored by Claude Sonnet 5
parent d4d80be1bf
commit 6695a61e04
+23 -1
View File
@@ -19,7 +19,29 @@ fn default_mount_base_dir() -> PathBuf {
if sudo_ctdra::is_run_as_root() { if sudo_ctdra::is_run_as_root() {
PathBuf::from("/run/media/smart-mount") PathBuf::from("/run/media/smart-mount")
} else { } 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") PathBuf::from("/run/media").join(user).join("smart-mount")
} }
} }