Fix: chmod 0777 auf /var/lib/mac2ip nur beim Neuanlegen ausführen
Zuvor wurde das explizite chmod bei jedem Aufruf ausgeführt, auch wenn das Verzeichnis bereits existierte. Bei einem bereits root-eigenen, durch die Paketierungs-Skripte angelegten Verzeichnis scheitert das chmod für unprivilegierte Nutzer mit EPERM, wodurch der Cache bei jedem Lauf stillschweigend deaktiviert wurde. Das chmod läuft jetzt nur direkt nach create_dir_all(), also ausschließlich wenn der Prozess das Verzeichnis selbst neu anlegt. Ergänzt Unit-Tests für beide Fälle (bestehendes Systemverzeichnis, Neuanlage). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SnWfGGqHJGh2AhZ6uhotaD
This commit is contained in:
+28
-5
@@ -109,12 +109,14 @@ fn ensure_cache_dir(dir: &Path) -> Result<(), String> {
|
||||
dir.display()
|
||||
)
|
||||
})?;
|
||||
// create_dir_all() unterliegt dem Prozess-Umask; explizites chmod ist nötig, um
|
||||
// wirklich 0777 zu erreichen (Verzeichnis-Rechte steuern nicht die Umask neuer Dateien).
|
||||
// Wird nur beim Neuanlegen ausgeführt; bei existierenden Verzeichnissen würde ein
|
||||
// unprivilegierter Aufruf auf root-eigenen Pfaden mit EPERM fehlschlagen.
|
||||
#[cfg(unix)]
|
||||
std::fs::set_permissions(dir, std::fs::Permissions::from_mode(0o777))
|
||||
.map_err(|e| format!("Verzeichnis-Rechte konnten nicht gesetzt werden: {e}"))?;
|
||||
}
|
||||
// create_dir_all() unterliegt dem Prozess-Umask; explizites chmod ist nötig, um
|
||||
// wirklich 0777 zu erreichen (Verzeichnis-Rechte steuern nicht die Umask neuer Dateien).
|
||||
#[cfg(unix)]
|
||||
std::fs::set_permissions(dir, std::fs::Permissions::from_mode(0o777))
|
||||
.map_err(|e| format!("Verzeichnis-Rechte konnten nicht gesetzt werden: {e}"))?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -173,3 +175,24 @@ pub async fn try_open_cache(db_path: &Path) -> Option<Cache> {
|
||||
chmod_cache_sidecars(db_path);
|
||||
Some(cache)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_ensure_cache_dir_existing_directory_does_not_fail() {
|
||||
// Bestehende Systemverzeichnisse (die einem unprivilegierten Nutzer nicht gehören)
|
||||
// dürfen beim Überprüfen keinen EPERM-Fehler werfen.
|
||||
assert!(ensure_cache_dir(Path::new("/tmp")).is_ok());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_ensure_cache_dir_creates_new_directory() {
|
||||
let temp_dir = std::env::temp_dir().join(format!("mac2ip_test_{}", std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_nanos()));
|
||||
assert!(!temp_dir.exists());
|
||||
assert!(ensure_cache_dir(&temp_dir).is_ok());
|
||||
assert!(temp_dir.exists());
|
||||
let _ = std::fs::remove_dir(&temp_dir);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user