aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/src/meshbay_node/transport/quic_server.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/transport/quic_server.py')
-rw-r--r--packages/meshbay-node/src/meshbay_node/transport/quic_server.py40
1 files changed, 36 insertions, 4 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/transport/quic_server.py b/packages/meshbay-node/src/meshbay_node/transport/quic_server.py
index 73e668c..ce6fe17 100644
--- a/packages/meshbay-node/src/meshbay_node/transport/quic_server.py
+++ b/packages/meshbay-node/src/meshbay_node/transport/quic_server.py
@@ -35,6 +35,7 @@ from aioquic.quic.events import QuicEvent, StreamDataReceived, StreamReset
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
from meshbay_common import MNP_VERSION
+from meshbay_node.roots import RootSet, entry_abs_path
from meshbay_common.handshake import (
NONCE_LEN,
ROLE_CLIENT,
@@ -98,6 +99,37 @@ class Denylist:
log.info("Denied jti: %s", jti[:8])
self._save()
+ def entries(self) -> dict[str, list[str]]:
+ """What is currently refused, for the operator to inspect (14.10)."""
+ return {
+ "users": sorted(self.user_ids),
+ "groups": sorted(self.group_ids),
+ "jtis": sorted(self.jtis),
+ }
+
+ def clear(self, subject: str = "") -> int:
+ """
+ Drop everything, or one identifier. Returns how many entries went.
+
+ Not silent by design: clearing re-admits whoever it was keeping out, and
+ the count is what tells the operator whether they undid one revocation
+ or all of them.
+ """
+ before = len(self.user_ids) + len(self.group_ids) + len(self.jtis)
+ if subject:
+ self.user_ids.discard(subject)
+ self.group_ids.discard(subject)
+ self.jtis.discard(subject)
+ else:
+ self.user_ids.clear()
+ self.group_ids.clear()
+ self.jtis.clear()
+ after = len(self.user_ids) + len(self.group_ids) + len(self.jtis)
+ removed = before - after
+ if removed:
+ self._save()
+ return removed
+
def _load(self) -> None:
if not self._path or not self._path.exists():
return
@@ -352,7 +384,7 @@ class _MNPServerProtocol(QuicConnectionProtocol):
self._send(stream_id, {"type": "error", "detail": "File not found"})
return
- file_path = ctx["shared_root"] / entry.path / entry.name
+ file_path = entry_abs_path(ctx["roots"], entry)
if not file_path.exists():
self._send(stream_id, {"type": "error", "detail": "File not on disk"})
return
@@ -379,7 +411,7 @@ class _MNPServerProtocol(QuicConnectionProtocol):
self._send(stream_id, {"type": "error", "detail": "File not found"})
return
- file_path = ctx["shared_root"] / entry.path / entry.name
+ file_path = entry_abs_path(ctx["roots"], entry)
if not file_path.exists():
self._send(stream_id, {"type": "error", "detail": "File not on disk"})
return
@@ -506,7 +538,7 @@ class QuicChunkServer:
sk_node: Ed25519PrivateKey,
hub_pk_pem: bytes,
gek: bytes,
- shared_root: Path,
+ roots: RootSet,
index: GroupIndex,
host: str = "::", # listen IPv4 + IPv6 (dual-stack Linux)
port: int = 19000,
@@ -519,7 +551,7 @@ class QuicChunkServer:
"sk_node": sk_node,
"hub_pk_pem": hub_pk_pem,
"gek": gek,
- "shared_root": shared_root,
+ "roots": roots,
"index": index,
}
if groups: