127 lines
11 KiB
Markdown
127 lines
11 KiB
Markdown
---
|
||
phase: quick-261009-dkv
|
||
verified: 2026-10-09T12:00:00Z
|
||
status: human_needed
|
||
score: 7/7 must-haves verified
|
||
covered_files:
|
||
- ".planning/quick/261009-dkv-modul-dateien-etappe-2a-teilen-von-datei/261009-dkv-PLAN.md"
|
||
- ".planning/quick/261009-dkv-modul-dateien-etappe-2a-teilen-von-datei/261009-dkv-SUMMARY.md"
|
||
- "CHANGELOG.md"
|
||
- "apps/api/src/nextcloud-files/nextcloud-files-shares.service.ts"
|
||
- "apps/api/src/nextcloud-files/nextcloud-files.changelog.ts"
|
||
- "apps/api/src/nextcloud-files/nextcloud-files.controller.ts"
|
||
- "apps/api/src/nextcloud-files/nextcloud-shares.ts"
|
||
- "apps/web/src/app/(portal)/modules/nextcloud-files/components/ShareDialog.tsx"
|
||
- "apps/web/src/app/(portal)/modules/nextcloud-files/components/SharesView.tsx"
|
||
- "apps/web/src/app/(portal)/modules/nextcloud-files/page.tsx"
|
||
covered_digest: "v3:sha256:b2a405e2df4a030f7ed36a98948410c09647f98f4ed01a67f0b421e85e0d61ea"
|
||
behavior_unverified: 0
|
||
overrides_applied: 0
|
||
human_verification:
|
||
- test: "Echte Firmen-Nextcloud: Teilen an einer Datei öffnen, Link erstellen"
|
||
expected: "Formular zeigt Passwort-Pflicht (Feld 'Passwort (Ihre Nextcloud verlangt eines)', 'Passwort erzeugen' funktioniert), Ablaufdatum nur als freiwillige Wahl"
|
||
why_human: "Die Richtlinie der Firmen-Nextcloud ist nur dort messbar; geprüft wurde gegen die Test-Nextcloud 34.0.4 (Pflicht-Passwort, Pflicht-Ablauf, nichts erzwungen)"
|
||
- test: "Link kopieren und in einem privaten Browserfenster öffnen"
|
||
expected: "Die Link-Adresse trägt die äußere Nextcloud-Adresse (nicht die interne)"
|
||
why_human: "Die Adresse baut die Nextcloud aus dem Aufrufhost; im Test war sie intern (172.17.0.1:18080)"
|
||
- test: "Teilen mit einer echten Kollegin/einem Kollegen und mit einer echten Gruppe"
|
||
expected: "Empfänger sieht die Freigabe in Nextcloud und unter 'Mit mir geteilt'; bei 'Annehmen verlangt' unter 'Noch nicht angenommen'"
|
||
why_human: "Echte Konten und Gruppen der Firma; 'Teilen mit Gruppen' muss dort erlaubt sein"
|
||
- test: "Desktop-App (Tauri): 'Link kopieren' und 'Passwort kopieren'"
|
||
expected: "Inhalt landet in der Zwischenablage, sonst Rückfall auf Markieren des Felds"
|
||
why_human: "Zwischenablage im Tauri-Fenster ist per Test nicht prüfbar"
|
||
- test: "Sichtprüfung der Beweisbilder in .playwright-mcp/nextcloud-files/ (s2a-*.png)"
|
||
expected: "Ruhige Optik, Mosaik-Regeln (keine Großbuchstaben-Etiketten, keine Mittelpunkte, keine Pfeilknöpfe), dunkel und hell lesbar"
|
||
why_human: "Optik; der Verifizierer hat nur s2a-dark-link-form.png angesehen (Dialog, Pflicht-Passwort, Passwort erzeugen, Personenliste lesbar)"
|
||
---
|
||
|
||
# Quick 261009-dkv: Dateien Etappe 2a (Teilen) Verification Report
|
||
|
||
**Goal:** Modul Dateien (nextcloud-files) Etappe 2a: Teilen von Dateien und Ordnern über Nextcloud (Personen, Gruppen, öffentliche Links nach Nextcloud-Richtlinie), Ansichten Von mir geteilt / Mit mir geteilt, Freigabe-Kennzeichen, ändern/entfernen, Modul-Changelog (1.0.0 erweitert, Version bleibt 1.0.0), CHANGELOG, vier Anleitungen.
|
||
**Verified:** 2026-10-09
|
||
**Status:** human_needed (keine Lücken, nur Prüfungen, die nur in der echten Umgebung oder per Auge gehen)
|
||
**Re-verification:** Nein, erste Prüfung
|
||
|
||
## Goal Achievement
|
||
|
||
### Observable Truths
|
||
|
||
| # | Truth | Status | Evidence |
|
||
|---|-------|--------|----------|
|
||
| 1 | Teilen mit Personen und Gruppen (Sharee-Suche, Ansehen/Bearbeiten, ändern, entfernen), nur bei Buchstabe R | ✓ VERIFIED | `nextcloud-files-shares.service.ts` `sharees()` (shareType[0]/[1]), `create()` (stat für Art/Schreibrecht, `permissionsFor`), `update()`, `remove()`; `FileBrowser.tsx:693` Menüpunkt nur bei `permissions.includes('R')`, `kind: 'share'` Dialog. Spec grün (Dienst 73 Tests). Live-Lauf `e2e-shares.sh` laut SUMMARY grün, von mir nicht erneut ausgeführt (würde Nextcloud-Zustand ändern) |
|
||
| 2 | Öffentliche Links (Ansehen/Bearbeiten/Nur hochladen), Passwort/Ablauf aus den eigenen Fähigkeiten bei jedem Lesen/Schreiben frisch, `expireDate: ""` für ohne Ablauf | ✓ VERIFIED | `loadPolicy()` ruft `cloud/capabilities` bei jedem `policy()`, `create()` und Link-`update()` ohne Zwischenspeicher; `checkLinkRules`; `json.expireDate = input.expireDate` wird auch als `""` gesendet; `LinkShareForm.tsx` (366 Zeilen) vorhanden und in `ShareDialog` eingebunden; Tests grün |
|
||
| 3 | API prüft Passwort/Ablauf vor dem Aufruf, German-Fehlercodes mit `ncMessage`, nie 401/403, 401 markiert Verbindung abgelaufen, 429 behält Etappe-1-Sperre; Passwort in keiner Antwort/keinem Log | ✓ VERIFIED | `mapShareFailure` (create/update/remove/accept/read-*) nach D-15, alles ≥500/401/429 über `mapNcFailure` mit `onExpired`; `parseShare` liefert nur `hasPassword` (`nextcloud-shares.ts:321`), kein Logger in `nextcloud-shares.ts` und im Dienst (grep); DTOs mit `whitelist`, Datum `^\d{4}-\d{2}-\d{2}$` plus `isRealDate`; Spec-Tests grün |
|
||
| 4 | Ansichten Von mir geteilt / Mit mir geteilt für jeden verbundenen Benutzer, inkl. offener Freigaben mit Annehmen/Ablehnen, Verlassen, andere Arten nur als Zahl | ✓ VERIFIED | `mine()`, `received()` (accepted + pending, 404/405 bei pending = leer), `accept()`; `page.tsx` TabId `files|sharedByMe|sharedWithMe|settings`, `SharesView mode="byMe"/"withMe"`; `hidden`-Zähler für nicht gezeigte Arten; Controller-Routen vorhanden; SharesView-Tests (14) grün |
|
||
| 5 | Freigabe-Kennzeichen in Liste und Raster; ausgehend aus `oc:share-types`, öffnet den Dialog | ✓ VERIFIED | `nextcloud-propfind.ts:51,182,210` `shareTypes`; `ShareIndicator.tsx`, `FileList.tsx`/`FileGrid.tsx` mit `onShare`; Test in `FileBrowser.test.tsx`; Bild `s2a-dark-indicator.png` vorhanden |
|
||
| 6 | Tessera-Begrenzung 15 pro 10 Minuten (16. gibt 429 `tooManyShares` ohne Nextcloud-Aufruf); Duplikat gibt `shareAlreadyExists` | ✓ VERIFIED | `nextcloud-login-guard.ts:46-47,191-200` `checkShareCreate`, aufgerufen im Dienst unmittelbar vor dem POST, nach allen Vorprüfungen; Duplikatprüfung über `listByPath` in `create()`; Guard-Spec (23 Tests) und Dienst-Spec grün |
|
||
| 7 | Modulversion bleibt 1.0.0 mit drei neuen Teilen-Punkten; CHANGELOG.md und alle vier Anleitungen beschreiben das Teilen | ✓ VERIFIED | `nextcloud-files.changelog.ts`: genau ein Eintrag 1.0.0 vom 2026-10-08, sieben `new`-Punkte, davon die letzten drei zum Teilen („Öffentliche Links erstellen…“); Seed nutzt `latestVersion(...)` (`nextcloud-files.seed.ts:18`), keine feste Version; `module-changelog.spec.ts` (76 Tests) grün; `CHANGELOG.md` zwei Punkte unter „Unveröffentlicht“ ohne „Modulversion“; Anwender (+Teilen, Link erstellen, Übersichten, Grenzen), Administration (Richtlinie/Link-Adresse), Betrieb (Limit, Fehlerbilder), Entwicklung (+55 Zeilen) im Commit 0585fd1 |
|
||
|
||
**Score:** 7/7 Truths verifiziert (0 behavior-unverified)
|
||
|
||
### Required Artifacts
|
||
|
||
| Artifact | Status | Details |
|
||
|----------|--------|---------|
|
||
| `nextcloud-shares.ts` (464 Z.) | ✓ VERIFIED | `ocsShareRequest`, Parser, `permissionsFor`, `accessOf`, `isRealDate`; vom Dienst genutzt |
|
||
| `nextcloud-files-shares.service.ts` (538 Z.) | ✓ VERIFIED | in Modul und Controller eingebunden |
|
||
| `dto/nextcloud-files-shares.dto.ts` | ✓ VERIFIED | Aufzählungen `kind`/`access`, keine Bitmasken |
|
||
| `share-policy.ts`, `ShareDialog.tsx`, `LinkShareForm.tsx`, `SharesView.tsx`, `ShareIndicator.tsx` | ✓ VERIFIED | vorhanden, verdrahtet (`page.tsx`, `FileBrowser.tsx`) |
|
||
| `nextcloud-files.changelog.ts` | ✓ VERIFIED | siehe Truth 7 |
|
||
| `e2e/e2e-shares.sh` | ✓ VERIFIED (Existenz) | vorhanden; Lauf nicht wiederholt |
|
||
|
||
### Key Links
|
||
|
||
| Von | Nach | Status |
|
||
|-----|------|--------|
|
||
| Dienst `create` → `checkShareCreate` | Login-Guard | ✓ WIRED (`shares.service.ts:372`) |
|
||
| Dienst → `mapNcFailure` mit `onExpired` → `markExpired` | Etappe-1-Fehlervertrag | ✓ WIRED (`transportFail`) |
|
||
| Dienst → `cloud/capabilities` | frisch bei jeder Nutzung | ✓ WIRED (`loadPolicy`) |
|
||
| Propfind → `shareTypes` | Kennzeichen | ✓ WIRED |
|
||
| `FileBrowser` Menü → `ShareDialog` | `kind: 'share'`, nur bei R | ✓ WIRED |
|
||
| Seed → `latestVersion(NEXTCLOUD_FILES_CHANGELOG)` | 1.0.0 | ✓ WIRED |
|
||
| Controller: statische Routen vor `:id` | Reihenfolge | ✓ (`shares/policy…POST shares` Zeilen 307-347, `PUT/DELETE shares/:id`, `:id/accept` ab 414); Controller-Spec prüft Reihenfolge |
|
||
|
||
### Behavioral Spot-Checks
|
||
|
||
| Check | Ergebnis |
|
||
|-------|----------|
|
||
| api vitest `src/nextcloud-files`, `module-manage-handlers`, `module-changelog` | 18 Dateien, 690 Tests grün |
|
||
| web vitest `modules/nextcloud-files`, `components/nextcloud-files`, `lib/nextcloud-files`, `messages` | 17 Dateien, 265 Tests grün |
|
||
| `tsc --noEmit` api und web | sauber (keine Ausgabe) |
|
||
| Schuldenmarker (TBD/FIXME/XXX/TODO/HACK) in allen geänderten .ts/.tsx/.sh | keine |
|
||
|
||
### Probe Execution
|
||
|
||
Keine Sonde deklariert. `e2e-shares.sh` braucht die Test-Nextcloud und verändert deren Zustand; nicht erneut ausgeführt (SUMMARY meldet mehrfach grün, als Beleg nicht gewertet, aber durch Unit-Tests und Code gestützt).
|
||
|
||
### Requirements Coverage
|
||
|
||
QUICK-261009-dkv: ✓ erfüllt (D-01 bis D-10 im Code und in den Tests nachgewiesen; D-05 Version bleibt 1.0.0 ✓).
|
||
|
||
### Anti-Patterns
|
||
|
||
Keine Blocker. Hinweise:
|
||
|
||
| Datei | Befund | Schwere |
|
||
|-------|--------|---------|
|
||
| `docs/anleitung-anwender.md` | Text sagt „mindestens zwei Buchstaben“ für die Suche; Code nutzt `max(1, minSearchLength)` aus der Nextcloud-Richtlinie. Auf typischen Servern (Standard 2) stimmt es, ist aber nicht fest | Info |
|
||
| SUMMARY | Gibt an, Passwort-Erzeuger der Nextcloud (D-18) bewusst nicht genutzt; deckt sich mit der Planvorgabe (lokaler CSPRNG) | Info |
|
||
| SUMMARY Beobachtung | Eingehender Nur-Ansehen-Ordner bietet „Neuer Ordner/Hochladen“ an (schon in Etappe 1), außerhalb des Auftrags | Info |
|
||
|
||
### Human Verification Required
|
||
|
||
1. **Firmen-Nextcloud, Linkformular** – Teilen an einer Datei, „Link erstellen“; erwartet: Passwort Pflicht mit „Passwort erzeugen“, Ablauf freiwillig. Grund: nur in der echten Umgebung messbar.
|
||
2. **Link-Adresse** – „Link kopieren“, im privaten Fenster öffnen; erwartet: äußere Adresse. Sonst Adresse in den Moduleinstellungen oder `overwritehost` in der Nextcloud ändern (steht in Administrations- und Betriebshandbuch).
|
||
3. **Echte Empfänger** – Person und Gruppe teilen; Freigabe in Nextcloud und unter „Mit mir geteilt“ sichtbar.
|
||
4. **Desktop-App** – „Link kopieren“, „Passwort kopieren“ in der Zwischenablage.
|
||
5. **Optik** – Beweisbilder `s2a-*.png` durchsehen (nur ein Bild vom Verifizierer geprüft).
|
||
|
||
### Gaps Summary
|
||
|
||
Keine Lücken. Alle sieben Wahrheiten sind durch Code, Verdrahtung und grüne Tests belegt; die Modulversion bleibt 1.0.0 gemäß D-05, Changelog, CHANGELOG und die vier Anleitungen sind vorhanden und inhaltlich auf den Code abgestimmt. Offen sind nur die Prüfungen in der echten Firmenumgebung und die Sichtprüfung.
|
||
|
||
---
|
||
|
||
_Verified: 2026-10-09_
|
||
_Verifier: Claude (gsd-verifier)_
|