diff options
| author | Christophe Besson <cbesson@gmail.com> | 2026-09-25 13:58:40 +0200 |
|---|---|---|
| committer | Christophe Besson <cbesson@gmail.com> | 2026-09-25 17:24:16 +0200 |
| commit | 43c72cf9e8853cd5b2f59d4a4acd87729b0ddae0 (patch) | |
| tree | 7818751ca6da8bff2a81bb33ef740b81c97c2b63 /docs/MAIL-SERVER.md | |
| parent | cc4cb6b363a24601637f18f8af7821bafd7765e9 (diff) | |
| download | meshbay-43c72cf9e8853cd5b2f59d4a4acd87729b0ddae0.tar.gz | |
fix(hub): make group revoke admin-only and route it through the broadcasting path
Two coupled gaps in the moderation surface (docs/MESHBAY_DESIGN.md §7.5):
admin_patch_group let a moderator set a group to "revoked", while the user
handler makes revoke admin-only; and a "revoked" set through either PATCH was
never broadcast to nodes — unlike POST /v1/admin/revoke and account deletion —
so it behaved like "suspended" on nodes while claiming to be the signed,
node-enforced state H4 promises.
PATCH now refuses "revoked" on both users and groups (400, pointing at
POST /v1/admin/revoke, which signs and broadcasts), a moderator setting a group
to revoked is refused with 403 as on the user handler, and moving an entity out
of "revoked" requires admin — a moderator flipping the hub row back to active
would only disagree with the nodes still enforcing the broadcast. Revoke has one
door and it broadcasts.
The admin SPA already revokes through POST /v1/admin/revoke, so this is not a
UI-visible change.
test_revoke_is_one_path.py holds the refusals and the working path; verified red
against the pre-fix admin.py and green after.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Diffstat (limited to 'docs/MAIL-SERVER.md')
0 files changed, 0 insertions, 0 deletions