From 8d47f957b6673d0329ecda4b5129de8726ac9e81 Mon Sep 17 00:00:00 2001 From: DragonSlayer_14 Date: Sun, 13 Sep 2026 19:21:11 +0200 Subject: [PATCH] =?UTF-8?q?Fix:=20chmod=200777=20auf=20/var/lib/mac2ip=20n?= =?UTF-8?q?ur=20beim=20Neuanlegen=20ausf=C3=BChren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Claude-Session: https://claude.ai/code/session_01SnWfGGqHJGh2AhZ6uhotaD --- src/cache.rs | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) 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); + } +}