import vona.globals as globals import vona.config as config from vona.federation import ( send_join, bullshit, ) from flask import ( Blueprint, jsonify, request, ) admin = Blueprint("admin", __name__) # This implements misc standard admin APIs. @admin.route("/_matrix/client/v3/admin/whois/") @admin.route("/_matrix/client/r0/admin/whois/") async def whois(user): if user.startswith("@"): return jsonify({ "devices": { "": { "sessions": [{ "connections": [{ "ip": "127.0.0.1", "last_seen": config.the_funny_number, "user_agent": f"Vona/{globals.version}" }] }] } }, "user_id": user }) return jsonify({ "errcode": "M_INVALID_PARAM", "error": "Expected UserID string to start with '@'" }) @admin.route("/_matrix/client/unstable/uk.timedout.msc4323/admin/suspend/", methods=["GET", "PUT"]) @admin.route("/_matrix/client/v1/admin/suspend/", methods=["GET", "PUT"]) async def suspend(user): if request.method == "PUT": req = request.get_json() if req and "suspended" in req: return jsonify({"suspended": req["suspended"]}) return jsonify({"suspended": True}) @admin.route("/_matrix/client/unstable/uk.timedout.msc4323/admin/lock/", methods=["GET", "PUT"]) @admin.route("/_matrix/client/v1/admin/lock/", methods=["GET", "PUT"]) async def lock(user): if request.method == "PUT": req = request.get_json() if req and "locked" in req: return jsonify({"locked": req["locked"]}) return jsonify({"locked": True}) @admin.route("/_matrix/client/unstable/uk.timedout.msc4375/admin/rooms") @admin.route("/_matrix/client/v1/admin/rooms") async def rooms(): return jsonify({ "chunk": [ f"!qa:{config.server_name}", f"!br:{config.server_name}", f"!3:{config.server_name}", f"!D:{config.server_name}", f"!U:{config.server_name}", f"!f:{config.server_name}", f"!gx:{config.server_name}", f"!hx:{config.server_name}", f"!iy:{config.server_name}", f"!p0:{config.server_name}", f"!jZ:{config.server_name}", ] }) @admin.route("/_matrix/client/unstable/uk.timedout.msc4375/admin/rooms/") @admin.route("/_matrix/client/v1/admin/rooms/") async def room_state(room): if ":" not in room: return jsonify({ "errcode": "M_NOT_FOUND", "error": "Unknown room" }), 404 else: if room.split(":")[1] != config.server_name: return jsonify({ "errcode": "M_NOT_FOUND", "error": "Unknown room" }), 404 state = globals.strip_state( send_join(bullshit, room)["state"] ) return jsonify({ "state": [state] }) @admin.route("/_matrix/client/unstable/uk.timedout.msc4375/admin/rooms//evacuate", methods=["POST"]) @admin.route("/_matrix/client/unstable/uk.timedout.msc4375/admin/rooms/", methods=["DELETE"]) @admin.route("/_matrix/client/v1/admin/rooms//evacuate", methods=["POST"]) @admin.route("/_matrix/client/v1/admin/rooms/", methods=["DELETE"]) async def evacuate_room(room): req = request.json if ( isinstance(req, dict) and "background" in req and isinstance(req["background"], bool) ): background = req["background"] else: background = True resp = { "background": background, } if not background: resp["removed"] = config.the_funny_number return resp @admin.route("/_matrix/client/unstable/uk.timedout.msc4375/admin/rooms//evacuate/status") @admin.route("/_matrix/client/unstable/uk.timedout.msc4375/admin/rooms//delete/status") @admin.route("/_matrix/client/v1/admin/rooms//evacuate/status") @admin.route("/_matrix/client/v1/admin/rooms//delete/status") async def evacuate_status(room): return jsonify({ "started_at": globals.time(), # everything all at once always now!!! "total": config.the_funny_number, "evacuated": config.the_funny_number, "failed": config.the_funny_number, }) @admin.route("/_matrix/client/unstable/uk.timedout.msc4375/admin/rooms//blocked", methods=["PUT"]) @admin.route("/_matrix/client/v1/admin/rooms//blocked", methods=["PUT"]) async def block(room): return jsonify({})