kopia lustrzana https://github.com/snarfed/bridgy-fed
56 wiersze
1.9 KiB
Python
56 wiersze
1.9 KiB
Python
# coding=utf-8
|
|
"""Renders mf2 proxy pages based on stored Object entities."""
|
|
import datetime
|
|
import logging
|
|
from urllib.parse import urlencode
|
|
|
|
from flask import redirect, request
|
|
from granary import as2, atom, microformats2
|
|
from oauth_dropins.webutil import flask_util
|
|
from oauth_dropins.webutil.flask_util import error
|
|
from oauth_dropins.webutil import util
|
|
from oauth_dropins.webutil.util import json_loads
|
|
|
|
from app import app, cache
|
|
import common
|
|
from models import Object
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@app.get('/render')
|
|
@flask_util.cached(cache, common.CACHE_TIME)
|
|
def render():
|
|
"""Fetches a stored Object and renders it as HTML."""
|
|
id = flask_util.get_required_param('id')
|
|
obj = Object.get_by_id(id)
|
|
if not obj:
|
|
error(f'No stored object for {id}', status=404)
|
|
elif not obj.as1:
|
|
error(f'Stored object for {id} has no AS1', status=404)
|
|
|
|
as1 = json_loads(obj.as1)
|
|
|
|
# TODO: uncomment once we're storing inner objects separately
|
|
# if (as1.get('objectType') == 'activity' and
|
|
# as1.get('verb') in ('post', 'update', 'delete')):
|
|
# # redirect to inner object
|
|
# obj_id = as1.get('object')
|
|
# if isinstance(obj_id, dict):
|
|
# obj_id = obj_id.get('id')
|
|
# if not obj_id:
|
|
# error(f'Stored {type} activity has no object id!', status=404)
|
|
# logger.info(f'{type} activity, redirecting to object id {obj_id}')
|
|
# return redirect('/render?' + urlencode({'id': obj_id}), code=301)
|
|
|
|
# add HTML meta redirect to source page. should trigger for end users in
|
|
# browsers but not for webmention receivers (hopefully).
|
|
html = microformats2.activities_to_html([as1])
|
|
utf8 = '<meta charset="utf-8">'
|
|
url = util.get_url(as1)
|
|
if url:
|
|
refresh = f'<meta http-equiv="refresh" content="0;url={url}">'
|
|
html = html.replace(utf8, utf8 + '\n' + refresh)
|
|
|
|
return html
|