noop: protocol: label classmethod cls identifiers with from/to

pull/640/head
Ryan Barrett 2023-09-09 14:17:47 -07:00
rodzic bd7cfa20f6
commit 0d2e4fb66a
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
4 zmienionych plików z 27 dodań i 28 usunięć

Wyświetl plik

@ -161,13 +161,13 @@ class ActivityPub(User, Protocol):
return actor.get('publicInbox') or actor.get('inbox') return actor.get('publicInbox') or actor.get('inbox')
@classmethod @classmethod
def send(cls, obj, url, log_data=True): def send(to_cls, obj, url, log_data=True):
"""Delivers an activity to an inbox URL. """Delivers an activity to an inbox URL.
If `obj.recipient_obj` is set, it's interpreted as the receiving actor If `obj.recipient_obj` is set, it's interpreted as the receiving actor
who we're delivering to and its id is populated into `cc`. who we're delivering to and its id is populated into `cc`.
""" """
if cls.is_blocklisted(url): if to_cls.is_blocklisted(url):
logger.info(f'Skipping sending to {url}') logger.info(f'Skipping sending to {url}')
return False return False

Wyświetl plik

@ -133,7 +133,7 @@ class ATProto(User, Protocol):
return util.domain_or_parent_in(util.domain_from_link(url), DOMAIN_BLOCKLIST) return util.domain_or_parent_in(util.domain_from_link(url), DOMAIN_BLOCKLIST)
@classmethod @classmethod
def send(cls, obj, url, log_data=True): def send(to_cls, obj, url, log_data=True):
"""Creates a record if we own its repo. """Creates a record if we own its repo.
Creates the repo first if it doesn't exist. Creates the repo first if it doesn't exist.
@ -167,7 +167,7 @@ class ATProto(User, Protocol):
repo = None repo = None
if user.atproto_did: if user.atproto_did:
# existing DID and repo # existing DID and repo
did_doc = cls.load(user.atproto_did) did_doc = to_cls.load(user.atproto_did)
pds = did_doc.raw['services']['atproto_pds']['endpoint'] pds = did_doc.raw['services']['atproto_pds']['endpoint']
if pds.rstrip('/') != url.rstrip('/'): if pds.rstrip('/') != url.rstrip('/'):
logger.warning(f'{user_key} {user.atproto_did} PDS {pds} is not us') logger.warning(f'{user_key} {user.atproto_did} PDS {pds} is not us')

Wyświetl plik

@ -255,7 +255,7 @@ class Protocol:
return g.user.key return g.user.key
@classmethod @classmethod
def send(cls, obj, url, log_data=True): def send(to_cls, obj, url, log_data=True):
"""Sends an outgoing activity. """Sends an outgoing activity.
To be implemented by subclasses. To be implemented by subclasses.
@ -359,7 +359,7 @@ class Protocol:
DOMAIN_BLOCKLIST + DOMAINS) DOMAIN_BLOCKLIST + DOMAINS)
@classmethod @classmethod
def receive(cls, obj): def receive(from_cls, obj):
"""Handles an incoming activity. """Handles an incoming activity.
If obj's key is unset, obj.as1's id field is used. If both are unset, If obj's key is unset, obj.as1's id field is used. If both are unset,
@ -375,9 +375,9 @@ class Protocol:
:class:`werkzeug.HTTPException` if the request is invalid :class:`werkzeug.HTTPException` if the request is invalid
""" """
# check some invariants # check some invariants
assert cls != Protocol assert from_cls != Protocol
assert isinstance(obj, Object), obj assert isinstance(obj, Object), obj
logger.info(f'From {cls.__name__}: {obj.key} AS1: {json_dumps(obj.as1, indent=2)}') logger.info(f'From {from_cls.__name__}: {obj.key} AS1: {json_dumps(obj.as1, indent=2)}')
if not obj.as1: if not obj.as1:
error('No object data provided') error('No object data provided')
@ -403,7 +403,7 @@ class Protocol:
if (already_seen if (already_seen
or (obj.new is False and obj.changed is False) or (obj.new is False and obj.changed is False)
or (obj.new is None and obj.changed is None or (obj.new is None and obj.changed is None
and cls.load(id, remote=False))): and from_cls.load(id, remote=False))):
msg = f'Already handled this activity {id}' msg = f'Already handled this activity {id}'
logger.info(msg) logger.info(msg)
return msg, 204 return msg, 204
@ -417,13 +417,13 @@ class Protocol:
obj.changed = orig.changed obj.changed = orig.changed
# if this is a post, ie not an activity, wrap it in a create or update # if this is a post, ie not an activity, wrap it in a create or update
obj = cls._handle_bare_object(obj) obj = from_cls._handle_bare_object(obj)
if obj.type not in SUPPORTED_TYPES: if obj.type not in SUPPORTED_TYPES:
error(f'Sorry, {obj.type} activities are not supported yet.', status=501) error(f'Sorry, {obj.type} activities are not supported yet.', status=501)
# add owner(s) # add owner(s)
actor_key = cls.actor_key(obj, default_g_user=False) actor_key = from_cls.actor_key(obj, default_g_user=False)
if actor_key: if actor_key:
add(obj.users, actor_key) add(obj.users, actor_key)
@ -431,11 +431,11 @@ class Protocol:
if obj.as1.get('verb') in ('post', 'update', 'delete'): if obj.as1.get('verb') in ('post', 'update', 'delete'):
inner_actor = as1.get_owner(inner_obj_as1) inner_actor = as1.get_owner(inner_obj_as1)
if inner_actor: if inner_actor:
user_key = cls.key_for(inner_actor) user_key = from_cls.key_for(inner_actor)
if user_key: if user_key:
add(obj.users, user_key) add(obj.users, user_key)
obj.source_protocol = cls.LABEL obj.source_protocol = from_cls.LABEL
obj.put() obj.put()
# store inner object # store inner object
@ -443,7 +443,7 @@ class Protocol:
inner_obj = None inner_obj = None
if obj.type in ('post', 'update') and inner_obj_as1.keys() > set(['id']): if obj.type in ('post', 'update') and inner_obj_as1.keys() > set(['id']):
Object.get_or_create(inner_obj_id, our_as1=inner_obj_as1, Object.get_or_create(inner_obj_id, our_as1=inner_obj_as1,
source_protocol=cls.LABEL) source_protocol=from_cls.LABEL)
actor = as1.get_object(obj.as1, 'actor') actor = as1.get_object(obj.as1, 'actor')
actor_id = actor.get('id') actor_id = actor.get('id')
@ -461,7 +461,7 @@ class Protocol:
# deactivate Follower # deactivate Follower
# TODO: avoid import? # TODO: avoid import?
from web import Web from web import Web
from_ = cls.key_for(actor_id) from_ = from_cls.key_for(actor_id)
to_cls = Protocol.for_id(inner_obj_id) or Web to_cls = Protocol.for_id(inner_obj_id) or Web
to = to_cls.key_for(inner_obj_id) to = to_cls.key_for(inner_obj_id)
follower = Follower.query(Follower.to == to, follower = Follower.query(Follower.to == to,
@ -493,7 +493,7 @@ class Protocol:
# if this is an actor, deactivate its followers/followings # if this is an actor, deactivate its followers/followings
# https://github.com/snarfed/bridgy-fed/issues/63 # https://github.com/snarfed/bridgy-fed/issues/63
deleted_user = cls.key_for(id=inner_obj_id) deleted_user = from_cls.key_for(id=inner_obj_id)
if deleted_user: if deleted_user:
logger.info(f'Deactivating Followers from or to = {inner_obj_id}') logger.info(f'Deactivating Followers from or to = {inner_obj_id}')
followers = Follower.query(OR(Follower.to == deleted_user, followers = Follower.query(OR(Follower.to == deleted_user,
@ -508,15 +508,15 @@ class Protocol:
# fetch actor if necessary so we have name, profile photo, etc # fetch actor if necessary so we have name, profile photo, etc
if actor and actor.keys() == set(['id']): if actor and actor.keys() == set(['id']):
logger.info('Fetching actor so we have name, profile photo, etc') logger.info('Fetching actor so we have name, profile photo, etc')
actor_obj = cls.load(actor['id']) actor_obj = from_cls.load(actor['id'])
if actor_obj and actor_obj.as1: if actor_obj and actor_obj.as1:
obj.our_as1 = {**obj.as1, 'actor': actor_obj.as1} obj.our_as1 = {**obj.as1, 'actor': actor_obj.as1}
# fetch object if necessary so we can render it in feeds # fetch object if necessary so we can render it in feeds
if obj.type == 'share' and inner_obj_as1.keys() == set(['id']): if obj.type == 'share' and inner_obj_as1.keys() == set(['id']):
if not inner_obj and cls.owns_id(inner_obj_id): if not inner_obj and from_cls.owns_id(inner_obj_id):
logger.info('Fetching object so we can render it in feeds') logger.info('Fetching object so we can render it in feeds')
inner_obj = cls.load(inner_obj_id) inner_obj = from_cls.load(inner_obj_id)
if inner_obj and inner_obj.as1: if inner_obj and inner_obj.as1:
obj.our_as1 = { obj.our_as1 = {
**obj.as1, **obj.as1,
@ -527,13 +527,13 @@ class Protocol:
} }
if obj.type == 'follow': if obj.type == 'follow':
cls._handle_follow(obj) from_cls._handle_follow(obj)
# deliver to targets # deliver to targets
return cls._deliver(obj) return from_cls._deliver(obj)
@classmethod @classmethod
def _handle_follow(cls, obj): def _handle_follow(from_cls, obj):
"""Handles an incoming follow activity. """Handles an incoming follow activity.
Args: Args:
@ -547,7 +547,6 @@ class Protocol:
if not from_id: if not from_id:
error(f'Follow activity requires actor. Got: {obj.as1}') error(f'Follow activity requires actor. Got: {obj.as1}')
from_cls = cls
from_obj = from_cls.load(from_id) from_obj = from_cls.load(from_id)
if not from_obj: if not from_obj:
error(f"Couldn't load {from_id}") error(f"Couldn't load {from_id}")
@ -617,7 +616,7 @@ class Protocol:
'actor': to_id, 'actor': to_id,
'object': obj.as1, 'object': obj.as1,
}) })
sent = cls.send(accept, from_target) sent = from_cls.send(accept, from_target)
if sent: if sent:
accept.populate( accept.populate(
delivered=[Target(protocol=from_cls.LABEL, uri=from_target)], delivered=[Target(protocol=from_cls.LABEL, uri=from_target)],
@ -691,7 +690,7 @@ class Protocol:
error(f'{obj.key.id()} is unchanged, nothing to do', status=204) error(f'{obj.key.id()} is unchanged, nothing to do', status=204)
@classmethod @classmethod
def _deliver(cls, obj): def _deliver(from_cls, obj):
"""Delivers an activity to its external recipients. """Delivers an activity to its external recipients.
Args: Args:
@ -699,7 +698,7 @@ class Protocol:
""" """
# find delivery targets # find delivery targets
# sort targets so order is deterministic for tests, debugging, etc # sort targets so order is deterministic for tests, debugging, etc
targets = cls._targets(obj) # maps Target to Object or None targets = from_cls._targets(obj) # maps Target to Object or None
if not targets: if not targets:
obj.status = 'ignored' obj.status = 'ignored'

4
web.py
Wyświetl plik

@ -270,7 +270,7 @@ class Web(User, Protocol):
return obj.key.id() return obj.key.id()
@classmethod @classmethod
def send(cls, obj, url, **kwargs): def send(to_cls, obj, url, **kwargs):
"""Sends a webmention to a given target URL. """Sends a webmention to a given target URL.
See :meth:`Protocol.send` for details. See :meth:`Protocol.send` for details.
@ -285,7 +285,7 @@ class Web(User, Protocol):
verb = obj.as1.get('verb') verb = obj.as1.get('verb')
if (verb in ('accept', 'undo') if (verb in ('accept', 'undo')
or url not in as1.targets(obj.as1) or url not in as1.targets(obj.as1)
or cls.is_blocklisted(url)): or to_cls.is_blocklisted(url)):
logger.info(f'Skipping sending to {url}') logger.info(f'Skipping sending to {url}')
return False return False