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)
|
* [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)
|
* [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)
|
* [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)
|
* [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)
|
* [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)
|
* [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)
|
* [MSC4260: Reporting users](https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/4260-report-user.md)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Non-merged MSCs:
|
Non-merged MSCs:
|
||||||
|
|
||||||
* [MSC4358: Out-of-room server discovery](https://github.com/matrix-org/matrix-spec-proposals/pull/4358)
|
* [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)
|
* [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)
|
* [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)
|
* [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"]}')"
|
key = f"({event["type"]},'{event["state_key"]}')"
|
||||||
formatted_state[key] = event
|
formatted_state[key] = event
|
||||||
|
|
||||||
|
if "event_id" in event:
|
||||||
event_id = event["event_id"]
|
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
|
event_cache[event_id] = event
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ class bullshit:
|
|||||||
def send_join(request, room) -> dict:
|
def send_join(request, room) -> dict:
|
||||||
if globals.room_version_from_id(room) in ["1", "2"]:
|
if globals.room_version_from_id(room) in ["1", "2"]:
|
||||||
return rooms.v1_v2(request, room)
|
return rooms.v1_v2(request, room)
|
||||||
|
else:
|
||||||
|
return rooms.v3(request, room)
|
||||||
|
|
||||||
|
|
||||||
@server.route("/_matrix/federation/v1/version")
|
@server.route("/_matrix/federation/v1/version")
|
||||||
|
|||||||
@@ -3,9 +3,6 @@ import vona.config as config
|
|||||||
|
|
||||||
# This file is responsible for creating Matrix rooms.
|
# This file is responsible for creating Matrix rooms.
|
||||||
|
|
||||||
# Room V3+
|
|
||||||
# TODO
|
|
||||||
|
|
||||||
# Room V1/V2
|
# Room V1/V2
|
||||||
def v1_v2(request, room) -> dict:
|
def v1_v2(request, room) -> dict:
|
||||||
event_chain = []
|
event_chain = []
|
||||||
@@ -211,3 +208,77 @@ def v1_v2(request, room) -> dict:
|
|||||||
}
|
}
|
||||||
|
|
||||||
return response
|
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 json
|
||||||
import re
|
import re
|
||||||
|
|
||||||
version = "1.4.4"
|
version = "1.5.0"
|
||||||
|
|
||||||
|
|
||||||
def canonical_json(value):
|
def canonical_json(value):
|
||||||
@@ -261,10 +261,14 @@ def make_ref_hash(
|
|||||||
|
|
||||||
|
|
||||||
def room_version_from_id(room):
|
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()
|
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):
|
if not any(ver in hexadecimal_room_id for ver in versions):
|
||||||
hexadecimal_room_id = "2" + hexadecimal_room_id[1:]
|
hexadecimal_room_id = "2" + hexadecimal_room_id[1:]
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
print("Available utils:")
|
print("Available utils:")
|
||||||
|
|
||||||
a = [
|
a = [
|
||||||
"makekey",
|
"makekey - Generate a signing key",
|
||||||
"joinroom"
|
"joinroom - Join a remote room",
|
||||||
|
"roomwithver - Brute-force a room with a specific room version",
|
||||||
]
|
]
|
||||||
|
|
||||||
for t in a:
|
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