diff --git a/follow.py b/follow.py index d2df4db..4ef8855 100644 --- a/follow.py +++ b/follow.py @@ -147,8 +147,7 @@ class FollowCallback(indieauth.Callback): follow=follow_obj.key) follow_obj.put() - urls = as1.object_urls(followee.as1) - url = (urls[0] if urls else None) or followee_id + url = as1.get_url(followee.as1) or followee_id link = common.pretty_link(url, text=addr) flash(f'Followed {link}.') return redirect(g.user.user_page_path('following')) @@ -235,7 +234,7 @@ class UnfollowCallback(indieauth.Callback): follower.put() obj.put() - link = common.pretty_link(util.get_url(followee.obj.as1) or followee_id) + link = common.pretty_link(as1.get_url(followee.obj.as1) or followee_id) flash(f'Unfollowed {link}.') return redirect(g.user.user_page_path('following')) diff --git a/tests/test_follow.py b/tests/test_follow.py index 4b04afe..f108230 100644 --- a/tests/test_follow.py +++ b/tests/test_follow.py @@ -336,6 +336,37 @@ class FollowTest(TestCase): followers, ignore=['created', 'updated']) + def test_callback_url_composite_url(self, mock_get, mock_post): + followee = { + **FOLLOWEE, + 'attachments': [{ + 'type': 'PropertyValue', + 'name': 'Link', + 'value': '', + }], + } + mock_get.side_effect = ( + requests_response(''), + self.as2_resp(followee), + ) + mock_post.side_effect = ( + requests_response('me=https://alice.com'), + requests_response('OK'), # AP Follow to inbox + ) + + self.state['state'] = 'https://bar/actor' + state = util.encode_oauth_state(self.state) + resp = self.client.get(f'/follow/callback?code=my_code&state={state}') + + expected_follow = { + **FOLLOW_URL, + 'object': followee, + } + self.check('https://bar/actor', resp, expected_follow, mock_get, mock_post) + self.assertEqual( + [f'Followed https://bar/actor.'], + get_flashed_messages()) + def test_indieauthed_session(self, mock_get, mock_post): mock_get.side_effect = ( self.as2_resp(FOLLOWEE), @@ -512,6 +543,29 @@ class UnfollowTest(TestCase): source_protocol='ui', labels=['user', 'activity'], as2=expected_undo, as1=as2.to_as1(expected_undo)) + def test_callback_composite_url(self, mock_get, mock_post): + follower = self.follower.to.get().obj + follower.our_as1 = { + **as2.to_as1(FOLLOWEE), + 'url': { + 'value': 'https://bar/url', + 'displayName': 'something', + }, + } + follower.put() + + # oauth-dropins indieauth https://alice.com fetch for user json + mock_get.return_value = requests_response('') + mock_post.side_effect = ( + requests_response('me=https://alice.com'), + requests_response('OK'), # AP Undo Follow to inbox + ) + + resp = self.client.get(f'/unfollow/callback?code=my_code&state={self.state}') + self.assertEqual([f'Unfollowed bar/url.'], + get_flashed_messages()) + self.check(resp, UNDO_FOLLOW, mock_get, mock_post) + def test_indieauthed_session(self, mock_get, mock_post): # oauth-dropins indieauth https://alice.com fetch for user json mock_get.return_value = requests_response('')