docs: define local-only logout visibility
This commit is contained in:
@@ -0,0 +1,124 @@
|
|||||||
|
# Local-Only Logout Visibility Design
|
||||||
|
|
||||||
|
**Date:** 2026-08-22
|
||||||
|
**Status:** approved
|
||||||
|
**Scope:** frontend visibility of the authenticated-shell logout control
|
||||||
|
**Source baseline:** `912bab9`
|
||||||
|
|
||||||
|
## 1. Purpose
|
||||||
|
|
||||||
|
ThothII has two distinct authentication journeys:
|
||||||
|
|
||||||
|
- standalone Mac and Windows installations authenticate directly in ThothII with local accounts;
|
||||||
|
- the Aritmolab server installation authenticates the user in the surrounding portal and exposes
|
||||||
|
that trusted identity to ThothII.
|
||||||
|
|
||||||
|
The current authenticated shell always renders a `Log out` button. That action is meaningful for
|
||||||
|
the standalone local-authentication journey, where ThothII owns the browser session. It is
|
||||||
|
misleading in the server journey because leaving the authenticated environment is a portal-level
|
||||||
|
operation, not a ThothII operation.
|
||||||
|
|
||||||
|
The frontend must therefore render the logout control only when the public authentication mode is
|
||||||
|
exactly `local`.
|
||||||
|
|
||||||
|
## 2. Behavioral contract
|
||||||
|
|
||||||
|
The existing `GET /auth/config` response is the sole authority for logout visibility. The frontend
|
||||||
|
applies this closed rule:
|
||||||
|
|
||||||
|
| Public authentication mode | Show `Log out` |
|
||||||
|
| --- | --- |
|
||||||
|
| `local` | yes |
|
||||||
|
| `upstream` | no |
|
||||||
|
| `oidc` | no |
|
||||||
|
| `none` | no |
|
||||||
|
| `mock` | no |
|
||||||
|
|
||||||
|
This deliberately hides the control for every current and future server-oriented non-local mode.
|
||||||
|
It does not infer deployment type from the operating system, hostname, URL, user issuer, nullable
|
||||||
|
session data, or build-time variables.
|
||||||
|
|
||||||
|
The authenticated user's display name remains visible in every mode. Only the `Log out` button is
|
||||||
|
conditional.
|
||||||
|
|
||||||
|
## 3. Frontend design
|
||||||
|
|
||||||
|
`AuthGate` already loads and validates the public authentication configuration before it requests
|
||||||
|
`GET /me`. It will derive a boolean logout capability from the retained configuration:
|
||||||
|
|
||||||
|
```text
|
||||||
|
canLogout = config.mode === "local"
|
||||||
|
```
|
||||||
|
|
||||||
|
`AuthGate` passes this capability through `AuthenticatedContent` to `AppShell`. `AppShell` uses it
|
||||||
|
only to decide whether to render the existing button. The current click handler, logout API
|
||||||
|
coordinator, authentication-state cleanup, and query/session isolation behavior remain unchanged.
|
||||||
|
|
||||||
|
The capability is passed explicitly instead of being recomputed from `AuthenticatedUser` because
|
||||||
|
legacy and upstream user representations may have nullable session data. It is also preferable to
|
||||||
|
a new environment variable because `/auth/config` already represents the backend's effective
|
||||||
|
authentication mode at runtime.
|
||||||
|
|
||||||
|
## 4. Backend and deployment impact
|
||||||
|
|
||||||
|
No backend route, authentication configuration, Compose descriptor, native `tht` command, or
|
||||||
|
packaging logic changes.
|
||||||
|
|
||||||
|
`POST /auth/logout` remains available for the local standalone flow and for existing internal
|
||||||
|
authentication behavior. Hiding a control is not treated as an authorization boundary; backend
|
||||||
|
authentication and CSRF protections remain authoritative.
|
||||||
|
|
||||||
|
Mac and Windows packages require no platform detection. Their existing local authentication
|
||||||
|
configuration produces `mode: "local"`, so they retain the button automatically. The Aritmolab
|
||||||
|
server's trusted-upstream configuration produces `mode: "upstream"`, so it loses the button
|
||||||
|
automatically.
|
||||||
|
|
||||||
|
## 5. Failure behavior
|
||||||
|
|
||||||
|
`AuthGate` continues to fail closed when `/auth/config` is unavailable or malformed; the
|
||||||
|
authenticated shell is not rendered in that state. Once the configuration has been accepted, an
|
||||||
|
unrecognized mode is already rejected by the existing parser and therefore cannot accidentally
|
||||||
|
enable logout.
|
||||||
|
|
||||||
|
The visibility change introduces no new request, fallback, or error message. In non-local modes
|
||||||
|
the button is absent and no user-initiated `POST /auth/logout` can originate from this shell
|
||||||
|
control.
|
||||||
|
|
||||||
|
## 6. Verification
|
||||||
|
|
||||||
|
Frontend component tests will prove:
|
||||||
|
|
||||||
|
1. `AuthGate` propagates logout capability for `mode: "local"` and disables it for
|
||||||
|
`mode: "upstream"`.
|
||||||
|
2. `AppShell` renders `Log out` when logout capability is enabled and preserves the existing
|
||||||
|
request-and-state-clear behavior.
|
||||||
|
3. `AppShell` keeps the authenticated identity visible but does not render `Log out` when logout
|
||||||
|
capability is disabled.
|
||||||
|
4. The focused frontend tests, the complete frontend Vitest suite, TypeScript build-mode
|
||||||
|
type-check, and production frontend build pass.
|
||||||
|
|
||||||
|
No live server mutation is required to validate this source change. A later manual server smoke
|
||||||
|
test may confirm that the deployed Aritmolab journey shows the user identity without a ThothII
|
||||||
|
logout control, while a standalone local-authentication smoke test confirms the control remains.
|
||||||
|
|
||||||
|
## 7. Non-goals
|
||||||
|
|
||||||
|
This change does not:
|
||||||
|
|
||||||
|
- implement portal or global Aritmolab logout;
|
||||||
|
- redirect users to an Aritmolab logout URL;
|
||||||
|
- remove or weaken `POST /auth/logout`;
|
||||||
|
- change login, expiry, session revocation, OIDC, or trusted-upstream behavior;
|
||||||
|
- detect Mac, Windows, or server packaging in browser code;
|
||||||
|
- alter any other authenticated-shell control or layout.
|
||||||
|
|
||||||
|
## 8. Acceptance criteria
|
||||||
|
|
||||||
|
The design is complete when:
|
||||||
|
|
||||||
|
- `Log out` is present only for public authentication mode `local`;
|
||||||
|
- the Aritmolab trusted-upstream server shell has no ThothII logout button;
|
||||||
|
- standalone Mac and Windows local-authentication behavior is unchanged;
|
||||||
|
- the username or display name remains visible in all authenticated modes;
|
||||||
|
- no backend or deployment configuration is added solely for this visibility decision;
|
||||||
|
- automated frontend tests prevent regression in both local and upstream modes.
|
||||||
Reference in New Issue
Block a user