aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/src/meshbay_node/transport
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/transport')
-rw-r--r--packages/meshbay-node/src/meshbay_node/transport/webrtc_server.py26
1 files changed, 19 insertions, 7 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/transport/webrtc_server.py b/packages/meshbay-node/src/meshbay_node/transport/webrtc_server.py
index 15309cf..717a27a 100644
--- a/packages/meshbay-node/src/meshbay_node/transport/webrtc_server.py
+++ b/packages/meshbay-node/src/meshbay_node/transport/webrtc_server.py
@@ -868,14 +868,20 @@ class WebRTCPeerSession:
self._send({"type": "error", "detail": "No pending handshake"})
return
- bundle_enc = await bundle_store.fetch_keypair(user_id)
- if bundle_enc:
- self._send({
+ kp = await bundle_store.fetch_keypair(user_id)
+ if kp and kp.get("bundle_enc"):
+ resp = {
"type": MNP.KEYPAIR_BUNDLE_RESP,
"v": MNP_VERSION,
"found": True,
- "bundle_enc": bundle_enc,
- })
+ "bundle_enc": kp["bundle_enc"],
+ }
+ # The recovery-wrapped copy (MNP 0.14) rides along when present, so a
+ # client holding the recovery key can re-wrap it under a new
+ # passphrase โ€” docs/auth-confirm.md ยง4.5.
+ if kp.get("bundle_enc_recovery"):
+ resp["bundle_enc_recovery"] = kp["bundle_enc_recovery"]
+ self._send(resp)
else:
self._send({"type": MNP.KEYPAIR_BUNDLE_RESP, "v": MNP_VERSION, "found": False})
@@ -891,8 +897,14 @@ class WebRTCPeerSession:
self._send({"type": "error", "detail": "Missing bundle_enc"})
return
- await bundle_store.store_keypair(self._user_id, bundle_enc)
- log.info("Keypair bundle stored for user=%s", self._user_id[:8])
+ # Optional second copy wrapped under the recovery key (MNP 0.14). Omitted
+ # by an older client and by a plain re-backup; the store keeps any
+ # existing recovery copy when this is absent.
+ recovery = msg.get("bundle_enc_recovery") or None
+
+ await bundle_store.store_keypair(self._user_id, bundle_enc, recovery)
+ log.info("Keypair bundle stored for user=%s (recovery=%s)",
+ self._user_id[:8], bool(recovery))
self._audit("keypair_bundle_store")
self._send({
"type": "ack", "v": MNP_VERSION,