Robuste Darktable-Synchronisation: sequenzieller Ablauf, Sicherheitshaertung #1

Merged
martin merged 3 commits from feature/robust-sync into main 2026-04-19 20:00:32 +02:00
Owner

Zusammenfassung

  • Sequenzieller Sync-Ablauf: Pre-Sync → Darktable → Post-Sync (keine Race Condition mehr)
  • Server-Erreichbarkeit: Dialog vor Darktable-Start, Abbruch bei Ablehnung
  • Versionsprüfung: Major.Minor-Abweichung → Warnung + Abbruch
  • Concurrent-Schutz: darktable.active-Marker auf Server
  • Offline-Handling: sync_pending-Marker, Hinweis beim nächsten Start
  • Gemeinsame Hilfsfunktionen in darktable_common.sh (DRY)
  • Atomares Locking via mkdir (TOCTOU-sicher, Symlink-resistent)
  • .env-Injection-Schutz: Shell-Operatoren werden geblockt
  • validate_path(): SSH-Injection über Pfad-Variablen verhindert
  • systemd-Timer entfernt

Akzeptanzkriterien

  • Pre-Sync wird vollständig abgewartet bevor Darktable startet (darktable_wrapper.sh: blockierender "$SYNC_BIN"-Aufruf)
  • Post-Sync läuft automatisch nach dem Schließen von Darktable (Wrapper wartet auf Darktable-Exit)
  • Server nicht erreichbar: Rückfrage (zenity/kdialog/read), bei Ablehnung Abbruch (Test 17)
  • Darktable-Version geprüft: Major.Minor-Abweichung → Abbruch (Tests 14–15)
  • Concurrent-Nutzung erkannt und gewarnt (darktable.active auf Server)
  • Offline-Post-Sync erzeugt sync_pending-Marker (Test 19)
  • Pre-Sync erkennt sync_pending und zeigt Hinweis
  • .env aus festem Pfad geladen (~/.config/darktable-sync/.env) (Test 3)
  • Lock-Dateien (*.lock) vom Sync ausgeschlossen (--exclude '*.lock')
  • DB-Backup vor Download (library.db.bak, data.db.bak) (Test 13)
  • systemd-Timer entfernt
  • BATS-Tests: 31/31 grün (common, sync, wrapper, security)
  • Security: .env-Injection geblockt (Tests 21–22)
  • Security: Pfad-Injection geblockt (Tests 23–24)
  • Security: Lockdir atomar, Symlink-resistent (Tests 25–26)
  • Security: DARKTABLE_BIN-basename validiert (Test 27)

Geänderte Dateien

Datei Änderung
scripts/darktable_common.sh Neu: gemeinsame Hilfsfunktionen
scripts/darktable_sync.sh Komplett neu
scripts/darktable_wrapper.sh Komplett neu
scripts/install.sh Angepasst
scripts/uninstall.sh Angepasst
.env.example DARKTABLE_BIN, SYNC_BIN ergänzt
tests/helpers/setup.bash Neu: BATS-Hilfsfunktionen
tests/stubs/ Neu: PATH-basierte Stubs
tests/darktable_common.bats Neu
tests/darktable_sync.bats Neu
tests/darktable_wrapper.bats Neu
tests/security.bats Neu

🤖 Generated with Claude Code

## Zusammenfassung - Sequenzieller Sync-Ablauf: Pre-Sync → Darktable → Post-Sync (keine Race Condition mehr) - Server-Erreichbarkeit: Dialog vor Darktable-Start, Abbruch bei Ablehnung - Versionsprüfung: Major.Minor-Abweichung → Warnung + Abbruch - Concurrent-Schutz: `darktable.active`-Marker auf Server - Offline-Handling: `sync_pending`-Marker, Hinweis beim nächsten Start - Gemeinsame Hilfsfunktionen in `darktable_common.sh` (DRY) - Atomares Locking via `mkdir` (TOCTOU-sicher, Symlink-resistent) - `.env`-Injection-Schutz: Shell-Operatoren werden geblockt - `validate_path()`: SSH-Injection über Pfad-Variablen verhindert - systemd-Timer entfernt ## Akzeptanzkriterien - [x] Pre-Sync wird vollständig abgewartet bevor Darktable startet (`darktable_wrapper.sh`: blockierender `"$SYNC_BIN"`-Aufruf) - [x] Post-Sync läuft automatisch nach dem Schließen von Darktable (Wrapper wartet auf Darktable-Exit) - [x] Server nicht erreichbar: Rückfrage (zenity/kdialog/read), bei Ablehnung Abbruch (Test 17) - [x] Darktable-Version geprüft: Major.Minor-Abweichung → Abbruch (Tests 14–15) - [x] Concurrent-Nutzung erkannt und gewarnt (`darktable.active` auf Server) - [x] Offline-Post-Sync erzeugt `sync_pending`-Marker (Test 19) - [x] Pre-Sync erkennt `sync_pending` und zeigt Hinweis - [x] `.env` aus festem Pfad geladen (`~/.config/darktable-sync/.env`) (Test 3) - [x] Lock-Dateien (`*.lock`) vom Sync ausgeschlossen (`--exclude '*.lock'`) - [x] DB-Backup vor Download (`library.db.bak`, `data.db.bak`) (Test 13) - [x] systemd-Timer entfernt - [x] BATS-Tests: 31/31 grün (common, sync, wrapper, security) - [x] Security: `.env`-Injection geblockt (Tests 21–22) - [x] Security: Pfad-Injection geblockt (Tests 23–24) - [x] Security: Lockdir atomar, Symlink-resistent (Tests 25–26) - [x] Security: `DARKTABLE_BIN`-basename validiert (Test 27) ## Geänderte Dateien | Datei | Änderung | |-------|----------| | `scripts/darktable_common.sh` | Neu: gemeinsame Hilfsfunktionen | | `scripts/darktable_sync.sh` | Komplett neu | | `scripts/darktable_wrapper.sh` | Komplett neu | | `scripts/install.sh` | Angepasst | | `scripts/uninstall.sh` | Angepasst | | `.env.example` | DARKTABLE_BIN, SYNC_BIN ergänzt | | `tests/helpers/setup.bash` | Neu: BATS-Hilfsfunktionen | | `tests/stubs/` | Neu: PATH-basierte Stubs | | `tests/darktable_common.bats` | Neu | | `tests/darktable_sync.bats` | Neu | | `tests/darktable_wrapper.bats` | Neu | | `tests/security.bats` | Neu | 🤖 Generated with [Claude Code](https://claude.com/claude-code)
martin added 3 commits 2026-04-19 20:00:16 +02:00
- Race Condition behoben: Pre-Sync wird vollstaendig abgewartet bevor Darktable startet
- Post-Sync nach Schliessen von Darktable eingefuehrt (bisher fehlend)
- .env aus festem Pfad ~/.config/darktable-sync/.env geladen (nicht mehr relativ)
- Server-Erreichbarkeit per SSH statt ping (Firewall-sicher)
- Darktable-Versionscheck (Major.Minor) vor Download mit Abbruch bei Konflikt
- DB-Backup vor jedem Download (library.db.bak, data.db.bak)
- sync_pending-Marker bei Offline/Fehler, Hinweis beim naechsten Start
- darktable.active-Marker auf Server fuer Concurrent-Erkennung
- Lock-Dateien vom Sync ausgeschlossen
- systemd-Timer entfernt, Service bleibt als manueller Trigger
- Gemeinsame Hilfsfunktionen in darktable_common.sh extrahiert
- 20 BATS-Tests mit vollstaendigem Stub-System ohne GUI-Dialoge

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- log() Funktion in darktable_common.sh ausgelagert (war doppelt vorhanden)
- ssh_server() Hilfsfunktion für wiederholte SSH-Aufrufe mit konsistenten Optionen
- ssh_server() nutzen statt inline SSH-Befehle in darktable_sync.sh und darktable_wrapper.sh
- Reduzierung von SSH-Optionswiederbholungen (ConnectTimeout, BatchMode, Port)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- load_config blockiert Shell-Operatoren (;|&`) in .env-Werten
- validate_path prueft Sonderzeichen und Path-Traversal in Pfad-Variablen
- validate_config prüft DARKTABLE_BIN-basename und ruft validate_path auf
- Lockdir-Trap erst nach erfolgreicher Lock-Akquisition registriert
  (verhindert dass externer Lockdir bei gescheitertem Lock entfernt wird)
- uninstall.sh nutzt rmdir statt rm -rf fuer Lockdir
- security.bats mit 10 Tests fuer alle Sicherheitsanforderungen

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
martin merged commit 0cd9679767 into main 2026-04-19 20:00:32 +02:00
martin deleted branch feature/robust-sync 2026-04-19 20:00:32 +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#1