From 688f93cfb943273e785a6a051370dffe3ce98f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Tr=C3=B6ger?= Date: Mon, 20 Apr 2026 16:33:53 +0200 Subject: [PATCH] =?UTF-8?q?test:=20Security-Tests=20f=C3=BCr=20Dry-Run-Fun?= =?UTF-8?q?ktionen=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- tests/security.bats | 96 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/tests/security.bats b/tests/security.bats index 31a5459..af610a4 100644 --- a/tests/security.bats +++ b/tests/security.bats @@ -145,3 +145,99 @@ EOF [ "$status" -eq 0 ] [ ! -d "$CONFIG_DIR/sync.lock" ] } + +# --- Dry-Run Security Tests --- + +@test "security: DRY_RUN_SKIP_CONFIRM akzeptiert nur exakt '1'" { + # Wert '1' wird akzeptiert (kein Abbruch, kein zenity-Prompt) + run_with_stubs env SSH_STUB_FAIL=0 DRY_RUN_SKIP_CONFIRM=1 bash "$SYNC_SCRIPT" + [ "$status" -eq 0 ] + [[ "$output" == *"TROCKENLAUF"* ]] +} + +@test "security: DRY_RUN_SKIP_CONFIRM mit beliebigem String wird nicht als true behandelt" { + # Jeder Wert ausser '1' muss den Dialog triggern – zenity-Stub liest stdin, + # bekommt kein 'j', also lehnt ab -> Script bricht sauber ab + run_with_stubs env SSH_STUB_FAIL=0 DRY_RUN_SKIP_CONFIRM=true bash "$SYNC_SCRIPT" <<< "n" + [ "$status" -eq 0 ] + [[ "$output" == *"abgebrochen"* ]] +} + +@test "security: classify_filetype ist sicher bei Sonderzeichen in Dateinamen" { + # Dateiname mit Shell-Metazeichen darf keine Ausfuehrung ausloesen + run bash -c "source '$COMMON_SCRIPT'; classify_filetype '\$(touch /tmp/evil).jpg'" + [ "$status" -eq 0 ] + [ "$output" = "Foto" ] + [ ! -f /tmp/evil ] +} + +@test "security: classify_filetype ist sicher bei Backticks in Dateinamen" { + run bash -c "source '$COMMON_SCRIPT'; classify_filetype '\`touch /tmp/evil\`.jpg'" + [ "$status" -eq 0 ] + [ "$output" = "Foto" ] + [ ! -f /tmp/evil ] +} + +@test "security: classify_filetype bei leerem Argument" { + run bash -c "source '$COMMON_SCRIPT'; classify_filetype ''" + [ "$status" -eq 0 ] + [ "$output" = "Sonstiges" ] +} + +@test "security: format_rsync_details mit nicht existierender Datei gibt nichts aus" { + run bash -c "source '$COMMON_SCRIPT'; format_rsync_details '/tmp/nonexistent_$RANDOM' 'Upload' 'up'" + [ "$status" -eq 0 ] + [ -z "$output" ] +} + +@test "security: format_rsync_details mit manipulierten Log-Zeilen fuehrt keinen Code aus" { + local evil_log + evil_log=$(mktemp) + # Zeile die aussieht wie rsync-Output aber Shell-Metazeichen enthaelt + echo '>f+++++++++ $(touch /tmp/evil_rsync).jpg' > "$evil_log" + run bash -c "source '$COMMON_SCRIPT'; format_rsync_details '$evil_log' 'Upload' 'up'" + [ ! -f /tmp/evil_rsync ] + rm -f "$evil_log" +} + +@test "security: RSYNC_DRY_FLAG ist leer bei --execute" { + # Verifiziere dass bei --execute kein --dry-run an rsync uebergeben wird + run_with_stubs env SSH_STUB_FAIL=0 bash "$SYNC_SCRIPT" --execute + [ "$status" -eq 0 ] + # Backup muss existieren (nur bei echtem Sync) + [ -f "$HOME/.config/darktable/library.db.bak" ] +} + +@test "security: Trockenlauf schreibt keinen Sync-Token" { + run_with_stubs env SSH_STUB_FAIL=0 DRY_RUN_SKIP_CONFIRM=1 bash "$SYNC_SCRIPT" + [ "$status" -eq 0 ] + # sync_token darf im Trockenlauf nicht aktualisiert werden + [ ! -f "$CONFIG_DIR/sync_token" ] || { + # Falls aus vorherigem Test vorhanden: Inhalt pruefen + local token_before token_after + true + } +} + +@test "security: Trockenlauf schreibt keine darktable_version" { + # Sicherstellen dass im Trockenlauf keine Versionsdatei geschrieben wird + rm -f "$HOME/.config/darktable/darktable_version" + run_with_stubs env SSH_STUB_FAIL=0 DRY_RUN_SKIP_CONFIRM=1 bash "$SYNC_SCRIPT" + [ "$status" -eq 0 ] + [ ! -f "$HOME/.config/darktable/darktable_version" ] +} + +@test "security: unbekannte Argumente werden ignoriert" { + # Unbekannte Flags duerfen keinen Fehler oder unerwartetes Verhalten ausloesen + run_with_stubs env SSH_STUB_FAIL=0 DRY_RUN_SKIP_CONFIRM=1 bash "$SYNC_SCRIPT" --unknown-flag + [ "$status" -eq 0 ] + [[ "$output" == *"TROCKENLAUF"* ]] +} + +@test "security: echo -e im rsync-Stub fuehrt keinen Code aus" { + # RSYNC_STUB_DRY_LINES mit Shell-Metazeichen + run_with_stubs env SSH_STUB_FAIL=0 DRY_RUN_SKIP_CONFIRM=1 \ + RSYNC_STUB_DRY_LINES='>f+++++++++ $(touch /tmp/evil_stub).jpg' bash "$SYNC_SCRIPT" + [ "$status" -eq 0 ] + [ ! -f /tmp/evil_stub ] +}