Files
tessera-ctl/.planning/quick/261009-dkv-modul-dateien-etappe-2a-teilen-von-datei/261009-dkv-REVIEW.md
T

9.0 KiB

phase, reviewed, depth, findings, status
phase reviewed depth findings status
quick-261009-dkv 2026-10-09 standard
critical warning info total
1 4 6 11
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

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“.