from datetime import datetime, timezone import vona.globals as globals import vona.config as config import time from flask import ( Blueprint, jsonify, ) from vona.federation import ( send_join, bullshit, ) hammerhead = Blueprint("hammerhead", __name__) # Hammerhead endpoints. Not documented, but code is at: # https://codeberg.org/timedout/hammerhead/src/branch/dev/hammerhead/router/routes/hammerhead @hammerhead.route("/_hammerhead/uptime") async def uptime(): return jsonify({"started_at": config.the_funny_number}) @hammerhead.route("/_hammerhead/version") async def version(): return jsonify({"version": globals.version}) @hammerhead.route("/_hammerhead/admin/reload-config") async def reload_config(): return jsonify({}) @hammerhead.route("/_hammerhead/admin/server-info/") async def server_info(server): return jsonify({ "destination": { "expires": datetime.now(timezone.utc).isoformat(), "host_header": server, "ip_port": [ f"{server}:443" ], "server_name": server }, "keys": globals.sign_json({ "old_verify_keys": {}, "server_name": server, "valid_until_ts": int(time.time() * 1000 + 604800000), "verify_keys": { f"ed25519:{config.signing_key.split()[1]}": { "key": globals.pubkey() } } }), "software": { "server": { "version": globals.version, "name": "Vona" } } }) @hammerhead.route("/_hammerhead/admin/rooms//state-resolver") async def room_state(room): state = send_join(bullshit, room)["state"] formatted_state = {} event_cache = {} for event in state: key = f"({event["type"]},'{event["state_key"]}')" formatted_state[key] = event 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 return jsonify({ "current_state": formatted_state, "event_cache": event_cache, "room_id": room, "room_version": globals.room_version_from_id(room) }) @hammerhead.route("/_hammerhead/admin/rooms//debug") async def debug_room(room): state = send_join(bullshit, room)["state"] formatted_state = {} event_cache = {} for event in state: key = f"({event["type"]},'{event["state_key"]}')" formatted_state[key] = event 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 if globals.room_version_from_id(room) in ["1", "2"]: extremity = globals.make_event_id(seed=f"6_{room}") else: extremity = globals.make_ref_hash( state[5], int(globals.room_version_from_id(room)), ) return jsonify({ "aliases": [f"#vona:{config.server_name}"], "current_state": formatted_state, "event_cache": event_cache, "room_id": room, "room_version": globals.room_version_from_id(room), "forward_extremities": [extremity], "servers": None })