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('')