syncova-backup/apps/api/internal/httpapi
Jerrit Fritzsche 20b0919676
Some checks failed
CI / Backend (Go) (push) Failing after 31s
CI / Frontend (React/TypeScript) (push) Successful in 45s
CI / Sicherheitsprüfungen (push) Successful in 27s
Datei- und Ordnerwiederherstellung, Ordnerbaum, Geist Mono im Paket
**Warum keine Wiederherstellung funktionierte.** Der Dienst laeuft mit
`ProtectSystem=strict` und `ReadWritePaths` nur auf Repository und
Sicherungsordner — alles andere ist fuer ihn schreibgeschuetzt. Jedes Ziel
ausserhalb endete mit "mkdir: permission denied", und zwar **nach** der
Vorabpruefung. `/tmp` scheiterte anders: Mit `PrivateTmp=yes` hat der Dienst ein
eigenes /tmp, und was dort landet, sieht man von aussen gar nicht.

`setup.sh` legt jetzt `/srv/syncova-restore` an und traegt es in
`ReadWritePaths` ein; `--wiederherstellungsziel` ergaenzt weitere. Der Ort liegt
unter /srv und nicht unter /var/lib — Letzteres steht auf der Sperrliste des
Zielschutzes. Beide Regeln zugleich zu erfuellen laesst genau /srv uebrig; das
ist mir erst aufgefallen, nachdem ich die Flaeche zunaechst falsch gelegt hatte
und der eigene Zielschutz sie ablehnte.

**Zwei neue Endpunkte** (Vertrag entsprechend erweitert):

- `GET /filesystem/browse` — Verzeichnisse mit der Angabe, ob der **Dienst**
  dort schreiben darf. **Gemessen** durch eine Probedatei, nicht aus den
  Rechtebits geraten: Unter ProtectSystem=strict sagen die Bits nichts ueber
  das aus, was der Namensraum zulaesst. Gesperrte Orte werden gezeigt, nicht
  versteckt — sonst bliebe offen, warum ein Pfad fehlt.
- `GET /backups/{id}/contents` — das Manifest als Ebene eines Baums. Der Baum
  entsteht aus den **Pfaden**, nicht aus Verzeichniseintraegen: Ein Manifest
  kann eine Datei enthalten, deren Elternverzeichnis nicht als eigener Eintrag
  vorliegt, und wer nur `directory`-Eintraege auflistet, verliert ganze
  Teilbaeume. Durch Mutation bestaetigt.

**Auswahl statt Textfeld.** Der Assistent hat jetzt einen Ordnerbaum fuer das
Ziel und einen Browser fuer den Backup-Inhalt. Ordner **und** einzelne Dateien
lassen sich waehlen; beides geht als `path_prefix` in die Anfrage, weil der
Server auf Gleichheit oder Praefix mit Verzeichnisgrenze vergleicht. Bewusste
Grenze: eine Auswahl je Lauf — eine Liste kennt die API nicht, und mehrere
Laeufe vorzutaeuschen ergaebe mehrere Ausgaenge, die niemand mehr erklaeren
kann.

**Integritaetslauf.** "can't access property toLocaleString, chunks_checked is
undefined" — die Ergebnisse liegen unter `details`, und die Felder heissen
`missing_chunks`/`corrupted_chunks`, nicht umgekehrt. Betrifft alle vier
Pruefendpunkte; sie tragen dieselbe Huelle. Derselbe Fehler wie bei
/retention-policies: die Antwortform angenommen statt geprueft.

**Geist Mono liegt jetzt im Paket** (drei Schnitte, 128 KB, OFL-Lizenz dabei).
Ausgeliefert vom eigenen Ursprung — das verlangt die CSP, und ein
Backup-Server, dessen Oberflaeche von einem CDN abhaengt, waere auch ohne CSP
falsch. `font-display: swap`, damit der Text sofort steht.

Nachgewiesen gegen Debian 12: Vollwiederherstellung (5 Dateien), nur ein Ordner
(2 Dateien), nur eine Datei (1 Datei) — alle drei bitgenau. Der Server nennt
/srv/syncova-restore als beschreibbar und /etc, /usr, /var als gesperrt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 15:52:37 +02:00
..
agent_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
agent_task_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
alert_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
auth_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
auth_middleware_test.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
auth_middleware.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
browse_handler_test.go Datei- und Ordnerwiederherstellung, Ordnerbaum, Geist Mono im Paket 2026-08-18 15:52:37 +02:00
browse_handler.go Datei- und Ordnerwiederherstellung, Ordnerbaum, Geist Mono im Paket 2026-08-18 15:52:37 +02:00
contract_routes.txt Datei- und Ordnerwiederherstellung, Ordnerbaum, Geist Mono im Paket 2026-08-18 15:52:37 +02:00
contract_test.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
errors.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
health_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
httpapi_test.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
hypervisor_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
job_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
job_mapping.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
metrics_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
middleware.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
ransomware_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
report_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
repository_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
response.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
restore_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
retention_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
role_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
router.go Datei- und Ordnerwiederherstellung, Ordnerbaum, Geist Mono im Paket 2026-08-18 15:52:37 +02:00
security_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
server.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
user_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00
verification_handler.go Syncova Backups V1 2026-08-17 09:10:54 +02:00