Release 0.3.0
This commit is contained in:
1 parent
08e8875cb5
commit
7590be66a5
31 files changed
+3270
-151
No files matched your search
@@ -66,3 +66,28 @@
|
||||
- Lokaler Produktionsserver der Browsertests über HTTP gestartet; Healthcheck
|
||||
und Migration vor Start erfolgreich
|
||||
- `bash -n start.sh`: erfolgreich
|
||||
|
||||
## Etappe 3
|
||||
|
||||
| Kriterium | Nachweis | Stand |
|
||||
| ----------------------------------------------- | ---------------------------------------------------------------------------------------------- | --------------------- |
|
||||
| Anlegen, Bearbeiten, Suchen, Filtern und Reload | Browserrundlauf mit Vorlage, Autosave, Quellen, Status, Suche und Neuladen | erfüllt am 21.10.2026 |
|
||||
| Taxonomien unabhängig | Format einzeln sowie Themen und Abschnittskategorien mehrfach gespeichert und gefiltert | erfüllt am 21.10.2026 |
|
||||
| Sicheres Markdown | Verhaltenstest und Browservorschau entfernen Skript/JavaScript, Formatierung bleibt erhalten | erfüllt am 21.10.2026 |
|
||||
| Private Bilder | Signatur-/Größenprüfung; anonymer Direktrequest erhält keinen Dateiinhalt | erfüllt am 21.10.2026 |
|
||||
| Sichtbare Speicherfehler | Actionfehler und Autosave-Fehlerstatus bleiben am Formular sichtbar | erfüllt am 21.10.2026 |
|
||||
| Konflikterkennung | zwei Browserseiten; veraltete Revision erhält Konflikt und überschreibt die neue Fassung nicht | erfüllt am 21.10.2026 |
|
||||
| Archiv und Wiederherstellung | Browserrundlauf blendet Piece aus und stellt den vorherigen Status wieder her | erfüllt am 21.10.2026 |
|
||||
| Duplikat | Verhaltenstest und Browser prüfen unabhängige Kopie samt Zuordnungen und Bild | erfüllt am 21.10.2026 |
|
||||
|
||||
## Ausgeführte Prüfungen Etappe 3
|
||||
|
||||
- `npm run lint`: erfolgreich
|
||||
- `npm run check`: 0 Fehler und 0 Warnungen
|
||||
- `npm test`: 13 Tests in 3 Dateien erfolgreich
|
||||
- `npm run build`: erfolgreich mit `@sveltejs/adapter-node`
|
||||
- `npm run test:e2e`: 10 von 10 Browsertests erfolgreich
|
||||
- Browserprüfung bei 390, 768, 960, 1280 und 1440 Pixeln in beiden Themes ohne
|
||||
ungewollten horizontalen Überlauf
|
||||
- Mobile Darkmode-Aufnahme des Piece-Editors visuell kontrolliert
|
||||
- `bash -n start.sh` und `git diff --check`: erfolgreich
|
||||
+38
-16
@@ -36,18 +36,18 @@ spätere API dieselben Regeln verwenden.
|
||||
Etappe 1 materialisiert nur den für echte Vorschau- und Seed-Daten benötigten
|
||||
Kern. Folgende Grenzen sind für spätere Migrationen bereits festgelegt.
|
||||
|
||||
| Bereich | Geplante Entitäten und Beziehungen |
|
||||
| ----------- | ---------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Identität | `users`, Rollen, Sessions, Einladungen, Reset-Tokens und Sperren sind umgesetzt; technische Zugänge folgen später |
|
||||
| Taxonomie | getrennte `section_categories`, `formats`, `topics`; Pieces und Vorschläge über Zuordnungstabellen mehrfach verknüpft |
|
||||
| Inhalt | `pieces` mit Status und Dauer; Quellen, Medien, private Recherche, Moderation, Präsentation und Vorlagen als getrennte Daten |
|
||||
| Sendungsbau | `shows`, geordnete `show_sections`, kopierte `piece_usages`, Reservebank und Sendungsvorlagen; Original-ID bleibt Referenz |
|
||||
| Live | expliziter Live-Stand, aktuelles Element, Status je Verwendung, tatsächliche Zeiten und getrennte Präsentationsausgabe |
|
||||
| Historie | unveränderliche Abschluss-Snapshots und Verwendungshistorie; Übersprungenes zählt nicht als gesendet |
|
||||
| Freigaben | widerrufbare, gehashte Lesetokens mit Sendung, Umfang, Passwortoption und Ablaufzeit |
|
||||
| RSS | Feedquellen, Abrufläufe und externe Einträge mit stabiler Herkunfts-ID sowie Status neu/übernommen/verworfen |
|
||||
| API/Audit | technische Berechtigungen, Idempotenzschlüssel und Audit-Ereignisse mit Akteur, Aktion und Ziel |
|
||||
| Betrieb | Anwendungseinstellungen und spätere Job-Zustände, keine Geheimnisse im Klartext ohne begründete Schutzstrategie |
|
||||
| Bereich | Geplante Entitäten und Beziehungen |
|
||||
| ----------- | -------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Identität | `users`, Rollen, Sessions, Einladungen, Reset-Tokens und Sperren sind umgesetzt; technische Zugänge folgen später |
|
||||
| Taxonomie | getrennte `section_categories`, `formats`, `topics`; Pieces und Vorschläge über Zuordnungstabellen mehrfach verknüpft |
|
||||
| Inhalt | `pieces` mit Status, Dauer, Revision, getrennten Textbereichen, Quellen und privaten Medien; Vorlagen sind definierte Startwerte |
|
||||
| Sendungsbau | `shows`, geordnete `show_sections`, kopierte `piece_usages`, Reservebank und Sendungsvorlagen; Original-ID bleibt Referenz |
|
||||
| Live | expliziter Live-Stand, aktuelles Element, Status je Verwendung, tatsächliche Zeiten und getrennte Präsentationsausgabe |
|
||||
| Historie | unveränderliche Abschluss-Snapshots und Verwendungshistorie; Übersprungenes zählt nicht als gesendet |
|
||||
| Freigaben | widerrufbare, gehashte Lesetokens mit Sendung, Umfang, Passwortoption und Ablaufzeit |
|
||||
| RSS | Feedquellen, Abrufläufe und externe Einträge mit stabiler Herkunfts-ID sowie Status neu/übernommen/verworfen |
|
||||
| API/Audit | technische Berechtigungen, Idempotenzschlüssel und Audit-Ereignisse mit Akteur, Aktion und Ziel |
|
||||
| Betrieb | Anwendungseinstellungen und spätere Job-Zustände, keine Geheimnisse im Klartext ohne begründete Schutzstrategie |
|
||||
|
||||
### Historien- und Kopierregel
|
||||
|
||||
@@ -89,6 +89,28 @@ konfigurierten Outbox-Pfad, `smtp` nutzt Nodemailer nur nach expliziter Auswahl.
|
||||
Die feste Anwendungs-Origin erzeugt Links und bestimmt den `Secure`-Status der
|
||||
Cookies; sie wird nicht aus ungeprüften Request-Headern übernommen.
|
||||
|
||||
## Inhalte, Markdown und Medien
|
||||
|
||||
Etappe 3 führt die Inhaltslogik in `src/lib/server/content.ts` zusammen. Listen
|
||||
erhalten ausschließlich kompakte Piece-Daten; private Recherche und vollständige
|
||||
Redaktionstexte werden nur an den angemeldeten Editor ausgeliefert. Themen und
|
||||
Abschnittskategorien sind Mehrfachzuordnungen, das Format bleibt eine einzelne
|
||||
unabhängige Zuordnung. Quellen werden gemeinsam mit einem Piece atomar ersetzt.
|
||||
|
||||
Jedes Piece besitzt eine ganzzahlige Revision. Speichern, Archivieren und
|
||||
Medienänderungen verwenden ein bedingtes Update auf die erwartete Revision.
|
||||
Eine veraltete Bearbeitung liefert einen Konflikt und verändert weder Piece noch
|
||||
Zuordnungen. Archivieren merkt sich den vorherigen Arbeitsstatus für die
|
||||
Wiederherstellung. Duplikate erhalten neue IDs und unabhängige Bilddateien.
|
||||
|
||||
Markdown wird roh gespeichert, mit Marked serverseitig gerendert und danach mit
|
||||
sanitize-html auf eine kleine Allowlist reduziert. Bilder werden nicht über
|
||||
Markdown eingebettet. Uploads akzeptieren höchstens 5 MB und nur anhand ihrer
|
||||
Dateisignatur erkannte JPEG-, PNG-, WebP- oder GIF-Dateien. Interne Dateinamen
|
||||
sind zufällige IDs; Originalnamen werden nie als Pfad verwendet. `/media/[id]`
|
||||
prüft die Anmeldung und liefert private Antworten mit `no-store`, `nosniff`,
|
||||
Same-Origin-Ressourcenrichtlinie und restriktiver CSP aus.
|
||||
|
||||
## Oberflächenstruktur
|
||||
|
||||
Die Hauptnavigation umfasst Eingang, Fundus, Sendungen, Archiv und Verwaltung.
|
||||
@@ -108,7 +130,7 @@ Fachabläufe werden jedoch nicht vorgetäuscht.
|
||||
## Sicherheitsgrenzen ab den Folgeetappen
|
||||
|
||||
Authentifizierung und Autorisierung werden seit Etappe 2 serverseitig an jeder
|
||||
betroffenen Route und Action geprüft. Markdown und fremdes HTML werden vor Ausgabe bereinigt.
|
||||
Uploadzugriff folgt denselben Rechten. Netzwerkabrufe erhalten Schutz gegen
|
||||
interne Ziele, Größen-/Zeitlimits und kontrollierte Redirects. Diese Regeln
|
||||
sind geplant, aber nicht Bestandteil der Etappe-1-Vorschauen.
|
||||
betroffenen Route und Action geprüft. Markdown und fremdes HTML werden vor
|
||||
Ausgabe bereinigt. Uploadzugriff folgt denselben Rechten. Spätere
|
||||
Netzwerkabrufe erhalten Schutz gegen interne Ziele, Größen-/Zeitlimits und
|
||||
kontrollierte Redirects.
|
||||
@@ -135,3 +135,40 @@ Geheimnisträger und werden weder versioniert noch über eine Route ausgeliefert
|
||||
|
||||
Nodemailer 10.1.7 unterstützt Node 20 oder neuer und ist MIT-0-lizenziert.
|
||||
Quelle: <https://github.com/nodemailer/nodemailer>
|
||||
|
||||
## D-011: Form-Actions und optimistische Piece-Revisionen
|
||||
|
||||
Piece-Schreibvorgänge bleiben normale SvelteKit-Form-Actions und funktionieren
|
||||
damit ohne clientseitiges JavaScript. `use:enhance` ergänzt den Editor um
|
||||
verzögertes Autospeichern und sichtbare Zustände. Vor interner Navigation wird
|
||||
eine ausstehende Änderung gespeichert; beim Verlassen der Seite greift die
|
||||
Browserwarnung. Jede Mutation vergleicht eine erwartete ganzzahlige Revision in
|
||||
derselben SQLite-Transaktion. Veraltete Änderungen liefern 409 und überschreiben
|
||||
keine aktuelleren Inhalte oder Zuordnungen.
|
||||
|
||||
Quelle: <https://svelte.dev/docs/kit/form-actions>
|
||||
|
||||
## D-012: Markdown immer nach dem Parsen bereinigen
|
||||
|
||||
Marked 18.1.1 rendert die gespeicherten Markdown-Texte serverseitig. Marked
|
||||
weist ausdrücklich darauf hin, dass seine HTML-Ausgabe nicht bereinigt ist.
|
||||
Darum reduziert sanitize-html 2.18.1 das Ergebnis anschließend auf ausgewählte
|
||||
Text-, Listen-, Code- und Linkelemente. Skripte, Bilder, Ereignisattribute,
|
||||
relative Protokoll-URLs und andere Schemata werden nicht zugelassen.
|
||||
|
||||
Quellen:
|
||||
|
||||
- <https://github.com/markedjs/marked>
|
||||
- <https://github.com/apostrophecms/apostrophe/tree/main/packages/sanitize-html>
|
||||
|
||||
## D-013: Private Rasterbilder außerhalb statischer Assets
|
||||
|
||||
Uploads liegen ausschließlich im konfigurierten privaten Uploadverzeichnis und
|
||||
werden über zufällige interne Namen adressiert. file-type 22.2.0 erkennt den Typ
|
||||
aus dem Dateiinhalt; Client-MIME und Originalname entscheiden nicht über Typ oder
|
||||
Pfad. Zugelassen sind JPEG, PNG, WebP und GIF bis 5 MB. SVG und allgemeine
|
||||
Dokumente bleiben ausgeschlossen. Eine authentifizierte ID-Route liefert Bilder
|
||||
mit sicherheitsrelevanten Headern aus. Das Adapter-Requestlimit liegt mit 6 MB
|
||||
knapp oberhalb des fachlichen Dateilimits.
|
||||
|
||||
Quelle: <https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload>
|
||||
+23
-8
@@ -2,9 +2,9 @@
|
||||
|
||||
## Aktueller Umfang
|
||||
|
||||
Etappe 1 und Etappe 2 sind abgeschlossen. Architektur, Gesamtdatenmodell,
|
||||
Anmeldung, Rollen und lokaler Betriebsweg sind dokumentiert. Etappe 3 wurde
|
||||
nicht begonnen.
|
||||
Etappe 1 bis Etappe 3 sind abgeschlossen. Architektur, Gesamtdatenmodell,
|
||||
Anmeldung, Rollen, persistente Inhaltsbearbeitung und lokaler Betriebsweg sind
|
||||
dokumentiert. Etappe 4 wurde nicht begonnen.
|
||||
|
||||
## Umgesetzter Stand Etappe 1
|
||||
|
||||
@@ -35,12 +35,11 @@ Beschreibungen und Metadaten bleiben ohne feste Kartenhöhe sichtbar. Suche und
|
||||
Statusfilter sind gleich hoch, und die Filtergruppe wird nur als Ganzes
|
||||
umgebrochen.
|
||||
|
||||
## Nicht Bestandteil dieser Etappe
|
||||
## Noch nicht umgesetzt
|
||||
|
||||
Echte Inhaltsbearbeitung, Autospeichern, Sendungsplanung, Live-Steuerung,
|
||||
Präsentationsfenster, Archivabschluss, Freigaben, RSS und API.
|
||||
Die Vorschauen dürfen nicht als Implementierung dieser Funktionen verstanden
|
||||
werden.
|
||||
Sendungsplanung, echte Live-Steuerung, Präsentationsfenster, Archivabschluss,
|
||||
Freigaben, RSS und API. Die bestehenden Vorschauen dürfen nicht als
|
||||
Implementierung dieser späteren Funktionen verstanden werden.
|
||||
|
||||
## Umgesetzter Stand Etappe 2
|
||||
|
||||
@@ -53,6 +52,22 @@ werden.
|
||||
- lokale Mail-Outbox als Vorgabe und explizit konfigurierbarer SMTP-Versand
|
||||
- responsive Authentifizierungs- und Kontenverwaltungsoberflächen
|
||||
|
||||
## Umgesetzter Stand Etappe 3
|
||||
|
||||
- persistente Piece-Neuanlage aus leerem Entwurf oder drei redaktionellen Vorlagen
|
||||
- Schnellaufnahme von Gedanken und HTTP-/HTTPS-Links im Eingang
|
||||
- vollständiger Editor für Quellen, Dauer, Status und getrennte Einleitung,
|
||||
Recherche, Moderation, Überleitung und Präsentation
|
||||
- serverseitig bereinigte Markdown-Vorschau
|
||||
- unabhängige Themen, Formate und Abschnittskategorien mit Barkeeper-Verwaltung
|
||||
- serverseitige Suche und Filter nach Status, Format, Thema und Abschnitt
|
||||
- Autospeichern mit sichtbarem Zustand und Warten vor interner Navigation
|
||||
- optimistische Revisionen verhindern unbemerktes Überschreiben
|
||||
- Duplizieren einschließlich Quellen, Taxonomie und Bildern
|
||||
- Archivieren und Wiederherstellen in den vorherigen Arbeitsstatus
|
||||
- private Rasterbilder mit Größen-/Signaturprüfung und geschützter Auslieferung
|
||||
- erweiterter Seed mit Eingangs-, Archiv-, Markdown- und Recherchebeispielen
|
||||
|
||||
## Bekannte offene Betriebsprüfung
|
||||
|
||||
Eine echte Cloudron-Installation samt Backup/Restore, Reverse-Proxy-Verhalten
|
||||
|
||||
Reference in new issue
Block a user