hive-forge: the controller-token mint writes straight to the store, and the on-disk token goes
`forgejo-swarm-controller-account`, in the forge's container, now puts the swarm-controller's forge token into the swarm secret store itself, under the forge publisher's leaf. The container already receives that leaf as nspawn system credentials for its journal forwarder; the mint loads the same three. The token reaches bao on stdin (`value=-`) and the forge's API through a header file, never as an argument, and never touches disk. The mint's guard is a marker holding the published token's name, at /var/lib/forgejo/swarm-controller-token-name, written last: after the put, and after every other `swarm-controller-boot-*` token of the account is revoked through forgejo's admin API, authenticated as the new token. So a put that failed, or a marker lost while the store kept an older token, leaves no live token behind once a mint completes. The mint logs in to the store and checks that the account is a site admin before it mints, so a store that is down or an account the admin API would refuse mints nothing on each retry. Failures retry under store-retry; forgejo does not wait for the mint. No bao read and no grant change: the forge publisher keeps create/update on the token. Removed: the host's `swarm-bao-forge-publisher` service and path unit, which read the token file through the container's root, and their entries in the store and policy ordering glue. The forge publisher's policy unit stays; `swarm-bao-forge-oidc` still uses the leaf. On deploy, an existing forge host has no marker, so the mint runs once: it mints a new token, publishes it, revokes the old one, and deletes the old /var/lib/forgejo/swarm-controller-token. The controller's next forge call gets a 401, re-reads the store and carries on.
This commit is contained in:
parent
fadcac8479
commit
141be16c6d
14 changed files with 294 additions and 261 deletions
|
|
@ -1736,10 +1736,11 @@ let
|
|||
&& lib.hasInfix "swarm-review-classifier \"\" clientAuth" s;
|
||||
}
|
||||
{
|
||||
# The forge's host is the one writer of the controller's forge token,
|
||||
# and reads the forge's own OIDC client secret and its container
|
||||
# forwarder's under the same leaf. Pinned as the whole list, so an added
|
||||
# `read` on the token or a write or wildcard on a secret fails.
|
||||
# The forge's mint, in its container, is the one writer of the
|
||||
# controller's forge token, and the forge's host and its container
|
||||
# forwarder read their OIDC client secrets under the same leaf. Pinned
|
||||
# as the whole list, so an added `read` on the token or a write or
|
||||
# wildcard on a secret fails.
|
||||
name = "the forge publisher's grant is writing the controller's forge token and reading the forge's and its forwarder's OIDC secrets, and nothing else";
|
||||
ok =
|
||||
let
|
||||
|
|
@ -1780,7 +1781,8 @@ let
|
|||
}
|
||||
{
|
||||
# The policy units that name the path are the whole list of who reaches
|
||||
# it: the publisher, which writes it, and the controller, which reads it.
|
||||
# it: the forge publisher's, which the mint writes it under, and the
|
||||
# controller's, which reads it.
|
||||
name = "no granting unit but the controller's and the forge publisher's names the controller's forge token";
|
||||
ok =
|
||||
let
|
||||
|
|
|
|||
Loading…
Reference in a new issue