Kanbante 0.46.5 — Pont draco : adoption de l'amorçage conditionnée (fusion #145) et échec de connexion suggérant le SSO (fusion #144) #91

Merged
bruno merged 1 commits from porte-unique-phase1-amorcage into main 2026-11-07 10:31:06 -05:00
Owner

Fusion #145 — adoption de l'amorçage conditionnée, et #144 (part Kanbante)

Version 0.46.5 (série 0.46.x, base main 0.46.4 revérifiée avant clonage). La PR #87 (0.47.0, métadonnées des jetons) n'est pas touchée ; le numéro en 0.46.x reste valide qu'elle fusionne avant ou après. Aucune fusion — à fusionner sur l'ordre de Bruno.

#145 — le trou

Sur une instance fraîche, le premier visiteur du pont /auth/draco adoptait le compte administrateur d'amorçage (« liaison au premier passage » de resolve_draco_user()) — prouvé par l'audit « compte partout » : « dan », simple user, est devenu l'admin local d'une instance neuve.

Le correctif (app/accounts.py, app/main.py)

L'adoption de l'amorçage (unique compte, admin actif, sans liaison) n'a désormais lieu que si :

  • (a) le sub entrant est « administrateur » pour kanbante au registre des rôles du Hub — le pont consultait déjà le registre (HUB-19) avant la résolution ; il transmet maintenant le rôle à resolve_draco_user(..., role_hub=...). Repli propre : Hub muet / rôle inconnu / rôle moindre → pas d'adoption ;
  • (b) ou l'adoption est initiée depuis une session native déjà authentifiée (liaison explicite par l'utilisateur connecté : pont avec session native ouverte, ou connexion native doublement connectée — mécanismes existants, désormais documentés comme la voie (b), drapeau liaison_session_native sur la résolution directe).

Tout autre sub inconnu reçoit le parcours JIT ordinaire : compte membre propre, jamais l'amorçage. La correspondance existante (cas de production : amorçage déjà lié) résout inchangée. /api/search, qui ne consulte pas le registre, ne peut plus adopter l'amorçage du tout. Documentation mise à jour : docs/correspondance-draco.md.

#144 — part Kanbante

L'échec du formulaire local ne rend plus le seul « Identifiants incorrects. » : identifiant sans compte local → le message le dit et suggère « Se connecter avec ObsiGate (SSO) » (le bouton déjà présent sur l'écran, libellé inchangé) ; mauvais mot de passe sur un compte local → même renvoi au SSO. Un compte créé au Hub n'a pas de mot de passe local (il vit chez ObsiGate) : l'impasse muette disparaît.

Tests

Nouveau tests/test_amorcage_pont.py — instance réellement fraîche par test (base SQLite temporaire : seul le compte d'amorçage, sans liaison) : (i) sub simple utilisateur → JIT membre propre, amorçage intact non lié ; (ii) sub administrateur au registre → adoption ; (ii-bis) Hub muet → pas d'adoption ; (iii) liaison existante → résolution inchangée ; (iv) session native authentifiée → liaison explicite (pont + résolution directe) ; échecs de formulaire #144. Le test historique d'amorçage de tests/test_draco_correspondance.py simule désormais le rôle « administrateur » du registre ; docstring de tests/test_draco_sso.py aligné.

Périmètre ciblé (pont + correspondance + rôles + SSO + auth) : 49 réussis en relance complète — une première passe avait vu 1 échec httpx.InvalidURL (fonds d'environnement de la VM : variables proxy/no_proxy, connu), non reproduit à la relance ni en exécution isolée. Suite complète comparée à l'arbre vierge dans le rapport du chantier.

Chevauchement signalé

La PR #88 ouverte (HUB-21, réglages du Hub) touche aussi VERSION, CHANGELOG.md et app/main.py : conflits de fusion possibles sur ces trois fichiers si elle fusionne d'abord — aucun fichier métier en commun (elle ajoute app/hub_reglages.py, _header.html, la recherche ; ici : app/accounts.py, le pont et le login de app/main.py, la documentation et les tests).

## Fusion #145 — adoption de l'amorçage conditionnée, et #144 (part Kanbante) Version **0.46.5** (série 0.46.x, base `main` 0.46.4 revérifiée avant clonage). La PR #87 (0.47.0, métadonnées des jetons) n'est **pas touchée** ; le numéro en 0.46.x reste valide qu'elle fusionne avant ou après. **Aucune fusion** — à fusionner sur l'ordre de Bruno. ### #145 — le trou Sur une instance fraîche, le premier visiteur du pont `/auth/draco` adoptait le compte administrateur d'amorçage (« liaison au premier passage » de `resolve_draco_user()`) — prouvé par l'audit « compte partout » : « dan », simple `user`, est devenu l'admin local d'une instance neuve. ### Le correctif (`app/accounts.py`, `app/main.py`) L'adoption de l'amorçage (unique compte, admin actif, sans liaison) n'a désormais lieu que si : - **(a)** le `sub` entrant est **« administrateur » pour kanbante au registre des rôles du Hub** — le pont consultait déjà le registre (HUB-19) avant la résolution ; il transmet maintenant le rôle à `resolve_draco_user(..., role_hub=...)`. Repli propre : Hub muet / rôle inconnu / rôle moindre → **pas d'adoption** ; - **(b)** ou l'adoption est initiée depuis une **session native déjà authentifiée** (liaison explicite par l'utilisateur connecté : pont avec session native ouverte, ou connexion native doublement connectée — mécanismes existants, désormais documentés comme la voie (b), drapeau `liaison_session_native` sur la résolution directe). Tout autre `sub` inconnu reçoit le parcours JIT ordinaire : compte **membre** propre, jamais l'amorçage. La correspondance existante (cas de production : amorçage déjà lié) résout inchangée. `/api/search`, qui ne consulte pas le registre, ne peut plus adopter l'amorçage du tout. Documentation mise à jour : `docs/correspondance-draco.md`. ### #144 — part Kanbante L'échec du formulaire local ne rend plus le seul « Identifiants incorrects. » : identifiant sans compte local → le message le dit et suggère « Se connecter avec ObsiGate (SSO) » (le bouton déjà présent sur l'écran, libellé inchangé) ; mauvais mot de passe sur un compte local → même renvoi au SSO. Un compte créé au Hub n'a pas de mot de passe local (il vit chez ObsiGate) : l'impasse muette disparaît. ### Tests Nouveau `tests/test_amorcage_pont.py` — instance **réellement fraîche** par test (base SQLite temporaire : seul le compte d'amorçage, sans liaison) : (i) `sub` simple utilisateur → JIT membre propre, amorçage intact non lié ; (ii) `sub` administrateur au registre → adoption ; (ii-bis) Hub muet → pas d'adoption ; (iii) liaison existante → résolution inchangée ; (iv) session native authentifiée → liaison explicite (pont + résolution directe) ; échecs de formulaire #144. Le test historique d'amorçage de `tests/test_draco_correspondance.py` simule désormais le rôle « administrateur » du registre ; docstring de `tests/test_draco_sso.py` aligné. Périmètre ciblé (pont + correspondance + rôles + SSO + auth) : **49 réussis** en relance complète — une première passe avait vu 1 échec `httpx.InvalidURL` (fonds d'environnement de la VM : variables proxy/`no_proxy`, connu), non reproduit à la relance ni en exécution isolée. Suite complète comparée à l'arbre vierge dans le rapport du chantier. ### Chevauchement signalé La PR #88 ouverte (HUB-21, réglages du Hub) touche aussi `VERSION`, `CHANGELOG.md` et `app/main.py` : conflits de fusion possibles sur ces trois fichiers si elle fusionne d'abord — aucun fichier métier en commun (elle ajoute `app/hub_reglages.py`, `_header.html`, la recherche ; ici : `app/accounts.py`, le pont et le login de `app/main.py`, la documentation et les tests).
bruno added 1 commit 2026-11-06 23:16:44 -05:00
bruno merged commit 6b1e2491dd into main 2026-11-07 10:31:06 -05:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Projets/kanbante#91