Implement rooms V3 through V9

This commit is contained in:
2025-10-25 04:22:48 -04:00
parent 2f891508ab
commit 9b6988a029
7 changed files with 126 additions and 11 deletions

View File

@@ -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

View File

@@ -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")

View File

@@ -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

View File

@@ -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:]

View File

@@ -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:

21
vona/utils/roomwithver.py Normal file
View File

@@ -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