9.0 KiB
phase, reviewed, depth, findings, status
| phase | reviewed | depth | findings | status | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| quick-261009-dkv | 2026-10-09 | standard |
|
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. copiedIdnach etwa 2 s zuruecksetzen.- Weiterfreigaben (Benutzer ist Initiator,
uid_ownerist 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“. |