Wenn zf.write() fuer ein File fehlschlaegt oder ZIP korrupt ist, wird folder_abs trotzdem geloescht. ignore_errors=True schluckt alles.
Fix
ZIP-Inhalt verifizieren (Size > 0, alle Dateien drin), nur dann loeschen. Fehler loggen statt schlucken.
## Problem
`server.py:177-198`:
```python
buf = io.BytesIO()
with zipfile.ZipFile(buf, "w", zipfile.ZIP_DEFLATED) as zf:
for fname in sorted(os.listdir(folder_abs)):
...
if os.path.isfile(fpath):
zf.write(fpath, fname)
buf.seek(0)
shutil.rmtree(folder_abs, ignore_errors=True) # immer!
```
Wenn `zf.write()` fuer ein File fehlschlaegt oder ZIP korrupt ist, wird `folder_abs` trotzdem geloescht. `ignore_errors=True` schluckt alles.
## Fix
ZIP-Inhalt verifizieren (Size > 0, alle Dateien drin), nur dann loeschen. Fehler loggen statt schlucken.
Fix umgesetzt in `server.py:download_kept`:
- Erwartete Dateiliste vor ZIP-Erstellung gesammelt
- Pro Datei `zf.write` in try/except: Fehler werden gesammelt, nicht geschluckt
- `shutil.rmtree` nur wenn alle erwarteten Dateien erfolgreich gepackt wurden
- Bei Teilerfolg: HTTP 500 mit Klartext `Nicht alle Dateien konnten gepackt werden (m/n). Quelle bleibt erhalten.`
Manueller Test:
- 2 lesbare Bilder -> 200 + 1124B, Ordner geloescht
- 1 lesbare + 1 chmod 000 Datei -> 500, Ordner bleibt erhalten
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem
server.py:177-198:Wenn
zf.write()fuer ein File fehlschlaegt oder ZIP korrupt ist, wirdfolder_abstrotzdem geloescht.ignore_errors=Trueschluckt alles.Fix
ZIP-Inhalt verifizieren (Size > 0, alle Dateien drin), nur dann loeschen. Fehler loggen statt schlucken.
Fix umgesetzt in
server.py:download_kept:zf.writein try/except: Fehler werden gesammelt, nicht geschlucktshutil.rmtreenur wenn alle erwarteten Dateien erfolgreich gepackt wurdenNicht alle Dateien konnten gepackt werden (m/n). Quelle bleibt erhalten.Manueller Test: