You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+33Lines changed: 33 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
8
8
## [Unreleased]
9
9
10
+
## [0.70.2] - 2026-06-10
11
+
12
+
### Security
13
+
-**WebDAV document storage**: UI-managed targets now reject private, loopback, link-local, internal-DNS, and DNS-rebinding destinations both before persistence and during socket lookup. Trusted private-network targets remain available through `DOCUMENT_STORAGE_WEBDAV_URL`.
14
+
-**WebDAV path normalization**: replaced ambiguous trailing-slash regular expressions with linear path processing to prevent polynomial-time matching on attacker-controlled configuration.
15
+
16
+
## [0.70.1] - 2026-06-10
17
+
18
+
### Removed
19
+
-**Repository metadata**: removed the last published reference to an internal development tool.
20
+
21
+
## [0.70.0] - 2026-06-10
22
+
23
+
### Added
24
+
-**WebDAV document storage**: admins can select WebDAV as the global destination for new document files, including calendar attachments, with per-field environment overrides, connection tests, protected configuration changes, and clear local/WebDAV/DMS status throughout the interface.
25
+
26
+
### Changed
27
+
-**Document binary handling**: previews, downloads, calendar attachments, deletion, and Paperless/DMS uploads now share one storage layer. Existing local files stay local, failed WebDAV uploads never fall back silently, failed database writes clean up staged remote files, and database backups explicitly exclude WebDAV binaries, which must be backed up separately.
28
+
29
+
## [0.69.0] - 2026-06-10
30
+
31
+
### Added
32
+
-**Documents — Paperless-ngx (DMS) integration**: admins can connect a Paperless-ngx document management system in Settings (server URL + API token, with a connection test). Multiple DMS accounts are supported.
33
+
-**Link from DMS**: search a connected DMS and link existing documents into the Documents module as references — the binary stays in the DMS and is not duplicated. Previews and downloads of linked documents are proxied live from the DMS, while each document's family/restricted/private visibility is still enforced.
34
+
-**Upload to DMS**: push a local document up into the connected DMS (asynchronous OCR ingestion); when several DMS accounts are configured, an account picker lets you choose the target.
35
+
36
+
All DMS operations are admin-only, and the API token is never returned in responses. The integration uses a provider-pluggable adapter layer (Paperless-ngx is the first adapter) and requires no new environment variables — everything is configured in-app.
37
+
38
+
## [0.68.4] - 2026-06-09
39
+
40
+
### Fixed
41
+
-**Documents**: PDF previews no longer fail with "This page was blocked by Chrome" in Chromium-based browsers. The preview iframe dropped its `sandbox` attribute (Chromium refuses to start its internal PDF viewer inside sandboxed frames) and the `/documents/:id/preview` endpoint now sends a PDF-specific Content-Security-Policy (`default-src 'self'`) instead of the strict `default-src 'none'` that blocked the native viewer. PDFs are still served same-origin as `application/pdf` with `X-Content-Type-Options: nosniff`, so no scripts can execute; non-PDF previews keep the strict policy.
Copy file name to clipboardExpand all lines: README.md
+6-2Lines changed: 6 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -158,7 +158,7 @@ Each module is independent. Use what fits, skip what doesn't.
158
158
||**Meals**| Weekly drag-and-drop planner with multiple items per slot. Direct export to shopping list. |
159
159
||**Recipes**| Create, duplicate, and scale recipes. Pre-fill meal slots or save any planned meal as a recipe. |
160
160
||**Calendar**| Google Calendar (OAuth) and CalDAV sync (iCloud, Nextcloud, Radicale). ICS subscriptions, recurring events, file attachments, public & school holiday overlays (OpenHolidays), month and agenda views. |
161
-
||**Documents**| Upload and organize family files. Folders, tags, per-document visibility controls, in-browser preview, drag-and-drop. |
161
+
||**Documents**| Upload and organize family files. Folders, tags, per-document visibility controls, in-browser preview, drag-and-drop. New files, including calendar attachments, can optionally use WebDAV storage; Paperless-ngx (DMS) linking and uploads remain supported. |
||**Notes & Contacts**| Colored sticky notes with Markdown. Contact directory with CardDAV sync. |
@@ -168,6 +168,10 @@ Each module is independent. Use what fits, skip what doesn't.
168
168
||**API Tokens**| Named Bearer / X-API-Key tokens for integrations. OpenAPI 3.0 spec included. |
169
169
||**Backup**| Manual and scheduled database backup and restore, with automatic pre-restore rollback. Optional WebDAV upload target (Nextcloud, ownCloud, Hetzner, etc.). |
170
170
171
+
> **WebDAV document storage needs its own backup.** SQLite/database backups contain document metadata and links, but not document binaries stored on WebDAV. Back up the WebDAV target separately.
172
+
> WebDAV targets configured in the admin UI must resolve to public network addresses. For a trusted
173
+
> LAN or loopback target, set `DOCUMENT_STORAGE_WEBDAV_URL` through the deployment environment.
174
+
171
175
---
172
176
173
177
## Design & technology
@@ -259,7 +263,7 @@ Open `http://localhost:3000`. The first visit walks you through creating your ad
259
263
260
264
[Installation](docs/installation.md) · [Spec & data model](docs/SPEC.md) · [Modules](MODULES.md) · [Contributing](CONTRIBUTING.md) · [Security](SECURITY.md) · [Privacy for self-hosters](docs/PRIVACY-FOR-SELFHOSTERS.md) · [Changelog](CHANGELOG.md) · [Backlog](BACKLOG.md)
261
265
262
-
If you self-host Yuvomi in a GDPR context (EU/EEA, processing other people's data), read [docs/PRIVACY-FOR-SELFHOSTERS.md](docs/PRIVACY-FOR-SELFHOSTERS.md) before going live: it covers third-country assessments for every external service (weather, CalDAV/CardDAV, OIDC, WebDAV backup), data-processing-agreement notes, log-retention guidance, and a records-of-processing template.
266
+
If you self-host Yuvomi in a GDPR context (EU/EEA, processing other people's data), read [docs/PRIVACY-FOR-SELFHOSTERS.md](docs/PRIVACY-FOR-SELFHOSTERS.md) before going live: it covers third-country assessments for every external service (weather, CalDAV/CardDAV, OIDC, WebDAV backup and document storage), data-processing-agreement notes, log-retention guidance, and a records-of-processing template.
Copy file name to clipboardExpand all lines: SECURITY.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -38,6 +38,8 @@ Vulnerabilities that require physical access to the host or root on the server a
38
38
- API rate limiting (300 requests/min per IP)
39
39
- Content Security Policy via Helmet (`self`-only)
40
40
- Optional SQLCipher AES-256 database encryption (built into the official Docker image; enable by setting `DB_ENCRYPTION_KEY`. Bare-metal installs require a SQLCipher-enabled build of better-sqlite3.)
41
+
- Existing WebDAV documents protect their connection configuration: changing the URL, username, password, or base path requires explicit admin confirmation and a successful read test against an existing object; required connection data cannot be removed while WebDAV documents exist
42
+
- UI-managed WebDAV document-storage URLs are protected against SSRF: private, loopback, link-local, internal-DNS, and DNS-rebinding targets are rejected before persistence and during socket lookup. Trusted private-network targets require the deployment-controlled `DOCUMENT_STORAGE_WEBDAV_URL` override
41
43
- No API endpoint accessible without session auth (except login)
42
44
-`SESSION_SECRET` is mandatory - server refuses to start if unset
| CalDAV/CardDAV-Server |`server/services/caldav-sync.js`, `server/services/cardav-sync.js`| nur wenn Nutzer einen Sync konfiguriert | abhängig vom Provider | ja, bei kommerziellen Anbietern (siehe 2.3) |
70
71
| OIDC-Provider |`server/auth.js`, `server/services/oidc.js`| nur wenn konfiguriert | abhängig vom Provider | meistens ja (siehe 2.4) |
71
72
| WebDAV-Backup |`server/services/backup-webdav.js`| nur wenn konfiguriert | abhängig vom Provider | ja, bei kommerziellen Anbietern (siehe 2.5) |
73
+
| WebDAV-Dokumentspeicher |`server/services/document-storage.js`| nur wenn konfiguriert | abhängig vom Provider | ja, bei kommerziellen Anbietern (siehe 2.6) |
72
74
73
75
### 2.1 Open-Meteo (Wetter-Standard)
74
76
@@ -165,9 +167,11 @@ Konfiguration so, dass du auf einen EU-Provider umstellen könntest.
165
167
`server/routes/backup.js` und `server/services/backup-scheduler.js`.
166
168
-**Aktiv nur, wenn:** du WebDAV-Backups in deinen Backup-Einstellungen
167
169
konfigurierst.
168
-
-**Was wird übertragen:** Backup-Archive deiner Yuvomi-Instanz inkl. **aller
169
-
Nutzdaten** — Kontakte, Termine, Notizen, Dokumente. Das ist datenschutz-
170
-
rechtlich der sensibelste Datenstrom.
170
+
-**Was wird übertragen:** Backup-Archive deiner Yuvomi-Instanz mit allen
171
+
SQLite-Nutzdaten — Kontakte, Termine, Notizen sowie Dokument-Metadaten und
172
+
lokal gespeicherte Dokumentdateien. Dateien aus dem separaten
173
+
WebDAV-Dokumentspeicher sind nicht enthalten. Das Backup ist
174
+
datenschutzrechtlich ein besonders sensibler Datenstrom.
171
175
-**Drittland-Bewertung — abhängig vom Anbieter:**
172
176
| Anbieter | Standort | Bewertung |
173
177
|---|---|---|
@@ -183,6 +187,28 @@ Konfiguration so, dass du auf einen EU-Provider umstellen könntest.
183
187
WebDAV-Provider zum reinen Speicheranbieter ohne Klartextzugriff. Halte
184
188
die Verschlüsselungs-Passphrase getrennt vom Backup-Speicherort.
185
189
190
+
### 2.6 WebDAV-Dokumentspeicher
191
+
192
+
-**Code-Stelle:**`server/services/document-storage.js`, gesteuert über
193
+
`server/routes/documents.js`.
194
+
-**Aktiv nur, wenn:** ein Admin WebDAV als Ziel für neue Dokumentdateien
195
+
aktiviert oder die entsprechenden `DOCUMENT_STORAGE_WEBDAV_*`-Variablen
196
+
setzt.
197
+
-**Was wird übertragen:** neu hochgeladene Dokumentdateien einschließlich
198
+
neuer Kalenderanhänge, außerdem Basic-Auth-Zugangsdaten und die IP-Adresse
199
+
des Yuvomi-Servers. Dateinamen werden nicht als Objektpfad übernommen; die
200
+
Dateien können dennoch unmittelbar personenbezogene oder besonders
201
+
schützenswerte Inhalte enthalten.
202
+
-**Drittland und AVV:** Es gelten dieselben providerabhängigen Bewertungen
203
+
wie beim WebDAV-Backup in Abschnitt 2.5. Bei einem kommerziellen Hoster ist
204
+
außerhalb der Haushaltsausnahme ein AVV erforderlich; bei Anbietern außerhalb
205
+
des EWR sind zusätzlich Angemessenheitsbeschluss, DPF oder SCCs mit TIA zu
206
+
prüfen.
207
+
-**Empfehlung:** Bevorzuge einen selbst gehosteten oder in der EU betriebenen
208
+
WebDAV-Dienst, beschränke den Zugriff auf ein eigenes Verzeichnis und sichere
209
+
dieses Ziel separat. SQLite-Backups enthalten nur Metadaten und
210
+
Speicher-Schlüssel, nicht die dort abgelegten Binärdateien.
211
+
186
212
---
187
213
188
214
## 3. Logging und Speicherbegrenzung (Art. 5 Abs. 1 lit. e DSGVO)
@@ -299,7 +325,8 @@ konkrete Konfiguration ein und ergänze um eigene Verarbeitungen.
| 5 | Backups | Datensicherung | Art. 6 Abs. 1 lit. f | Nutzer und alle Datensubjekte der App | Vollbackup der DB | <<WebDAV-Provider>> | <<Aufbewahrungs-Konzept, z. B. 30 Tage rollierend>> | Verschlüsselung vor Upload, AVV |
302
-
| 6 | Sicherheits-/Betriebs-Logs | Missbrauchserkennung, Fehlersuche | Art. 6 Abs. 1 lit. f | Nutzer / Login-Versuchende | IP bei fehlgeschlagenen Logins, Fehler-Stacktraces | nur lokal | nein | **max. 30 Tage** | Rotation, Zugangsbeschränkung |
328
+
| 6 | Dokumentablage | Gemeinsame Ablage und Kalenderanhänge | Art. 6 Abs. 1 lit. b/f | Nutzer und in Dokumenten genannte Personen | Dokumentdateien, Anhänge, Metadaten | <<WebDAV-Provider, falls aktiv>> | <<je nach Anbieter>> | bis Löschung durch Nutzer | TLS, eigener Pfad, AVV, separates Backup |
329
+
| 7 | Sicherheits-/Betriebs-Logs | Missbrauchserkennung, Fehlersuche | Art. 6 Abs. 1 lit. f | Nutzer / Login-Versuchende | IP bei fehlgeschlagenen Logins, Fehler-Stacktraces | nur lokal | nein | **max. 30 Tage** | Rotation, Zugangsbeschränkung |
303
330
304
331
### 5.3 Auftragsverarbeiter (Art. 28)
305
332
@@ -308,7 +335,7 @@ konkrete Konfiguration ein und ergänze um eigene Verarbeitungen.
308
335
| <<z. B. Hetzner Online GmbH>> | Server-Hosting | <<Datum>> | DE | AVV nach Art. 28; ISO 27001 |
0 commit comments