Session juin 2026 — Frontend, invitations, corrections critiques #1

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

Résumé

Cette PR couvre l'ensemble du travail de la session du 9-10 juin 2026 : frontend complet, système d'invitations, et plusieurs corrections critiques découvertes lors des premiers tests en conditions réelles.

Changements

Frontend — SPA vanilla JS

  • web/static/index.html — shell HTML complet (login, home, overlays)
  • web/static/style.css — thème dark/light adaptatif par luminance, variables CSS
  • web/static/app.js — SPA sans dépendances : clock, rain canvas, search bangs, bookmarks, settings, admin
  • web/embed.go — package embed pour les assets statiques (contournement restriction ../ dans go:embed)
  • Fix http.ServeFileFS pour éviter que chi ne route /style.css vers le fallback SPA

ListSessions

  • Était un stub retournant uniquement la session courante
  • Implémenté proprement via AuthService.ListSessions

Mise à jour dépendances

  • Go 1.22 → 1.23, chi v5.3.0, x/crypto v0.38.0, x/net v0.40.0
  • 29/40 CVEs résolues (11 bloquées sur Go 1.25 non disponible)

README

  • Documentation complète : démarrage rapide, config, Traefik/Nginx, sécurité, structure projet

Système d'invitations

  • Migration 008_init_invitations.sql : tables invitations + settings
  • InvitationRepository / InvitationService : create/validate/consume/resend/revoke
  • Config : CAIRN_OPEN_REGISTRATION (défaut true), CAIRN_INVITE_LIFETIME (défaut 72h)
  • RegisterWithInviteCheck : vérifie inscription ouverte ou token d'invitation valide
  • Endpoint public GET /api/auth/invite/{token} pour valider avant affichage
  • Admin : toggle open/closed + CRUD invitations
  • Frontend : onglet "Invitations" dans admin, ?invite=TOKEN pré-remplit le formulaire
  • Flag Secure hardcodé → cookie ignoré sur HTTP (localhost)
  • Maintenant déduit du schéma de CAIRN_BASE_URL : https:// → Secure, http:// → pas Secure

Fix syntaxe JS critique

  • Apostrophe française dans 'Si l'adresse...' cassait le parsing JS entier
  • Aucun event listener n'était attaché → login "refresh" sans effet
  • Corrigé en double quotes

TODO connu (prochaine session)

  • Masquer le message d'erreur d'email dupliqué côté user (vecteur d'énumération), logger en audit
  • Admin stats : champs undefined (désalignement API ↔ JS)
  • Admin users : username/email undefined (idem)
  • Admin journal : Invalid Date (format timestamp)
  • Retirer le banner window.onerror de debug

Test plan

  • docker compose up -d démarre sans erreur
  • Login admin fonctionne (cookie sans Secure sur HTTP)
  • Inscription libre fonctionne, 1er compte = admin
  • Mauvais mot de passe → message d'erreur correct
  • Onglets admin : Statistiques / Utilisateurs / Invitations / Journal visibles
  • Horloge, pluie, barre de recherche fonctionnels

🤖 Generated with Claude Code

## Résumé Cette PR couvre l'ensemble du travail de la session du 9-10 juin 2026 : frontend complet, système d'invitations, et plusieurs corrections critiques découvertes lors des premiers tests en conditions réelles. ## Changements ### Frontend — SPA vanilla JS - `web/static/index.html` — shell HTML complet (login, home, overlays) - `web/static/style.css` — thème dark/light adaptatif par luminance, variables CSS - `web/static/app.js` — SPA sans dépendances : clock, rain canvas, search bangs, bookmarks, settings, admin - `web/embed.go` — package embed pour les assets statiques (contournement restriction `../` dans go:embed) - Fix `http.ServeFileFS` pour éviter que chi ne route `/style.css` vers le fallback SPA ### ListSessions - Était un stub retournant uniquement la session courante - Implémenté proprement via `AuthService.ListSessions` ### Mise à jour dépendances - Go 1.22 → 1.23, chi v5.3.0, x/crypto v0.38.0, x/net v0.40.0 - 29/40 CVEs résolues (11 bloquées sur Go 1.25 non disponible) ### README - Documentation complète : démarrage rapide, config, Traefik/Nginx, sécurité, structure projet ### Système d'invitations - Migration `008_init_invitations.sql` : tables `invitations` + `settings` - `InvitationRepository` / `InvitationService` : create/validate/consume/resend/revoke - Config : `CAIRN_OPEN_REGISTRATION` (défaut true), `CAIRN_INVITE_LIFETIME` (défaut 72h) - `RegisterWithInviteCheck` : vérifie inscription ouverte ou token d'invitation valide - Endpoint public `GET /api/auth/invite/{token}` pour valider avant affichage - Admin : toggle open/closed + CRUD invitations - Frontend : onglet "Invitations" dans admin, `?invite=TOKEN` pré-remplit le formulaire ### Fix cookie Secure - Flag `Secure` hardcodé → cookie ignoré sur HTTP (localhost) - Maintenant déduit du schéma de `CAIRN_BASE_URL` : `https://` → Secure, `http://` → pas Secure ### Fix syntaxe JS critique - Apostrophe française dans `'Si l'adresse...'` cassait le parsing JS entier - Aucun event listener n'était attaché → login "refresh" sans effet - Corrigé en double quotes ## TODO connu (prochaine session) - [ ] Masquer le message d'erreur d'email dupliqué côté user (vecteur d'énumération), logger en audit - [ ] Admin stats : champs `undefined` (désalignement API ↔ JS) - [ ] Admin users : username/email `undefined` (idem) - [ ] Admin journal : `Invalid Date` (format timestamp) - [ ] Retirer le banner `window.onerror` de debug ## Test plan - [x] `docker compose up -d` démarre sans erreur - [x] Login admin fonctionne (cookie sans Secure sur HTTP) - [x] Inscription libre fonctionne, 1er compte = admin - [x] Mauvais mot de passe → message d'erreur correct - [x] Onglets admin : Statistiques / Utilisateurs / Invitations / Journal visibles - [x] Horloge, pluie, barre de recherche fonctionnels 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.
No description provided.