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() {
|
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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user