Server-side presentatiebibliotheek voor ocideck-web (#1986) #1990

Merged
brenno merged 1 commit from feature/web-server-deck-index into main 2026-09-04 13:03:16 +00:00
Owner

Summary

  • Nieuwe web_deck_index.dart service: haalt een config-bestand (ocideck-web-config.json) op van dezelfde origin, leest daarin het pad naar een map met .md-bestanden, en parseert de autoindex-HTML (Apache Options +Indexes / Nginx autoindex on) tot een lijst presentaties.
  • Welkomstscherm toont de lijst op web onder "Presentaties op deze server"; een klik opent het deck via dezelfde in-memory flow als URL-import (_importUrlWeb).
  • HOSTING.md §7 documenteert de configuratie voor de beheerder.
  • Vertalingen toegevoegd in 31 talen; Klingon (tlh) vrijgesteld in l10n_untranslated_test.dart (geen woord voor "presentaties"/"server").
  • Network sink guard allowlist bijgewerkt voor het nieuwe package:http-gebruik (same-origin, web-only, browser+CSP zijn de gate).

Ontwerpkeuze

De gebruiker koos voor de Apache/Nginx autoindex-route (server-side directory listing parsen) boven een statisch manifest of een server-side endpoint. Dit houdt "no backend" in stand: alleen statische bestanden en de bestaande autoindex-functie van de webserver. De beheerder configureert het pad via een statisch config-bestand op de server (deploy-time).

Waarom geen test voor de full fetch-flow

kIsWeb is onder flutter test altijd false, dus fetchWebDeckIndex() returnt direct een lege lijst. De parser (parseAutoindexHtml) is wél getest met 7 unit tests die Apache- en Nginx-autoindex-HTML, dubbele links, ongeldige input, relatieve URL-resolutie en hoofdlettergevoeligheid dekken.

Test plan

  • make check groen (golden failures zijn pre-existing op macOS, geconfirmeerd op origin/main)
  • make sast (semgrep) schoon
  • make check-secrets: gitleaks vond 1 pre-existing hit in macos/Pods/Manifest.lock (lokale CocoaPods-artefact, niet in git, niet in deze wijziging)
  • 7 unit tests voor parseAutoindexHtml
  • l10n-check groen (31 talen + tlh-vrijstelling)
  • network_sink_guard_test groen

Generated with Devin

## Summary - Nieuwe `web_deck_index.dart` service: haalt een config-bestand (`ocideck-web-config.json`) op van dezelfde origin, leest daarin het pad naar een map met `.md`-bestanden, en parseert de autoindex-HTML (Apache `Options +Indexes` / Nginx `autoindex on`) tot een lijst presentaties. - Welkomstscherm toont de lijst op web onder "Presentaties op deze server"; een klik opent het deck via dezelfde in-memory flow als URL-import (`_importUrlWeb`). - HOSTING.md §7 documenteert de configuratie voor de beheerder. - Vertalingen toegevoegd in 31 talen; Klingon (tlh) vrijgesteld in `l10n_untranslated_test.dart` (geen woord voor "presentaties"/"server"). - Network sink guard allowlist bijgewerkt voor het nieuwe `package:http`-gebruik (same-origin, web-only, browser+CSP zijn de gate). ### Ontwerpkeuze De gebruiker koos voor de **Apache/Nginx autoindex**-route (server-side directory listing parsen) boven een statisch manifest of een server-side endpoint. Dit houdt "no backend" in stand: alleen statische bestanden en de bestaande autoindex-functie van de webserver. De beheerder configureert het pad via een statisch config-bestand op de server (deploy-time). ### Waarom geen test voor de full fetch-flow `kIsWeb` is onder `flutter test` altijd `false`, dus `fetchWebDeckIndex()` returnt direct een lege lijst. De parser (`parseAutoindexHtml`) is wél getest met 7 unit tests die Apache- en Nginx-autoindex-HTML, dubbele links, ongeldige input, relatieve URL-resolutie en hoofdlettergevoeligheid dekken. #### Test plan - [x] `make check` groen (golden failures zijn pre-existing op macOS, geconfirmeerd op origin/main) - [x] `make sast` (semgrep) schoon - [x] `make check-secrets`: gitleaks vond 1 pre-existing hit in `macos/Pods/Manifest.lock` (lokale CocoaPods-artefact, niet in git, niet in deze wijziging) - [x] 7 unit tests voor `parseAutoindexHtml` - [x] l10n-check groen (31 talen + tlh-vrijstelling) - [x] network_sink_guard_test groen Generated with [Devin](https://devin.ai)
feat(web): server-side presentatiebibliotheek via autoindex (#1986)
All checks were successful
scans / scans (pull_request) Successful in 2m52s
static-gate / static-gate (pull_request) Successful in 6m16s
88d24ba68c
De webversie vroeg elke bezoeker om een bestand van de eigen machine te
kiezen. Op een server waar presentaties al staan, is dat onhandig: de
gebruiker wil bladeren door wat er al ligt. Deze wijziging voegt een
backendless presentatiebibliotheek toe die de bestaande autoindex-functie
van de webserver (Apache Options +Indexes / Nginx autoindex on) hergebruikt.

De beheerder plaatst een config-bestand (ocideck-web-config.json) op de
app-root dat het pad naar de presentatiemap aanwijst. De web-app haalt dat
config op (same-origin), leest de autoindex-HTML, parseert de .md-links, en
toont ze op het welkomstscherm onder "Presentaties op deze server". Een klik
opent het deck via dezelfde in-memory flow als URL-import — geen backend,
geen nieuw aanvalsoppervlak, decks blijven gewone .md-bestanden.

Zonder config-bestand is de feature onzichtbaar: bestaande deployments
merken niets. De feature is opt-in en afwezigheid is geen fout.

Closes #1986

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
brenno merged commit eda75ede05 into main 2026-09-04 13:03:16 +00:00
Sign in to join this conversation.
No description provided.