Watch
1
0
Fork
You've already forked SouveraineOS
0

docs: take the lockscreen out of casey's uid

The current user unit wins the boot race but still runs as the human whose Personal key the lock is meant to evict. Record the target souveraine-session principal, its narrow Wayland/PAM/data reach, and the fact that the rich shell is presentation—not release authority.
This commit is contained in:
Fimeg 2026-08-17 12:43:45 -04:00
commit 341a2fe060
4 changed files with 24 additions and 0 deletions

View file

@ -8,6 +8,7 @@ must consume rather than replace.
| Question | Authority | Souveraine's role | | Question | Authority | Souveraine's role |
| --- | --- | --- | | --- | --- | --- |
| Who owns the secure pre-unlock surface? | Dedicated `souveraine-session` principal + compositor lock protocol | Sessiond decides and audits; the shell renders; Casey authenticates but does not own the lock process. Target design, not current user-unit state. |
| Can this machine suspend, hibernate, power off, or reboot? | logind `Can*` methods | Query and expose the answer; execute the matching logind/systemd verb. | | Can this machine suspend, hibernate, power off, or reboot? | logind `Can*` methods | Query and expose the answer; execute the matching logind/systemd verb. |
| Has the compositor secured the display? | `WlSessionLock.secure` | Mirror it as `screenLockSecure`; never infer it from a button press. | | Has the compositor secured the display? | `WlSessionLock.secure` | Mirror it as `screenLockSecure`; never infer it from a button press. |
| Does the shell want its lock surface shown? | `GlobalStates.screenLocked` | Maintain this request state and persist it across a shell crash. | | Does the shell want its lock surface shown? | `GlobalStates.screenLocked` | Maintain this request state and persist it across a shell crash. |

View file

@ -243,6 +243,14 @@ delivery, decision deferred:
`Unlock` stops being a no-op once the daemon consults lock state; this closes `Unlock` stops being a no-op once the daemon consults lock state; this closes
`audit-status.md` P2 as a consequence, not separate work. `audit-status.md` P2 as a consequence, not separate work.
The lockscreen must not run as the human whose Personal key it evicts. The
target is a dedicated `souveraine-session` principal: package code plus
Ambient and tightly scoped Revealable state, with no access to Casey's home or
any agent's memory. PAM authenticates Casey; it does not make the lock
authority Casey or hand it the decrypted Personal tree. The living owner and
current user-unit gap are recorded in
`../../souveraine/saf/authority/01-session.md`.
## Federation — encrypt then push ## Federation — encrypt then push
The Gitea remote is **untrusted by design.** It is trusted in the reference The Gitea remote is **untrusted by design.** It is trusted in the reference

View file

@ -20,6 +20,14 @@ unreachable); deploy checklist below. Phases A/B remain skipped, except the
restore flag and splash timing which Phase C absorbed (sessiond pokes restore flag and splash timing which Phase C absorbed (sessiond pokes
splash-signal from its own first frame). splash-signal from its own first frame).
**Ownership correction, 2026-08-17:** the zero-gap handoff below describes the
current implementation, not the final principal boundary. The rich shell is a
presentation client; it must not become the authority merely because it draws
the normal lock face. The target keeps lock policy and release under sessiond
running as dedicated `souveraine-session`, while Casey is only the PAM subject
and Personal-key owner. The living design is
`../../souveraine/saf/authority/01-session.md`.
## What actually happens at boot today ## What actually happens at boot today
1. `souveraine-splash` takes DRM master (`Before=greetd.service`) and covers 1. `souveraine-splash` takes DRM master (`Before=greetd.service`) and covers

View file

@ -60,6 +60,13 @@ conversation on sessiond's own lock surface.
- **Fail-closed default.** Default behavior on start is to lock; `--no-initial-lock` - **Fail-closed default.** Default behavior on start is to lock; `--no-initial-lock`
is the explicit opt-out for dev. is the explicit opt-out for dev.
Sessiond is still packaged as a user unit with no `User=` directive. It
therefore runs as the human graphical-session owner. That ordering closes the
boot visibility hole but does not close ownership of the lockscreen. The
target principal is `souveraine-session`, with only the Wayland lock, PAM,
Ambient, and Revealable reach described in
`../../../souveraine/saf/authority/01-session.md`.
## Audit gaps (toward the RedFlag bar) ## Audit gaps (toward the RedFlag bar)
sessiond is the component that most directly maps onto RedFlag's "capability sessiond is the component that most directly maps onto RedFlag's "capability