54 lines
1.5 KiB
Python
54 lines
1.5 KiB
Python
|
from flask import Flask, request, jsonify
|
||
|
from flask_cors import CORS, cross_origin
|
||
|
|
||
|
from .config import Config
|
||
|
from .db import Database
|
||
|
from .errors import bad_req, not_found
|
||
|
|
||
|
app = Flask(__name__)
|
||
|
|
||
|
|
||
|
JRD_JSON = "application/jrd+json; charset=utf-8"
|
||
|
|
||
|
WEBFINGER_ROUTE = "/.well-known/webfinger"
|
||
|
|
||
|
@app.route(WEBFINGER_ROUTE, methods=["GET"])
|
||
|
@cross_origin()
|
||
|
def hello_world():
|
||
|
config = Config()
|
||
|
db = Database()
|
||
|
|
||
|
resource = request.args.get("resource")
|
||
|
if resource is None:
|
||
|
bad_req("webfinger must have 'resource' arg")
|
||
|
if "acct:" not in resource:
|
||
|
return bad_req("webfinger resource query must have 'acct'")
|
||
|
if "@" not in resource:
|
||
|
return bad_req("webfinger resource query must have '@'")
|
||
|
|
||
|
parts = resource.split("acct:")
|
||
|
parts = parts[1].split("@")
|
||
|
username = parts[0]
|
||
|
hostname = parts[1]
|
||
|
if hostname != config.options["hostname"]:
|
||
|
bad_req(f"Only serves hostname {config.options['hostname']}")
|
||
|
user = db.get_user(username)
|
||
|
if user is None:
|
||
|
return not_found(f"resource {username} not found")
|
||
|
|
||
|
resp = jsonify(
|
||
|
{
|
||
|
"subject": f"acct:{username}@{hostname}",
|
||
|
"aliases": [f"http://{hostname}/@{username}"],
|
||
|
"links": [
|
||
|
{
|
||
|
"rel": "self",
|
||
|
"type": "application/activity+json",
|
||
|
"href": f"http://{hostname}/users/{username}",
|
||
|
},
|
||
|
],
|
||
|
}
|
||
|
)
|
||
|
resp.headers["Content-Type"] = JRD_JSON
|
||
|
return resp
|