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)
CI / test (push) Failing after 2m26s
CI / test (pull_request) Failing after 2m35s

This commit is contained in:
Spark
2026-11-07 04:16:19 +00:00
parent d89b35061b
commit f8f8af63e1
8 changed files with 449 additions and 38 deletions
+36 -6
View File
@@ -79,13 +79,26 @@ def ensure_bootstrap_admin() -> dict | None:
# (app.main.draco_bridge) et du contrôle draco de /api/search :
#
# 1. correspondance existante → son compte (None si désactivé) ;
# 2. amorçage : s'il n'existe qu'UN seul compte et que c'est un
# admin actif sans liaison, le premier sub valide s'y lie —
# le compte d'amorçage (celui de Bruno, créé depuis
# l'environnement) garde ainsi son accès sans verrouillage ;
# 2. amorçage CONDITIONNÉ (fusion #145, 0.46.5) : s'il n'existe
# qu'UN seul compte et que c'est un admin actif sans liaison,
# ce compte d'amorçage ne peut être adopté que si
# a) le sub entrant est « administrateur » pour kanbante
# au registre des rôles du Hub (app.hub_roles, rôle
# transmis par l'appelant via ``role_hub`` — dans le
# doute, registre muet ou rôle moindre, PAS d'adoption),
# ou b) l'adoption est initiée depuis une session native
# déjà authentifiée (``liaison_session_native=True`` :
# l'utilisateur connecté lie explicitement son compte) ;
# tout autre sub inconnu suit le parcours ordinaire (JIT ou
# refus selon la surface), JAMAIS l'amorçage ;
# 3. sinon, si provisionner=True : création JIT d'un compte
# propre à cette identité (voir provision_draco_user).
#
# Avant la 0.46.5, l'étape 2 liait l'amorçage au PREMIER sub
# valide de passage : sur une instance fraîche, un simple
# utilisateur de la suite devenait l'administrateur local
# (audit « compte partout » du 2026-11-06, carte fusion #145).
#
# Un sub inconnu ne désigne JAMAIS un compte existant non lié
# (ni l'opérateur d'environnement, ni un compte dont le nom
# ressemblerait au nom affiché draco) : la liaison d'un compte
@@ -163,7 +176,12 @@ def provision_draco_user(sub: str, nom_affiche: str = "") -> dict | None:
return models.get_user(user_id)
def resolve_draco_user(claims: dict | None, provisionner: bool = False) -> dict | None:
def resolve_draco_user(
claims: dict | None,
provisionner: bool = False,
role_hub: str | None = None,
liaison_session_native: bool = False,
) -> dict | None:
"""Compte Kanbante désigné par des claims draco valides.
provisionner=False : correspondance et amorçage seulement
@@ -173,6 +191,15 @@ def resolve_draco_user(claims: dict | None, provisionner: bool = False) -> dict
connexion draco » du critère « un compte fonctionne
partout »). Un compte désactivé résout à None et n'est
jamais contourné par un JIT (la correspondance existe).
Adoption de l'amorçage (fusion #145) : ``role_hub`` est le
rôle du sub au registre du Hub pour kanbante, déjà consulté
par l'appelant (app.hub_roles ; ``None`` = inconnu, Hub
muet) et ``liaison_session_native`` signale une adoption
initiée depuis une session native authentifiée. L'amorçage
n'est adopté que si l'un des deux vaut respectivement
``"administrateur"`` / ``True`` — sinon, aucun paramètre ne
doit être deviné ici : dans le doute, pas d'adoption.
"""
sub = str((claims or {}).get("sub") or "")
if not sub:
@@ -186,8 +213,11 @@ def resolve_draco_user(claims: dict | None, provisionner: bool = False) -> dict
seul["role"] == "admin"
and seul["active"]
and not seul.get("draco_sub")
and (role_hub == "administrateur" or liaison_session_native)
):
# Compte d'amorçage : liaison au premier passage.
# Compte d'amorçage : adoption conditionnée (#145) —
# administrateur au registre du Hub, ou liaison
# explicite depuis une session native authentifiée.
models.update_user(seul["id"], draco_sub=sub)
models.log_admin(seul["id"], "draco.link.amorcage", sub)
return models.get_user(seul["id"])