Implement rooms V3 through V9
This commit is contained in:
13
MSCs.md
13
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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:]
|
||||
|
||||
@@ -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
21
vona/utils/roomwithver.py
Normal 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
|
||||
Reference in New Issue
Block a user