diff options
| author | tv <tv@krebsco.de> | 2026-11-08 14:18:33 +0000 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-11-08 15:32:31 +0100 |
| commit | d56b3b069782585a6edcc9c608236361c2644a51 (patch) | |
| tree | 22839d0582b3b5a841465b23bfa13957fc6e84ea /docs | |
| parent | fac4b143587188d283578bc51e13ca44bcfc6382 (diff) | |
envelope: a signed value names its swarm
Review 3.1, part of finding 12: a signed value's payload bound path,
user, time and prev, but not the swarm. A user with the same name and
key in two swarms could have an envelope replayed from one into the
other, wherever the path holds no envelope yet (prev "").
The payload now names the swarm (`swarm`), and a node takes an envelope
only for its own. /auth/whoami says the swarm, and continuum-signed and
the example in api.md sign it. Wire version 44: nodes before this
refuse such envelopes, and those after refuse the old ones.
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/access.md | 3 | ||||
| -rw-r--r-- | docs/api.md | 10 | ||||
| -rw-r--r-- | docs/openapi.yaml | 4 |
3 files changed, 10 insertions, 7 deletions
diff --git a/docs/access.md b/docs/access.md index a85dfa4..e8108e2 100644 --- a/docs/access.md +++ b/docs/access.md @@ -139,7 +139,8 @@ forgets it. The login page token pasted, from a login by key, say; the dashboard renews it while open ([`dashboard.md`](dashboard.md)). -`GET /auth/whoami` says who a request's user is, how it proved it, and what it may do. +`GET /auth/whoami` says the swarm, who a request's user is, how it proved it, and what +it may do. Pages of other origins, the dashboards of other members, may call a node with a token: its own links (`/admin/dashboard/links/own`, and its events) and messages diff --git a/docs/api.md b/docs/api.md index 019f9cf..cf05046 100644 --- a/docs/api.md +++ b/docs/api.md @@ -281,18 +281,20 @@ their users), a user writes one by signing it with its SSH key: the payload, one of JSON, then the signature, as `application/continuum-signed`. ```sh -# The envelope there, if any, and what replaces it names: its SHA-256 (none: ""). +# The swarm it is for; the envelope there, if any, and what replaces it names: its +# SHA-256 (none: ""). +swarm=$(curl -sf -u alice localhost:3000/auth/whoami | jq -r .swarm) read=$(curl -sf -u alice -H 'Accept: text/plain' 'localhost:3000/store/config?raw=true') prev=${read:+$(printf %s "$read" | sha256sum | cut -d' ' -f1)} -printf '{"path":["config"],"value":{"mode":"fast"},"user":"alice","at":%s,"prev":"%s"}' \ - "$(date +%s000)" "$prev" > payload +printf '{"swarm":"%s","path":["config"],"value":{"mode":"fast"},"user":"alice","at":%s,"prev":"%s"}' \ + "$swarm" "$(date +%s000)" "$prev" > payload ssh-keygen -Y sign -f ~/.ssh/id_ed25519 -n continuum-value payload { cat payload; echo; cat payload.sig; } | curl -X PUT localhost:3000/store/config \ -u alice -H 'Content-Type: application/continuum-signed' --data-binary @- ``` The node writes it as its envelope if the authenticated user signed it (`403` if not), -for this path, with one of its keys, may write there (`403`), and it replaces what is +for this swarm and this path, with one of its keys, may write there (`403`), and it replaces what is there (`prev`, the SHA-256 of the envelope it replaces; `409` if it names another: read again and sign anew), and only where values are signed (`409` elsewhere). It answers with the value, as a `PUT` does; a signed `null` deletes, with `204`. Under diff --git a/docs/openapi.yaml b/docs/openapi.yaml index f0d54a9..13d8a65 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -192,7 +192,7 @@ paths: schema: type: string example: | - {"path":["config"],"value":{"mode":"fast"},"user":"alice","at":1762400000000,"prev":""} + {"swarm":"6f9a…","path":["config"],"value":{"mode":"fast"},"user":"alice","at":1762400000000,"prev":""} -----BEGIN SSH SIGNATURE----- U1NIU0lH… -----END SSH SIGNATURE----- @@ -981,7 +981,7 @@ paths: get: tags: [Auth] summary: Who you are here - description: The user, how it proved it (`htpasswd`, `header`, `token`), its registry entry's capabilities, and its token's claims if it came with one. + description: The swarm, the user, how it proved it (`htpasswd`, `header`, `token`), its registry entry's capabilities, and its token's claims if it came with one. responses: '200': description: Who. |
