Trockenlauf als Standard, Backups vor Download, Security-Verbesserungen #6

Merged
martin merged 5 commits from feat/sync-delete-with-backup into main 2026-04-21 07:12:11 +02:00
Owner

Zusammenfassung

Diese PR implementiert einen Drei-Schichten-Sicherheitsansatz für die Synchronisation:

1. Trockenlauf als Standard (Fail-Safe)

  • Standardaufruf zeigt nur was synchronisiert würde (keine Änderungen)
  • --execute oder -e Flag für echten Datenabgleich erforderlich
  • Bestätigung per Dialog (optional mit DRY_RUN_SKIP_CONFIRM=1 überspring bar)

2. Lokale Backups vor Downloads (Data Protection)

  • Vor dem Download werden Dateien in -bak Verzeichnisse verschoben
  • --delete Flag entfernt nur gelöschte Dateien von Server (nicht lokal)
  • Automatische Bereinigung von Backups älter als 2 Jahre

3. Umfangreiche Validierung (Security)

  • Upload-Abbruch bei leeren Quellverzeichnissen
  • Path-Traversal-Schutz für Pfad-Variablen
  • Shell-Injection-Sicherheit in neuen Funktionen
  • 63 Tests (alle bestanden)

Geänderte Dateien

  • scripts/darktable_sync.sh – Dry-Run Logic, Backup-Verzeichnis-Handling
  • scripts/darktable_common.sh – Neue Helper: classify_filetype(), format_rsync_details(), cleanup_old_backups(), confirm_dry_run()
  • install.sh – Interaktive Abfragen (.env Move, LOCAL_PHOTO_DIR)
  • desktop/darktable-sync-only.desktop – +--execute
  • systemd/darktable-sync.service – +--execute
  • tests/ – 20+ neue Tests für Dry-Run & Security

Akzeptanzkriterien

  • Dry-Run ist Standard (Test: "Trockenlauf ist Standard ohne --execute")
  • --execute & -e funktionieren (Tests: "(-e ist Kurzform|--execute fuehrt echten Sync)")
  • Dry-Run erstellt keine Backups (Test: "Trockenlauf erstellt kein Backup")
  • Dry-Run zeigt Zusammenfassung (Test: "Trockenlauf zeigt Ergebnis-Zusammenfassung")
  • Upload bricht bei leerer Quelle ab (Test: "Upload bricht ab wenn Foto-Quellverzeichnis leer ist")
  • Download-Backups vor Änderungen (Test: "Backup-Verzeichnisse werden bei echtem Sync angelegt")
  • Alte Backups (>730 Tage) gelöscht (Test: "cleanup_old_backups: Datei aelter als 730 Tage wird geloescht")
  • Dry-Run schreibt keinen State (Tests: "security: Trockenlauf schreibt keinen Sync-Token")
  • DRY_RUN_SKIP_CONFIRM nur '1' gültig (Test: "security: DRY_RUN_SKIP_CONFIRM akzeptiert nur exakt '1'")
  • Code-Injection unmöglich (8 Security-Tests)

Test-Ergebnisse

Alle 63 Tests bestanden (0 Fehler)

  • 13 Core Sync Tests (mit --execute-Flag)
  • 8 Dry-Run Behavior Tests
  • 6 Backup/Delete Tests
  • 36 Security Tests (Injection, Path-Traversal, Shell-Metacharacters)
## Zusammenfassung Diese PR implementiert einen Drei-Schichten-Sicherheitsansatz für die Synchronisation: ### 1. Trockenlauf als Standard (Fail-Safe) - Standardaufruf zeigt **nur** was synchronisiert würde (keine Änderungen) - `--execute` oder `-e` Flag für echten Datenabgleich erforderlich - Bestätigung per Dialog (optional mit `DRY_RUN_SKIP_CONFIRM=1` überspring bar) ### 2. Lokale Backups vor Downloads (Data Protection) - Vor dem Download werden Dateien in `-bak` Verzeichnisse verschoben - `--delete` Flag entfernt nur gelöschte Dateien von Server (nicht lokal) - Automatische Bereinigung von Backups älter als 2 Jahre ### 3. Umfangreiche Validierung (Security) - Upload-Abbruch bei leeren Quellverzeichnissen - Path-Traversal-Schutz für Pfad-Variablen - Shell-Injection-Sicherheit in neuen Funktionen - 63 Tests (alle bestanden) ## Geänderte Dateien - **scripts/darktable_sync.sh** – Dry-Run Logic, Backup-Verzeichnis-Handling - **scripts/darktable_common.sh** – Neue Helper: classify_filetype(), format_rsync_details(), cleanup_old_backups(), confirm_dry_run() - **install.sh** – Interaktive Abfragen (.env Move, LOCAL_PHOTO_DIR) - **desktop/darktable-sync-only.desktop** – +--execute - **systemd/darktable-sync.service** – +--execute - **tests/** – 20+ neue Tests für Dry-Run & Security ## Akzeptanzkriterien - [x] Dry-Run ist Standard (Test: "Trockenlauf ist Standard ohne --execute") - [x] --execute & -e funktionieren (Tests: "(-e ist Kurzform|--execute fuehrt echten Sync)") - [x] Dry-Run erstellt keine Backups (Test: "Trockenlauf erstellt kein Backup") - [x] Dry-Run zeigt Zusammenfassung (Test: "Trockenlauf zeigt Ergebnis-Zusammenfassung") - [x] Upload bricht bei leerer Quelle ab (Test: "Upload bricht ab wenn Foto-Quellverzeichnis leer ist") - [x] Download-Backups vor Änderungen (Test: "Backup-Verzeichnisse werden bei echtem Sync angelegt") - [x] Alte Backups (>730 Tage) gelöscht (Test: "cleanup_old_backups: Datei aelter als 730 Tage wird geloescht") - [x] Dry-Run schreibt keinen State (Tests: "security: Trockenlauf schreibt keinen Sync-Token") - [x] DRY_RUN_SKIP_CONFIRM nur '1' gültig (Test: "security: DRY_RUN_SKIP_CONFIRM akzeptiert nur exakt '1'") - [x] Code-Injection unmöglich (8 Security-Tests) ## Test-Ergebnisse **Alle 63 Tests bestanden** (0 Fehler) - 13 Core Sync Tests (mit --execute-Flag) - 8 Dry-Run Behavior Tests - 6 Backup/Delete Tests - 36 Security Tests (Injection, Path-Traversal, Shell-Metacharacters)
martin added 5 commits 2026-04-21 07:05:56 +02:00
- .env-Verschiebung aus Projektverzeichnis wird angeboten und bei Bestätigung automatisch ausgeführt
- Lokales Foto-Verzeichnis wird interaktiv abgefragt (mit Hinweis falls es bereits existiert)
- Ausführlicher Hinweis nach Anlegen der Default-.env mit Pflichtfeldern und nächsten Schritten
- bats-Hinweis entfernt (nur für Entwickler relevant)
- Tests: Umlaut-Mismatch in security.bats behoben, teardown() für Lock-Isolation ergänzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ohne Flags führt darktable_sync.sh jetzt einen Trockenlauf durch:
- Banner mit Hinweis und Bestätigungsabfrage vor dem Start
- rsync läuft mit --dry-run (keine Dateiänderungen)
- Keine destruktiven Operationen: kein Backup, kein Token-Schreiben,
  kein sync_pending entfernen
- Zusammenfassung nach Richtung (Upload/Download) und Aktion
  (neu/aktualisiert/gelöscht) aufgeschlüsselt
- Optionale Detailansicht: Dateien gruppiert nach Typ (Foto, XMP,
  Datenbank, Video, Sonstiges)

Mit --execute oder -e wird der echte Sync wie bisher ausgeführt.
Desktop-Entry und Systemd-Service auf --execute aktualisiert.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
12 neue Tests prüfen: classify_filetype gegen Injection, format_rsync_details
mit manipulierten Logs, RSYNC_DRY_FLAG-Isolation, Trockenlauf schreibt keine
Tokens/Versionsdateien, DRY_RUN_SKIP_CONFIRM-Grenzen, unbekannte Argumente.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Reduziere Dateizugriffe von 12 auf 2 durch Pufferung der Log-Inhalte.
Liest Upload- und Download-Logs jeweils einmal, statt sie 6x zu lesen.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Gelöschte Dateien werden beim Download ins Backup-Verzeichnis verschoben
(${LOCAL_PHOTO_DIR}-bak, ${LOCAL_DARKTABLE_DB_DIR}-bak) statt permanent
gelöscht. Upload verwendet --delete ohne Backup. Backups älter als 2 Jahre
werden automatisch bereinigt. Safeguard verhindert --delete bei leerem
Quellverzeichnis. validate_path prüft jetzt auch lokale Pfade.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
martin merged commit 0dd2464108 into main 2026-04-21 07:12:11 +02:00
martin deleted branch feat/sync-delete-with-backup 2026-04-21 07:12:11 +02:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: martin/darktable-sync#6