diff options
| author | Christophe Besson <cbesson@gmail.com> | 2026-09-30 11:57:03 +0200 |
|---|---|---|
| committer | Christophe Besson <cbesson@gmail.com> | 2026-09-30 11:57:03 +0200 |
| commit | 5612dbbac41609b3f84784f57f1de538262db9a9 (patch) | |
| tree | 571e0bbd18c31be32ca33db35ca42f8aff672cc9 /packages/meshbay-hub/src/meshbay_hub/api/signaling.py | |
| parent | d3ad243c4ae3a273f623bd5fc631e3266aa4d0e4 (diff) | |
| download | meshbay-5612dbbac41609b3f84784f57f1de538262db9a9.tar.gz | |
fix(node): the roster, not the key alone, decides who gets a session
The handshake opened a session for anyone holding the group key with a hub
token naming the group; the roster was consulted only when wrapping the key
in a join. A member revoked or unpinned on the node but still a member on
the hub kept a full session with the key they already held — and was handed
the chat epoch their removal had just opened, since chat keys go to any
session. An honest client never met this (it asks for the key through
join_request every time); one that kept the key did not have to.
- After the proof, the node asks the roster and refuses with
`not_authorized_for_group` unless the account is an active member of the
group or the node's operator.
- A removal from any door — MNP, the node page, the CLI — now opens a new
chat epoch in each group the person could read, broadcasts it, and closes
every connection they hold (`ops.members._after_removal`). The CLI and the
node page did neither.
- Design §5.2, protocol §6.1, §6.3, §14.2.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/api/signaling.py')
0 files changed, 0 insertions, 0 deletions