Support remote follow

main
Thomas Sileo 2022-06-26 10:28:21 +02:00
parent b977b64bfb
commit 6700984117
4 changed files with 53 additions and 4 deletions

View File

@ -11,11 +11,13 @@ import httpx
from dateutil.parser import isoparse from dateutil.parser import isoparse
from fastapi import Depends from fastapi import Depends
from fastapi import FastAPI from fastapi import FastAPI
from fastapi import Form
from fastapi import Request from fastapi import Request
from fastapi import Response from fastapi import Response
from fastapi.exceptions import HTTPException from fastapi.exceptions import HTTPException
from fastapi.responses import FileResponse from fastapi.responses import FileResponse
from fastapi.responses import PlainTextResponse from fastapi.responses import PlainTextResponse
from fastapi.responses import RedirectResponse
from fastapi.responses import StreamingResponse from fastapi.responses import StreamingResponse
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
from loguru import logger from loguru import logger
@ -42,10 +44,13 @@ from app.config import DOMAIN
from app.config import ID from app.config import ID
from app.config import USER_AGENT from app.config import USER_AGENT
from app.config import USERNAME from app.config import USERNAME
from app.config import generate_csrf_token
from app.config import is_activitypub_requested from app.config import is_activitypub_requested
from app.config import verify_csrf_token
from app.database import get_db from app.database import get_db
from app.templates import is_current_user_admin from app.templates import is_current_user_admin
from app.uploads import UPLOAD_DIR from app.uploads import UPLOAD_DIR
from app.webfinger import get_remote_follow_template
# TODO(ts): # TODO(ts):
# #
@ -458,6 +463,39 @@ async def inbox(
return Response(status_code=204) return Response(status_code=204)
@app.get("/remote_follow")
def get_remote_follow(
request: Request,
db: Session = Depends(get_db),
) -> templates.TemplateResponse:
return templates.render_template(
db,
request,
"remote_follow.html",
{"remote_follow_csrf_token": generate_csrf_token()},
)
@app.post("/remote_follow")
def post_remote_follow(
request: Request,
db: Session = Depends(get_db),
csrf_check: None = Depends(verify_csrf_token),
profile: str = Form(),
) -> RedirectResponse:
if not profile.startswith("@"):
profile = f"@{profile}"
remote_follow_template = get_remote_follow_template(profile)
if not remote_follow_template:
raise HTTPException(status_code=404)
return RedirectResponse(
remote_follow_template.format(uri=ID),
status_code=302,
)
@app.get("/.well-known/webfinger") @app.get("/.well-known/webfinger")
def wellknown_webfinger(resource: str) -> JSONResponse: def wellknown_webfinger(resource: str) -> JSONResponse:
"""Exposes/servers WebFinger data.""" """Exposes/servers WebFinger data."""
@ -476,7 +514,7 @@ def wellknown_webfinger(resource: str) -> JSONResponse:
{"rel": "self", "type": "application/activity+json", "href": ID}, {"rel": "self", "type": "application/activity+json", "href": ID},
{ {
"rel": "http://ostatus.org/schema/1.0/subscribe", "rel": "http://ostatus.org/schema/1.0/subscribe",
"template": DOMAIN + "/authorize_interaction?uri={uri}", "template": BASE_URL + "/admin/lookup?query={uri}",
}, },
], ],
} }

View File

@ -18,7 +18,6 @@ from app import models
from app.actor import LOCAL_ACTOR from app.actor import LOCAL_ACTOR
from app.ap_object import Attachment from app.ap_object import Attachment
from app.ap_object import Object from app.ap_object import Object
from app.boxes import public_outbox_objects_count
from app.config import BASE_URL from app.config import BASE_URL
from app.config import DEBUG from app.config import DEBUG
from app.config import VERSION from app.config import VERSION
@ -93,7 +92,6 @@ def render_template(
"local_actor": LOCAL_ACTOR, "local_actor": LOCAL_ACTOR,
"followers_count": db.query(models.Follower).count(), "followers_count": db.query(models.Follower).count(),
"following_count": db.query(models.Following).count(), "following_count": db.query(models.Following).count(),
"objects_count": public_outbox_objects_count(db),
**template_args, **template_args,
}, },
) )

View File

@ -21,7 +21,7 @@
<div style="margin:30px 0;"> <div style="margin:30px 0;">
<nav class="flexbox"> <nav class="flexbox">
<ul> <ul>
<li>{{ header_link("index", "Notes") }} <span>{{ objects_count }}</span></li> <li>{{ header_link("index", "Notes") }}</li>
<li>{{ header_link("followers", "Followers") }} <span>{{ followers_count }}</span></li> <li>{{ header_link("followers", "Followers") }} <span>{{ followers_count }}</span></li>
<li>{{ header_link("following", "Following") }} <span>{{ following_count }}</span></li> <li>{{ header_link("following", "Following") }} <span>{{ following_count }}</span></li>
</ul> </ul>

View File

@ -0,0 +1,13 @@
{%- import "utils.html" as utils with context -%}
{% extends "layout.html" %}
{% block content %}
{% include "header.html" %}
<h2>Remotely follow {{ local_actor.display_name }}</h2>
<form action="{{ url_for("post_remote_follow") }}" method="POST">
<input type="hidden" name="csrf_token" value="{{remote_follow_csrf_token}}">
<input type="text" name="profile" placeholder="you@instance.tld">
<input type="submit" value="Follow">
</form>
{% endblock %}