Support remote follow
parent
b977b64bfb
commit
6700984117
40
app/main.py
40
app/main.py
|
@ -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}",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 %}
|
Loading…
Reference in New Issue