From b71096663c668707e9895ed06a43d482785db81e Mon Sep 17 00:00:00 2001 From: Kierre Date: Fri, 24 Oct 2025 20:34:20 -0400 Subject: [PATCH] Add room v3+ event ID calculator --- vona/globals/__init__.py | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/vona/globals/__init__.py b/vona/globals/__init__.py index 3de09d3..25b4e65 100644 --- a/vona/globals/__init__.py +++ b/vona/globals/__init__.py @@ -169,7 +169,10 @@ def make_auth_header( return authorization_headers[0].decode("utf-8") -def redact_event(event): +def redact_event( + event: dict, + for_event_id: bool = False, +): # Returns a redacted event as per # the algorithm for v1/v2 rooms. @@ -181,7 +184,6 @@ def redact_event(event): "state_key", "content", "hashes", - "signatures", "depth", "prev_events", "prev_state", @@ -191,6 +193,9 @@ def redact_event(event): "membership", ] + if not for_event_id: + allowed_keys.append("signatures") + redacted_event = {k: v for k, v in event.items() if k in allowed_keys} if "type" in redacted_event and "content" in redacted_event: @@ -236,6 +241,26 @@ def hash_and_sign_event(event_object): return event_object +def make_ref_hash( + event: dict, + room_ver: int = 3, +): + stripped = redact_event(event, True) + evt_bytes = canonical_json(stripped) + + evt_hash = base64.b64encode( + hashlib.sha256(evt_bytes).digest() + ).decode("utf-8").rstrip("=") + + if room_ver > 3: + while "+" in evt_hash: + evt_hash = evt_hash.replace("+", "-") + while "/" in evt_hash: + evt_hash = evt_hash.replace("/", "_") + + return "$" + evt_hash + + def room_version_from_id(room): room_id_no_sigil = room.replace("!", "") @@ -345,7 +370,7 @@ class http_client: ) -def strip_state(l) -> dict: +def strip_state(l) -> list: if not isinstance(l, list): return l