Secretary Server (CalDAV/CardDAV)
Quick links
Komponenten
Der Server stellt mehrere WebDAV/CalDAV/CardDAV-Handler bereit:
- CalDAV:
/calendars/– Kalender und VJOURNAL-basierte Apps (Notes, Tasks, Journal) - CardDAV:
/addressbooks/– Adressbücher - WebDAV/Custom:
/principals/,/secrets/,/pdfs/, Namespace-Handler - Ressourcen: generischer Handler für GET/PUT/PROPPATCH/DELETE/MOVE/COPY
Addons (werden vom Server im eigenen User-Kontext periodisch gestartet):
- secretary-server-links – prüft gespeicherte Links, aktualisiert Status, markiert Änderungen und speichert Fehler
- secretary-server-news – abonniert RSS/Atom-Feeds, importiert neue Artikel als VJOURNAL-Ressourcen, verwaltet
X-NEWS-*Properties
Befehle
cargo build # Debug-Build
tools/rp-conformance.py target/release/secretary-rp # WebAuthn-Gegentest
cargo build --release # Release-Build
cargo test # Tests ausführen
dpkg-buildpackage -us -uc -b # .deb bauen (im Projektverzeichnis)
Abhängigkeiten
- Rust/Cargo (Build-Dependency)
- tokio, hyper (HTTP-Server)
- tokio-rustls, rustls (TLS)
- serde, toml (Konfiguration)
- quick-xml (XML/DAV)
- sha2, hex, base64 (Auth)
Konfiguration
- Pfad via
SECRETARY_CONFIG-Env-Variable (default:~/.config/secretary-server/secretary-server.toml) - TLS-Zertifikate via LE-Deploy-Hook in
~/.local/share/secretary-server/certs/ - TOML-Format, Optionen:
[server],[storage],[auth],[tls],[keys],[links],[news] [auth]-Felder:enabled,password_hash,salt(ein Passwort, kein Multi-User)- Username wird zur Laufzeit aus
$USER-Env gelesen (kein Config-Feld) [links]/[news]-Addons:active(Default: false) undintervalim humantime-Format"30m"/"1h"(Default:"30m"bzw."15m"). Der Server startetsecretary-server-linksbzw.secretary-server-newsselbst im User-Kontext in diesem Intervall (erster Lauf sofort nach dem Serverstart,tokio::time::interval). Die Addons haben kein eigenes systemd-Unit mehr. Weitere Felder der Sektionen (timeout_secs,user_agent,touch_last_checked,retries,insecure_tls,max_body_chars,prune_*) liest die jeweilige Binaerdatei.[links] retries(Default: 2) wiederholt vorübergehende Abruffehler des Link-Checkers (Transportfehler, HTTP 408/425/429/5xx) mit kurzem Backoff, bevor ein Defekt (X-LINK-LAST-ERROR) geschrieben wird; 403/404 bleiben endgültig.insecure_tls(Default: false, in[links]und[news]) schaltet die Zertifikats- und Hostname-Prüfung des HTTP-Client ab - gedacht für interne HTTPS-Dienste mit selbstsignierten Zertifikaten; die Inhalts-Prüfung per Hash bleibt davon unberührt.- Config-Validierung: Port-Bereich (1-65535), storage_path muss absolut sein,
aktives Addon braucht
interval > 0
Storage-Layout
<storage_path>/
├── calendars/ # CalDAV-Collections
│ ├── <collection>/
│ │ ├── .metadata # display_name, description, components
│ │ ├── .synctoken # Aktueller Sync-Token
│ │ ├── .sync-log # Änderungsprotokoll
│ │ └── *.ics # Kalender-Dateien
├── addressbooks/ # CardDAV-Collections
│ ├── <collection>/
│ │ ├── .metadata
│ │ ├── .synctoken
│ │ └── *.vcf # Kontakt-Dateien
├── notes/ tasks/ journal/ links/ launcher/ news/ # CalDAV-artige Top-Level-Roots
│ └── <collection>/ # der VJOURNAL-Apps (z. B. Default-Collections)
├── secrets/ # Secrets-Collections (WebDAV, seit 0.18.0)
│ └── <collection>/
│ ├── .metadata
│ ├── .synctoken
│ └── *.ics # Secret-Einträge
└── .storage.lock # Cross-Process-Mutations-Lock (Server + secretary-server-links + secretary-server-news)
Schlüsselverwaltung (Model B)
<storage_path>/keys/<vault-uid>/
├── key.json # Client-Registry (MK-Verpackungen, aktive Flags)
├── escrow.json # Escrow-verpackte Master Key Kopie
└── audit.json # append-only JSON-lines Audit-Log
Escrow-RSA-Keypair liegt außerhalb (default ~/.config/secretary-server/keys/).
Sicherheit
- Pfad-Traversal-Schutz in
resolve_path - Basic Auth mit SHA256 (mit optionalem Salt) und Constant-Time-Vergleich
- TLS-Unterstützung via rustls (optional, wenn
[tls]konfiguriert) - Atomare Schreibvorgänge (Temp-Datei + Rename)
src/safefs.rs: jeder Storage-Zugriff läuft descriptor-relativ vom gepinnten Storage-Root aus (openatmitO_NOFOLLOW/O_PATH, danachrenameat,renameat2(RENAME_NOREPLACE),unlinkat,mkdirat,fdopendir/readdir). Damit kann ein zwischen Prüfung und Zugriff eingebauter Symlink weder umgangen noch ausgenutzt werden (kein TOCTOU-Fenster mehr). Der konfigurierte Root selbst ist vertrauenswürdig und darf unter einem symlinked Pfad liegen; darunter wird nie ein Symlink traversiert.- Cross-Process-Mutations-Lock (
.storage.lock) für alle schreibenden Storage-Operationen; Server,secretary-server-linksundsecretary-server-newsteilen sich damit denselben Lock.