From 9b6988a029bdbaf3d2159920ef6bc88ab67dac03 Mon Sep 17 00:00:00 2001 From: Kierre Date: Sat, 25 Oct 2025 04:22:48 -0400 Subject: [PATCH] Implement rooms V3 through V9 --- MSCs.md | 13 ++++++- vona/custom/hammerhead.py | 9 ++++- vona/federation/__init__.py | 2 + vona/federation/rooms.py | 77 +++++++++++++++++++++++++++++++++++-- vona/globals/__init__.py | 10 +++-- vona/utils/__main__.py | 5 ++- vona/utils/roomwithver.py | 21 ++++++++++ 7 files changed, 126 insertions(+), 11 deletions(-) create mode 100644 vona/utils/roomwithver.py diff --git a/MSCs.md b/MSCs.md index af15bbf..cbadbc5 100644 --- a/MSCs.md +++ b/MSCs.md @@ -6,7 +6,6 @@ Merged MSCs: * [MSC971: Groups](https://github.com/matrix-org/matrix-spec-proposals/issues/971) * [MSC1708: .well-known for server name resolution](https://github.com/velikopter/matrix-spec-proposals/blob/edutypes/proposals/1708-well-known-for-federation.md) * [MSC1753: C2S Capabilities API](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/1753-capabilities.md) -* [MSC1759: Room V2](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/1759-rooms-v2.md) * [MSC1794: Federation v2 Invite API](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/1794-federation-v2-invites.md) * [MSC1802: Better format for send_join and send_leave](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/1802-standardised-federation-response-format.md) * [MSC1812: Federation Make Membership Room Version](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/1812-federation-make-membership.md) @@ -21,10 +20,20 @@ Merged MSCs: * [MSC4260: Reporting users](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/4260-report-user.md) - Non-merged MSCs: * [MSC4358: Out-of-room server discovery](https://github.com/matrix-org/matrix-spec-proposals/pull/4358) * [MSC4367: via routes in the published room directory](https://github.com/matrix-org/matrix-spec-proposals/pull/4367) * [MSC4370: Federation endpoint for retrieving current extremities](https://github.com/matrix-org/matrix-spec-proposals/pull/4370) * [MSC4373: Server opt-out of specific EDU types](https://github.com/matrix-org/matrix-spec-proposals/pull/4373) + + +Room version MSCs: +* [MSC1759: Room V2](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/1759-rooms-v2.md) +* [MSC1659: Room V3](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/1659-event-id-as-hashes.md) +* [MSC2002: Room V4](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/2002-rooms-v4.md) +* [MSC2077: Room V5](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/2077-rooms-v5.md) +* [MSC2240: Room V6](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/2240-rooms-v6.md) +* [MSC2998: Room V7](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/2998-rooms-v7.md) +* [MSC3289: Room V8](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/3289-rooms-v8.md) +* [MSC3375: Room V9](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/3375-room-v9.md) diff --git a/vona/custom/hammerhead.py b/vona/custom/hammerhead.py index 55ac560..01710e7 100644 --- a/vona/custom/hammerhead.py +++ b/vona/custom/hammerhead.py @@ -73,7 +73,14 @@ async def room_state(room): key = f"({event["type"]},'{event["state_key"]}')" formatted_state[key] = event - event_id = event["event_id"] + if "event_id" in event: + event_id = event["event_id"] + else: + event_id = globals.make_ref_hash( + event, + int(globals.room_version_from_id(room)) + ) + event_cache[event_id] = event diff --git a/vona/federation/__init__.py b/vona/federation/__init__.py index 4dca0a7..f21d869 100644 --- a/vona/federation/__init__.py +++ b/vona/federation/__init__.py @@ -24,6 +24,8 @@ class bullshit: def send_join(request, room) -> dict: if globals.room_version_from_id(room) in ["1", "2"]: return rooms.v1_v2(request, room) + else: + return rooms.v3(request, room) @server.route("/_matrix/federation/v1/version") diff --git a/vona/federation/rooms.py b/vona/federation/rooms.py index 4293a13..b171ebf 100644 --- a/vona/federation/rooms.py +++ b/vona/federation/rooms.py @@ -3,9 +3,6 @@ import vona.config as config # This file is responsible for creating Matrix rooms. -# Room V3+ -# TODO - # Room V1/V2 def v1_v2(request, room) -> dict: event_chain = [] @@ -211,3 +208,77 @@ def v1_v2(request, room) -> dict: } return response + + +# Room V3 to V9 +def v3(request, room) -> dict: + initial_response = v1_v2(request, room) + state = list(initial_response["state"]) + ver = int(globals.room_version_from_id(room)) + events = {} + hash_map = {} + + for event in state: + events[event["type"]] = event + del event["event_id"] + del event["hashes"] + del event["signatures"] + + # m.room.create doesn't have prev_events or auth_events + events["m.room.create"] = globals.hash_and_sign_event(events["m.room.create"]) + hash_map["m.room.create"] = globals.make_ref_hash(events["m.room.create"], ver) + + events["m.room.member"]["auth_events"] = [hash_map["m.room.create"]] + events["m.room.member"]["prev_events"] = [hash_map["m.room.create"]] + events["m.room.member"] = globals.hash_and_sign_event(events["m.room.member"]) + hash_map["m.room.member"] = globals.make_ref_hash(events["m.room.member"], ver) + + events["m.room.power_levels"]["auth_events"] = [ + hash_map["m.room.create"], + hash_map["m.room.member"], + ] + events["m.room.power_levels"]["prev_events"] = [hash_map["m.room.member"]] + events["m.room.power_levels"] = globals.hash_and_sign_event(events["m.room.power_levels"]) + hash_map["m.room.power_levels"] = globals.make_ref_hash(events["m.room.power_levels"], ver) + + events["m.room.join_rules"]["auth_events"] = [ + hash_map["m.room.create"], + hash_map["m.room.member"], + hash_map["m.room.power_levels"], + ] + events["m.room.join_rules"]["prev_events"] = [hash_map["m.room.power_levels"]] + events["m.room.join_rules"] = globals.hash_and_sign_event(events["m.room.join_rules"]) + hash_map["m.room.join_rules"] = globals.make_ref_hash(events["m.room.join_rules"], ver) + + events["m.room.guest_access"]["auth_events"] = [ + hash_map["m.room.create"], + hash_map["m.room.member"], + hash_map["m.room.power_levels"], + ] + events["m.room.guest_access"]["prev_events"] = [hash_map["m.room.join_rules"]] + events["m.room.guest_access"] = globals.hash_and_sign_event(events["m.room.guest_access"]) + hash_map["m.room.guest_access"] = globals.make_ref_hash(events["m.room.guest_access"], ver) + + events["m.room.history_visibility"]["auth_events"] = [ + hash_map["m.room.create"], + hash_map["m.room.member"], + hash_map["m.room.power_levels"], + ] + events["m.room.history_visibility"]["prev_events"] = [hash_map["m.room.guest_access"]] + events["m.room.history_visibility"] = globals.hash_and_sign_event(events["m.room.history_visibility"]) + + new_state = [] + + for event in events: + new_state.append(events[event]) + + + resp = { + "auth_chain": new_state, + "event": initial_response["event"], + "members_omitted": False, + "servers_in_room": [config.server_name], + "state": new_state + } + + return resp diff --git a/vona/globals/__init__.py b/vona/globals/__init__.py index e053f87..a794ebb 100644 --- a/vona/globals/__init__.py +++ b/vona/globals/__init__.py @@ -10,7 +10,7 @@ import httpx import json import re -version = "1.4.4" +version = "1.5.0" def canonical_json(value): @@ -261,10 +261,14 @@ def make_ref_hash( def room_version_from_id(room): - room_id_no_sigil = room.replace("!", "") + room_id_no_sigil = ( + room + .replace("!", "") + .replace(f":{config.server_name}", "") + ) hexadecimal_room_id = bytes(room_id_no_sigil, "utf-8").hex() - versions = [str(i) for i in range(1, 3)] + versions = [str(i) for i in range(1, 10)] if not any(ver in hexadecimal_room_id for ver in versions): hexadecimal_room_id = "2" + hexadecimal_room_id[1:] diff --git a/vona/utils/__main__.py b/vona/utils/__main__.py index d348e52..a028842 100644 --- a/vona/utils/__main__.py +++ b/vona/utils/__main__.py @@ -1,8 +1,9 @@ print("Available utils:") a = [ - "makekey", - "joinroom" + "makekey - Generate a signing key", + "joinroom - Join a remote room", + "roomwithver - Brute-force a room with a specific room version", ] for t in a: diff --git a/vona/utils/roomwithver.py b/vona/utils/roomwithver.py new file mode 100644 index 0000000..5e271c6 --- /dev/null +++ b/vona/utils/roomwithver.py @@ -0,0 +1,21 @@ +import vona.globals as globals +import vona.config as config +import os + +versions = [str(i) for i in range(1, 10)] +desired_ver = input("Desired room version:\n\t") + +if desired_ver not in versions: + os._exit(1) + +try: + while True: + room_id = os.urandom(8).hex() + room_ver = globals.room_version_from_id(room_id) + + if room_ver == desired_ver: + print(f"!{room_id}:{config.server_name}") + break +except: + print("") + pass