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") } }