Allow Vona to receive invites, and add validation to make_join

This commit is contained in:
2025-09-10 23:57:35 -04:00
parent 9fd2f84741
commit 789ca3e743
2 changed files with 66 additions and 39 deletions

View File

@@ -139,8 +139,15 @@ def send_join_v1(roomId, eventId):
def send_join_v2(roomId, eventId):
return jsonify(send_join(request, roomId))
@server.route('/_matrix/federation/v1/make_join/<roomId>/<userId>')
@server.route('/_matrix/federation/v1/make_join/<roomId>/<userId>')
def make_join(roomId, userId):
if 2 not in request.args.getlist("ver"):
return jsonify({
"errcode": "M_INCOMPATIBLE_ROOM_VERSION",
"error": "Your homeserver does not support the features required to join this room.",
"room_version": invite_data["room_version"]
}), 400
return jsonify({
"event": {
"content": {
@@ -200,7 +207,7 @@ def user_devices(user):
"devices": [],
"stream_id": the_funny_number,
"user_id": f"@vona:{server_name}"
})
})
@server.route('/_matrix/federation/v1/user/keys/query', methods=['POST'])
def user_keys():
@@ -210,35 +217,49 @@ def user_keys():
# https://spec.matrix.org/v1.15/server-server-api/#inviting-to-a-room
@server.route('/_matrix/federation/v2/invite/<room>/<txnId>', methods=['PUT'])
def invite_user_v2(room, txnId):
# This endpoint is not allowed for room
# versions over v2 as per spec, so any
# invites received here can be discarded
# safely.
return jsonify({
"errcode": "M_INCOMPATIBLE_ROOM_VERSION",
"error": "Vona only supports room version 2.",
"room_version": str(the_funny_number)
}), 400
return invite_user(request.data.decode('utf-8'), 2)
@server.route('/_matrix/federation/v1/invite/<room>/<txnId>', methods=['PUT'])
def invite_user(room, txnId):
# TODO: Sign provided JSON and return it.
def invite_user_v1(room, txnId):
return invite_user(request.data.decode('utf-8'), 1)
data = request.data.decode('utf-8')
invite_data = json.loads(data)
def invite_user(data, endpVer):
try:
invite_data = json.loads(data)
except:
return jsonify({"errcode":"M_NOT_JSON","error":"Content not JSON."}), 400
if "room_version" in invite_data:
if invite_data["room_version"] != "2":
return jsonify({
"errcode": "M_INCOMPATIBLE_ROOM_VERSION",
"error": "Vona only supports room version 2.",
"room_version": invite_data["room_version"]
})
# Placeholder
abort(500)
if "event" in invite_data:
if "room_version" in invite_data:
if invite_data["room_version"] != "2":
return jsonify({
"errcode": "M_INCOMPATIBLE_ROOM_VERSION",
"error": "Vona only supports room version 2.",
"room_version": invite_data["room_version"]
}), 400
else:
if "content" in invite_data["event"]:
if "membership" in invite_data["event"]["content"] and invite_data["event"]["content"]["membership"] == "invite":
if endpVer == 1:
return jsonify([
200,
{"event": globals.sign_json(invite_data["event"])}
])
else:
return jsonify({"event": globals.sign_json(invite_data["event"]), "room_version": "2"})
else:
print("membership is NOT an invitation, or it is missing.")
else:
print("event does not have content")
else:
print("data does have room version")
else:
print("data does have event")
return jsonify({
"errcode": "M_FORBIDDEN",
"error": "Invalid invitation PDU"
}), 403
@server.route('/_matrix/federation/v1/hierarchy/<roomId>')
def space_hierachy(roomId):