From fcc6cdf8306b3a8dd3c264823ede349201bf8e57 Mon Sep 17 00:00:00 2001 From: Spark Date: Fri, 6 Nov 2026 19:01:13 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20brancher=20la=20d=C3=A9connexion=20du=20?= =?UTF-8?q?menu=20compte=20sur=20la=20d=C3=A9connexion=20globale=20(fusion?= =?UTF-8?q?=20#141)=20=E2=80=94=207.85.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 6 ++++++ VERSION | 2 +- app/templates/_draco_bar.html | 14 ++++++++++++++ tests/test_draco_bar_texte.py | 12 ++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db36622..c787d03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## v7.85.3 (2026-11-06) — Déconnexion du menu compte branchée (fusion #141) + +- **Défaut corrigé** : le bouton « Déconnexion » du menu compte de la barre commune ne faisait rien — la barre relaie l'action `deconnexion` à l'hôte et le `onAction` du gabarit (`app/templates/_draco_bar.html`) n'avait aucune branche pour elle (même défaut que la console Spark, l'hôte du signalement de Bruno). +- **Branchement** : nouvelle branche `deconnexion` — destruction d'abord de la session locale Flowdeck (`fetch GET /auth/logout`, le même point de sortie que les liens « Log out » existants), 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 Flowdeck sont terminées ; le retour se fait sur la racine Flowdeck (page de connexion). +- **Test** : `tests/test_draco_bar_texte.py::test_barre_deconnexion_branchee_globale` (marqueurs du branchement dans le gabarit). Périmètre draco/barre comparé à main vierge dans le même environnement : fonds identique (2 échecs `test_draco_urls_devprod` et 17 erreurs de dépendances absentes de l'environnement local, préexistants), +1 test passant. + ## v7.85.2 (2026-11-06) — HUB-19 : propagation des rôles du Hub (registre D3(a)) - **Client des rôles du Hub** (`app/services/hub_roles.py`, nouveau) : portage Python du pilote ShaarIt 0.7.0 (`hub_roles.rs`). À l'ouverture de session draco, consultation de `GET {hub}/api/roles/flowdeck` — en-tête Cookie complet de la requête relayé tel quel, `Accept: application/json`, délai 2 s. URL du Hub résolue comme la barre commune (`draco_urls.hub_url()` : explicite `HUB_URL` > hôte de la requête > dérivation par l'hôte de l'agent > défaut officiel), jamais d'URL dev figée. Cache mémoire par `sub`, TTL 60 s, horodatage posé **avant** l'appel : un échec conserve l'ancien cache, pas de rafale. Toute erreur (401/404/réseau/JSON illisible/rôle hors ensemble {`aucun`, `utilisateur`, `administrateur`}) = rôle **inconnu** → comportement actuel conservé, intégralement. diff --git a/VERSION b/VERSION index f1ff083..020a223 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -7.85.2 +7.85.3 diff --git a/app/templates/_draco_bar.html b/app/templates/_draco_bar.html index db7ae4d..176842b 100644 --- a/app/templates/_draco_bar.html +++ b/app/templates/_draco_bar.html @@ -132,6 +132,20 @@ return; } if (act === "palette") { location.href = "/recherche"; return; } + if (act === "deconnexion") { + /* Fusion #141 : détruire d'abord la session locale + Flowdeck (GET /auth/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 : la session de la suite entière se termine. */ + var retourFd = encodeURIComponent(location.origin + "/"); + var cibleFd = "{{ draco_urls().obsigate }}/sso/logout?return_to=" + retourFd; + fetch("/auth/logout", { credentials: "same-origin" }) + .catch(function () { }) + .finally(function () { location.href = cibleFd; }); + return; + } /* Correctif fusion #70 : action "menu" supprimée avec le bouton trois points (console agent dans le menu de la marque). Nonce CSP du script inchangé. */ if (act === "spark") { if (window.DRACO_PANNEAU) { window.DRACO_PANNEAU.toggle(); } diff --git a/tests/test_draco_bar_texte.py b/tests/test_draco_bar_texte.py index 1f24136..70a65a9 100644 --- a/tests/test_draco_bar_texte.py +++ b/tests/test_draco_bar_texte.py @@ -33,6 +33,18 @@ def test_aucun_texte_chantier_rendu(): assert rendu.lstrip().startswith("