Admin fixes, bang-triggered hub menu, and OIDC SSO #2

Merged
darktweek merged 9 commits from session/june-2026-part2 into main 2026-06-11 18:28:39 +02:00
darktweek commented 2026-06-10 07:10:05 +02:00 (Migrated from github.com)

Résumé

Trois axes : correction des bugs admin/sécurité de la session précédente, refonte du menu en hub plein écran déclenché par bang, et intégration SSO OpenID Connect.

1 — Correctifs (TODO session précédente)

Cause racine commune : les structs model n'avaient pas de tags JSON → les endpoints admin sérialisaient en PascalCase alors que le front lit du snake_case (« undefined » partout, « Invalid Date »). En prime, User.Password (hash argon2) fuitait via /admin/users.

  • DTO explicites snake_case (userJSON, auditJSON) ; stats en snake_case ; timestamps unix
  • User.Password tagué json:"-" (defense-in-depth)
  • Register : message générique sur email dupliqué (anti-énumération), vraie raison loguée en audit (register_blocked_duplicate_email)
  • Migration 009 : suppression du CHECK rigide sur audit_log.action
  • Suppression du banner de debug window.onerror

2 — Menu hub (bang configurable)

Plus de barre de navigation. Un bang (défaut !menu, configurable) tapé dans la recherche morph en hub plein écran liquid-glass avec tuiles : Marque-pages, Compte, Administration (admin), Déconnexion.

  • SettingsService : résolution env-verrouillé → DB-éditable → défaut
  • /api/me expose menu_bang ; admin GET/PUT /api/admin/settings/menu
  • Nouvel onglet admin « Réglages »
  • Esthétique liquid-glass inspirée de la maquette docker_terre_ginyu/go

3 — SSO OpenID Connect

OIDC standard (Authorization Code + PKCE, discovery .well-known, claims via userinfo), sans dépendance externe (image scratch préservée).

  • OIDCService (discovery cache, state/PKCE store TTL, exchange, userinfo)
  • ProvisionSSO : création JIT, liaison par email, username unique, mot de passe aléatoire inutilisable
  • Endpoints publics /api/auth/sso/{config,login,callback}
  • Page login : bouton « Se connecter avec » au-dessus du formulaire quand activé
  • Config via compose (CAIRN_OIDC_*, verrouillé) ou admin → Réglages → SSO (secret write-only)
  • Sans provider : email + mot de passe + TOTP par défaut

Test plan (vérifié via preview navigateur)

  • Admin Statistiques : vraies valeurs (2 users, 192 KB…)
  • Admin Utilisateurs : username/email présents, pas de champ password
  • Admin Journal : dates correctes (plus d'Invalid Date)
  • Register email existant → message générique + audit log
  • Hub !menu morph plein écran, tuiles fonctionnelles, greeting = username
  • Bang configurable via admin (!Cadm testé) et /me
  • SSO config admin (set/get, secret jamais renvoyé)
  • Login affiche « Se connecter avec Authentik » quand activé
  • /api/auth/sso/login redirige (302) ou échoue gracieusement

🤖 Generated with Claude Code

## Résumé Trois axes : correction des bugs admin/sécurité de la session précédente, refonte du menu en hub plein écran déclenché par bang, et intégration SSO OpenID Connect. ## 1 — Correctifs (TODO session précédente) Cause racine commune : les structs `model` n'avaient pas de tags JSON → les endpoints admin sérialisaient en PascalCase alors que le front lit du snake_case (« undefined » partout, « Invalid Date »). En prime, `User.Password` (hash argon2) fuitait via `/admin/users`. - DTO explicites snake_case (`userJSON`, `auditJSON`) ; stats en snake_case ; timestamps unix - `User.Password` tagué `json:"-"` (defense-in-depth) - Register : message générique sur email dupliqué (anti-énumération), vraie raison loguée en audit (`register_blocked_duplicate_email`) - Migration 009 : suppression du CHECK rigide sur `audit_log.action` - Suppression du banner de debug `window.onerror` ## 2 — Menu hub (bang configurable) Plus de barre de navigation. Un bang (défaut `!menu`, configurable) tapé dans la recherche morph en hub plein écran liquid-glass avec tuiles : Marque-pages, Compte, Administration (admin), Déconnexion. - `SettingsService` : résolution env-verrouillé → DB-éditable → défaut - `/api/me` expose `menu_bang` ; admin GET/PUT `/api/admin/settings/menu` - Nouvel onglet admin « Réglages » - Esthétique liquid-glass inspirée de la maquette `docker_terre_ginyu/go` ## 3 — SSO OpenID Connect OIDC standard (Authorization Code + PKCE, discovery `.well-known`, claims via userinfo), **sans dépendance externe** (image scratch préservée). - `OIDCService` (discovery cache, state/PKCE store TTL, exchange, userinfo) - `ProvisionSSO` : création JIT, liaison par email, username unique, mot de passe aléatoire inutilisable - Endpoints publics `/api/auth/sso/{config,login,callback}` - Page login : bouton « Se connecter avec <provider> » au-dessus du formulaire quand activé - Config via compose (`CAIRN_OIDC_*`, verrouillé) **ou** admin → Réglages → SSO (secret write-only) - Sans provider : email + mot de passe + TOTP par défaut ## Test plan (vérifié via preview navigateur) - [x] Admin Statistiques : vraies valeurs (2 users, 192 KB…) - [x] Admin Utilisateurs : username/email présents, **pas de champ password** - [x] Admin Journal : dates correctes (plus d'Invalid Date) - [x] Register email existant → message générique + audit log - [x] Hub `!menu` morph plein écran, tuiles fonctionnelles, greeting = username - [x] Bang configurable via admin (`!Cadm` testé) et `/me` - [x] SSO config admin (set/get, secret jamais renvoyé) - [x] Login affiche « Se connecter avec Authentik » quand activé - [x] `/api/auth/sso/login` redirige (302) ou échoue gracieusement 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.
No description provided.