merging Protocol/Web receive: handle bare reply objects

for #529
pull/582/head
Ryan Barrett 2023-06-29 14:59:50 -07:00
rodzic 54881ea707
commit aeeea5590d
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
2 zmienionych plików z 65 dodań i 13 usunięć

Wyświetl plik

@ -314,7 +314,7 @@ class ProtocolReceiveTest(TestCase):
create_as1 = {
'id': 'fake:create',
'objectType': 'activity',
'verb': 'create',
'verb': 'post',
'actor': 'fake:user',
'object': post_as1,
}
@ -328,7 +328,7 @@ class ProtocolReceiveTest(TestCase):
status='complete',
our_as1=create_as1,
delivered=['shared:target'],
type='create',
type='post',
labels=['user', 'activity', 'feed'],
users=[g.user.key, self.alice.key, self.bob.key],
)
@ -453,7 +453,7 @@ class ProtocolReceiveTest(TestCase):
create_as1 = {
'id': 'fake:create',
'objectType': 'activity',
'verb': 'create',
'verb': 'post',
'actor': 'fake:user',
'object': reply_as1,
}
@ -467,13 +467,54 @@ class ProtocolReceiveTest(TestCase):
status='complete',
our_as1=create_as1,
delivered=['fake:post:target'],
type='create',
type='post',
labels=['user', 'activity', 'notification'],
users=[g.user.key, self.alice.key],
)
self.assertEqual([(obj, 'fake:post:target')], Fake.sent)
def test_create_reply_bare_object(self):
self.make_followers()
reply_as1 = {
'id': 'fake:reply',
'objectType': 'note',
'inReplyTo': 'fake:post',
'author': 'fake:alice',
}
Fake.fetchable['fake:post'] = {
'objectType': 'note',
'id': 'fake:post',
'author': 'fake:bob',
}
self.assertEqual('OK', Fake.receive('fake:reply', our_as1=reply_as1))
self.assert_object('fake:reply',
our_as1=reply_as1,
type='note',
users=[g.user.key],
)
create_as1 = {
'id': 'fake:reply#bridgy-fed-create',
'objectType': 'activity',
'verb': 'post',
'actor': 'http://bf/fake/fake:user/ap',
'object': reply_as1,
'published': '2022-01-02T03:04:05+00:00',
}
obj = self.assert_object('fake:reply#bridgy-fed-create',
status='complete',
our_as1=create_as1,
delivered=['fake:post:target'],
type='post',
labels=['user', 'activity', 'notification'],
users=[g.user.key, self.bob.key],
)
self.assertEqual([(obj, 'fake:post:target')], Fake.sent)
# def test_update_reply(self):
# self.make_followers()
@ -505,7 +546,7 @@ class ProtocolReceiveTest(TestCase):
'inReplyTo': 'fake:post',
}
create_as1 = {
'objectType': 'create',
'objectType': 'post',
'id': 'fake:create',
'object': reply_as1,
}
@ -513,7 +554,7 @@ class ProtocolReceiveTest(TestCase):
self.assert_object('fake:create',
our_as1=reply_as1,
type='create',
type='post',
users=[g.user.key],
# not feed since it's a reply
# not notification since it doesn't involve the user

25
web.py
Wyświetl plik

@ -692,9 +692,12 @@ def _targets(obj):
"""
logger.info('Finding recipients and their targets')
inner_obj_as1 = as1.get_object(obj.as1)
# if there's in-reply-to, like-of, or repost-of, they're the targets.
# otherwise, it's all followers. sort so order is deterministic for tests.
orig_ids = sorted(as1.get_ids(obj.as1, 'inReplyTo'))
orig_ids = sorted(as1.get_ids(obj.as1, 'inReplyTo') +
as1.get_ids(inner_obj_as1, 'inReplyTo'))
verb = obj.as1.get('verb')
if orig_ids:
logger.info(f'original object ids from inReplyTo: {orig_ids}')
@ -724,16 +727,24 @@ def _targets(obj):
# TODO: attach orig_obj's author/actor to obj.users
target = protocol.target_for(orig_obj)
if target:
targets[Target(protocol=protocol.LABEL, uri=target)] = orig_obj
logger.info(f'Target for {id} is {target}')
if not target:
# TODO: surface errors like this somehow?
logger.error(f"Can't find delivery target for {id}")
continue
# TODO: surface errors like this somehow?
logger.error(f"Can't find delivery target for {id}")
logger.info(f'Target for {id} is {target}')
targets[Target(protocol=protocol.LABEL, uri=target)] = orig_obj
orig_user = orig_obj.as1.get('author') or orig_obj.as1.get('actor')
if orig_user:
user_key = protocol.key_for(orig_user)
logger.info(f'Recipient is {user_key}')
if user_key not in obj.users:
obj.users.append(user_key)
if 'notification' not in obj.labels:
obj.labels.append('notification')
# deliver to followers?
inner_obj_as1 = as1.get_object(obj.as1)
is_reply = (obj.type == 'comment' or
(inner_obj_as1 and inner_obj_as1.get('inReplyTo')))
if obj.type == 'share' or (obj.type in ('post', 'update') and not is_reply):