- WR-01: prisma generate als eigener Schritt mit Pruefung im api-Abbild, Bau scheitert ohne Client; Startprobe als .gitea/scripts/image-start-check.sh versioniert
- WR-02: Semgrep im offiziellen Container, per Digest angepinnt (kein pipx/PyPI mehr)
- WR-04: Zeitbudget 1500 s, Limits je Werkzeug, Ergebniszeile sofort nach jedem Werkzeug
- WR-05: Authorization-Ersetzung der ZAP-Pruefung nur fuer das Ziel
- IN-01: yarn/npm per Platzhalter entfernt und Abwesenheit geprueft (api und web)
- IN-02: Kommentar zu doppelten Kopfzeilen in next.config.ts richtiggestellt
- IN-03: Berichtsordner Modus 700, Zugangsdaten nur als base64 (keine curl-Konfiguration)
- IN-04: flacher Klon wird bei gitleaks als unvollstaendig gemeldet
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Abschlusslauf der automatischen Pruefung, Vorher/Nachher-Tabelle, Liste des Offenen
- Einordnung der Befunde ergaenzt (Desktop-Bausteine, Testwerkzeuge)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- api: eigene Stufe prod-deps (nur Betriebsabhaengigkeiten, Prisma-Client dort erzeugt), Laufzeitstufe direkt von node:24-alpine
- api und web: npm, npx, corepack und yarn des Node-Abbilds entfernt
- api-Abbild 1,59 auf 1,12 GB; Fundzahl 3 kritisch/45 hoch auf 0 kritisch/6 hoch
- Beleg: Start gegen frische Datenbank (63 Migrationen), Rauchtests am neuen Stack
- Sicherheitsprotokoll, Betriebs- und Entwicklungsanleitung, CHANGELOG
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- decrypt lehnt jeden Echtheitsmarker ab, der nicht genau 16 Byte lang ist
- authTagLength 16 auch beim Verschluesseln (Ausgabe unveraendert)
- Tests: 4 Byte, 17 Byte, leer, gekipptes Bit; Rundlauf mit Umlauten
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- zap-baseline.sh: passive Aussenpruefung mit festgelegtem ZAP-Abbild, Ziel per ZAP_TARGET (Standard: oeffentliche Adresse von alpha), Anmeldedatei-Weg nur fuer den Ausnahmefall
- zap-hooks.py: Spinne fuellt keine Formulare aus und sendet keine (POST=0 lokal bewiesen)
- Sicherheitsprotokoll: Abschnitt Pruefung von aussen, erster Lauf direkt gegen die Anwendung (0 hoch, 2 mittel, 6 niedrig, 3 Info), Einordnung und Verlauf
- Betriebsanleitung Kapitel 9: Schritt Pruefung von aussen; Entwicklungsanleitung: Abschnitt ZAP; CHANGELOG
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- 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>