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:
+23
-1
@@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user