Block a user
[Perf] Bilder werden 2-3x pro Bild dekodiert in analyze_folder
[Bug] Silent Failures: AI ohne Key, HEIC ohne pillow-heif, Export-Skips
[Bug] Silent Failures: AI ohne Key, HEIC ohne pillow-heif, Export-Skips
Fix in drei Teilen umgesetzt:
a) AI-Phase
_run_analyze_jobprueft API-Key vor Phase 4 (leer / Platzhalteryour_*/ Laenge < 30)ai_skipped-Feld im Status-Result mit klarer…
[Bug] /download loescht Quelle auch bei fehlgeschlagenem ZIP-Schreiben
Fix umgesetzt in server.py:download_kept:
- Erwartete Dateiliste vor ZIP-Erstellung gesammelt
- Pro Datei
zf.writein try/except: Fehler werden gesammelt, nicht geschluckt shutil.rmtree…
[Bug] /download loescht Quelle auch bei fehlgeschlagenem ZIP-Schreiben
[Bug] Unbounded _jobs-Dict + Race in /export/download vs Cleanup
[Bug] Unbounded _jobs-Dict + Race in /export/download vs Cleanup
Fix umgesetzt in server.py:
(a) Jobs-TTL
- Job-Dict bekommt jetzt
created_atbeim Anlegen (/analyze,/export) - Background-Thread
_cleanup_jobspurged Jobs aelter als `_JOB_TTL =…
[Bug] Pillow-Resource-Leak: Image.open() ohne with-Statement
[Bug] Pillow-Resource-Leak: Image.open() ohne with-Statement
Fix umgesetzt:
analyzer.py:_mean_brightness->with Image.open(...)analyzer.py:find_duplicates->with Image.open(...) as img: phash(img)processor.py:get_exif_info-> `with…
[Security] CORS, Security-Header, Token-Speicherung
Fix (a) und (b) umgesetzt in server.py:
CORS — statt allow_origins=["*"] jetzt allow_origin_regex fuer localhost, 127.0.0.1 und lxc<id>-<port>.<domain> (VCH Subdomain-Proxy).…
[Security] CORS, Security-Header, Token-Speicherung
[Security] Token in HttpOnly+SameSite-Cookie statt sessionStorage
[Security] /browse und /move ohne Pfad-Sandboxing
[Security] /browse und /move ohne Pfad-Sandboxing
Fix umgesetzt in server.py:
BROWSE_ROOT = "/home/vchuser"als Sandbox/browselehnt Pfade ausserhalb mit 403 ab,parentistNonean der Wurzel/moveprueft jetzt `tempfile.gettemp…
[Security] DOM-XSS via innerHTML mit User-Inputs (Dateinamen, Browse)
Fix umgesetzt in index.html:
- Upload-Liste (Z.1049 alt): row via
createElement+textContent, kein Template-String mit User-Input - Folder-Browser-Item (Z.1139 alt):
textContentstatt…
[Security] DOM-XSS via innerHTML mit User-Inputs (Dateinamen, Browse)
[Security] IDOR: Job- und ZIP-IDs nicht an Session gebunden
[Security] IDOR: Job- und ZIP-IDs nicht an Session gebunden
Fix umgesetzt in server.py:
- Helper
_request_token(request)extrahiert Bearer-Token (odernoauthbei deaktiviertem APP_PASSWORD) _check_owner(owner, request)-> 403 bei Mismatch -…
[Security] Auth-Hardening: Timing-Attack, fehlendes Rate-Limit
Fix umgesetzt in server.py:
secrets.compare_digest()fuer Passwort-Vergleich- In-Memory-Rate-Limit: max. 5 Versuche/Minute pro IP, sonst HTTP 429
Manueller Test: 5 falsche Versuche -> 6.…
[Security] Auth-Hardening: Timing-Attack, fehlendes Rate-Limit