kopia lustrzana https://github.com/snarfed/bridgy-fed
inbound AP: handle Follow with composite object
rodzic
a52df2c269
commit
8cdc5ecc4c
|
@ -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()
|
||||
|
|
|
@ -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')
|
||||
|
||||
|
|
|
@ -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')
|
||||
|
|
Ładowanie…
Reference in New Issue