diff --git a/CHANGELOG.md b/CHANGELOG.md index acc9c89..586bf1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.46.3 — 2026-11-06 — Déconnexion du menu compte : locale **et** globale (fusion #141) + +- **Défaut corrigé** : Kanbante était le seul hôte à brancher l'action `deconnexion` de la barre commune, mais sa branche ne faisait que naviguer vers `GET /logout` — la session locale était détruite, **la session draco (SSO) survivait** : le pont `/auth/draco` rouvrait une session Kanbante sans mot de passe. Une « déconnexion » qui ne déconnectait pas vraiment. +- **Branchement corrigé** (`app/templates/_draco_bar.html`) : destruction d'abord de la session locale (`fetch GET /logout`), puis navigation vers la déconnexion globale de l'émettrice (`GET {draco_urls.obsigate}/sso/logout?return_to={origine}/`, nouvelle route ObsiGate 2.86.0, PR sœur) : le `jti` draco y est révoqué et le cookie effacé sur le domaine parent. Après le parcours, la session de la suite entière et la session locale Kanbante sont terminées ; le retour se fait sur la racine Kanbante (page de connexion). +- **Test** : nouveau `tests/test_deconnexion.py` (marqueurs du branchement + disparition de l'ancien branchement local seul). Périmètre draco/barre : 33 passés (environnement local : variables `NO_PROXY`/proxy de la VM à écarter pour httpx, fonds connu). + ## 0.46.2 — 2026-11-06 — Rôles du Hub propagés à Kanbante (HUB-19, suite du pilote ShaarIt 0.7.0) Version **corrective** au sens du patron du dépôt (pas de fonction nouvelle côté métier : un garde d'accès branché sur le registre du Hub, contrat D3(a) du plan Hub v2). diff --git a/VERSION b/VERSION index 43c125a..c063aea 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.46.2 +0.46.3 diff --git a/app/templates/_draco_bar.html b/app/templates/_draco_bar.html index dd303d9..598e2c9 100644 --- a/app/templates/_draco_bar.html +++ b/app/templates/_draco_bar.html @@ -152,8 +152,24 @@ donc RETIRÉE : la page /profile elle-même continue d'exister (jetons API, réglages du compte Kanbante), mais elle n'est plus la cible du menu compte de la - barre. « Déconnexion » reste relayée, inchangée. */ - if (act === "deconnexion") { location.href = "/logout"; return; } + barre. « Déconnexion » : voir la branche ci-dessous. */ + if (act === "deconnexion") { + /* Fusion #141 : la déconnexion n'est plus seulement + locale. Détruire d'abord la session Kanbante + (GET /logout), puis naviguer vers la déconnexion + globale de l'émettrice (ObsiGate, GET /sso/logout) + avec retour ici — le jti draco y est révoqué et le + cookie effacé sur le domaine parent. Avant ce + correctif, le seul /logout laissait la session SSO + vivante : le pont /auth/draco rouvrait une session + Kanbante sans mot de passe. */ + var retourKb = encodeURIComponent(location.origin + "/"); + var cibleKb = "{{ draco_urls.obsigate }}/sso/logout?return_to=" + retourKb; + fetch("/logout", { credentials: "same-origin" }) + .catch(function () { }) + .finally(function () { location.href = cibleKb; }); + return; + } if (act === "palette") { location.href = "/recherche"; return; } if (act === "alertes") { if (window.DRACO_ALERTES) { window.DRACO_ALERTES.open(); } else { location.href = "/activity"; } return; } /* Correctif fusion #70 : action "menu" supprimée avec le bouton trois points (console agent dans le menu de la marque). */ diff --git a/tests/test_deconnexion.py b/tests/test_deconnexion.py new file mode 100644 index 0000000..93322e7 --- /dev/null +++ b/tests/test_deconnexion.py @@ -0,0 +1,21 @@ +"""Déconnexion du menu compte (fusion #141) — branchement global. + +Kanbante était le seul hôte branché, mais sa branche ne faisait que +naviguer vers son /logout local : la session draco (SSO) survivait +et le pont /auth/draco rouvrait une session sans mot de passe. Le +branchement livré : destruction de la session locale (GET /logout) +puis navigation vers la déconnexion globale de l'émettrice +(GET /sso/logout chez ObsiGate, retour ici). +""" +from pathlib import Path + +R = Path(__file__).resolve().parents[1] + + +def test_gabarit_branche_deconnexion_globale(): + gabarit = (R / "app/templates/_draco_bar.html").read_text(encoding="utf-8") + assert 'act === "deconnexion"' in gabarit + assert 'fetch("/logout"' in gabarit + assert "{{ draco_urls.obsigate }}/sso/logout?return_to=" in gabarit + # L'ancien branchement local seul a disparu. + assert 'if (act === "deconnexion") { location.href = "/logout"; return; }' not in gabarit