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:
2026-09-13 19:21:11 +02:00
co-authored by Claude Sonnet 5
parent 464262265c
commit 8d47f957b6
+24 -1
View File
@@ -109,12 +109,14 @@ fn ensure_cache_dir(dir: &Path) -> Result<(), String> {
dir.display() dir.display()
) )
})?; })?;
}
// create_dir_all() unterliegt dem Prozess-Umask; explizites chmod ist nötig, um // 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). // 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)] #[cfg(unix)]
std::fs::set_permissions(dir, std::fs::Permissions::from_mode(0o777)) std::fs::set_permissions(dir, std::fs::Permissions::from_mode(0o777))
.map_err(|e| format!("Verzeichnis-Rechte konnten nicht gesetzt werden: {e}"))?; .map_err(|e| format!("Verzeichnis-Rechte konnten nicht gesetzt werden: {e}"))?;
}
Ok(()) Ok(())
} }
@@ -173,3 +175,24 @@ pub async fn try_open_cache(db_path: &Path) -> Option<Cache> {
chmod_cache_sidecars(db_path); chmod_cache_sidecars(db_path);
Some(cache) 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);
}
}