aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/src/meshbay_node/transport/webrtc/admission.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/transport/webrtc/admission.py')
-rw-r--r--packages/meshbay-node/src/meshbay_node/transport/webrtc/admission.py18
1 files changed, 12 insertions, 6 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/transport/webrtc/admission.py b/packages/meshbay-node/src/meshbay_node/transport/webrtc/admission.py
index f94cade..20ebc79 100644
--- a/packages/meshbay-node/src/meshbay_node/transport/webrtc/admission.py
+++ b/packages/meshbay-node/src/meshbay_node/transport/webrtc/admission.py
@@ -20,6 +20,7 @@ from meshbay_common.device import (
device_add_transcript,
device_hello_transcript,
device_request_transcript,
+ device_revoke_transcript,
)
from meshbay_common.join import JOIN_TTL, ROLE_MEMBER, ROLE_OPERATOR, join_transcript
from meshbay_common.protocol import MNP
@@ -516,10 +517,17 @@ class AdmissionMixin:
pk_ed_b64 = str(msg.get("pk_ed25519", ""))
pk_x_b64 = str(msg.get("pk_x25519", ""))
+ code_hash = str(msg.get("code_hash", ""))
ts = int(msg.get("ts", 0))
if not (pk_ed_b64 and pk_x_b64):
self._send({"type": "error", "detail": "Missing device keys"})
return
+ # An approval answers a request the new device filed and signed with
+ # these keys. Without one, a countersignature alone — obtained however
+ # it was — would admit any key its holder chose.
+ if not code_hash:
+ self._send({"type": "error", "detail": "No pending request named"})
+ return
if abs(time.time() - ts) > DEVICE_TTL:
self._send({"type": "error", "detail": "Approval expired"})
return
@@ -543,9 +551,8 @@ class AdmissionMixin:
# Spend the request. Single use: an approval cannot be replayed, and a
# code that was used is gone whatever else happens next.
- code_hash = str(msg.get("code_hash", ""))
- if code_hash and not await roster.take_device_request(
- code_hash, self._user_id):
+ if not await roster.take_device_request(
+ code_hash, self._user_id, pk_ed_b64, pk_x_b64):
self._send({"type": "error",
"detail": "That request is no longer pending"})
return
@@ -696,10 +703,9 @@ class AdmissionMixin:
self._send({"type": "error", "detail": "No such device"})
return
- transcript = device_add_transcript(
+ transcript = device_revoke_transcript(
node_pk_b64=self._node_pk_b64(), user_id=self._user_id,
- pk_ed25519_b64=target, pk_x25519_b64=victim["pk_x25519"],
- nonce_node=self._nonce_node, ts=ts)
+ pk_ed25519_b64=target, nonce_node=self._nonce_node, ts=ts)
signer = await self._verify_device_signer(roster, transcript,
msg.get("sig", ""))
if signer is None: