feat(nextcloud-files): Teilen in Modul-Changelog, Anleitungen und Changelog

- Modul-Changelog: unveroeffentlichter Eintrag 1.0.0 um drei Teilen-Punkte erweitert (Version bleibt 1.0.0)
- CHANGELOG.md: Dateien, Teilen und Dateien, Uebersicht der Freigaben
- Anleitungen Anwender, Administration, Betrieb, Entwicklung beschreiben das Teilen
- Live-Test e2e-shares.sh: Abschnitt version
- Teilen-Dialog: Linkformular scrollt beim Oeffnen in den sichtbaren Bereich
- Mit mir geteilt: offene Freigaben zeigen kein irrefuehrendes Eigene Berechtigung

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-09 11:46:18 +02:00
parent c3adf851b8
commit 0585fd17c4
11 changed files with 129 additions and 5 deletions
@@ -3,7 +3,7 @@
# Aufruf: e2e-shares.sh [people|links|received|version|all] (Vorgabe: all) # Aufruf: e2e-shares.sh [people|links|received|version|all] (Vorgabe: all)
# Aufgabe 1 liefert Aufbau, Aufraeumen und den Abschnitt "people"; Aufgabe 2 die Abschnitte # Aufgabe 1 liefert Aufbau, Aufraeumen und den Abschnitt "people"; Aufgabe 2 die Abschnitte
# "links" (Passwort- und Ablaufregeln der Nextcloud per occ umgeschaltet) und "received" # "links" (Passwort- und Ablaufregeln der Nextcloud per occ umgeschaltet) und "received"
# (eingehende und offene Freigaben); version folgt in Aufgabe 3. # (eingehende und offene Freigaben); version prueft den Modul-Changelog (bleibt 1.0.0).
# Setzt einen laufenden Stack (api neu gebaut: docker compose up -d --build api) und # Setzt einen laufenden Stack (api neu gebaut: docker compose up -d --build api) und
# nc-test-setup.sh voraus. Nur Testwerte; liest keine .env-Dateien. # nc-test-setup.sh voraus. Nur Testwerte; liest keine .env-Dateien.
# #
@@ -449,7 +449,14 @@ print(len(d), "Freigaben", [(s.get("share_type"), s.get("share_with"), s.get("pe
echo "e2e shares received ok" echo "e2e shares received ok"
} }
section_version() { echo "e2e shares version: folgt in Aufgabe 3"; } section_version() {
local code
code=$(e2e_status "$ADMIN" GET "$API/modules/changelog/nextcloud-files")
e2e_expect 200 "$code" "Modul-Changelog"
e2e_expect 1.0.0 "$(jq_py 'd[0]["version"]')" "Modul-Changelog: neueste Version bleibt 1.0.0"
e2e_expect True "$(jq_py 'any("Öffentliche Links" in c["de"] for c in d[0]["changes"])')" "Modul-Changelog: Punkt zu oeffentlichen Links"
echo "e2e shares version ok"
}
case "$SECTION" in case "$SECTION" in
people) section_people ;; people) section_people ;;
+2
View File
@@ -17,6 +17,8 @@ Diese Liste beschreibt in einfachen Worten, was sich von Version zu Version an T
- Dateien, Anmeldung: Jeder meldet sich mit seinem eigenen Nextcloud-Konto an. Tessera speichert dabei nicht Ihr Passwort, sondern lässt sich von Nextcloud einen eigenen Zugang ausstellen, den Sie jederzeit in Nextcloud widerrufen können. Konten mit Zwei-Faktor-Anmeldung melden sich über „Im Browser anmelden“: Sie bestätigen den Zugriff auf der Nextcloud-Seite, Tessera wartet so lange. Der Anmeldebildschirm zeigt Name, Logo und Farbe Ihrer Nextcloud, damit Sie sehen, wo Sie sich anmelden. „Abmelden“ entfernt den Zugang auch in Nextcloud; Ihre Dateien bleiben unverändert. Damit nicht ein paar Fehlversuche die Nextcloud für alle sperren, begrenzt Tessera Fehlversuche selbst und hält alle Anfragen an, sobald die Nextcloud „zu viele Anfragen“ meldet. - Dateien, Anmeldung: Jeder meldet sich mit seinem eigenen Nextcloud-Konto an. Tessera speichert dabei nicht Ihr Passwort, sondern lässt sich von Nextcloud einen eigenen Zugang ausstellen, den Sie jederzeit in Nextcloud widerrufen können. Konten mit Zwei-Faktor-Anmeldung melden sich über „Im Browser anmelden“: Sie bestätigen den Zugriff auf der Nextcloud-Seite, Tessera wartet so lange. Der Anmeldebildschirm zeigt Name, Logo und Farbe Ihrer Nextcloud, damit Sie sehen, wo Sie sich anmelden. „Abmelden“ entfernt den Zugang auch in Nextcloud; Ihre Dateien bleiben unverändert. Damit nicht ein paar Fehlversuche die Nextcloud für alle sperren, begrenzt Tessera Fehlversuche selbst und hält alle Anfragen an, sobald die Nextcloud „zu viele Anfragen“ meldet.
- Dateien, Arbeiten mit Dateien: Ordner durchsuchen mit Pfadleiste, Liste oder Raster (Tessera merkt sich Ihre Wahl), Farbkacheln je Dateityp, echte Vorschaubilder und Anzeige des belegten Speicherplatzes. Neuer Ordner, Umbenennen, Verschieben (mit Ordnerauswahl) und Löschen – gelöscht wird in den Papierkorb Ihrer Nextcloud, nach einer Rückfrage; alles auch für mehrere Einträge gleichzeitig, per Maus, Zeilenmenü, Rechtsklick oder Tastatur (Enter, Rücktaste, F2, Entf, Strg+A). - Dateien, Arbeiten mit Dateien: Ordner durchsuchen mit Pfadleiste, Liste oder Raster (Tessera merkt sich Ihre Wahl), Farbkacheln je Dateityp, echte Vorschaubilder und Anzeige des belegten Speicherplatzes. Neuer Ordner, Umbenennen, Verschieben (mit Ordnerauswahl) und Löschen – gelöscht wird in den Papierkorb Ihrer Nextcloud, nach einer Rückfrage; alles auch für mehrere Einträge gleichzeitig, per Maus, Zeilenmenü, Rechtsklick oder Tastatur (Enter, Rücktaste, F2, Entf, Strg+A).
- Dateien, Hochladen und Herunterladen: Dateien und ganze Ordner per Ziehen und Ablegen (auch direkt auf einen Ordner) oder über „Hochladen“ hochladen; große Dateien gehen in Stücken hoch. Die Übertragungsleiste am unteren Rand zeigt den Fortschritt jeder Datei, lässt Abbrechen und Wiederholen zu und nennt Fehler in einfachen Worten. Tessera überschreibt nie stillschweigend: Gibt es den Namen schon, wählen Sie „Ersetzen“, „Beide behalten“ oder „Überspringen“. Dateien werden direkt heruntergeladen, Ordner und Mehrfachauswahl als ZIP-Datei. - Dateien, Hochladen und Herunterladen: Dateien und ganze Ordner per Ziehen und Ablegen (auch direkt auf einen Ordner) oder über „Hochladen“ hochladen; große Dateien gehen in Stücken hoch. Die Übertragungsleiste am unteren Rand zeigt den Fortschritt jeder Datei, lässt Abbrechen und Wiederholen zu und nennt Fehler in einfachen Worten. Tessera überschreibt nie stillschweigend: Gibt es den Namen schon, wählen Sie „Ersetzen“, „Beide behalten“ oder „Überspringen“. Dateien werden direkt heruntergeladen, Ordner und Mehrfachauswahl als ZIP-Datei.
- Dateien, Teilen: Im Zeilenmenü einer Datei oder eines Ordners finden Sie jetzt „Teilen“. Dort suchen Sie Kolleginnen, Kollegen und Gruppen aus Ihrer Nextcloud und geben die Datei zum „Ansehen“ oder „Bearbeiten“ frei; die Berechtigung ändern Sie später, und eine Freigabe nehmen Sie mit „Entfernen“ wieder zurück. Außerdem erstellen Sie öffentliche Links mit „Ansehen“ oder „Bearbeiten“, bei Ordnern auch mit „Nur hochladen“, und kopieren sie mit „Link kopieren“. Passwort und Ablaufdatum richten sich nach den Regeln der Firmen-Nextcloud: Verlangt sie ein Passwort, fragt Tessera danach und kann auf Wunsch eines erzeugen. Tessera speichert das Passwort nie und zeigt es nur, solange der Dialog offen ist. Zum Schutz der Nextcloud legt Tessera höchstens 15 neue Freigaben innerhalb von 10 Minuten an.
- Dateien, Übersicht der Freigaben: Die Reiter „Von mir geteilt“ und „Mit mir geteilt“ zeigen alle Freigaben auf einen Blick. Sie öffnen Einträge direkt im zugehörigen Ordner, ändern oder entfernen Ihre eigenen Freigaben, verlassen Freigaben anderer und nehmen offene Freigaben an oder lehnen sie ab. Geteilte Einträge sind in der Dateiliste markiert. Freigaben per E-Mail und an andere Server zeigt Tessera nicht an; sie bleiben der Nextcloud vorbehalten.
### Geändert ### Geändert
@@ -207,4 +207,17 @@ describe('Seeds und Changelogs gehören zusammen', () => {
expect(changelog![0].date).toBe('2026-10-08'); expect(changelog![0].date).toBe('2026-10-08');
} }
}); });
it('nextcloud-files: das Teilen steht im unveröffentlichten Eintrag 1.0.0 (sieben Neu-Punkte, keine 1.1.0)', () => {
const changelog = MODULE_CHANGELOGS.get('nextcloud-files') ?? [];
expect(changelog).toHaveLength(1);
const changes = changelog[0].changes;
expect(changes).toHaveLength(7);
expect(changes.every((c) => c.kind === 'new')).toBe(true);
expect(changes.slice(4).map((c) => c.de)).toEqual([
expect.stringContaining('Kolleginnen, Kollegen und Gruppen'),
expect.stringContaining('Öffentliche Links'),
expect.stringContaining('„Von mir geteilt“ und „Mit mir geteilt“'),
]);
});
}); });
@@ -30,6 +30,21 @@ export const NEXTCLOUD_FILES_CHANGELOG: ModuleChangelog = [
de: 'Dateien und ganze Ordner per Ziehen und Ablegen hochladen, große Dateien in Stücken; die Übertragungsleiste zeigt den Fortschritt und lässt Abbrechen und Wiederholen zu. Tessera überschreibt nie stillschweigend, und Ordner und Mehrfachauswahl laden Sie als ZIP-Datei herunter.', de: 'Dateien und ganze Ordner per Ziehen und Ablegen hochladen, große Dateien in Stücken; die Übertragungsleiste zeigt den Fortschritt und lässt Abbrechen und Wiederholen zu. Tessera überschreibt nie stillschweigend, und Ordner und Mehrfachauswahl laden Sie als ZIP-Datei herunter.',
en: 'Upload files and whole folders by drag and drop, large files in chunks; the transfer bar shows progress and allows cancelling and retrying. Tessera never overwrites silently, and you download folders and multiple selections as a ZIP file.', en: 'Upload files and whole folders by drag and drop, large files in chunks; the transfer bar shows progress and allows cancelling and retrying. Tessera never overwrites silently, and you download folders and multiple selections as a ZIP file.',
}, },
{
kind: 'new',
de: 'Dateien und Ordner mit Kolleginnen, Kollegen und Gruppen aus Ihrer Nextcloud teilen, wahlweise zum Ansehen oder Bearbeiten; Berechtigungen ändern und Freigaben wieder entfernen.',
en: 'Share files and folders with colleagues and groups from your Nextcloud, either to view or to edit; change permissions and remove shares again.',
},
{
kind: 'new',
de: 'Öffentliche Links erstellen und kopieren, für Ordner auch zum reinen Hochladen; Passwort und Ablaufdatum folgen den Regeln Ihrer Nextcloud.',
en: 'Create and copy public links, for folders also upload-only; password and expiry date follow the rules of your Nextcloud.',
},
{
kind: 'new',
de: 'Die Ansichten „Von mir geteilt“ und „Mit mir geteilt“ zeigen alle Freigaben, und geteilte Einträge sind in der Dateiliste markiert.',
en: 'The views “Shared by me” and “Shared with me” list all shares, and shared items are marked in the file list.',
},
], ],
}, },
]; ];
@@ -1,7 +1,7 @@
'use client'; 'use client';
import { useLocale, useTranslations } from 'next-intl'; import { useLocale, useTranslations } from 'next-intl';
import { useId, useRef, useState } from 'react'; import { useEffect, useId, useRef, useState } from 'react';
import { copyText } from '@/components/nextcloud-files/clipboard'; import { copyText } from '@/components/nextcloud-files/clipboard';
import { import {
accessOptions, accessOptions,
@@ -75,6 +75,7 @@ export function LinkShareForm({
const [showPassword, setShowPassword] = useState(false); const [showPassword, setShowPassword] = useState(false);
const [passwordCopied, setPasswordCopied] = useState(false); const [passwordCopied, setPasswordCopied] = useState(false);
const passwordInput = useRef<HTMLInputElement>(null); const passwordInput = useRef<HTMLInputElement>(null);
const formRef = useRef<HTMLFormElement>(null);
const passwordFieldVisible = editing ? editPassword === 'change' : createPasswordOn; const passwordFieldVisible = editing ? editPassword === 'change' : createPasswordOn;
// --- Ablauf --- // --- Ablauf ---
@@ -127,11 +128,18 @@ export function LinkShareForm({
setPasswordCopied(ok); setPasswordCopied(ok);
}; };
// Das Formular steht unter den Personen im scrollbaren Dialog: beim Öffnen ganz in den
// sichtbaren Bereich holen, damit „Link erstellen“ und „Abbrechen“ nicht verborgen bleiben.
useEffect(() => {
formRef.current?.scrollIntoView?.({ block: 'nearest' });
}, []);
const passwordLabel = required ? t('passwordRequiredLabel') : t('passwordLabel'); const passwordLabel = required ? t('passwordRequiredLabel') : t('passwordLabel');
const expiryLabel = rule.required ? t('expiryRequiredLabel') : t('expiryLabel'); const expiryLabel = rule.required ? t('expiryRequiredLabel') : t('expiryLabel');
return ( return (
<form <form
ref={formRef}
onSubmit={submit} onSubmit={submit}
aria-label={editing ? t('titleEdit') : t('titleCreate')} aria-label={editing ? t('titleEdit') : t('titleCreate')}
className="mt-3 space-y-4 rounded border border-border bg-well/40 p-3" className="mt-3 space-y-4 rounded border border-border bg-well/40 p-3"
@@ -283,6 +283,8 @@ describe('SharesView — Mit mir geteilt', () => {
name: 'Ben-Briefkasten', name: 'Ben-Briefkasten',
target: '/Ben-Briefkasten', target: '/Ben-Briefkasten',
pending: true, pending: true,
permissions: 0,
access: 'custom',
}); });
mockReceived.mockResolvedValue({ mockReceived.mockResolvedValue({
shares: [incoming()], shares: [incoming()],
@@ -292,6 +294,8 @@ describe('SharesView — Mit mir geteilt', () => {
}); });
mount('withMe'); mount('withMe');
expect(await screen.findByText('Noch nicht angenommen')).toBeTruthy(); expect(await screen.findByText('Noch nicht angenommen')).toBeTruthy();
// die Nextcloud meldet offene Freigaben ohne Berechtigung: kein irreführendes "Eigene Berechtigung"
expect(screen.queryByText(/Eigene Berechtigung/)).toBeNull();
// keine "Öffnen"-Aktion fuer eine offene Freigabe // keine "Öffnen"-Aktion fuer eine offene Freigabe
expect(screen.queryByRole('button', { name: '„Ben-Briefkasten“ öffnen' })).toBeNull(); expect(screen.queryByRole('button', { name: '„Ben-Briefkasten“ öffnen' })).toBeNull();
@@ -200,7 +200,9 @@ export function SharesView({
<p className="truncate text-xs text-muted-foreground"> <p className="truncate text-xs text-muted-foreground">
{[ {[
share.ownerName ? t('from', { name: share.ownerName }) : null, share.ownerName ? t('from', { name: share.ownerName }) : null,
accessText(share), // Eine noch offene Freigabe meldet die Nextcloud ohne Berechtigung (gemessen: 0);
// „Eigene Berechtigung“ wäre dort irreführend, also steht nichts.
isPending ? null : accessText(share),
share.expiration share.expiration
? tShare('people.expires', { date: dateText(share.expiration, locale) }) ? tShare('people.expires', { date: dateText(share.expiration, locale) })
: null, : null,
+1
View File
@@ -398,6 +398,7 @@ Das Modul „Dateien“ (Gruppe Infrastruktur) aktivieren Sie wie jedes Modul im
**Welche Adresse ist die richtige?** Gemeint ist die Adresse, von der die Anfragen des Tessera-Servers bei der Nextcloud ankommen. Meist ist das einfach die Adresse des Tessera-Servers. Läuft die Nextcloud hinter einem Proxy (zum Beispiel Nginx Proxy Manager), sieht sie unter Umständen nur die Adresse des Proxys. Im Zweifel schauen Sie im Zugriffsprotokoll des Webservers der Nextcloud nach, welche Adresse bei Tessera-Anfragen auftaucht. **Welche Adresse ist die richtige?** Gemeint ist die Adresse, von der die Anfragen des Tessera-Servers bei der Nextcloud ankommen. Meist ist das einfach die Adresse des Tessera-Servers. Läuft die Nextcloud hinter einem Proxy (zum Beispiel Nginx Proxy Manager), sieht sie unter Umständen nur die Adresse des Proxys. Im Zweifel schauen Sie im Zugriffsprotokoll des Webservers der Nextcloud nach, welche Adresse bei Tessera-Anfragen auftaucht.
- **Adresse ändern:** Ändern Sie die Adresse, während Benutzer verbunden sind, fragt Tessera ausdrücklich nach. Nach dem Wechsel gelten alle bestehenden Verbindungen als abgelaufen, jeder meldet sich neu an (die alten App-Passwörter gelten nur für die alte Nextcloud und werden nie an die neue geschickt). Offene Browser-Anmeldungen werden verworfen. - **Adresse ändern:** Ändern Sie die Adresse, während Benutzer verbunden sind, fragt Tessera ausdrücklich nach. Nach dem Wechsel gelten alle bestehenden Verbindungen als abgelaufen, jeder meldet sich neu an (die alten App-Passwörter gelten nur für die alte Nextcloud und werden nie an die neue geschickt). Offene Browser-Anmeldungen werden verworfen.
- **Benutzer löschen:** Löschen Sie einen Tessera-Benutzer, bleibt dessen App-Passwort in der Geräteliste seines Nextcloud-Kontos stehen. Entfernen Sie es dort (Einstellungen → Sicherheit), oder lassen Sie es vorher über „Abmelden“ in Tessera widerrufen. Ohne Tessera-Konto kann niemand den Zugang nutzen, aber er bleibt in Nextcloud eingetragen. - **Benutzer löschen:** Löschen Sie einen Tessera-Benutzer, bleibt dessen App-Passwort in der Geräteliste seines Nextcloud-Kontos stehen. Entfernen Sie es dort (Einstellungen → Sicherheit), oder lassen Sie es vorher über „Abmelden“ in Tessera widerrufen. Ohne Tessera-Konto kann niemand den Zugang nutzen, aber er bleibt in Nextcloud eingetragen.
- **Teilen und Regeln für Links:** Die Benutzer können im Modul Dateien und Ordner mit Kollegen und Gruppen teilen und öffentliche Links erstellen. **Die Regeln dafür legen Sie in der Nextcloud fest, nicht in Tessera:** Dort unter „Verwaltungseinstellungen“ im Bereich „Teilen“ schalten Sie ein oder aus, ob Links erlaubt sind, ob ein Passwort für Links Pflicht ist (auch mit Ausnahmegruppen), ob Links ein Ablaufdatum bekommen, ob dieses Pflicht ist und nach wie vielen Tagen es spätestens gilt, ob Besucher in freigegebene Ordner hochladen dürfen (öffentliches Hochladen), ob mit Gruppen geteilt werden darf und ob neue Freigaben automatisch angenommen werden. Tessera liest diese Regeln **für jeden Benutzer bei jeder Aktion neu** aus der Nextcloud; eine Änderung wirkt deshalb nach wenigen Sekunden ohne Neustart und ohne Zwischenspeicher in Tessera. Verlangt die Nextcloud ein Passwort, fragt das Formular danach und bietet „Passwort erzeugen“ an; ein Pflicht-Ablaufdatum trägt es vor. Tessera erlaubt nie mehr, als die Nextcloud dem Benutzer erlaubt, und meldet Ablehnungen der Nextcloud auf Deutsch. **Die Adresse eines Links stammt aus der Nextcloud**, nicht aus Tessera. Tragen Sie deshalb in Tessera die Adresse ein, unter der die Nextcloud von außen erreichbar ist (die, die auch Kollegen und Kunden im Browser benutzen). Ist dort eine interne Adresse eingetragen, tragen die Links ebenfalls die interne Adresse und funktionieren für Außenstehende nicht. Alternativ legen Sie in der `config.php` der Nextcloud `overwritehost`, `overwriteprotocol` und `overwrite.cli.url` auf die externe Adresse fest, dann baut die Nextcloud ihre Links immer damit. Zum Schutz der Nextcloud legt Tessera je Benutzer höchstens 15 neue Freigaben in 10 Minuten an (Näheres im Betriebshandbuch). Freigaben per E-Mail und an andere Server verwalten die Benutzer nur in der Nextcloud selbst; Tessera zeigt sie nicht an.
- **Kein Dashboard-Widget:** Das Modul bringt keine Dashboard-Kachel mit. - **Kein Dashboard-Widget:** Das Modul bringt keine Dashboard-Kachel mit.
- **Betrieb:** Netzwerkfreigaben, eigene Zertifizierungsstellen, die Größenbegrenzung des Proxys für das Hochladen und Fehlerbilder stehen im Betriebshandbuch, Abschnitt „Dateien (Nextcloud)“. - **Betrieb:** Netzwerkfreigaben, eigene Zertifizierungsstellen, die Größenbegrenzung des Proxys für das Hochladen und Fehlerbilder stehen im Betriebshandbuch, Abschnitt „Dateien (Nextcloud)“.
+15 -1
View File
@@ -255,7 +255,7 @@ Das Modul zeigt Ihre Dateien aus der Firmen-Nextcloud direkt in Tessera: ansehen
**Dateien ansehen:** Oben zeigt eine Pfadleiste, wo Sie sind; ein Klick auf einen Teil des Pfads springt dorthin. Über „Liste“ und „Raster“ wählen Sie die Ansicht (Tessera merkt sich Ihre Wahl), über „Sortieren nach“ die Reihenfolge nach Name, Größe oder Änderungsdatum. Jede Datei hat eine Kachel in der Farbe ihres Typs (zum Beispiel PDF, XLSX, ZIP); bei Bildern erscheint das Vorschaubild. Ein Doppelklick auf einen Ordner öffnet ihn. Ganz unten steht der belegte Speicherplatz. Ist Ihr Speicher in Nextcloud unbegrenzt, steht dort nur, wie viel belegt ist. **Dateien ansehen:** Oben zeigt eine Pfadleiste, wo Sie sind; ein Klick auf einen Teil des Pfads springt dorthin. Über „Liste“ und „Raster“ wählen Sie die Ansicht (Tessera merkt sich Ihre Wahl), über „Sortieren nach“ die Reihenfolge nach Name, Größe oder Änderungsdatum. Jede Datei hat eine Kachel in der Farbe ihres Typs (zum Beispiel PDF, XLSX, ZIP); bei Bildern erscheint das Vorschaubild. Ein Doppelklick auf einen Ordner öffnet ihn. Ganz unten steht der belegte Speicherplatz. Ist Ihr Speicher in Nextcloud unbegrenzt, steht dort nur, wie viel belegt ist.
**Arbeiten mit Dateien:** Über „Neuer Ordner“ legen Sie einen Ordner an. Über das Menü an jeder Zeile (oder mit der rechten Maustaste) finden Sie Öffnen, Herunterladen, Umbenennen, Verschieben, „In Nextcloud öffnen“ und Löschen. Beim Verschieben wählen Sie den Zielordner in einer Ordnerauswahl. **Löschen** verschiebt in den Papierkorb Ihrer Nextcloud, nach einer Rückfrage; dort holen Sie die Dateien bei Bedarf wieder heraus. Alles gilt auch für mehrere Einträge: Setzen Sie Häkchen oder halten Sie Strg (Umschalt für einen Bereich) gedrückt; eine Leiste oben nennt dann die Anzahl und bietet Herunterladen, Verschieben und Löschen für die ganze Auswahl. **Arbeiten mit Dateien:** Über „Neuer Ordner“ legen Sie einen Ordner an. Über das Menü an jeder Zeile (oder mit der rechten Maustaste) finden Sie Öffnen, Herunterladen, Teilen, Umbenennen, Verschieben, „In Nextcloud öffnen“ und Löschen. Beim Verschieben wählen Sie den Zielordner in einer Ordnerauswahl. **Löschen** verschiebt in den Papierkorb Ihrer Nextcloud, nach einer Rückfrage; dort holen Sie die Dateien bei Bedarf wieder heraus. Alles gilt auch für mehrere Einträge: Setzen Sie Häkchen oder halten Sie Strg (Umschalt für einen Bereich) gedrückt; eine Leiste oben nennt dann die Anzahl und bietet Herunterladen, Verschieben und Löschen für die ganze Auswahl.
**Hochladen:** Ziehen Sie Dateien oder ganze Ordner aus dem Dateimanager auf die Seite. Eine gestreifte Fläche nennt das Ziel („In „…“ ablegen“); legen Sie die Dateien auf eine Ordnerzeile, landen sie in diesem Ordner. Alternativ klicken Sie auf „Hochladen“ und wählen Dateien aus. Große Dateien gehen automatisch in Stücken hoch. Am unteren Rand erscheint die **Übertragungsleiste**: Jede Datei hat einen Fortschrittsbalken, „Abbrechen“ stoppt sie, „Erneut versuchen“ wiederholt eine fehlgeschlagene, „Erledigte entfernen“ räumt auf. Die Leiste lässt sich ein- und ausklappen. **Hochladen:** Ziehen Sie Dateien oder ganze Ordner aus dem Dateimanager auf die Seite. Eine gestreifte Fläche nennt das Ziel („In „…“ ablegen“); legen Sie die Dateien auf eine Ordnerzeile, landen sie in diesem Ordner. Alternativ klicken Sie auf „Hochladen“ und wählen Dateien aus. Große Dateien gehen automatisch in Stücken hoch. Am unteren Rand erscheint die **Übertragungsleiste**: Jede Datei hat einen Fortschrittsbalken, „Abbrechen“ stoppt sie, „Erneut versuchen“ wiederholt eine fehlgeschlagene, „Erledigte entfernen“ räumt auf. Die Leiste lässt sich ein- und ausklappen.
@@ -263,6 +263,20 @@ Das Modul zeigt Ihre Dateien aus der Firmen-Nextcloud direkt in Tessera: ansehen
**Herunterladen:** Eine einzelne Datei lädt Ihr Browser direkt herunter. Ordner und Mehrfachauswahl kommen als ZIP-Datei; haben Sie alles in einem Ordner ausgewählt, kommt der ganze Ordner als ZIP. Für eine ZIP-Datei aus einer Auswahl nimmt die Nextcloud nur eine begrenzte Zahl von Einträgen an (je nach Länge der Namen etwa 100 bis 200); bei mehr meldet Tessera das sofort, wählen Sie dann weniger aus oder laden Sie den ganzen Ordner herunter. Klappt ein Herunterladen nicht (zum Beispiel, weil die Datei inzwischen gelöscht wurde), steht der Grund in der Zeile unter der Dateiliste; ist die Verbindung abgelaufen, sehen Sie wieder den Anmeldebildschirm. **Herunterladen:** Eine einzelne Datei lädt Ihr Browser direkt herunter. Ordner und Mehrfachauswahl kommen als ZIP-Datei; haben Sie alles in einem Ordner ausgewählt, kommt der ganze Ordner als ZIP. Für eine ZIP-Datei aus einer Auswahl nimmt die Nextcloud nur eine begrenzte Zahl von Einträgen an (je nach Länge der Namen etwa 100 bis 200); bei mehr meldet Tessera das sofort, wählen Sie dann weniger aus oder laden Sie den ganzen Ordner herunter. Klappt ein Herunterladen nicht (zum Beispiel, weil die Datei inzwischen gelöscht wurde), steht der Grund in der Zeile unter der Dateiliste; ist die Verbindung abgelaufen, sehen Sie wieder den Anmeldebildschirm.
**Teilen:** Öffnen Sie das Menü einer Datei oder eines Ordners (oder klicken Sie mit der rechten Maustaste darauf) und wählen Sie „Teilen“. Es öffnet sich ein Fenster. Im Abschnitt „Personen und Gruppen“ tippen Sie mindestens zwei Buchstaben eines Namens in das Feld „Person oder Gruppe suchen“; darunter erscheinen die Treffer aus Ihrer Nextcloud, Gruppen sind als „Gruppe“ gekennzeichnet. Wählen Sie vorher unter „Berechtigung für die nächste Freigabe“, ob die Person die Datei nur „Ansehen“ oder auch „Bearbeiten“ darf, und klicken Sie dann auf den Treffer. Die Freigabe ist sofort angelegt, und die Nextcloud benachrichtigt die Kollegin oder den Kollegen selbst. Der Empfänger steht danach in der Liste darunter. Dort ändern Sie die Berechtigung jederzeit im Auswahlfeld hinter dem Namen, und mit „Freigabe für … entfernen“ nehmen Sie die Freigabe wieder zurück; die Datei selbst bleibt dabei unverändert. Wer schon eine Freigabe hat, erscheint in der Suche mit dem Vermerk „bereits geteilt“. In der Dateiliste trägt jeder geteilte Eintrag ein kleines Freigabe-Symbol; ein Klick darauf öffnet das Teilen-Fenster. Eingehende Freigaben, also Einträge, die andere mit Ihnen geteilt haben, tragen ein anderes Symbol („Mit Ihnen geteilt“). Einträge, die andere mit Ihnen geteilt haben, können Sie nicht weiterteilen; dort fehlt „Teilen“ im Menü.
**Link erstellen:** Mit einem öffentlichen Link kann jeder, der die Adresse kennt, den Inhalt öffnen, auch ohne Nextcloud-Konto. Im Teilen-Fenster klicken Sie im Abschnitt „Link“ auf „Link erstellen“ und wählen, was andere tun dürfen: „Ansehen“ (ansehen und herunterladen), „Bearbeiten“ (Dateien ändern, bei Ordnern auch hinzufügen und löschen) oder, nur bei Ordnern, „Nur hochladen“. „Nur hochladen“ wirkt wie ein Briefkasten: Andere legen Dateien in den Ordner, sehen aber nicht, was darin liegt. Mit „Link kopieren“ legen Sie die Adresse in die Zwischenablage; ein kurzes „Kopiert“ bestätigt das. Das Passwort und das Ablaufdatum bestimmt die Nextcloud Ihrer Firma, nicht Tessera:
- Verlangt die Nextcloud ein Passwort, heißt das Feld „Passwort (Ihre Nextcloud verlangt eines)“, und Sie kommen ohne Passwort nicht weiter. Mit „Passwort erzeugen“ lässt Tessera ein sicheres Passwort einsetzen; „Anzeigen“ macht es lesbar. Ist ein Passwort nicht Pflicht, können Sie den Link trotzdem mit „Mit Passwort schützen“ absichern.
- Verlangt die Nextcloud ein Ablaufdatum, steht das im Formular, und das späteste erlaubte Datum ist genannt („Spätestens am …“). Sonst ist das Ablaufdatum freiwillig, und „Ohne Ablaufdatum“ ist in Ordnung.
- Geben Sie das Passwort getrennt vom Link weiter, zum Beispiel in einer zweiten Nachricht. **Tessera speichert das Passwort nie und kann es später nicht mehr anzeigen:** Es steht nur, solange das Fenster nach dem Erstellen offen ist, in einem Hinweisfeld mit „Passwort kopieren“. Mit „Verstanden“ schließen Sie das Feld. Haben Sie es vergessen, vergeben Sie über „Ändern“ und „Passwort ändern“ einfach ein neues.
- Mit „Ändern“ passen Sie Berechtigung, Ablaufdatum, Passwort und die freiwillige Bezeichnung an (die Bezeichnung hilft, mehrere Links zu unterscheiden), mit „Löschen“ und der Rückfrage „Ja, löschen“ ist der Link sofort ungültig. Wer die Adresse hat, kommt danach nicht mehr an die Datei.
- Ob Tessera Links anbietet, entscheidet die Nextcloud. Hat Ihr Administrator öffentliche Links dort ausgeschaltet, sagt das Fenster es Ihnen.
**Von mir geteilt und Mit mir geteilt:** Über den Reitern oben neben „Dateien“ finden Sie diese zwei Übersichten. „Von mir geteilt“ listet alles, was Sie geteilt haben, geordnet nach Datei oder Ordner, mit den Empfängern („Geteilt mit …“, „Link“, „Gruppe …“). „Freigaben bearbeiten“ öffnet das Teilen-Fenster, „Im Ordner zeigen“ springt in den Ordner und markiert den Eintrag. „Mit mir geteilt“ listet, was andere mit Ihnen geteilt haben, mit dem Namen des Absenders („von …“); „Öffnen“ bringt Sie in den passenden Ordner. Eine Freigabe, die Sie nicht mehr brauchen, entfernen Sie mit „Freigabe verlassen“ (nach einer Rückfrage); sie verschwindet dann aus Ihrer Nextcloud, und die Absenderin müsste sie bei Bedarf neu teilen. Hat die Nextcloud so eingestellt, dass Sie neue Freigaben zuerst bestätigen müssen, stehen sie oben unter „Noch nicht angenommen“: „Annehmen“ übernimmt sie in Ihre Dateien, „Ablehnen“ weist sie ab. Zeigt eine Übersicht nur einen Teil, steht ein Hinweis darüber, und den Rest sehen Sie in Nextcloud.
**Grenzen beim Teilen:** Zum Schutz der Nextcloud legt Tessera höchstens 15 neue Freigaben innerhalb von 10 Minuten an; danach bittet eine Meldung, einige Minuten zu warten. Freigaben, die per E-Mail oder an einen anderen Server gehen, können Sie in Tessera weder anlegen noch bearbeiten; die sehen und verwalten Sie nur in Nextcloud (das Teilen-Fenster weist mit einer Zeile darauf hin, wenn es solche Freigaben gibt).
**Tastatur:** **Tastatur:**
| Taste | Wirkung | | Taste | Wirkung |
+3
View File
@@ -192,6 +192,7 @@ Das Modul „Dateien“ spricht aus dem `api`-Container mit der Nextcloud der In
- **Nginx Proxy Manager (Tessera-Adresse):** Beim Hochladen schickt der Browser große Dateien in Stücken von 8 MiB durch `/api-proxy`. Der Proxy vor Tessera muss das durchlassen: `client_max_body_size` mindestens `10m` (besser `64m`) und Lese- und Sendezeitlimits (`proxy_read_timeout`, `proxy_send_timeout`) von mindestens 120 Sekunden. Bei der Nginx-Voreinstellung von 1 MiB bricht jeder größere Upload schon beim ersten Stück ab. - **Nginx Proxy Manager (Tessera-Adresse):** Beim Hochladen schickt der Browser große Dateien in Stücken von 8 MiB durch `/api-proxy`. Der Proxy vor Tessera muss das durchlassen: `client_max_body_size` mindestens `10m` (besser `64m`) und Lese- und Sendezeitlimits (`proxy_read_timeout`, `proxy_send_timeout`) von mindestens 120 Sekunden. Bei der Nginx-Voreinstellung von 1 MiB bricht jeder größere Upload schon beim ersten Stück ab.
- **Zusammenbau großer Dateien:** Nextcloud setzt die Stücke am Ende zu einer Datei zusammen. Dauert das länger als etwa 20 Sekunden, antwortet Tessera sofort und die Oberfläche fragt den Fortschritt ab; die Verbindung bleibt also nie lange offen. Unvollständige Uploads (Stücke ohne Abschluss, etwa nach einem Seitenwechsel) räumt Nextcloud nach 24 Stunden selbst auf. - **Zusammenbau großer Dateien:** Nextcloud setzt die Stücke am Ende zu einer Datei zusammen. Dauert das länger als etwa 20 Sekunden, antwortet Tessera sofort und die Oberfläche fragt den Fortschritt ab; die Verbindung bleibt also nie lange offen. Unvollständige Uploads (Stücke ohne Abschluss, etwa nach einem Seitenwechsel) räumt Nextcloud nach 24 Stunden selbst auf.
- **Zustand im Arbeitsspeicher:** Offene Browser-Anmeldungen (Zwei-Faktor), laufende Zusammenbauten, die Aufrufsperre gegen die Brute-Force-Sperre der Nextcloud, die zwischengespeicherte Kennung der Nextcloud (10 Minuten) und noch ausstehende Widerrufe von App-Passwörtern liegen im Prozess des `api`-Containers. Ein Widerruf steht aus, wenn Nextcloud ihn gerade nicht annehmen konnte (Sperre nach „zu viele Anfragen“, Netzfehler, Wartung); Tessera versucht ihn nach dem Ende der Sperre bzw. nach einer Minute erneut, höchstens sechsmal. Ebenso beobachtet Tessera eine abgebrochene Browser-Anmeldung bis zu ihrem Ablauf und widerruft ein dort doch noch ausgestelltes App-Passwort sofort. Ein Neustart verwirft all das: Wer gerade eine Browser-Anmeldung offen hatte, startet sie neu; angemeldete Benutzer bleiben angemeldet (ihre Zugänge liegen verschlüsselt in der Datenbank). Ein dabei verlorener Widerruf bleibt als Gerät im Nextcloud-Konto des Benutzers stehen und lässt sich dort entfernen. - **Zustand im Arbeitsspeicher:** Offene Browser-Anmeldungen (Zwei-Faktor), laufende Zusammenbauten, die Aufrufsperre gegen die Brute-Force-Sperre der Nextcloud, die zwischengespeicherte Kennung der Nextcloud (10 Minuten) und noch ausstehende Widerrufe von App-Passwörtern liegen im Prozess des `api`-Containers. Ein Widerruf steht aus, wenn Nextcloud ihn gerade nicht annehmen konnte (Sperre nach „zu viele Anfragen“, Netzfehler, Wartung); Tessera versucht ihn nach dem Ende der Sperre bzw. nach einer Minute erneut, höchstens sechsmal. Ebenso beobachtet Tessera eine abgebrochene Browser-Anmeldung bis zu ihrem Ablauf und widerruft ein dort doch noch ausgestelltes App-Passwort sofort. Ein Neustart verwirft all das: Wer gerade eine Browser-Anmeldung offen hatte, startet sie neu; angemeldete Benutzer bleiben angemeldet (ihre Zugänge liegen verschlüsselt in der Datenbank). Ein dabei verlorener Widerruf bleibt als Gerät im Nextcloud-Konto des Benutzers stehen und lässt sich dort entfernen.
- **Teilen:** Tessera legt je Benutzer höchstens 15 neue Freigaben innerhalb von 10 Minuten an. Das liegt bewusst unter dem eigenen Limit der Nextcloud von 20 in 10 Minuten: Läge Tessera darüber, meldete die Nextcloud „zu viele Anfragen“, und Tessera hielte dann alle Anfragen an die Nextcloud für 15 Minuten an, für alle Benutzer. Der Zähler zählt auch Versuche, die die Nextcloud ablehnt, liegt im Arbeitsspeicher des `api`-Containers und beginnt nach einem Neustart bei null. Die Regeln für Links (Passwort, Ablaufdatum, öffentliches Hochladen, Gruppen) liest Tessera bei jeder Aktion frisch aus der Nextcloud und speichert nichts davon; eine Änderung in der Nextcloud wirkt nach wenigen Sekunden ohne Neustart (die Nextcloud selbst hält ihre Angaben nach einer Änderung per `occ` kurz in einem Zwischenspeicher). Passwörter von Links speichert und protokolliert Tessera nie, und auch die Adressen der Links stehen in keinem Protokoll. Die Adresse eines Links baut die Nextcloud aus dem Namen, unter dem Tessera sie aufruft (Administrationshandbuch, Abschnitt „Dateien: Nextcloud anbinden“).
- **Brute-Force-Ausnahme in der Nextcloud:** Tragen Sie die Adresse des Tessera-Servers dort in die Ausnahmeliste ein (Administrationshandbuch, Abschnitt „Dateien: Nextcloud anbinden“). Sonst kann eine Reihe falscher Anmeldungen die Nextcloud für alle Benutzer gleichzeitig sperren. - **Brute-Force-Ausnahme in der Nextcloud:** Tragen Sie die Adresse des Tessera-Servers dort in die Ausnahmeliste ein (Administrationshandbuch, Abschnitt „Dateien: Nextcloud anbinden“). Sonst kann eine Reihe falscher Anmeldungen die Nextcloud für alle Benutzer gleichzeitig sperren.
- **Verschlüsselung:** Die gespeicherten App-Passwörter sind mit `TESSERA_ENCRYPTION_KEY` verschlüsselt (Kapitel 2). Ein anderer Schlüssel macht sie unlesbar; die Benutzer müssen sich dann neu verbinden. - **Verschlüsselung:** Die gespeicherten App-Passwörter sind mit `TESSERA_ENCRYPTION_KEY` verschlüsselt (Kapitel 2). Ein anderer Schlüssel macht sie unlesbar; die Benutzer müssen sich dann neu verbinden.
@@ -764,3 +765,5 @@ Für die Desktop-Auslieferung ist keine neue Pflichtvariable nötig.
| `/api-proxy/desktop/update` antwortet dauerhaft `204`, obwohl Pakete da sind | Manifest ohne `signature`/`updateVersion`: Pakete aus einem Bau vor der Update-Funktion oder mit `--no-sign` | Eine Änderung unter `apps/desktop/` pushen bzw. den Tag neu bauen lassen; im CI prüfen, dass die Secrets `TAURI_SIGNING_PRIVATE_KEY`/`_PASSWORD` gesetzt sind (Abschnitt „Updates in der App und der Signierschlüssel"). | | `/api-proxy/desktop/update` antwortet dauerhaft `204`, obwohl Pakete da sind | Manifest ohne `signature`/`updateVersion`: Pakete aus einem Bau vor der Update-Funktion oder mit `--no-sign` | Eine Änderung unter `apps/desktop/` pushen bzw. den Tag neu bauen lassen; im CI prüfen, dass die Secrets `TAURI_SIGNING_PRIVATE_KEY`/`_PASSWORD` gesetzt sind (Abschnitt „Updates in der App und der Signierschlüssel"). |
| Eine Fehlermeldung aus der Desktop-App nennt als Herkunft „Desktop-App (unbekannt)“ ohne Version, Betreff-Kürzel `[Desktop]` | Der Client ist älter als diese Fassung: er meldet dem Server beim Start nur `desktop=1`, nicht Version, Stand und Betriebssystem (Parameter `dv`, `dc`, `dos`, aus denen `web` das Cookie `tessera_desktop_client` bildet) | Kein Fehler, die Meldung ist trotzdem als Desktop-App erkennbar. Client über „Auf Version … aktualisieren“ im Infobereich oder den Browser-Installer aktualisieren; danach stehen Betriebssystem, Version und Stand in der Meldung. | | Eine Fehlermeldung aus der Desktop-App nennt als Herkunft „Desktop-App (unbekannt)“ ohne Version, Betreff-Kürzel `[Desktop]` | Der Client ist älter als diese Fassung: er meldet dem Server beim Start nur `desktop=1`, nicht Version, Stand und Betriebssystem (Parameter `dv`, `dc`, `dos`, aus denen `web` das Cookie `tessera_desktop_client` bildet) | Kein Fehler, die Meldung ist trotzdem als Desktop-App erkennbar. Client über „Auf Version … aktualisieren“ im Infobereich oder den Browser-Installer aktualisieren; danach stehen Betriebssystem, Version und Stand in der Meldung. |
| Beim Hochladen in „Dateien“ bricht jede größere Datei beim ersten 8-MB-Stück ab (Fehler „Die Verbindung wurde unterbrochen“, im Proxy-Protokoll `413`) | Der Proxy vor Tessera (Nginx Proxy Manager) lässt keine Anfragen über seiner Größengrenze durch (`client_max_body_size`), oder sein Zeitlimit ist zu kurz | Für die Tessera-Adresse `client_max_body_size` auf mindestens `10m` und die Lese-/Sendezeitlimits auf mindestens 120 Sekunden stellen (Kapitel 3, Abschnitt „Dateien (Nextcloud)“). | | Beim Hochladen in „Dateien“ bricht jede größere Datei beim ersten 8-MB-Stück ab (Fehler „Die Verbindung wurde unterbrochen“, im Proxy-Protokoll `413`) | Der Proxy vor Tessera (Nginx Proxy Manager) lässt keine Anfragen über seiner Größengrenze durch (`client_max_body_size`), oder sein Zeitlimit ist zu kurz | Für die Tessera-Adresse `client_max_body_size` auf mindestens `10m` und die Lese-/Sendezeitlimits auf mindestens 120 Sekunden stellen (Kapitel 3, Abschnitt „Dateien (Nextcloud)“). |
| In „Dateien“ tragen öffentliche Links eine interne Adresse (zum Beispiel ein interner Rechnername oder eine IP-Adresse) und lassen sich von außen nicht öffnen | Die Nextcloud baut die Adresse eines Links aus dem Namen, unter dem Tessera sie aufruft; in Tessera ist die interne Adresse der Nextcloud eingetragen | In den Einstellungen des Moduls die von außen erreichbare Adresse der Nextcloud eintragen, oder in der `config.php` der Nextcloud `overwritehost`, `overwriteprotocol` und `overwrite.cli.url` auf die externe Adresse setzen; bereits erstellte Links ändern sich nicht rückwirkend, sie müssen neu erstellt werden. |
| In „Dateien“ erscheint „Sie haben in kurzer Zeit viele Freigaben angelegt. Bitte warten Sie einige Minuten.“ | Tessera hat für den Benutzer 15 neue Freigaben innerhalb von 10 Minuten angelegt (oder Versuche gezählt, die die Nextcloud abgelehnt hat) | Einige Minuten abwarten (der Zähler läuft nach 10 Minuten ab); ein Neustart des `api`-Containers setzt den Zähler zurück, ist aber nur im Ausnahmefall nötig. |
+55
View File
@@ -796,3 +796,58 @@ Hintergrund- und Textfarbe über die CSS-Variablen laufen, nicht über `dark:`-U
Oberfläche wird also grundsätzlich dunkel, nur Feinheiten (Status-, Warn- und Fehlerfarben, Oberfläche wird also grundsätzlich dunkel, nur Feinheiten (Status-, Warn- und Fehlerfarben,
Hinweisboxen, Badges, wie im Projekt bereits an über 100 Stellen betroffen) bleiben falsch. Jede neue Hinweisboxen, Badges, wie im Projekt bereits an über 100 Stellen betroffen) bleiben falsch. Jede neue
`dark:`-Utility-Klasse im Projekt setzt voraus, dass diese Zeile in `globals.css` unverändert bleibt. `dark:`-Utility-Klasse im Projekt setzt voraus, dass diese Zeile in `globals.css` unverändert bleibt.
**Dateien (Nextcloud), Teilen (quick-261009-dkv):** Das Teilen läuft über eine eigene
OCS-Schicht, `apps/api/src/nextcloud-files/nextcloud-shares.ts`, und nicht über den Anmelde-Helfer
`ocsRequest` aus `nextcloud-auth-client.ts`. Der Anmeldecode wertet einen 403 als „App-Passwort
vorhanden“ und wirft den Text jeder Fehlerantwort weg; beim Teilen steht genau dort die Begründung
der Nextcloud (`ocs.meta.message`), und ein 403 heißt „nicht erlaubt“. Die Schicht liest den
Antwortkörper deshalb bei jedem Status (Erfolg bis 8 MiB, Fehler bis 64 KiB, Fähigkeiten bis
1 MiB), bleibt sonst aber bei den Regeln der Etappe 1: fester Pfadanfang `/ocs/v2.php/`, jedes
Segment einzeln codiert, keine Weiterleitungen, keine Cookies, und es wird nie eine Adresse aus
einer Nextcloud-Antwort aufgerufen (weder die `url` einer Freigabe noch `api.generate`). Die
Parser bauen kleine eigene Ansichten; Passwort (`hasPassword` statt Wert), Kennung und Adressen
fremder Links verlassen sie nie.
Der Browser schickt nie Bitmasken. Die Routen (`shares/policy`, `shares/by-path`, `sharees`,
`shares/mine`, `shares/received`, `POST shares`, `PUT/DELETE shares/:id`, `POST shares/:id/accept`)
nehmen nur die Aufzählungen `kind` (`user`, `group`, `link`) und `access` (`view`, `edit`,
`upload`); `permissionsFor` rechnet sie selbst in Bits um, Eintragsart und Schreibrecht kommen aus
einer eigenen PROPFIND- bzw. GET-Abfrage, das Teilen-Bit 16 wird nie gesendet. Die statischen
Routen stehen vor den `:id`-Routen (das Controller-Spec prüft die Reihenfolge). Die Freigaberegeln
(Links erlaubt, Passwortpflicht, Ablaufdatum mit Tagen, öffentliches Hochladen, Gruppen,
Mindestlänge) liest der Dienst bei **jedem** Schreibzugriff frisch aus `cloud/capabilities` des
jeweiligen Benutzers und prüft vorab; es gibt keinen Zwischenspeicher. Nextcloud selbst
beantwortet die Fähigkeiten nach einer `occ`-Änderung noch einige Sekunden aus dem Zwischenspeicher
(der Live-Test wartet darauf mit `policy_wait`).
Fehlerabbildung (`mapShareFailure`, immer nach Aufruf, Status und gesendeten Feldern, **nie nach
dem Text** der Nextcloud, der übersetzt sein kann): Nextcloud verschweigt bei `PUT` die Gründe, und
Ablauffehler kommen als **404**, nicht als 400 (gemessen: `PUT` mit Ablauf jenseits des Höchstwerts
ergibt 404, ein schwaches Passwort 400). Daraus folgt: 400 mit gesendetem Passwort ist
`sharePasswordRejected`, 404 oder (beim Ändern) 400 mit gesendetem Ablaufdatum ist
`shareExpiryInvalid`, 404 ohne beides ist beim Anlegen `shareRecipientInvalid` (Link: `notFound`),
beim Ändern `shareNotFound`; 401 setzt die Verbindung auf „abgelaufen“, 429 und ab 500 laufen
unverändert durch `mapNcFailure`, und ein 403 der Nextcloud kommt als `shareRejected` (422) beim
Browser an. 401 und 403 verlassen die API nie. Die Datums-Eingabe prüft der DTO streng
(`YYYY-MM-DD` plus echte Datumsprüfung `isRealDate`), weil Nextcloud Daten großzügig parst
(`31.12.2026x` würde angenommen).
Zwei Fallen beim Anlegen: Ein `POST` für einen Empfänger, der die Freigabe schon hat, liefert die
alte Freigabe zurück und **verschickt die Benachrichtigung erneut**. Der Dienst prüft deshalb vorab
über `shares/by-path`, ob es sie schon gibt (`shareAlreadyExists`, 409), und ändert Berechtigungen
immer per `PUT`. Außerdem begrenzt Tessera selbst auf 15 neue Freigaben je Benutzer in 10 Minuten
(`checkShareCreate`, im Arbeitsspeicher, zählt auch Versuche, die die Nextcloud ablehnt;
unmittelbar vor dem `POST`, nach allen Vorprüfungen). Das liegt absichtlich unter dem Limit der
Nextcloud (20 in 600 s): Deren 429 würde die Aufrufsperre des Ursprungs auslösen, und die hielte
die Anfragen aller Benutzer 15 Minuten an. Die Oberfläche legt immer nur eine Freigabe zugleich an.
Live-Test: `.planning/quick/261009-dkv-modul-dateien-etappe-2a-teilen-von-datei/e2e/e2e-shares.sh
[people|links|received|version|all]` gegen die Test-Nextcloud (`nc-test-setup.sh` der Etappe 1
vorher). Er legt Benutzer `ben` und Gruppe `tessera-team` an, schaltet die Ratenbegrenzung der
Nextcloud (`ratelimit.protection.enabled`) nur für den Lauf aus und stellt die Regeln über
`occ config:app:set core …` um (`shareapi_enforce_links_password`, `shareapi_default_expire_date`,
`shareapi_enforce_expire_date`, `shareapi_expire_after_n_days`; für die offenen Freigaben
`user:setting anna files_sharing default_accept`). Alles setzt der `trap` zurück. Der Zähler von
Tessera liegt im Prozess: `all` verbraucht 7 der 15 Plätze, nach höchstens zwei `all`-Läufen
`docker compose restart api`.