fix(#3422): the bridge reads and writes users.yml directly

`swarm agent create` failed with "no user store at
swarm-authelia-bridge-users.json but users.yml already holds users" on
any hive that had users. The guard was correct; what was wrong is that
two files both claimed to be canonical for one physical file.

The bridge kept a private users.json and rendered users.yml from it,
while swarmctl kept its own pair against the same users.yml. A writer
whose own JSON was absent could not tell "nothing here yet" from
"someone else's users", so it refused to write at all.

users.yml becomes the store: read before write, through serde_norway
rather than a hand-rolled emitter. Unknown top-level and per-user keys
round-trip through `extra`, or whichever process writes second would
silently delete what the first added. Validation stays on the write path
-- a bare to_string(&store) serialises perfectly and drops the "no
control character ever reaches this file" guarantee silently.

The seed constant goes with the guard: nothing writes a seed now, an
absent file is an empty store, and left as a pub constant it read as if
the seed dance were still load-bearing.
This commit is contained in:
atlas 2026-08-18 10:31:48 +02:00
commit 24f4cd42a9
5 changed files with 190 additions and 101 deletions

21
Cargo.lock generated
View file

@ -4324,6 +4324,19 @@ dependencies = [
"serde",
]
[[package]]
name = "serde_norway"
version = "0.9.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e408f29489b5fd500fab51ff1484fc859bb655f32c671f307dcd733b72e8168c"
dependencies = [
"indexmap",
"itoa",
"ryu",
"serde",
"unsafe-libyaml-norway",
]
[[package]]
name = "serde_path_to_error"
version = "0.1.20"
@ -4564,6 +4577,7 @@ dependencies = [
"reqwest 0.13.1",
"serde",
"serde_json",
"serde_norway",
"swarm-authelia-bridge-sock",
"tokio",
"tracing",
@ -4649,6 +4663,7 @@ dependencies = [
"clap_complete",
"serde",
"serde_json",
"serde_norway",
]
[[package]]
@ -5236,6 +5251,12 @@ dependencies = [
"subtle",
]
[[package]]
name = "unsafe-libyaml-norway"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b39abd59bf32521c7f2301b52d05a6a2c975b6003521cbd0c6dc1582f0a22104"
[[package]]
name = "untrusted"
version = "0.9.0"