Files
matrix-vona/vona/client/admin.py

153 lines
4.0 KiB
Python

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/<user>")
@admin.route("/_matrix/client/r0/admin/whois/<user>")
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/<user>", methods=["GET", "PUT"])
@admin.route("/_matrix/client/v1/admin/suspend/<user>", 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/<user>", methods=["GET", "PUT"])
@admin.route("/_matrix/client/v1/admin/lock/<user>", 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/<room>")
@admin.route("/_matrix/client/v1/admin/rooms/<room>")
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/<room>/evacuate", methods=["POST"])
@admin.route("/_matrix/client/unstable/uk.timedout.msc4375/admin/rooms/<room>", methods=["DELETE"])
@admin.route("/_matrix/client/v1/admin/rooms/<room>/evacuate", methods=["POST"])
@admin.route("/_matrix/client/v1/admin/rooms/<room>", methods=["DELETE"])
async def evacuate_room(room):
req = request.json
if (
"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/<room>/evacuate/status")
@admin.route("/_matrix/client/unstable/uk.timedout.msc4375/admin/rooms/<room>/delete/status")
@admin.route("/_matrix/client/v1/admin/rooms/<room>/evacuate/status")
@admin.route("/_matrix/client/v1/admin/rooms/<room>/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/<room>/blocked", methods=["PUT"])
@admin.route("/_matrix/client/v1/admin/rooms/<room>/blocked", methods=["PUT"])
async def block(room):
return jsonify({})