aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/src/meshbay_node/daemon.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/daemon.py')
-rw-r--r--packages/meshbay-node/src/meshbay_node/daemon.py44
1 files changed, 31 insertions, 13 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/daemon.py b/packages/meshbay-node/src/meshbay_node/daemon.py
index 095bcae..1777bc3 100644
--- a/packages/meshbay-node/src/meshbay_node/daemon.py
+++ b/packages/meshbay-node/src/meshbay_node/daemon.py
@@ -601,19 +601,8 @@ class NodeDaemon(EnrichmentMixin):
payload = _jwt.decode(
token, session.hub_pk_pem, algorithms=["EdDSA"],
options={"verify_exp": False})
- target = payload.get("target")
- tid = payload.get("target_id", "")
- if target == "user":
- denylist.deny_user(tid)
- elif target == "group":
- # H4: previously dropped on the floor, so "suspend a
- # group" was a hub-only gesture that no node enforced.
- denylist.deny_group(tid)
- self._drop_group_sessions(tid)
- elif target == "jti":
- denylist.deny_jti(tid)
- else:
- log.warning("Unknown revocation target: %r", target)
+ self._apply_revocation(denylist, payload.get("target"),
+ payload.get("target_id", ""))
except Exception as e:
log.warning("Invalid revocation token: %s", e)
@@ -1522,6 +1511,35 @@ class NodeDaemon(EnrichmentMixin):
except Exception:
pass
+ def _apply_revocation(self, denylist, target, target_id: str) -> None:
+ """
+ What a revocation the hub signed does on this node.
+
+ A revoked account or group is refused from now on, and its live sessions
+ are closed: a denylist entry alone stops the next connection and leaves
+ the current one streaming, downloading and chatting until it happens to
+ disconnect.
+ """
+ if target == "user":
+ denylist.deny_user(target_id)
+ self._drop_user_sessions(target_id)
+ elif target == "group":
+ denylist.deny_group(target_id)
+ self._drop_group_sessions(target_id)
+ elif target == "jti":
+ denylist.deny_jti(target_id)
+ else:
+ log.warning("Unknown revocation target: %r", target)
+
+ def _drop_user_sessions(self, user_id: str) -> None:
+ """Close every live session of a revoked account."""
+ if not self._webrtc or not user_id:
+ return
+ for session in list(self._webrtc._sessions.values()):
+ if getattr(session, "_user_id", None) == user_id:
+ spawn(session.close())
+ log.info("Dropped session for revoked account %s", user_id[:8])
+
def _drop_group_sessions(self, group_id: str) -> None:
"""Close live sessions for a revoked group (H4)."""
if not self._webrtc or not group_id: