inbound AP: handle Follow with composite object

pull/356/head
Ryan Barrett 2023-01-08 17:28:12 -08:00
rodzic a52df2c269
commit 8cdc5ecc4c
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
3 zmienionych plików z 49 dodań i 7 usunięć

Wyświetl plik

@ -157,6 +157,8 @@ def accept_follow(follow, follow_unwrapped, user):
followee = follow.get('object')
followee_unwrapped = follow_unwrapped.get('object')
if isinstance(followee_unwrapped, dict):
followee_unwrapped = followee_unwrapped.get('id')
follower = follow.get('actor')
if not followee or not followee_unwrapped or not follower:
error('Follow activity requires object and actor. Got: %s' % follow)
@ -167,7 +169,6 @@ def accept_follow(follow, follow_unwrapped, user):
error('Follow actor requires id and inbox. Got: %s', follower)
# store Follower
# TODO: handle composite followee object
followee_domain = util.domain_from_link(followee_unwrapped, minimize=False)
# follow use_instead, if any
followee_domain = User.get_or_create(followee_domain).key.id()

Wyświetl plik

@ -166,7 +166,7 @@ class FollowCallback(indieauth.Callback):
direction='out', protocol='activitypub', status='complete',
source_as2=follow_json)
link = util.pretty_link(followee.get('url') or id, text=addr)
link = util.pretty_link(util.get_url(followee) or id, text=addr)
flash(f'Followed {link}.')
return redirect(f'/user/{domain}/following')

Wyświetl plik

@ -394,7 +394,50 @@ class ActivityPubTest(testutil.TestCase):
self.assertEqual('complete', activity.status)
self.assertEqual(LIKE_WITH_ACTOR, json_loads(activity.source_as2))
def test_inbox_follow_accept(self, mock_head, mock_get, mock_post):
def test_inbox_follow_accept_with_id(self, mock_head, mock_get, mock_post):
self._test_inbox_follow_accept(FOLLOW_WRAPPED, ACCEPT,
mock_head, mock_get, mock_post)
activity = Activity.query().get()
self.assertEqual(FOLLOW_WITH_ACTOR, json_loads(activity.source_as2))
follower = Follower.query().get()
self.assertEqual(FOLLOW_WRAPPED_WITH_ACTOR, json_loads(follower.last_follow))
def test_inbox_follow_accept_with_object(self, mock_head, mock_get, mock_post):
wrapped_user = {
'id': FOLLOW_WRAPPED['object'],
'url': FOLLOW_WRAPPED['object'],
}
unwrapped_user = {
'id': FOLLOW['object'],
'url': FOLLOW['object'],
}
follow = copy.deepcopy(FOLLOW_WRAPPED)
follow['object'] = wrapped_user
accept = copy.deepcopy(ACCEPT)
accept['actor'] = accept['object']['object'] = wrapped_user
self._test_inbox_follow_accept(follow, accept, mock_head, mock_get, mock_post)
activity = Activity.query().get()
follow.update({
'actor': FOLLOW_WITH_ACTOR['actor'],
'object': unwrapped_user,
})
self.assertEqual(follow, json_loads(activity.source_as2))
follower = Follower.query().get()
follow.update({
'actor': ACTOR,
'object': wrapped_user,
})
self.assertEqual(follow, json_loads(follower.last_follow))
def _test_inbox_follow_accept(self, follow_as2, accept_as2,
mock_head, mock_get, mock_post):
mock_head.return_value = requests_response(url='https://www.realize.be/')
mock_get.side_effect = [
# source actor
@ -405,7 +448,7 @@ class ActivityPubTest(testutil.TestCase):
]
mock_post.return_value = requests_response()
got = self.client.post('/foo.com/inbox', json=FOLLOW_WRAPPED)
got = self.client.post('/foo.com/inbox', json=follow_as2)
self.assertEqual(200, got.status_code)
mock_get.assert_has_calls((
@ -416,7 +459,7 @@ class ActivityPubTest(testutil.TestCase):
self.assertEqual(2, len(mock_post.call_args_list))
args, kwargs = mock_post.call_args_list[0]
self.assertEqual(('http://follower/inbox',), args)
self.assertEqual(ACCEPT, json_loads(kwargs['data']))
self.assertEqual(accept_as2, json_loads(kwargs['data']))
# check webmention
args, kwargs = mock_post.call_args_list[1]
@ -431,12 +474,10 @@ class ActivityPubTest(testutil.TestCase):
self.assertEqual('in', activity.direction)
self.assertEqual('activitypub', activity.protocol)
self.assertEqual('complete', activity.status)
self.assertEqual(FOLLOW_WITH_ACTOR, json_loads(activity.source_as2))
# check that we stored a Follower object
follower = Follower.get_by_id(f'www.realize.be {FOLLOW["actor"]}')
self.assertEqual('active', follower.status)
self.assertEqual(FOLLOW_WRAPPED_WITH_ACTOR, json_loads(follower.last_follow))
def test_inbox_follow_use_instead_strip_www(self, mock_head, mock_get, mock_post):
root = User.get_or_create('realize.be')