diff options
| author | Christophe Besson <cbesson@gmail.com> | 2026-09-25 14:28:03 +0200 |
|---|---|---|
| committer | Christophe Besson <cbesson@gmail.com> | 2026-09-25 17:24:16 +0200 |
| commit | 6b9b5394c5ec01c5de01b7bf23bc161792f38278 (patch) | |
| tree | 56536e2d30723aaec1852ba5cf19e24a886c815f /packages/meshbay-common/tests | |
| parent | 43c72cf9e8853cd5b2f59d4a4acd87729b0ddae0 (diff) | |
| download | meshbay-6b9b5394c5ec01c5de01b7bf23bc161792f38278.tar.gz | |
fix(hub): require the passphrase to change the e-mail on file
A member hands its hub access token to every node it connects to (the MNP
handshake), so a node operator holds a live bearer token for that member.
PATCH /v1/users/me {email} needed only that token, and the confirmation code
goes to the new address — so an operator could point the account's e-mail at
their own inbox, confirm it, and then use the passphrase-reset path to take the
account over. This is the immediate mitigation of that chain; the full fix
(a node-audience token distinct from the API session token) follows.
Changing the address now requires the passphrase-derived auth_key, verified
through the same throttle as a passphrase change or an account deletion — the
hub still never sees the passphrase. A PATCH that does not change the address is
unaffected. The profile page prompts for the passphrase and derives auth_key
with the existing MeshBayKeys.deriveAuthKey, as the delete and change-password
flows already do.
test_email_change_requires_passphrase.py: refused without / with a wrong
passphrase, proceeds with the right one, and a no-email PATCH still works; red
before, green after. test_mail_is_not_a_relay.py updated to pass the auth_key.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Diffstat (limited to 'packages/meshbay-common/tests')
0 files changed, 0 insertions, 0 deletions