fix(PROJ-11): BUG-23 (real fix, second attempt) and BUG-25 — QA round 4 gate

BUG-25: DashboardPage header ran ~200px past the viewport at 375px,
"Abmelden" unreachable without horizontal scroll. flex-col/flex-wrap
so it stacks on narrow screens instead of overflowing.

BUG-23: the previous fix (logout_all admin endpoint) never worked —
that route doesn't exist on Synapse (404, swallowed by try/catch).
A second attempt (list + bulk-delete devices) also did nothing,
because loginAsUser()'s admin puppet-login issues a deviceless token
that never appears in the devices list. Live-tested both failures via
account/whoami with the "revoked" token still returning 200.

Actual fix: revokeAccessToken() calls the plain Client-Server /logout
endpoint authenticated as the token being revoked, not as the backend's
admin token — the only mechanism that invalidates a deviceless token.
invalidateMatrixAccessToken() now returns the token it removed so the
route can pass it along. Verified: whoami returns 200 before logout,
401 M_UNKNOWN_TOKEN with the same token right after.

QA round 4 (first with real cross-browser access — Chromium/Firefox/
WebKit at 375/768/1440px) found no remaining Critical or functional
High findings once these two land: production-ready.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0143yYvjesjHndBACoweyK67
This commit is contained in:
patrickandClaude Sonnet 5 committed 2026-09-11 23:38:33 +02:00
1 parent edc05d4d1e
commit dc1ba9ae27
6 files changed
+281 -14

No files matched your search

+5 -2
View File
@@ -13,13 +13,16 @@ export function DashboardPage() {
return (
<main className="min-h-screen p-6 space-y-6">
<div className="flex items-center justify-between">
{/* BUG-25: this used to be a single non-wrapping flex row — at 375px the
three buttons ran ~200px past the viewport edge with no way to reach
"Abmelden" short of horizontal scrolling. Stack on narrow screens. */}
<div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
<div className="space-y-2">
<h1 className="text-2xl font-semibold">TalkTime Dashboard</h1>
{user && <p className="text-sm text-muted-foreground">Angemeldet als {user.email}</p>}
<OrganizationSwitcher />
</div>
<div className="flex gap-2">
<div className="flex flex-wrap gap-2">
<Button variant="outline" asChild>
<Link to="/roles">Rollen &amp; Rechte</Link>
</Button>