Repository navigation
KeepLocal v1.14.0
Die zweite Top-10-Runde (ZIP-Härtung, Revisions-UI, Android-Sync & PDF-Anhänge)
Server
- ZIP-Import-Härtung — Endungs-Whitelist + Magic-Bytes-Prüfung + Bildauflösungs-Grenze (40 MP) für Fremd-ZIPs; zuvor war ein .html/.svg-Eintrag Stored XSS
- revisions[]-Projektion — Listen/Detail-Antworten und alle Schreibpfade (PUT, Pin/Archive, Restore, Share, Bild/Datei) sowie der 409-Conflict-Body liefern die Historie nicht mehr mit
- Delta-Pull-Endpunkte — GET /api/notes/meta (Signatur), GET /api/notes/tree (+since), ?since= am Listing — inklusive Grenze ($gte), damit Bulk-Timestamps keine Notiz dauerhaft überspringen
- Backup async I/O — Streaming-Hash + async Kopien; abgebrochene Läufe verworfen ihr Verzeichnis und belegen keine Retention-Slots mehr
- API-Key-Scopes — Keys mit read / read+write, expiresIn als Server-Vokabular (30d/90d/365d/never); Bestands-Keys behalten Vollzugriff
Web
- Revisions-Historie UI — Fassungen ansehen und wiederherstellen (Restore-Status re-armt sich jetzt beim erneuten Anwählen)
- Bulk-Auswahl + Tag-Farb-Punkte — tote Props wiederbelebt; Bulk-Toasts zählen nur tatsächliche API-Calls
- includeMeta-Gating — Meta-Abfragen nur noch bei Bedarf; Settings-API-Key-Expiry-Fix
Android (versionCode 28)
- Tag-Verwaltung über die Bulk-API — Rename/Merge/Delete je ein PATCH /api/notes/tags statt einem Request pro Notiz; Room-Spiegel, offline bleibt der alte Pfad
- PDF-Anhänge — files[] durch alle Mapper (Room 5→6), Upload mit Budget-Prüfung, Löschen, Öffnen über FileProvider
- Background-Sync pulled jetzt — Meta-Signatur-Sonde → Baum-Lösch-Cleanup → seitenweiser ?since=-Delta-Upsert; während des Pulls gequeuete Offline-Edits werden per Live-Check respektiert (kein stiller Verlust mehr)
- API-Keys — Route-Fix /api/api-keys (der Screen 404-te bisher), Scope-Auswahl beim Anlegen, Scope-Anzeige pro Key, Wrapper korrekt entpackt (Einmal-Key war vorher verloren)
Zahlen
Server 409/409 · Web 269/269 · E2E grün · Android-Unit-Tests grün · 16-Agent-Adversarial-Review: 10 Findings bestätigt, alle behoben · APK auf dem Testgerät installiert und gestartet
Bekannt (bewusst offen): PATCH /api/notes/tags lowercased die Quell-Tags, Mongo $in matcht aber case-sensitiv auf gespeicherte Bestände — gemischte Schreibweisen („Einkauf"/„einkauf") werden vom Server-Rename nicht erfasst; Web + Android gleichermaßen, Folge-Issue für eine Normalisierungs-Migration.
🤖 Generated with Claude Code