LibrePlan-connector (specialist module): read-only REST import #1240

Closed
opened 2026-08-04 21:04:04 +00:00 by brenno · 0 comments
Owner

Wat

Een specialist module (off by default, onder Settings → Extensions) die een projectsnapshot ophaalt van een LibrePlan-instantie via de REST API (XML, Basic Auth) en vult OciDeck-slides. Read-only, user-initiated, desktop-only.

Design-doc: docs/design/LIBREPLAN_CONNECTOR.md (gecommit op design/libreplan-connector)

Afhankelijk van: #1238 (Gantt-slidetype) — de connector vult het Gantt-type, plus bestaande types.

Waarom

LibrePlan is een server-gebaseerde PM-tool. De integratie brengt LibrePlan-data naar OciDeck-presentaties: een projectstatus, een Gantt, een resource-load, een timesheet — als deck dat de deur uit gaat. OciDeck is de presentatielaag, LibrePlan is het systeem van record.

De richting: consumer, niet client

LibrePlan server ──REST GET──► OciDeck connector ──► slides (Markdown)
  (user-pointed)                (off by default)      (sovereign .md)

De pijl wijst één kant op. Geen push-back, geen live-sync, geen embedded UI. De snapshot landt als soevereine Markdown die overleeft zonder LibrePlan.

Scope van dit issue

  1. libreplan_client.dart — REST client (GET-only, Basic Auth, XML)
  2. libreplan_xml.dart — XML → Dart models (pure Dart, testable)
  3. Converters — per view: Gantt, WBS, resource-load, timesheet, status, RACI, critical path → bestaande + nieuwe slidetypes
  4. libreplan_import.dart — orchestration: fetch + convert + insert
  5. Settings form + import dialog (project picker, view picker, date range)
  6. SecretStorewriteLibreplanPassword/readLibreplanPassword, keyed op base URL + username
  7. pubspec.yamlxml dependency + make sbom
  8. DocsPRIVACY.md (what leaves your device), SECURITY.md (trust boundary), USER_GUIDE.md
  9. Tests — XML parsing, converters, client (mock HTTP), secret store

Beveiligingscontract (security-architect reviewed)

  • Credentials in OS-keychain via SecretStore, nooit in .md, nooit in prefs, nooit in logs
  • Desktop-only — web keychain is niet veilig (platformCanStoreSecrets = false)
  • Via NetGuard — SSRF-guard, interne adressen dicht tenzij trustedInternal
  • HTTPS verplicht — plain HTTP alleen voor vertrouwde interne servers
  • Certificaat-validatie via PinnedHttpClient (bestaand trust-dialog)
  • XML-parser veilig — geen XXE, entity-expansion limits, fail-closed
  • Privacy-projectie — geïmporteerde data gaat door OciWacht, net als hand-getypte slides
  • Logs — base URL + username bij fout, nooit response body (bevat projectdata)

Welke LibrePlan-data naar welk slidetype

LibrePlan endpoint OciDeck slidetype Nieuw?
orderelements (WBS + dates + deps) Gantt (#1238) + tree Gantt is nieuw
resources table / matrix (RACI) nee
resourceshours (load over time) chart heatmap nee
workreports (timesheets) table nee
expenses scorecard / chart nee
calendars (capacity) chart nee
criteria (skills) matrix nee
critical path flow nee
project status (mixed) cockpit nee

Wat expliciet niet in dit issue zit

  • Geen push-back / write naar LibrePlan — GET-only, geen POST/DELETE
  • Geen live-sync — snapshot is point-in-time
  • Geen web build — desktop-only (keychain)
  • Geen embedded LibrePlan UI — geen iframe, geen proxy
  • Geen theming vanuit LibrePlan — OciDeck style-profile
  • Geen Gantt-slidetype — dat is #1238, dit issue is afhankelijk

Open vragen (te bevestigen in implementatie)

  1. Projectlijst-grootte — voorgesteld: fetch + cache + search field
  2. Re-import gedrag — voorgesteld: insert duplicates, user deletes old (vervangen is gevaarlijk)
  3. Date format in XML — voorgesteld: parse date-only, ignore time
  4. Partial fetch failure — voorgesteld: insert what succeeded, report what failed (per-view fail-closed)
  5. XML parser limits — voorgesteld: max depth 100, max entity expansion 100x

Referenties

  • Design-doc: docs/design/LIBREPLAN_CONNECTOR.md
  • Afhankelijk van: #1238 (Gantt-slidetype)
  • Sibling: docs/design/GANTT_SLIDETYPE.md
  • Patronen: docs/design/PENTEST_MIAUW.md (opt-in module), docs/design/AI_ASSIST.md (outbound consent)
  • Beveiliging: lib/services/secret_store.dart, lib/utils/net_guard.dart, lib/utils/pinned_http_client.dart
  • LibrePlan REST API: scripts/rest-clients/README.rst in LibrePlan repo
## Wat Een specialist module (off by default, onder Settings → Extensions) die een projectsnapshot ophaalt van een LibrePlan-instantie via de REST API (XML, Basic Auth) en vult OciDeck-slides. Read-only, user-initiated, desktop-only. **Design-doc:** `docs/design/LIBREPLAN_CONNECTOR.md` (gecommit op `design/libreplan-connector`) **Afhankelijk van:** #1238 (Gantt-slidetype) — de connector vult het Gantt-type, plus bestaande types. ## Waarom LibrePlan is een server-gebaseerde PM-tool. De integratie brengt LibrePlan-data naar OciDeck-presentaties: een projectstatus, een Gantt, een resource-load, een timesheet — als deck dat de deur uit gaat. OciDeck is de presentatielaag, LibrePlan is het systeem van record. ## De richting: consumer, niet client ``` LibrePlan server ──REST GET──► OciDeck connector ──► slides (Markdown) (user-pointed) (off by default) (sovereign .md) ``` De pijl wijst één kant op. Geen push-back, geen live-sync, geen embedded UI. De snapshot landt als soevereine Markdown die overleeft zonder LibrePlan. ## Scope van dit issue 1. **`libreplan_client.dart`** — REST client (GET-only, Basic Auth, XML) 2. **`libreplan_xml.dart`** — XML → Dart models (pure Dart, testable) 3. **Converters** — per view: Gantt, WBS, resource-load, timesheet, status, RACI, critical path → bestaande + nieuwe slidetypes 4. **`libreplan_import.dart`** — orchestration: fetch + convert + insert 5. **Settings form** + import dialog (project picker, view picker, date range) 6. **SecretStore** — `writeLibreplanPassword`/`readLibreplanPassword`, keyed op base URL + username 7. **`pubspec.yaml`** — `xml` dependency + `make sbom` 8. **Docs** — `PRIVACY.md` (what leaves your device), `SECURITY.md` (trust boundary), `USER_GUIDE.md` 9. **Tests** — XML parsing, converters, client (mock HTTP), secret store ## Beveiligingscontract (security-architect reviewed) - **Credentials in OS-keychain** via `SecretStore`, nooit in `.md`, nooit in prefs, nooit in logs - **Desktop-only** — web keychain is niet veilig (`platformCanStoreSecrets` = false) - **Via NetGuard** — SSRF-guard, interne adressen dicht tenzij `trustedInternal` - **HTTPS verplicht** — plain HTTP alleen voor vertrouwde interne servers - **Certificaat-validatie** via `PinnedHttpClient` (bestaand trust-dialog) - **XML-parser veilig** — geen XXE, entity-expansion limits, fail-closed - **Privacy-projectie** — geïmporteerde data gaat door OciWacht, net als hand-getypte slides - **Logs** — base URL + username bij fout, nooit response body (bevat projectdata) ## Welke LibrePlan-data naar welk slidetype | LibrePlan endpoint | OciDeck slidetype | Nieuw? | | --- | --- | --- | | orderelements (WBS + dates + deps) | **Gantt** (#1238) + `tree` | Gantt is nieuw | | resources | `table` / `matrix` (RACI) | nee | | resourceshours (load over time) | `chart` heatmap | nee | | workreports (timesheets) | `table` | nee | | expenses | `scorecard` / `chart` | nee | | calendars (capacity) | `chart` | nee | | criteria (skills) | `matrix` | nee | | critical path | `flow` | nee | | project status (mixed) | `cockpit` | nee | ## Wat expliciet niet in dit issue zit - **Geen push-back / write naar LibrePlan** — GET-only, geen POST/DELETE - **Geen live-sync** — snapshot is point-in-time - **Geen web build** — desktop-only (keychain) - **Geen embedded LibrePlan UI** — geen iframe, geen proxy - **Geen theming vanuit LibrePlan** — OciDeck style-profile - **Geen Gantt-slidetype** — dat is #1238, dit issue is afhankelijk ## Open vragen (te bevestigen in implementatie) 1. Projectlijst-grootte — voorgesteld: fetch + cache + search field 2. Re-import gedrag — voorgesteld: insert duplicates, user deletes old (vervangen is gevaarlijk) 3. Date format in XML — voorgesteld: parse date-only, ignore time 4. Partial fetch failure — voorgesteld: insert what succeeded, report what failed (per-view fail-closed) 5. XML parser limits — voorgesteld: max depth 100, max entity expansion 100x ## Referenties - Design-doc: `docs/design/LIBREPLAN_CONNECTOR.md` - Afhankelijk van: #1238 (Gantt-slidetype) - Sibling: `docs/design/GANTT_SLIDETYPE.md` - Patronen: `docs/design/PENTEST_MIAUW.md` (opt-in module), `docs/design/AI_ASSIST.md` (outbound consent) - Beveiliging: `lib/services/secret_store.dart`, `lib/utils/net_guard.dart`, `lib/utils/pinned_http_client.dart` - LibrePlan REST API: `scripts/rest-clients/README.rst` in LibrePlan repo
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#1240
No description provided.