- docs/sicherheitsprotokoll.md: alle bisherigen Pruefungen (acht Code-Pruefungen,
Bedrohungsbetrachtungen, Datentrennung, Fehlerregister), erste vollstaendige
Pruefung vom 9.10.2026 mit Zahlen und Einordnung jedes Befunds
- Links aus docs/README.md, Betriebs- und Entwicklungsanleitung; Entwicklungsanleitung
mit Abschnitt Sicherheitspruefungen und Pflegeregel
- CHANGELOG: Sicherheits-Eintrag unter Neu
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Skript .gitea/scripts/security-scan.sh: gitleaks, pnpm audit, osv-scanner, Semgrep, Trivy (Quellstand und Abbilder), angepinnt und per SHA256 geprueft, Exit immer 0
- Job security nach publish (nur main und Tags v*, continue-on-error, Zeitlimit 30 Minuten, kein Secret)
- Ausnahmelisten .gitleaks.toml und .semgrepignore fuer geprueft harmlose Treffer
- docs/ci-cd-setup.md beschreibt den Job
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Der CI-Runner brauchte 141 ms fuer den 5-MiB-Fall, die Grenze lag bei
100 ms. Jetzt 1 s (der alte quadratische Scanner braeuchte Minuten),
der Mischfall 2 s.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Unter Last auf dem Runner liefen Rollenabfragen grosser Seiten ueber die
Standardsekunde; Laeufe 513/514 wurden mit wechselnden Tests rot
(domains-page, nextcloud-files-page). asyncUtilTimeout 5 s, testTimeout 15 s.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Anwender-, Administrations-, Betriebs- und Entwicklungsanleitung gegen
Code und Oberflaechentexte abgeglichen; falsche und veraltete Stellen
korrigiert, fehlende Funktionen ergaenzt. Willkommensmail: Hinweis
nennt jetzt sechs statt vier Felder.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Ausgabe-Reiter bieten nur an, was zur aktuellen Dateiliste passt: nach dem Entfernen
einer Datei oder einer fehlgeschlagenen Prüfung kommt Hinweis oder Fehler mit
„Erneut versuchen“ statt der alten Auswertung (WR-02)
- Aufteilen: ein in der Datei geschützter Schlüssel bleibt geschützt (Passwort für die
Ausgabe, auch in der ZIP); ohne Schutz nur ausdrücklich und mit sichtbarem Hinweis;
Schlüssel heißen nach ihrem Zertifikat (WR-03, IN-05)
- Meldungen: tooManyItems, aiaNotAllowed, buildFailed (statt „Dateien konnten nicht
geprüft werden“ beim Erstellen), protectionTooExpensive; Hinweis zum Passwort
genauer (IN-03, IN-05)
- Download-Adresse wird erst nach einer Sekunde widerrufen (IN-04)
- Anleitungen und Änderungsliste: Grenzen, Aufteilen mit Schlüsselschutz, Umlaut-Passwörter
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- ZIP: eigenes Entpacken mit hartem Deckel (maxOutputLength), Größe, Verhältnis und
CRC am echten Ergebnis; eine gefälschte Kopfgröße 0 umgeht keine Grenze mehr (CR-01)
- PEM: linearer Scanner statt Regex mit quadratischer Laufzeit, gemeinsam für
Erkennung und Abruf (CR-02)
- PKCS#12: PBES2/AES leitet das Passwort aus UTF-8 ab, Lesen und Schreiben, mit
OpenSSL-Gegenprobe für „pässwörd“ und „pw€“ (CR-03)
- Grenzen je Anfrage: höchstens 200 Zertifikate, 50 Schlüssel, 50 Anfragen (413
tooManyItems); Ableitungsrunden höchstens 1 Million je Verfahren und 6 Millionen je
Anfrage (protectionTooExpensive) (WR-04, WR-05)
- Upload: Gesamtgrenze beim Empfang, multer-Grenzen für Dateien, Felder, Teile (WR-06)
- build-Leser hinter CORS, damit 413/400 CORS-Kopfzeilen tragen (WR-01)
- Selbstsignierte Wurzeln ohne basicConstraints (Version 1, keyCertSign) sind Wurzeln,
Serverzertifikate bleiben es (WR-07)
- Adressschutz: IPv6-Adressen in Klammern werden beurteilt; „CA Issuers“-Filter für
Anzeige und Abruf gemeinsam, eigener Code aiaNotAllowed (IN-01, IN-02)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Neuer Knopf „Fehlendes Zertifikat holen“ nur auf Klick: POST fetch-issuer liest die
Aussteller-Adresse (AIA) serverseitig aus dem Zertifikat, nie vom Browser; nur Standardport,
Adressschutz vor jedem Sprung, Aufloesung beim Verbinden geprueft, 8 s und 256 KiB, hoechstens
3 Weiterleitungen; angenommen wird nur ein Zertifikat, das wirklich ausgestellt hat
- Geholte Zertifikate erscheinen als „nachgeladen von <Server>“ in der Liste und auf der Karte
- Gemeinsamer Adressschutz gehaertet: versteckte IPv6-Schreibweisen interner Adressen
(IPv4-gemappt in Hex, NAT64, 6to4, Teredo, Zonenkennung u. a.), neues Spec
- Modul-Changelog 1.2.0, CHANGELOG (Sicherheit), drei Anleitungen
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Sieben Vorlagen (Nginx, Apache ab/vor 2.4.8, Windows/IIS, Nginx Proxy Manager, HAProxy, Tomcat) mit Dateien und Einrichtungszeilen
- Reiter „Vorlagen“ mit ZIP samt Anleitung, Schnipsel und Kopieren
- Modulversion 1.2.0, Modul-Changelog, CHANGELOG und drei Anleitungen
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- build liefert jeden Inhalt in jedem Format: Einzelzertifikat (PEM, DER, PKCS#7 .p7b/.p7c), Fullchain und Nur Kette auch als PKCS#7, Zertifikat und Schlüssel in einer PEM-Datei, PFX, Schlüssel (PKCS#8, klassisch, DER, optional mit Passwort) und CSR (PEM, DER)
- PKCS#7 von Hand aus ASN.1 gebaut, jedes Zertifikat mit seinen eigenen Bytes (RSA und EC)
- PFX schreiben für RSA und EC über einen begrenzten, im finally zurückgesetzten forge-Austausch; Kompatibel (3DES/SHA-1, Vorgabe) oder Modern (AES-256)
- Schlüssel und Passwörter nur in der Anfrage, nie in Antwort, Fehlertext oder Log; falscher Schlüssel: keyMismatch, kein Schlüssel: keyMissing, ohne Passwort: passwordRequired
- Reiter Konvertieren für Zertifikat, Schlüssel und Anfrage; Zusammenführen mit Kettenformat, Zertifikat und Schlüssel sowie PFX (Passwort doppelt, Verschlüsselung wählbar)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Private Schlüssel (PKCS#1, PKCS#8, SEC1; PEM und DER; unverschlüsselt, verschlüsselt, klassisch verschlüsselt) für RSA und EC über node:crypto
- PKCS#12 lesen (OpenSSL 3, kompatibel, RC2; EC-Zertifikate und -Schlüssel), auch ohne Endung und im ZIP
- Zertifikatsanfragen (CSR) als PEM und DER mit Inhaber, SAN und Schlüssel
- Zuordnung von Schlüssel und Anfrage zum Zertifikat (checkPrivateKey, SPKI-Vergleich)
- Feld passwords je Datei, gesperrte Dateien fragen nach dem Passwort; kein Passwort in Antwort oder Log
- Oberfläche: Passwortfeld mit Anzeigen/Verbergen, Schlüssel- und Anfragekarten im Reiter Analysieren
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- ZIP wird an den Anfangsbytes erkannt und mit Grenzen geöffnet (eine Ebene, Verhältnis, Gesamtgröße, verschlüsselte Einträge)
- PKCS#7 als PEM und DER, auch für EC, über den ASN.1-Lauf
- Eingefügter PEM-Text als eigener Eintrag im Reiter Dateien
- Neue Reiter Analysieren und Aufteilen auf dem gemeinsamen Arbeitsbereich
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Kettenbau mit Aussteller- und Signaturprüfung (checkIssued plus verify), Wurzel nur auf Wunsch
- build-Route für Fullchain und Nur Kette (PEM), eigene JSON-Grenze 512 KiB mit 413 und Code tooLarge
- Reiter Zusammenführen mit Kettenansicht, Hinweis bei fehlendem Zwischenzertifikat
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Ein gemeinsamer Arbeitsbereich im Browser: jede Auswahl hängt an, eine zweite Datei ersetzt nie die erste
- Ein Parser (node:crypto) für RSA- und EC-Zertifikate als PEM, DER und TRUSTED CERTIFICATE, Rolle je Datei
- Neue Route analyze (mehrere Dateien, 30 x 5 MiB, zusammen 20 MiB); alte Routen, Service und Web-Reiter entfernt
- Test-PKI-Fixtures (RSA und EC, Ketten, Schlüssel, CSR, PFX) mit Erzeugungsskript
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Tauri faengt Drag&Drop unter Linux und Windows standardmaessig selbst
ab; die Seite bekam kein drop-Ereignis. disable_drag_drop_handler()
am Hauptfenster gibt das Ablegen an die Webansicht weiter.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Link aendern: nicht angebotene Berechtigung bleibt unberuehrt (Aktuell: ...), Zugriff nur bei ausdruecklicher Wahl gesendet
- Fehler je Abschnitt zugeordnet und geloescht; Aendern nur bei aenderbarer Freigabe; Kopiert-Anzeige laeuft ab
- Freigabe-Ansichten: stabiler Rueckruf, nur das juengste Laden gilt; Weitergaben mit Hinweis
- Ablaufgrenzen nach Serverdatum, Passwort-Erzeugung bis 256 Zeichen
- Dateiansicht blendet Neuer Ordner, Hochladen, Ablegen, Umbenennen, Verschieben und Loeschen nach den Buchstaben der Nextcloud aus
- Import-Reihenfolge nach biome check, Anleitungen und Changelog (10 statt 15 Freigaben, Suche ab einem oder zwei Zeichen)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Pfade, Ziele und Empfaengerkennungen der Freigaben bleiben woertlich (nur Anzeigetexte werden bereinigt)
- Weitergaben als eigene Freigaben mit eigenem Pfad; accessOf nach Eintragsart
- Begrenzung: 10 neue Freigaben je 10 Minuten, 40 Versuche je 10 Minuten vor den Abfragen an die Nextcloud, leere Zaehler werden entfernt
- Freigaberegeln nennen das Serverdatum, die Ordnerliste die Berechtigungsbuchstaben des Ordners selbst
- Live-Test: Ablehnen offener Freigaben, Weitergabe, Buchstaben des Ordners
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- 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>
- Link-Formular: Berechtigung (Ansehen, Bearbeiten, Nur hochladen), Passwort verlangt oder
freiwillig mit Passwort erzeugen, Ablaufdatum verlangt (vorbelegt, begrenzt) oder frei,
Bezeichnung; Link kopieren, aendern, loeschen mit Rueckfrage
- Ansichten Von mir geteilt und Mit mir geteilt mit offenen Freigaben (Annehmen, Ablehnen),
Oeffnen in der Dateiansicht (initialPath/initialFocus), Freigabe verlassen
- Reiter fuer jeden verbundenen Benutzer, ausgeblendet nur wenn die Nextcloud das Teilen ausschaltet
- Hilfen (Passwortmodus, Ablaufregel, Datumsrechnung, Aenderungsunterschied), Web-Client, Meldungen de/en
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Links anlegen und aendern: Passwort, Ablaufdatum und Bezeichnung nur im JSON-Koerper,
Vorpruefung aus den frisch gelesenen Faehigkeiten (Passwort/Ablauf verlangt, Hochladen,
mehrere Links), echte Datumspruefung, nur geaenderte Felder beim Aendern
- Routen shares/mine, shares/received (angenommen plus offen, 404/405 bei offen = leer)
und POST shares/:id/accept am Ende der Klasse
- Fehlerzweige fuer Passwort und Ablauf mit Tests; nie Passwort in Antwort oder Fehler
- Live-Test e2e-shares.sh: Abschnitte links (Pflicht-Passwort und Pflicht-Ablauf per occ)
und received (eingehend, offen, annehmen, verlassen)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Teilen-Dialog (Suche mit Verzoegerung, Ergebnisliste als Combobox, Berechtigung
je Zeile aendern, entfernen) auf dem Modul-Dialog, Fehler mit Meldung der Nextcloud
- Menueeintrag Teilen (nur bei Buchstabe R), Freigabe-Kennzeichen in Liste und Raster
(ausgehend als Knopf, eingehend als Markierung)
- Web-Client, reine Hilfen (Berechtigungsauswahl, Passwort erzeugen), Fehlertexte
und Meldungen de/en; sharingDisabled traegt scope=groups fuer den Gruppentext
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Freigaben-Schicht (nextcloud-shares.ts): eigener OCS-Aufruf, der Fehlertexte liest,
Parser fuer Freigaben, Empfaenger und Freigaberegeln, Berechtigungsabbildung
- Dienst mit Vorpruefung aus den Faehigkeiten, Dublettenpruefung und Fehlermatrix
(nie 401/403 nach aussen), Begrenzung auf 15 neue Freigaben in 10 Minuten
- Routen shares/policy, shares/by-path, sharees, POST/PUT/DELETE shares
- oc:share-types als shareTypes an jedem Eintrag
- Live-Test e2e-shares.sh (Abschnitt people)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Offenhalten-Grenze fuenf auf acht, gepinnte Module nie per LRU verworfen
- Schalter in der App-Leiste der Modulansicht, Karte in Einstellungen -> Eigene Module
- Texte de/en
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Spalte User.customModulePreloadIds, PUT /custom-modules/:id/preload (Grenze 8, 404 fuer Fremdes)
- Vorlade-Planer und -Komponente, Speicher preload()/pinned, Ersatzgroesse im Behaelter
- E2E-Skript gegen die API
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Entwicklung: Abschnitt Modulversion und Modul-Changelog pflegen
- Betrieb: Pruefung vor der Freigabe, Anwender: Abschnitt Aenderungen
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- neun weitere Changelogs aus Git-Tags und CHANGELOG.md
- alle Seeds lesen ihre Version per latestVersion
- Waechter: Vollstaendigkeit, keine Waisen, dkv ab 1.1.0
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Typen, Register, Route GET /modules/changelog/:slug, Waechter-Test
- Seed liest die Version per latestVersion aus dem Changelog
- Marktplatz-Detailseite zeigt den Abschnitt Aenderungen
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- bei offenem Dialog oder Menue (oder einem Ziel darin) zeigt die Ansicht keine
Ablage-Markierung und laedt nichts hoch; das Ereignis wird trotzdem abgefangen, damit der
Browser die Datei nicht selbst oeffnet
- ein bereits behandeltes Ablegen (defaultPrevented) wird nicht hochgeladen
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- antwortet die Abfrage mit 404/410, laedt die Seite zuerst den Stand neu; ging die Antwort
"verbunden" unterwegs verloren, erscheinen direkt die Dateien statt eines Fehlers
- Seitentest fuer den Fall
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- WR-08: POST download/zip mit den Namen im Koerper (JSON oder unsichtbares Formular mit
names als JSON-Text) statt im Query-String; hoechstens 1000 Namen; die Weboberflaeche
laedt per Formular in einen unsichtbaren Rahmen (Strom direkt auf die Platte, Cookie und
Content-Disposition bleiben); alles ausgewaehlt -> ganzer Ordner als ZIP
- Nextcloud nimmt die Auswahl nur in ihrer Adresse an (gemessen: Apache lehnt ueber 8190
Zeichen mit 414 ab); Tessera prueft die Laenge und antwortet vorher mit 413
selectionTooLarge, die Weboberflaeche meldet es schon vor dem Absenden
- IN-06: Vorabpruefung (check=1 bzw. check: true, ein PROPFIND Depth 0) vor jedem Download;
Fehler stehen in der Statuszeile, connectionExpired fuehrt zum Anmeldebildschirm; auch der
Klick auf einen Dateinamen geht ueber die Pruefung
- e2e-transfer auf POST umgestellt (JSON, Formular ueber /api-proxy, 300 Namen, Pruefung),
Anwenderhandbuch
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- der Merkzettel wird geleert, wenn neu abgelegt wird und nichts mehr laeuft, nach jedem
Loeschen, Verschieben und Umbenennen in der Ansicht und wenn ein Hochladen mit
pathConflict/notFound scheitert (dann legt "Erneut versuchen" den Ordner wieder an)
- innerhalb einer Ablage wird jeder Ordner weiter nur einmal angelegt
- Hook-Tests fuer alle drei Wege
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- WR-09: ein einzelnes UTF-16-Ersatzzeichen in einem Pfadsegment ist 400 invalidPath (bzw.
invalidName) statt eines URIError mit 500; die Weboberflaeche wiederholt keine 4xx
- IN-02: Vorschaubilder nur als Rasterbild, image/svg+xml wird wie ein fehlendes
Vorschaubild behandelt (CSP-Sandbox und nosniff bleiben)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- WR-04: die Entity-Tag-Pruefung beim Ersetzen laeuft im Zusammenbau unmittelbar vor dem
MOVE (gemessen gegen Nextcloud 34: If-Match auf dem MOVE wird gegen .file geprueft und
ergibt immer 412, ist also nicht nutzbar); weicht der Tag ab -> changedMeanwhile
- WR-05: completeUpload merkt den Zustand synchron vor dem ersten await; ein zweiter oder
gleichzeitiger Abschluss liefert das gemerkte Ergebnis (auch denselben Fehler) und baut
nie zweimal zusammen; nur Fehler vor dem MOVE duerfen erneut versucht werden
- WR-06: 412 mit replaceEtag (PUT oder Zusammenbau) ist changedMeanwhile, nicht nameTaken
- IN-01: replaceEtag muss die Form eines Entity-Tags haben (sonst 400)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- die Aufrufsperre vergibt je Zugangsschluessel vier Plaetze bis zur Antwort (Kopfzeilen);
weitere Aufrufe warten der Reihe nach und pruefen danach, ob der Zugang inzwischen tot
oder der Ursprung gesperrt ist; ein widerrufener Zugang erzeugt so hoechstens vier 401
- Hochladen und Zusammenbau (Antwort erst nach dem ganzen Koerper) belegen keinen Platz
- Weboberflaeche: Vorschaubilder laden weiter lazy; schlaegt eines fehl, prueft die Ansicht
hoechstens alle 10 s die Verbindung und kehrt bei connectionExpired zur Anmeldung zurueck
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- voruebergehend gescheiterte Widerrufe (Aufrufsperre nach 429, Netz, Zeitablauf, Wartung,
5xx) kommen in eine kleine Warteschlange im Arbeitsspeicher und werden nach dem Ende
der Sperre bzw. nach einer Minute erneut versucht (hoechstens 200 Eintraege, 6 Versuche,
nie geloggt)
- abgebrochene, ersetzte oder durch Adresswechsel verworfene Browser-Anmeldungen bleiben
bis zum Ablauf als "abgebrochen" stehen; der Server fragt sie alle 10 s ab und widerruft
ein doch noch ausgestelltes App-Passwort sofort; sie zaehlen nicht gegen die 200 offenen
- Specs fuer Sperre, Netzfehler, Aufgeben und den Login-Flow-Abbruch; Betriebshandbuch
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Einstellungen zeigen bei http:// einen Warnhinweis: Passwoerter und App-Passwoerter
gehen unverschluesselt durch das Netz; https bleibt ohne Hinweis
- Anleitung Administration nennt die Warnung
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- testAddress fragt status.php ueber ncRequest ab (keine Weiterleitung, Aufrufsperre,
keine Zugangsdaten) statt ueber fetchNextcloudStatus mit bis zu drei Weiterleitungen
- Ergebnis nur noch ok / maintenance / paused / locked / redirect / not-nextcloud /
unreachable, ohne HTTP-Statuscode, Fehlerkuerzel oder Weiterleitungsziel
- NEXTCLOUD_STATUS_FETCHER entfaellt; Specs mit Attrappen-Transport, Anleitung angepasst
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- PUT settings traegt @Roles(ADMIN, SUPER_ADMIN) statt @ModuleManage (Muster wie
TendersController.getSourceConfig); alle Benutzer schicken ihr Passwort an diese Adresse
- POST settings/test: Verwalter ohne Administratorrolle pruefen nur die gespeicherte Adresse,
jede andere Adresse ist 403
- Einstellungen fuer Verwalter nur lesbar mit kurzem Hinweis, ohne Speichern-Knopf; Hinweis
"nicht eingerichtet" verweist Nicht-Administratoren an einen Administrator
- Metadaten-Spec (module-manage-handlers), Controller-Spec, Seitentest, e2e-settings
(Verwalter: 403 auf PUT und fremde Pruefung), Anleitungen und Changelog angepasst
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>