Skip to content

Commit

Permalink
start to make User subclasses for each protocol
Browse files Browse the repository at this point in the history
  • Loading branch information
snarfed committed May 26, 2023
1 parent 60a3327 commit eaa4e53
Show file tree
Hide file tree
Showing 23 changed files with 465 additions and 424 deletions.
25 changes: 14 additions & 11 deletions activitypub.py
@@ -1,5 +1,4 @@
"""Handles requests for ActivityPub endpoints: actors, inbox, etc.
"""
"""ActivityPub protocol implementation."""
from base64 import b64encode
from hashlib import sha256
import itertools
Expand Down Expand Up @@ -29,6 +28,7 @@
)
from models import Follower, Object, Target, User
from protocol import Protocol
import webmention

logger = logging.getLogger(__name__)

Expand All @@ -43,11 +43,11 @@
def default_signature_user():
global _DEFAULT_SIGNATURE_USER
if _DEFAULT_SIGNATURE_USER is None:
_DEFAULT_SIGNATURE_USER = User.get_or_create('snarfed.org')
_DEFAULT_SIGNATURE_USER = webmention.Webmention.get_or_create('snarfed.org')
return _DEFAULT_SIGNATURE_USER


class ActivityPub(Protocol):
class ActivityPub(User, Protocol):
"""ActivityPub protocol class."""
LABEL = 'activitypub'

Expand Down Expand Up @@ -513,11 +513,12 @@ def actor(domain):
if tld in TLD_BLOCKLIST:
error('', status=404)

g.user = User.get_by_id(domain)
# TODO(#512): parameterize by protocol
g.user = webmention.Webmention.get_by_id(domain)
if not g.user:
return f'User {domain} not found', 404
return f'Web user {domain} not found', 404
elif not g.user.actor_as2:
return f'User {domain} not fully set up', 404
return f'Web user {domain} not fully set up', 404

# TODO: unify with common.actor()
actor = postprocess_as2(g.user.actor_as2)
Expand Down Expand Up @@ -565,9 +566,10 @@ def inbox(domain=None):

# load user
if domain:
g.user = User.get_by_id(domain)
# TODO(#512): parameterize by protocol
g.user = webmention.Webmention.get_by_id(domain)
if not g.user:
error(f'User {domain} not found', status=404)
error(f'Web user {domain} not found', status=404)

ActivityPub.verify_signature(activity)

Expand Down Expand Up @@ -603,8 +605,9 @@ def follower_collection(domain, collection):
https://www.w3.org/TR/activitypub/#collections
https://www.w3.org/TR/activitystreams-core/#paging
"""
if not User.get_by_id(domain):
return f'User {domain} not found', 404
# TODO(#512): parameterize by protocol
if not webmention.Webmention.get_by_id(domain):
return f'Web user {domain} not found', 404

# page
followers, new_before, new_after = Follower.fetch_page(domain, collection)
Expand Down
5 changes: 4 additions & 1 deletion app.py
Expand Up @@ -6,4 +6,7 @@
from flask_app import app

# import all modules to register their Flask handlers
import activitypub, convert, follow, pages, redirect, superfeedr, webfinger, webmention, xrpc_actor, xrpc_feed, xrpc_graph
import activitypub, convert, follow, pages, redirect, superfeedr, ui, webfinger, webmention, xrpc_actor, xrpc_feed, xrpc_graph

import models
models.reset_protocol_properties()
9 changes: 4 additions & 5 deletions convert.py
Expand Up @@ -17,8 +17,7 @@
from activitypub import ActivityPub
from common import CACHE_TIME
from flask_app import app, cache
from models import Object
from protocol import protocols
from models import Object, PROTOCOLS
from webmention import Webmention

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -52,15 +51,15 @@ def convert(src, dest, _):
error(f'Expected fully qualified URL; got {url}')

# load, and maybe fetch. if it's a post/update, redirect to inner object.
obj = protocols[src].load(url)
obj = PROTOCOLS[src].load(url)
if not obj.as1:
error(f'Stored object for {id} has no data', status=404)

type = as1.object_type(obj.as1)
if type in ('post', 'update', 'delete'):
obj_id = as1.get_object(obj.as1).get('id')
if obj_id:
# TODO: protocols[src].load() this instead?
# TODO: PROTOCOLS[src].load() this instead?
obj_obj = Object.get_by_id(obj_id)
if (obj_obj and obj_obj.as1 and
not obj_obj.as1.keys() <= set(['id', 'url', 'objectType'])):
Expand All @@ -72,7 +71,7 @@ def convert(src, dest, _):
return '', 410

# convert and serve
return protocols[dest].serve(obj)
return PROTOCOLS[dest].serve(obj)


@app.get('/render')
Expand Down
16 changes: 10 additions & 6 deletions follow.py
Expand Up @@ -20,6 +20,7 @@
from flask_app import app
import common
import models
from webmention import Webmention

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -80,9 +81,10 @@ def remote_follow():
logger.info(f'Got: {request.values}')

domain = request.values['domain']
g.user = models.User.get_by_id(domain)
# TODO(#512): parameterize by protocol
g.user = Webmention.get_by_id(domain)
if not g.user:
error(f'No Bridgy Fed user found for domain {domain}')
error(f'No web user found for domain {domain}')

addr = request.values['address']
webfinger = fetch_webfinger(addr)
Expand Down Expand Up @@ -133,9 +135,10 @@ def finish(self, auth_entity, state=None):
session['indieauthed-me'] = me

domain = util.domain_from_link(me)
g.user = models.User.get_by_id(domain)
# TODO(#512): parameterize by protocol
g.user = Webmention.get_by_id(domain)
if not g.user:
error(f'No user for domain {domain}')
error(f'No web user for domain {domain}')
domain = g.user.key.id()

addr = state
Expand Down Expand Up @@ -220,9 +223,10 @@ def finish(self, auth_entity, state=None):
session['indieauthed-me'] = me

domain = util.domain_from_link(me)
g.user = models.User.get_by_id(domain)
# TODO(#512): parameterize by protocol
g.user = Webmention.get_by_id(domain)
if not g.user:
error(f'No user for domain {domain}')
error(f'No web user for domain {domain}')
domain = g.user.key.id()

follower = models.Follower.get_by_id(state)
Expand Down

0 comments on commit eaa4e53

Please sign in to comment.