AP follow/unfollow UI: handle followees with composite url objects

ie with namedprofile links

fixes https://console.cloud.google.com/errors/detail/CKmLytj-nPv9RQ;time=P30D?project=bridgy-federated
pull/629/head
Ryan Barrett 2023-08-26 07:49:27 -07:00
rodzic 2742904468
commit 9daa8f36eb
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
2 zmienionych plików z 56 dodań i 3 usunięć

Wyświetl plik

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

Wyświetl plik

@ -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': '<a href="https://bar/actor"></a>',
}],
}
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 <a href="https://bar/url">https://bar/actor</a>.'],
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 <a href="https://bar/url">bar/url</a>.'],
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('')