95 lines
9.0 KiB
Markdown
95 lines
9.0 KiB
Markdown
---
|
|
phase: quick-261009-dkv
|
|
reviewed: 2026-10-09
|
|
depth: standard
|
|
findings:
|
|
critical: 1
|
|
warning: 4
|
|
info: 6
|
|
total: 11
|
|
status: issues_found
|
|
---
|
|
|
|
# Code Review: quick-261009-dkv (Dateien Etappe 2a, Teilen)
|
|
|
|
Gepruefte Commits: 207d37b, bf893af, fe429db, c3adf85, 0585fd1.
|
|
|
|
## Critical
|
|
|
|
### CR-01: Pfade und Kennungen werden durch `cleanText` veraendert
|
|
|
|
`apps/api/src/nextcloud-files/nextcloud-shares.ts` (~285-286, 310, 359): `parseShare` baut `path`/`target` (sowie `shareWith` und die Empfaenger-`id` in `shareeList`) mit `cleanText`. Die Funktion faltet Leerraum, schneidet ab und ersetzt Steuerzeichen. Diese Werte sind aber Bezeichner, die an die Nextcloud zurueckgehen (SharesView, shareTarget, ShareDialog listSharesForPath/createShare, onOpen/focusAfterLoad). `/Kunden/Mueller GmbH` (zwei Leerzeichen) wird zu `/Kunden/Mueller GmbH`; die Operation trifft dann einen anderen Eintrag oder keinen.
|
|
|
|
Fix: Kennungen und Pfade woertlich behalten (bei Steuerzeichen oder Ueberlaenge ablehnen bzw. leer), nur Anzeigetexte (name, label, *Name, message) bereinigen; den Namen aus dem woertlichen letzten Segment ableiten. Spec-Faelle mit doppeltem und nachgestelltem Leerzeichen in Pfaden und Kennungen.
|
|
|
|
## Warnings
|
|
|
|
### WR-01: Link-Zugriff wird beim Speichern stillschweigend auf "Ansehen" gesenkt
|
|
|
|
`LinkShareForm.tsx:58-63`, `share-policy.ts linkUpdateDiff`, Dienst ~422: Ist die bestehende Link-Berechtigung (Bearbeiten, Hochladen, eigene) nicht in `accessOptions`, faellt `initialAccess` auf `view` zurueck, und jedes Speichern (auch nur Bezeichnung oder Ablauf) senkt die Berechtigung. Fix: Zustand `null`, wenn der aktuelle Wert nicht angeboten wird; Zugriff nur senden, wenn der Benutzer gewaehlt hat; aktuellen Wert als deaktivierte gewaehlte Option zeigen ("Aktuell: ..." / "Eigene Berechtigung"). Tests.
|
|
|
|
### WR-02: Biome `organizeImports` schlaegt fehl
|
|
|
|
Betroffen: `nextcloud-files-shares.service.ts`, `nextcloud-files.controller.ts`, `nextcloud-files.module.ts`, `nextcloud-shares.spec.ts`, `components/FileList.tsx`, `components/ShareDialog.tsx`. Fix: `biome check --write` auf genau diesen Dateien; als Tor `biome check` (nicht nur lint) auf allen geaenderten Dateien.
|
|
|
|
### WR-03: Zaehler fuer neue Freigaben im Arbeitsspeicher, Vorpruefungen unbegrenzt
|
|
|
|
`nextcloud-login-guard.ts:191-200`, Dienst 346-373: Grenze auf 10 je 10 Minuten senken; ehrlich kommentieren, dass die Zusicherung je Prozess ohne Neustart gilt und Freigaben, die direkt in der Nextcloud entstehen, ebenfalls gegen deren 20 zaehlen; leere Map-Eintraege entfernen (shareCreates und flowStarts). Wiederholte abgelehnte Versuche (z. B. shareAlreadyExists) muessen begrenzt werden (billiger Versuchszaehler je Benutzer oder Pruefung vor den Nextcloud-Vorabfragen), damit sie die Nextcloud nicht belasten. Dokumente mit "15" anpassen.
|
|
|
|
### WR-04: `refreshAfterExpiry` pro Render neu, ueberlappende Ladevorgaenge
|
|
|
|
`page.tsx:138-139`, `SharesView.tsx:75-116`: Die Funktion wird je Render neu erzeugt, der Lade-Effekt der SharesView laeuft erneut (Flackern); ueberlappende Ladevorgaenge koennen in falscher Reihenfolge angewendet werden. Fix: stabiler Rueckruf (useCallback oder Ref) und Anforderungsnummer im Laden. Tests.
|
|
|
|
## Info
|
|
|
|
### IN-01: Ablaufgrenzen aus Browserdatum statt Serverdatum
|
|
|
|
`share-policy.ts todayLocal/expiryRule`: Die Antwort der Richtlinie der API soll das Serverdatum (JJJJ-MM-TT) enthalten, das Web nutzt es fuer Vorgabe und Hoechstwert.
|
|
|
|
### IN-02: Fehler ohne Abschnittszuordnung
|
|
|
|
`ShareDialog.tsx:105-112, 370-373`: `fail()` setzt `errorSection` nicht (Suchfehler erscheint unter Link); die Suche loescht per onChange alle Fehler. Fix: abschnittsbezogen setzen und loeschen.
|
|
|
|
### IN-03: `accessOf` zu grosszuegig
|
|
|
|
`nextcloud-shares.ts:242-248`: Bearbeiten nur bei (mask&15)==15 (Ordner) bzw. ==3 (Datei); sonst eigene Berechtigung (nur Lesen = Ansehen, nur Anlegen am Ordner = Hochladen). Tests.
|
|
|
|
### IN-04: `generatePassword` Obergrenze
|
|
|
|
`share-policy.ts`: Obergrenze max(64, minLength), hoechstens 256.
|
|
|
|
### IN-05: Kleinere Punkte
|
|
|
|
- Knopf "Aendern" am Link nur bei `share.canEdit`.
|
|
- `copiedId` nach etwa 2 s zuruecksetzen.
|
|
- Weiterfreigaben (Benutzer ist Initiator, `uid_owner` ist ein anderer): richtig einordnen, damit sie den Dialog nicht mit einem Pfad aus fremdem Baum oeffnen.
|
|
|
|
### IN-06: Live-Test fuer Ablehnen
|
|
|
|
`e2e-shares.sh`, Abschnitt `received`: offene Freigabe ueber Tessera ablehnen und pruefen, dass sie weg ist; messen, welche Nextcloud-Route fuer offene Freigaben gilt, den Dienst korrigieren, falls `DELETE shares/{id}` falsch ist.
|
|
|
|
## Zusaetzlich beauftragt
|
|
|
|
- EXTRA-1 (Etappe 1): In einem Ordner ohne Schreibrecht bietet die Dateiansicht "Neuer Ordner", "Hochladen" (und Ablegen) an. Eigene Rechte des geoeffneten Ordners auswerten; Umbenennen/Verschieben/Loeschen je Eintrag nach den Buchstaben.
|
|
- EXTRA-2: Anleitung sagt "mindestens zwei Buchstaben", der Code nutzt `max(1, minSearchLength)`. Anleitung angleichen.
|
|
|
|
## Fix status
|
|
|
|
Behoben in den Commits 78f6cf3 (Schnittstelle) und d487a00 (Oberfläche, Anleitungen).
|
|
|
|
| Befund | Stand | Wie |
|
|
|--------|-------|-----|
|
|
| CR-01 | fixed | Neue Hilfe `verbatimId` (`nextcloud-shares.ts`): Pfad, Ziel, `share_with` und Empfängerkennung der Suche bleiben wörtlich; Steuerzeichen oder Überlänge ergeben „unbrauchbar“ (Freigabe ohne brauchbaren Pfad zählt als versteckt). Nur Anzeigetexte laufen durch `cleanText`. `name` ist das wörtliche letzte Segment; `SharesView` nennt dem Ordner „Im Ordner zeigen/Öffnen“ den Namen aus dem Pfad. Spec-Fälle mit doppeltem und nachgestelltem Leerzeichen in Pfad, Ziel, Name, `share_with` und Suche; Live-Test prüft einen Pfad mit zwei Leerzeichen gegen die echte Nextcloud. |
|
|
| WR-01 | fixed | `LinkShareForm`: Zugriffsauswahl ist `null`, wenn der aktuelle Wert nicht angeboten wird; die Zeile „Aktuell: …“ steht gewählt und gesperrt da; `linkUpdateDiff` sendet `access` nur bei ausdrücklicher Wahl. Tests in `share-policy.test.ts`, `ShareDialog.test.tsx`, API-Spec (nur Bezeichnung ändert die Berechtigung nicht); im Browser mit eigener Berechtigung (21) bestätigt. |
|
|
| WR-02 | fixed | `biome check --write` auf genau den Dateien der Aufgabe; Tor ist `biome check` auf allen 31 geänderten Dateien: 0 Fehler, keine Warnungen. |
|
|
| WR-03 | fixed | Grenze 10 je 10 Minuten, ehrlicher Kommentar (je Prozess ohne Neustart, Freigaben direkt in der Nextcloud zählen gegen deren 20); neuer Versuchszähler `checkShareAttempt` (40 je 10 Minuten, auch abgelehnte) vor den Abfragen an die Nextcloud; ein Wartungslauf je Minute entfernt leere Einträge aus `flowStarts`, `shareCreates`, `shareAttempts`. Dokumente von 15 auf 10 angepasst (CHANGELOG, Anwender-, Administrations-, Betriebs-, Entwicklungshandbuch, Live-Test). |
|
|
| WR-04 | fixed | `page.tsx`: `refreshAfterExpiry` per `useCallback`; `SharesView`: Rückruf über Verweis, Ladenummer `loadSeq` (nur das jüngste Ergebnis gilt, Verlassen entwertet laufende). Tests: Neuzeichnen lädt nicht neu, aktueller Rückruf wird genutzt, überlappende Vorgänge, spätes Ergebnis nach dem Verlassen, Seitentest. |
|
|
| IN-01 | fixed | `parseSharePolicy(data, today)`: Antwort enthält `today` (Serverdatum, `serverDate`); Web nutzt `policyToday` für Vorgabe, Höchst- und Mindestdatum (Rückfall auf die Browseruhr nur ohne Wert). |
|
|
| IN-02 | fixed | `fail(err, section)`; Suchfehler gehören zu „Personen und Gruppen“; Tippen löscht nur Fehler dieses Abschnitts. Tests und Browserbild. |
|
|
| IN-03 | fixed | `accessOf(permissions, itemType)`: Bearbeiten nur bei Maske 15 (Ordner) oder 3 (Datei), Nur hochladen nur bei Maske 4 an Ordnern, Ansehen bei 1, alles andere „Eigene Berechtigung“; Tabelle mit 19 Fällen. |
|
|
| IN-04 | fixed | `generatePassword`: Länge `min(256, max(20, Mindestlänge))`, nie unter der Mindestlänge der Nextcloud. |
|
|
| IN-05 | fixed | „Ändern“ nur bei `canEdit`; „Kopiert“ geht nach 2 s zurück (auch beim Passwort-Hinweis); Weitergaben: gemessen ist `uid_owner` der Freigebende, `uid_file_owner` der Dateieigentümer, `path` im Baum des Aufrufers. Die Weitergabe gilt als eigene Freigabe in „Von mir geteilt“ mit eigenem Pfad (`target` = `path`) und dem Hinweis „Von Ihnen weitergegeben, Eigentümer: …“ (`fileOwnerName`); für die Dateieigentümerin erscheint sie als Freigabe des Freigebenden. Die Befundannahme „uid_owner ist der Dateieigentümer“ stimmt für die Nextcloud nicht. |
|
|
| IN-06 | fixed | Live-Test: offene Freigabe ablehnen über Tessera, Ergebnis geprüft. Gemessen: `DELETE shares/{id}` ist richtig (200, danach weder offen noch angenommen, bei Ben ist die Freigabe ganz weg); `DELETE shares/pending/{id}` ergibt 405. Dienst unverändert. |
|
|
| EXTRA-1 | fixed | Listenantwort trägt `permissions` des Ordners selbst; `entry-permissions.ts` (C, K, N, V, D); Dateiansicht blendet Neuer Ordner, Hochladen, Ablegen (auch auf Ordnerzeilen und per Tastatur), Umbenennen, Verschieben und Löschen aus (Menü, Auswahlleiste, Entf/F2), zeigt „Nur ansehen“; unbekannt ist nie verboten. Messwerte: eigener Ordner `RGDNVCK`, Nur-Ansehen-Ordner `SGDN`, Inhalt `SG`. Tests, Live-Test, Browserbild. |
|
|
| EXTRA-2 | fixed | Anwenderhandbuch: „je nach Einstellung Ihrer Nextcloud ab einem oder zwei Zeichen“. |
|