Files
xamxam/TODO.md
T
Pontoporeia 7b6d79c133 diag: invalid_grant is SSO auth-method mismatch, not bad creds
- feat: creds-test.sh gum probe for SMTP vs PeerTube auth + PeerTubeService::probeAuth()
- feat: app-token.sh gum probe for long-lived PeerTube app token (client_credentials)
- docs: add copy-paste proof commands to demonstrate the SSO break to admins
2026-08-24 11:33:34 +02:00

7.2 KiB
Raw Blame History

TODO

  • Open up CSP frame-src from hardcoded domain whitelist to https: scheme-wide
  • Fix relinked file not appearing in FilePond UI: switch to ID-based input lookup
  • Fix student name popover overflowing below viewport: clamp position so popover stays within screen bounds
  • Fix orientation (and other filter) metadata links on TFE page leading to empty search: remove redundant query= param
  • Fix language metadata link using wrong query= param instead of dedicated language= filter
  • Sort TFE files by display category on public page (note d'intention → TFE → image → video → audio → website → annexes)
  • Fix CSV import: VALUES had 24 ? placeholders but execute array has 23 values → 27 total for 26 columns
  • Add custom 404 page: render through layout with dedicated not-found.css, register in build, return HTTP 404
  • Remove "Mo" option from duration — keep only minutes and pages
  • Combine pages and minutes as separate fields (both can be set simultaneously)
  • Fix minutes input visibility (can't see what's typed)
  • Add has_annexes checkbox to form + DB column
  • Display duration on admin backoffice recap page
  • Update public TFE page duration display for new combined format
  • Fix handleAutosaveResponse is not defined — load autosave-handler.js on about_page edit view
  • Fix handleAutosaveResponse is not defined in admin add/edit — function was scoped inside IIFE bundle, not on window
  • Fix search result cards: title and author always below image/gradient, remove text overlay on placeholder gradient
  • Change search results to 10 per page with HTMX pagination (no-JS fallback preserved)
  • Bump to 15 results/page, make results area vertically scrollable, sticky pagination at viewport bottom
  • Fix HTMX targetError: move #search-results wrapper inside fragment so it survives outerHTML swaps
  • Add range counter to results header (e.g. "1–15 sur 112 résultats")
  • Collapsible filter controls with
    / + active filter badge on mobile
  • Responsive paginator: hide first/last buttons on mobile, smaller touch targets
  • Compact range counter on mobile: "1–15 / 112" instead of full "1–15 sur 112 résultats"
  • Remove orientation display from search result card meta
  • Add bulk select/delete to tmp cleanup dialog (like admin/index.php pattern)
  • Move cleanup UI from modal to dedicated page (like add.php/edit.php)
  • Replace
    with / in cleanup fragments (like contenus.php)
  • Standardise test group recipes: lint-php, lint-css, lint-js, test + add fix recipe + make lint pass clean
  • Remove Mot de passe column from acces.php, add key.svg icon button in Actions to copy password to clipboard, reorder actions (URL/password/edit/toggle/archive), switch URL icon to link-simple.svg
  • Fix CC2r: removed hidden seeds (were stale/overriding user input), render initial licence-choice from $formData; Interne want_license unchecked clears CC2r+licence, switching from other modes preserves values; CC2r independent toggle; licence dropdown has no-licence placeholder
  • Dans le formulaire admin, le contact privé ne se sauvegarde pas.
  • Remove "Rendre le contact visible publiquement sur la fiche du TFE" from admin add/edit forms
  • Auto-show contact on public TFE page when contact_visible is filled (no checkbox needed)
  • Fix file size limits: align all layers (JS/FilepondHandler/ThesisFileHandler/validate-fragment) — video/audio 5 GB, default 500 MB, PDF 100 MB; fix JS fileValidateSizeFilter gate bug that rejected AV files >1 GB despite 8 GB per-ext cap
  • Fix: deleting contact groups in apropos form not persisted (no change event after DOM removal, autosave never triggered)
  • Improve h1, h2, h3 size difference in base.css heading scale
  • Rework TFE page desktop layout: two columns 35vw/1fr, left = author/title/meta/synopsis, right = files, media 100% width; columns scroll independently, content fits 100vw; no bottom padding on main; add &scrollbar=0 to PDF iframe URLs
  • 'Promoteur·ice ULB' remplacé par 'Promoteur·ice université' (changement juste l'étiquette)
  • PDF viewer: fix page navigation buttons (prev/next) — build toolbar after canvases exist & query canvases fresh in scroll handler
  • PDF viewer: render pages smaller by default (0.85× scale)
  • PDF viewer: add dark transparent violet background behind pages when expanded
  • pdf-viewer: expand to fill right column (not whole page), center pages, freeze column on expand
  • pdf-viewer: fix toolbar width (align-self:stretch), hide sibling file items when expanded
  • Allow admin to export an empty CSV template (headers only) from the import dialog for use as an import model
  • Fix import modal missing FilePond styling: bundling refactor dropped filepond CSS + file-upload-filepond.js wrapper from admin list page (pre-existing regression)
  • Move 'download empty CSV template' button onto the same line as the Fichier CSV heading (button on the right, styled as btn)

Enquête: PeerTube auth failed (400) invalid_grant

  • [Diagnosed & reproduced] Single LDAP credential (xamxam@erg.be). Both mail and PeerTube are now on portail.erg.school (LemonLDAP OIDC) SSO — verified: mail.erg.school advertises SMTP XOAUTH2/OAUTHBEARER after STARTTLS. The difference: mail kept PLAIN/LOGIN (additive migration) so the app's PLAIN auth still works; PeerTube removed the password grant (hard cutover) so grant_type=password → invalid_grant. Not fixable with any credential; needs admin to restore password grant, register OIDC client, or (best) set up authorization_code+refresh_token. Full report in docs/peertube-sso-incident.md.
  • Built scripts/creds-test.sh (gum UI) + scripts/creds-probe.php (PHP probe) + just creds-test, + public PeerTubeService::probeAuth() to isolate auth-vs-channel. Probes SMTP AUTH and PeerTube password grant with the stored creds; logs results (never the password). Added probeAuth to PeerTubeService.
  • Built scripts/app-token.sh (gum) + just app-token to test whether a long-lived PeerTube app token (client_credentials grant) is obtainable. Confirmed live: client_credentials is rejected for the built-in local client (unsupported_grant_type) → an admin must run PeerTube's create-client on the server first. OIDC presence not determinable anonymously.
  • Consider decoupling PeerTube credentials from SMTP settings (separate peertube username/password fields in the admin) so mail SSO changes don't silently break uploads
  • (Superseded) The earlier client_credentials app-token path is ruled out: idP portail.erg.school (LemonLDAP::NG OIDC) only supports authorization_code + refresh_token, no password/client_credentials/device flow. Real host is portail.erg.school (not .be). Topology: videos.erg.be (PeerTube, Belgacom ADSL), mail.erg.school (Mailcow), portail.erg.school (LemonLDAP SSO). No self-service OIDC client registration.
  • Likely code change: PeerTubeService::obtainToken() switch to OIDC authorization_code+refresh_token against https://portail.erg.school/oauth2/token — requires admin to register an OIDC client + one-time interactive login to seed a refresh_token.