diff --git a/src/cache.rs b/src/cache.rs index 833626b..ee7f7f0 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -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 { 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); + } +}