test: Security-Tests für Dry-Run-Funktionen ergänzt
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>
This commit is contained in:
@@ -145,3 +145,99 @@ EOF
|
|||||||
[ "$status" -eq 0 ]
|
[ "$status" -eq 0 ]
|
||||||
[ ! -d "$CONFIG_DIR/sync.lock" ]
|
[ ! -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 ]
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user