forked from forks/microblog.pub
Tweak AP ctx, and gzip support for HTML resp
This commit is contained in:
parent
784362b532
commit
dad3dae988
7 changed files with 188 additions and 128 deletions
69
app.py
69
app.py
|
@ -63,9 +63,10 @@ from core.meta import is_public
|
||||||
from core.meta import not_undo
|
from core.meta import not_undo
|
||||||
from core.shared import _build_thread
|
from core.shared import _build_thread
|
||||||
from core.shared import _get_ip
|
from core.shared import _get_ip
|
||||||
|
from core.shared import activitypubify
|
||||||
from core.shared import csrf
|
from core.shared import csrf
|
||||||
|
from core.shared import htmlify
|
||||||
from core.shared import is_api_request
|
from core.shared import is_api_request
|
||||||
from core.shared import jsonify
|
|
||||||
from core.shared import login_required
|
from core.shared import login_required
|
||||||
from core.shared import noindex
|
from core.shared import noindex
|
||||||
from core.shared import paginated_query
|
from core.shared import paginated_query
|
||||||
|
@ -322,7 +323,7 @@ def serve_uploads(oid, fname):
|
||||||
def remote_follow():
|
def remote_follow():
|
||||||
"""Form to allow visitor to perform the remote follow dance."""
|
"""Form to allow visitor to perform the remote follow dance."""
|
||||||
if request.method == "GET":
|
if request.method == "GET":
|
||||||
return render_template("remote_follow.html")
|
return htmlify(render_template("remote_follow.html"))
|
||||||
|
|
||||||
csrf.protect()
|
csrf.protect()
|
||||||
profile = request.form.get("profile")
|
profile = request.form.get("profile")
|
||||||
|
@ -339,8 +340,7 @@ def remote_follow():
|
||||||
def index():
|
def index():
|
||||||
if is_api_request():
|
if is_api_request():
|
||||||
_log_sig()
|
_log_sig()
|
||||||
print(ME)
|
return activitypubify(**ME)
|
||||||
return jsonify(**ME)
|
|
||||||
|
|
||||||
q = {
|
q = {
|
||||||
"box": Box.OUTBOX.value,
|
"box": Box.OUTBOX.value,
|
||||||
|
@ -369,14 +369,15 @@ def index():
|
||||||
DB.activities, q, limit=25 - len(pinned)
|
DB.activities, q, limit=25 - len(pinned)
|
||||||
)
|
)
|
||||||
|
|
||||||
resp = render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"index.html",
|
"index.html",
|
||||||
outbox_data=outbox_data,
|
outbox_data=outbox_data,
|
||||||
older_than=older_than,
|
older_than=older_than,
|
||||||
newer_than=newer_than,
|
newer_than=newer_than,
|
||||||
pinned=pinned,
|
pinned=pinned,
|
||||||
)
|
)
|
||||||
return resp
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/all")
|
@app.route("/all")
|
||||||
|
@ -391,12 +392,14 @@ def all():
|
||||||
}
|
}
|
||||||
outbox_data, older_than, newer_than = paginated_query(DB.activities, q)
|
outbox_data, older_than, newer_than = paginated_query(DB.activities, q)
|
||||||
|
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"index.html",
|
"index.html",
|
||||||
outbox_data=outbox_data,
|
outbox_data=outbox_data,
|
||||||
older_than=older_than,
|
older_than=older_than,
|
||||||
newer_than=newer_than,
|
newer_than=newer_than,
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/note/<note_id>")
|
@app.route("/note/<note_id>")
|
||||||
|
@ -458,9 +461,11 @@ def note_by_id(note_id):
|
||||||
app.logger.exception(f"invalid doc: {doc!r}")
|
app.logger.exception(f"invalid doc: {doc!r}")
|
||||||
app.logger.info(f"shares={shares!r}")
|
app.logger.info(f"shares={shares!r}")
|
||||||
|
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"note.html", likes=likes, shares=shares, thread=thread, note=data
|
"note.html", likes=likes, shares=shares, thread=thread, note=data
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/outbox", methods=["GET", "POST"])
|
@app.route("/outbox", methods=["GET", "POST"])
|
||||||
|
@ -477,7 +482,7 @@ def outbox():
|
||||||
"meta.public": True,
|
"meta.public": True,
|
||||||
"type": {"$in": [ActivityType.CREATE.value, ActivityType.ANNOUNCE.value]},
|
"type": {"$in": [ActivityType.CREATE.value, ActivityType.ANNOUNCE.value]},
|
||||||
}
|
}
|
||||||
return jsonify(
|
return activitypubify(
|
||||||
**activitypub.build_ordered_collection(
|
**activitypub.build_ordered_collection(
|
||||||
DB.activities,
|
DB.activities,
|
||||||
q=q,
|
q=q,
|
||||||
|
@ -503,7 +508,9 @@ def outbox():
|
||||||
@app.route("/emoji/<name>")
|
@app.route("/emoji/<name>")
|
||||||
def ap_emoji(name):
|
def ap_emoji(name):
|
||||||
if name in EMOJIS:
|
if name in EMOJIS:
|
||||||
return jsonify(**{**EMOJIS[name].to_dict(), "@context": config.DEFAULT_CTX})
|
return activitypubify(
|
||||||
|
**{**EMOJIS[name].to_dict(), "@context": config.DEFAULT_CTX}
|
||||||
|
)
|
||||||
abort(404)
|
abort(404)
|
||||||
|
|
||||||
|
|
||||||
|
@ -523,7 +530,7 @@ def outbox_detail(item_id):
|
||||||
if doc["meta"].get("deleted", False):
|
if doc["meta"].get("deleted", False):
|
||||||
abort(404)
|
abort(404)
|
||||||
|
|
||||||
return jsonify(**activity_from_doc(doc))
|
return activitypubify(**activity_from_doc(doc))
|
||||||
|
|
||||||
|
|
||||||
@app.route("/outbox/<item_id>/activity")
|
@app.route("/outbox/<item_id>/activity")
|
||||||
|
@ -541,7 +548,7 @@ def outbox_activity(item_id):
|
||||||
|
|
||||||
if obj["type"] != ActivityType.CREATE.value:
|
if obj["type"] != ActivityType.CREATE.value:
|
||||||
abort(404)
|
abort(404)
|
||||||
return jsonify(**obj["object"])
|
return activitypubify(**obj["object"])
|
||||||
|
|
||||||
|
|
||||||
@app.route("/outbox/<item_id>/replies")
|
@app.route("/outbox/<item_id>/replies")
|
||||||
|
@ -570,7 +577,7 @@ def outbox_activity_replies(item_id):
|
||||||
"activity.object.inReplyTo": obj.get_object().id,
|
"activity.object.inReplyTo": obj.get_object().id,
|
||||||
}
|
}
|
||||||
|
|
||||||
return jsonify(
|
return activitypubify(
|
||||||
**activitypub.build_ordered_collection(
|
**activitypub.build_ordered_collection(
|
||||||
DB.activities,
|
DB.activities,
|
||||||
q=q,
|
q=q,
|
||||||
|
@ -610,7 +617,7 @@ def outbox_activity_likes(item_id):
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
return jsonify(
|
return activitypubify(
|
||||||
**activitypub.build_ordered_collection(
|
**activitypub.build_ordered_collection(
|
||||||
DB.activities,
|
DB.activities,
|
||||||
q=q,
|
q=q,
|
||||||
|
@ -649,7 +656,7 @@ def outbox_activity_shares(item_id):
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
return jsonify(
|
return activitypubify(
|
||||||
**activitypub.build_ordered_collection(
|
**activitypub.build_ordered_collection(
|
||||||
DB.activities,
|
DB.activities,
|
||||||
q=q,
|
q=q,
|
||||||
|
@ -672,7 +679,7 @@ def inbox():
|
||||||
except BadSignature:
|
except BadSignature:
|
||||||
abort(404)
|
abort(404)
|
||||||
|
|
||||||
return jsonify(
|
return activitypubify(
|
||||||
**activitypub.build_ordered_collection(
|
**activitypub.build_ordered_collection(
|
||||||
DB.activities,
|
DB.activities,
|
||||||
q={"meta.deleted": False, "box": Box.INBOX.value},
|
q={"meta.deleted": False, "box": Box.INBOX.value},
|
||||||
|
@ -800,7 +807,7 @@ def followers():
|
||||||
|
|
||||||
if is_api_request():
|
if is_api_request():
|
||||||
_log_sig()
|
_log_sig()
|
||||||
return jsonify(
|
return activitypubify(
|
||||||
**activitypub.build_ordered_collection(
|
**activitypub.build_ordered_collection(
|
||||||
DB.activities,
|
DB.activities,
|
||||||
q=q,
|
q=q,
|
||||||
|
@ -814,12 +821,14 @@ def followers():
|
||||||
followers = [
|
followers = [
|
||||||
doc["meta"]["actor"] for doc in raw_followers if "actor" in doc.get("meta", {})
|
doc["meta"]["actor"] for doc in raw_followers if "actor" in doc.get("meta", {})
|
||||||
]
|
]
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"followers.html",
|
"followers.html",
|
||||||
followers_data=followers,
|
followers_data=followers,
|
||||||
older_than=older_than,
|
older_than=older_than,
|
||||||
newer_than=newer_than,
|
newer_than=newer_than,
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/following")
|
@app.route("/following")
|
||||||
|
@ -829,11 +838,11 @@ def following():
|
||||||
if is_api_request():
|
if is_api_request():
|
||||||
_log_sig()
|
_log_sig()
|
||||||
if config.HIDE_FOLLOWING:
|
if config.HIDE_FOLLOWING:
|
||||||
return jsonify(
|
return activitypubify(
|
||||||
**activitypub.simple_build_ordered_collection("following", [])
|
**activitypub.simple_build_ordered_collection("following", [])
|
||||||
)
|
)
|
||||||
|
|
||||||
return jsonify(
|
return activitypubify(
|
||||||
**activitypub.build_ordered_collection(
|
**activitypub.build_ordered_collection(
|
||||||
DB.activities,
|
DB.activities,
|
||||||
q=q,
|
q=q,
|
||||||
|
@ -853,13 +862,15 @@ def following():
|
||||||
if "remote_id" in doc and "object" in doc.get("meta", {})
|
if "remote_id" in doc and "object" in doc.get("meta", {})
|
||||||
]
|
]
|
||||||
lists = list(DB.lists.find())
|
lists = list(DB.lists.find())
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"following.html",
|
"following.html",
|
||||||
following_data=following,
|
following_data=following,
|
||||||
older_than=older_than,
|
older_than=older_than,
|
||||||
newer_than=newer_than,
|
newer_than=newer_than,
|
||||||
lists=lists,
|
lists=lists,
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/tags/<tag>")
|
@app.route("/tags/<tag>")
|
||||||
|
@ -873,7 +884,8 @@ def tags(tag):
|
||||||
):
|
):
|
||||||
abort(404)
|
abort(404)
|
||||||
if not is_api_request():
|
if not is_api_request():
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"tags.html",
|
"tags.html",
|
||||||
tag=tag,
|
tag=tag,
|
||||||
outbox_data=DB.activities.find(
|
outbox_data=DB.activities.find(
|
||||||
|
@ -886,6 +898,7 @@ def tags(tag):
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
)
|
||||||
_log_sig()
|
_log_sig()
|
||||||
q = {
|
q = {
|
||||||
"box": Box.OUTBOX.value,
|
"box": Box.OUTBOX.value,
|
||||||
|
@ -895,7 +908,7 @@ def tags(tag):
|
||||||
"activity.object.tag.type": "Hashtag",
|
"activity.object.tag.type": "Hashtag",
|
||||||
"activity.object.tag.name": "#" + tag,
|
"activity.object.tag.name": "#" + tag,
|
||||||
}
|
}
|
||||||
return jsonify(
|
return activitypubify(
|
||||||
**activitypub.build_ordered_collection(
|
**activitypub.build_ordered_collection(
|
||||||
DB.activities,
|
DB.activities,
|
||||||
q=q,
|
q=q,
|
||||||
|
@ -920,7 +933,9 @@ def featured():
|
||||||
"meta.pinned": True,
|
"meta.pinned": True,
|
||||||
}
|
}
|
||||||
data = [clean_activity(doc["activity"]["object"]) for doc in DB.activities.find(q)]
|
data = [clean_activity(doc["activity"]["object"]) for doc in DB.activities.find(q)]
|
||||||
return jsonify(**activitypub.simple_build_ordered_collection("featured", data))
|
return activitypubify(
|
||||||
|
**activitypub.simple_build_ordered_collection("featured", data)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/liked")
|
@app.route("/liked")
|
||||||
|
@ -936,12 +951,14 @@ def liked():
|
||||||
|
|
||||||
liked, older_than, newer_than = paginated_query(DB.activities, q)
|
liked, older_than, newer_than = paginated_query(DB.activities, q)
|
||||||
|
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"liked.html", liked=liked, older_than=older_than, newer_than=newer_than
|
"liked.html", liked=liked, older_than=older_than, newer_than=newer_than
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
q = {"meta.deleted": False, "meta.undo": False, "type": ActivityType.LIKE.value}
|
q = {"meta.deleted": False, "meta.undo": False, "type": ActivityType.LIKE.value}
|
||||||
return jsonify(
|
return activitypubify(
|
||||||
**activitypub.build_ordered_collection(
|
**activitypub.build_ordered_collection(
|
||||||
DB.activities,
|
DB.activities,
|
||||||
q=q,
|
q=q,
|
||||||
|
|
|
@ -32,6 +32,7 @@ from core.shared import MY_PERSON
|
||||||
from core.shared import _build_thread
|
from core.shared import _build_thread
|
||||||
from core.shared import _Response
|
from core.shared import _Response
|
||||||
from core.shared import csrf
|
from core.shared import csrf
|
||||||
|
from core.shared import htmlify
|
||||||
from core.shared import login_required
|
from core.shared import login_required
|
||||||
from core.shared import noindex
|
from core.shared import noindex
|
||||||
from core.shared import p
|
from core.shared import p
|
||||||
|
@ -113,7 +114,9 @@ def admin_login() -> _Response:
|
||||||
payload = u2f.begin_authentication(ID, devices)
|
payload = u2f.begin_authentication(ID, devices)
|
||||||
session["challenge"] = payload
|
session["challenge"] = payload
|
||||||
|
|
||||||
return render_template("login.html", u2f_enabled=u2f_enabled, payload=payload)
|
return htmlify(
|
||||||
|
render_template("login.html", u2f_enabled=u2f_enabled, payload=payload)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@blueprint.route("/admin", methods=["GET"])
|
@blueprint.route("/admin", methods=["GET"])
|
||||||
|
@ -127,7 +130,8 @@ def admin_index() -> _Response:
|
||||||
}
|
}
|
||||||
col_liked = DB.activities.count(q)
|
col_liked = DB.activities.count(q)
|
||||||
|
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"admin.html",
|
"admin.html",
|
||||||
instances=list(DB.instances.find()),
|
instances=list(DB.instances.find()),
|
||||||
inbox_size=DB.activities.count({"box": Box.INBOX.value}),
|
inbox_size=DB.activities.count({"box": Box.INBOX.value}),
|
||||||
|
@ -148,27 +152,32 @@ def admin_index() -> _Response:
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@blueprint.route("/admin/indieauth", methods=["GET"])
|
@blueprint.route("/admin/indieauth", methods=["GET"])
|
||||||
@login_required
|
@login_required
|
||||||
def admin_indieauth() -> _Response:
|
def admin_indieauth() -> _Response:
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"admin_indieauth.html",
|
"admin_indieauth.html",
|
||||||
indieauth_actions=DB.indieauth.find().sort("ts", -1).limit(100),
|
indieauth_actions=DB.indieauth.find().sort("ts", -1).limit(100),
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@blueprint.route("/admin/tasks", methods=["GET"])
|
@blueprint.route("/admin/tasks", methods=["GET"])
|
||||||
@login_required
|
@login_required
|
||||||
def admin_tasks() -> _Response:
|
def admin_tasks() -> _Response:
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"admin_tasks.html",
|
"admin_tasks.html",
|
||||||
success=p.get_success(),
|
success=p.get_success(),
|
||||||
dead=p.get_dead(),
|
dead=p.get_dead(),
|
||||||
waiting=p.get_waiting(),
|
waiting=p.get_waiting(),
|
||||||
cron=p.get_cron(),
|
cron=p.get_cron(),
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@blueprint.route("/admin/lookup", methods=["GET"])
|
@blueprint.route("/admin/lookup", methods=["GET"])
|
||||||
|
@ -191,9 +200,11 @@ def admin_lookup() -> _Response:
|
||||||
|
|
||||||
print(data)
|
print(data)
|
||||||
app.logger.debug(data.to_dict())
|
app.logger.debug(data.to_dict())
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"lookup.html", data=data, meta=meta, url=request.args.get("url")
|
"lookup.html", data=data, meta=meta, url=request.args.get("url")
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@blueprint.route("/admin/thread")
|
@blueprint.route("/admin/thread")
|
||||||
|
@ -214,7 +225,7 @@ def admin_thread() -> _Response:
|
||||||
tpl = "note.html"
|
tpl = "note.html"
|
||||||
if request.args.get("debug"):
|
if request.args.get("debug"):
|
||||||
tpl = "note_debug.html"
|
tpl = "note_debug.html"
|
||||||
return render_template(tpl, thread=thread, note=data)
|
return htmlify(render_template(tpl, thread=thread, note=data))
|
||||||
|
|
||||||
|
|
||||||
@blueprint.route("/admin/new", methods=["GET"])
|
@blueprint.route("/admin/new", methods=["GET"])
|
||||||
|
@ -246,7 +257,8 @@ def admin_new() -> _Response:
|
||||||
content = f"@{actor.preferredUsername}@{domain} "
|
content = f"@{actor.preferredUsername}@{domain} "
|
||||||
thread = _build_thread(data)
|
thread = _build_thread(data)
|
||||||
|
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"new.html",
|
"new.html",
|
||||||
reply=reply_id,
|
reply=reply_id,
|
||||||
content=content,
|
content=content,
|
||||||
|
@ -255,6 +267,7 @@ def admin_new() -> _Response:
|
||||||
emojis=config.EMOJIS.split(" "),
|
emojis=config.EMOJIS.split(" "),
|
||||||
custom_emojis=EMOJIS_BY_NAME,
|
custom_emojis=EMOJIS_BY_NAME,
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@blueprint.route("/admin/lists", methods=["GET"])
|
@blueprint.route("/admin/lists", methods=["GET"])
|
||||||
|
@ -262,7 +275,7 @@ def admin_new() -> _Response:
|
||||||
def admin_lists() -> _Response:
|
def admin_lists() -> _Response:
|
||||||
lists = list(DB.lists.find())
|
lists = list(DB.lists.find())
|
||||||
|
|
||||||
return render_template("lists.html", lists=lists)
|
return htmlify(render_template("lists.html", lists=lists))
|
||||||
|
|
||||||
|
|
||||||
@blueprint.route("/admin/notifications")
|
@blueprint.route("/admin/notifications")
|
||||||
|
@ -341,13 +354,15 @@ def admin_notifications() -> _Response:
|
||||||
inbox_data, reverse=True, key=lambda doc: doc["_id"].generation_time
|
inbox_data, reverse=True, key=lambda doc: doc["_id"].generation_time
|
||||||
)
|
)
|
||||||
|
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"stream.html",
|
"stream.html",
|
||||||
inbox_data=inbox_data,
|
inbox_data=inbox_data,
|
||||||
older_than=older_than,
|
older_than=older_than,
|
||||||
newer_than=newer_than,
|
newer_than=newer_than,
|
||||||
nid=nid,
|
nid=nid,
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@blueprint.route("/admin/stream")
|
@blueprint.route("/admin/stream")
|
||||||
|
@ -365,9 +380,11 @@ def admin_stream() -> _Response:
|
||||||
DB.activities, q, limit=int(request.args.get("limit", 25))
|
DB.activities, q, limit=int(request.args.get("limit", 25))
|
||||||
)
|
)
|
||||||
|
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
tpl, inbox_data=inbox_data, older_than=older_than, newer_than=newer_than
|
tpl, inbox_data=inbox_data, older_than=older_than, newer_than=newer_than
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@blueprint.route("/admin/list/<name>")
|
@blueprint.route("/admin/list/<name>")
|
||||||
|
@ -393,9 +410,11 @@ def admin_list(name: str) -> _Response:
|
||||||
DB.activities, q, limit=int(request.args.get("limit", 25))
|
DB.activities, q, limit=int(request.args.get("limit", 25))
|
||||||
)
|
)
|
||||||
|
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
tpl, inbox_data=inbox_data, older_than=older_than, newer_than=newer_than
|
tpl, inbox_data=inbox_data, older_than=older_than, newer_than=newer_than
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@blueprint.route("/admin/bookmarks")
|
@blueprint.route("/admin/bookmarks")
|
||||||
|
@ -413,9 +432,11 @@ def admin_bookmarks() -> _Response:
|
||||||
DB.activities, q, limit=int(request.args.get("limit", 25))
|
DB.activities, q, limit=int(request.args.get("limit", 25))
|
||||||
)
|
)
|
||||||
|
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
tpl, inbox_data=inbox_data, older_than=older_than, newer_than=newer_than
|
tpl, inbox_data=inbox_data, older_than=older_than, newer_than=newer_than
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@blueprint.route("/u2f/register", methods=["GET", "POST"])
|
@blueprint.route("/u2f/register", methods=["GET", "POST"])
|
||||||
|
@ -425,7 +446,7 @@ def u2f_register():
|
||||||
if request.method == "GET":
|
if request.method == "GET":
|
||||||
payload = u2f.begin_registration(ID)
|
payload = u2f.begin_registration(ID)
|
||||||
session["challenge"] = payload
|
session["challenge"] = payload
|
||||||
return render_template("u2f.html", payload=payload)
|
return htmlify(render_template("u2f.html", payload=payload))
|
||||||
else:
|
else:
|
||||||
resp = json.loads(request.form.get("resp"))
|
resp = json.loads(request.form.get("resp"))
|
||||||
device, device_cert = u2f.complete_registration(session["challenge"], resp)
|
device, device_cert = u2f.complete_registration(session["challenge"], resp)
|
||||||
|
@ -439,9 +460,11 @@ def u2f_register():
|
||||||
@login_required
|
@login_required
|
||||||
def authorize_follow():
|
def authorize_follow():
|
||||||
if request.method == "GET":
|
if request.method == "GET":
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"authorize_remote_follow.html", profile=request.args.get("profile")
|
"authorize_remote_follow.html", profile=request.args.get("profile")
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
actor = get_actor_url(request.form.get("profile"))
|
actor = get_actor_url(request.form.get("profile"))
|
||||||
if not actor:
|
if not actor:
|
||||||
|
|
|
@ -19,6 +19,7 @@ from itsdangerous import BadSignature
|
||||||
from config import DB
|
from config import DB
|
||||||
from config import JWT
|
from config import JWT
|
||||||
from core.shared import _get_ip
|
from core.shared import _get_ip
|
||||||
|
from core.shared import htmlify
|
||||||
from core.shared import login_required
|
from core.shared import login_required
|
||||||
|
|
||||||
blueprint = flask.Blueprint("indieauth", __name__)
|
blueprint = flask.Blueprint("indieauth", __name__)
|
||||||
|
@ -105,7 +106,8 @@ def indieauth_endpoint():
|
||||||
scope = request.args.get("scope", "").split()
|
scope = request.args.get("scope", "").split()
|
||||||
|
|
||||||
print("STATE", state)
|
print("STATE", state)
|
||||||
return render_template(
|
return htmlify(
|
||||||
|
render_template(
|
||||||
"indieauth_flow.html",
|
"indieauth_flow.html",
|
||||||
client=get_client_id_data(client_id),
|
client=get_client_id_data(client_id),
|
||||||
scopes=scope,
|
scopes=scope,
|
||||||
|
@ -115,6 +117,7 @@ def indieauth_endpoint():
|
||||||
client_id=client_id,
|
client_id=client_id,
|
||||||
me=me,
|
me=me,
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
# Auth verification via POST
|
# Auth verification via POST
|
||||||
code = request.form.get("code")
|
code = request.form.get("code")
|
||||||
|
|
|
@ -554,10 +554,14 @@ def task_process_reply() -> _Response:
|
||||||
|
|
||||||
root_reply = in_reply_to
|
root_reply = in_reply_to
|
||||||
|
|
||||||
|
# Fetch the activity reply
|
||||||
reply = ap.fetch_remote_activity(in_reply_to)
|
reply = ap.fetch_remote_activity(in_reply_to)
|
||||||
if reply.has_type(ap.ActivityType.CREATE):
|
if reply.has_type(ap.ActivityType.CREATE):
|
||||||
reply = reply.get_object()
|
reply = reply.get_object()
|
||||||
|
|
||||||
|
# Store some metadata for the UI
|
||||||
|
# FIXME(tsileo): be able to display: "In reply to @user@domain.tld"?
|
||||||
|
|
||||||
new_replies = [activity, reply]
|
new_replies = [activity, reply]
|
||||||
|
|
||||||
while 1:
|
while 1:
|
||||||
|
|
|
@ -8,7 +8,7 @@ from pathlib import Path
|
||||||
import yaml
|
import yaml
|
||||||
from itsdangerous import JSONWebSignatureSerializer
|
from itsdangerous import JSONWebSignatureSerializer
|
||||||
from little_boxes import strtobool
|
from little_boxes import strtobool
|
||||||
from little_boxes.activitypub import DEFAULT_CTX as AP_DEFAULT_CTX
|
from little_boxes.activitypub import CTX_AS as AP_DEFAULT_CTX
|
||||||
from pymongo import MongoClient
|
from pymongo import MongoClient
|
||||||
|
|
||||||
import sass
|
import sass
|
||||||
|
|
|
@ -263,6 +263,9 @@ def post_to_outbox(activity: ap.BaseActivity) -> str:
|
||||||
class MicroblogPubBackend(Backend):
|
class MicroblogPubBackend(Backend):
|
||||||
"""Implements a Little Boxes backend, backed by MongoDB."""
|
"""Implements a Little Boxes backend, backed by MongoDB."""
|
||||||
|
|
||||||
|
def ap_context(self) -> Any:
|
||||||
|
return DEFAULT_CTX
|
||||||
|
|
||||||
def base_url(self) -> str:
|
def base_url(self) -> str:
|
||||||
return BASE_URL
|
return BASE_URL
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,19 @@ def build_resp(resp):
|
||||||
return resp, headers
|
return resp, headers
|
||||||
|
|
||||||
|
|
||||||
def jsonify(**data):
|
def htmlify(data):
|
||||||
|
resp, headers = build_resp(data)
|
||||||
|
return Response(
|
||||||
|
response=resp,
|
||||||
|
headers={
|
||||||
|
**headers,
|
||||||
|
"Content-Type": "text/html; charset=utf-8",
|
||||||
|
"Cache-Control": "max-age=0, private, must-revalidate",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def activitypubify(**data):
|
||||||
if "@context" not in data:
|
if "@context" not in data:
|
||||||
data["@context"] = config.DEFAULT_CTX
|
data["@context"] = config.DEFAULT_CTX
|
||||||
resp, headers = build_resp(json.dumps(data))
|
resp, headers = build_resp(json.dumps(data))
|
||||||
|
@ -68,9 +80,7 @@ def jsonify(**data):
|
||||||
headers={
|
headers={
|
||||||
**headers,
|
**headers,
|
||||||
"Cache-Control": "max-age=0, private, must-revalidate",
|
"Cache-Control": "max-age=0, private, must-revalidate",
|
||||||
"Content-Type": "application/json"
|
"Content-Type": "application/activity+json",
|
||||||
if app.debug
|
|
||||||
else "application/activity+json",
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue