fix outbound AP headers and signature for Mastodon 3.2.1

https://github.com/snarfed/bridgy-fed/issues/68#issuecomment-720059695
flask
Ryan Barrett 2020-10-31 15:24:56 -07:00
rodzic 8af4571648
commit 155be76bca
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
3 zmienionych plików z 16 dodań i 14 usunięć

Wyświetl plik

@ -60,6 +60,7 @@ def send(activity, inbox_url, user_domain):
headers=('Date', 'Digest', 'Host'))
# deliver to inbox
body = json_dumps(activity).encode()
headers = {
'Content-Type': common.CONTENT_TYPE_AS2,
# required for HTTP Signature
@ -67,10 +68,11 @@ def send(activity, inbox_url, user_domain):
'Date': datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT'),
# required by Mastodon
# https://github.com/tootsuite/mastodon/pull/14556#issuecomment-674077648
'Digest': 'SHA256=' + b64encode(sha256(json_dumps(activity).encode()).digest()).decode(),
'Digest': 'SHA-256=' + b64encode(sha256(body).digest()).decode(),
'Host': util.domain_from_link(inbox_url),
}
return common.requests_post(inbox_url, json=activity, auth=auth, headers=headers)
return common.requests_post(inbox_url, data=body, auth=auth,
headers=headers)
class ActorHandler(common.Handler):

Wyświetl plik

@ -352,7 +352,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, kwargs['json'])
self.assertEqual(ACCEPT, json_loads(kwargs['data']))
# check webmention
args, kwargs = mock_post.call_args_list[1]

Wyświetl plik

@ -381,7 +381,7 @@ class WebmentionTest(testutil.TestCase):
args, kwargs = mock_post.call_args
self.assertEqual(('https://foo.com/inbox',), args)
self.assertEqual(self.as2_create, kwargs['json'])
self.assertEqual(self.as2_create, json_loads(kwargs['data']))
headers = kwargs['headers']
self.assertEqual(CONTENT_TYPE_AS2, headers['Content-Type'])
@ -416,7 +416,7 @@ class WebmentionTest(testutil.TestCase):
args, kwargs = mock_post.call_args
self.assertEqual(('https://foo.com/inbox',), args)
self.assertEqual(self.as2_update, kwargs['json'])
self.assertEqual(self.as2_update, json_loads(kwargs['data']))
def test_activitypub_create_reply_attributed_to_id_only(self, mock_get, mock_post):
"""Based on PeerTube's AS2.
@ -451,7 +451,7 @@ class WebmentionTest(testutil.TestCase):
args, kwargs = mock_post.call_args
self.assertEqual(('https://foo.com/inbox',), args)
self.assertEqual(self.as2_create, kwargs['json'])
self.assertEqual(self.as2_create, json_loads(kwargs['data']))
def test_activitypub_update_reply(self, mock_get, mock_post):
Response(id='http://a/reply http://orig/as2', status='complete').put()
@ -468,7 +468,7 @@ class WebmentionTest(testutil.TestCase):
args, kwargs = mock_post.call_args
self.assertEqual(('https://foo.com/inbox',), args)
self.assertEqual(self.as2_update, kwargs['json'])
self.assertEqual(self.as2_update, json_loads(kwargs['data']))
def test_activitypub_create_repost(self, mock_get, mock_post):
mock_get.side_effect = [self.repost, self.orig_as2, self.actor]
@ -489,7 +489,7 @@ class WebmentionTest(testutil.TestCase):
args, kwargs = mock_post.call_args
self.assertEqual(('https://foo.com/inbox',), args)
self.assertEqual(self.repost_as2, kwargs['json'])
self.assertEqual(self.repost_as2, json_loads(kwargs['data']))
headers = kwargs['headers']
self.assertEqual(CONTENT_TYPE_AS2, headers['Content-Type'])
@ -525,7 +525,7 @@ class WebmentionTest(testutil.TestCase):
args, kwargs = mock_post.call_args
self.assertEqual(('https://foo.com/inbox',), args)
self.assertEqual(self.as2_create, kwargs['json'])
self.assertEqual(self.as2_create, json_loads(kwargs['data']))
def test_activitypub_create_default_url_to_wm_source(self, mock_get, mock_post):
"""Source post has no u-url. AS2 id should default to webmention source."""
@ -549,7 +549,7 @@ class WebmentionTest(testutil.TestCase):
args, kwargs = mock_post.call_args
self.assertEqual(('https://foo.com/inbox',), args)
self.assert_equals(self.repost_as2, kwargs['json'])
self.assert_equals(self.repost_as2, json_loads(kwargs['data']))
def test_activitypub_create_author_only_url(self, mock_get, mock_post):
"""Mf2 author property is just a URL. We should run full authorship.
@ -588,7 +588,7 @@ class WebmentionTest(testutil.TestCase):
repost_as2 = copy.deepcopy(self.repost_as2)
repost_as2['actor']['image'] = repost_as2['actor']['icon'] = \
{'type': 'Image', 'url': 'http://orig/pic'},
self.assert_equals(repost_as2, kwargs['json'])
self.assert_equals(repost_as2, json_loads(kwargs['data']))
def test_activitypub_create_post(self, mock_get, mock_post):
mock_get.side_effect = [self.create, self.actor]
@ -631,7 +631,7 @@ class WebmentionTest(testutil.TestCase):
self.assertEqual(len(inboxes), len(mock_post.call_args_list))
for call, inbox in zip(mock_post.call_args_list, inboxes):
self.assertEqual((inbox,), call[0])
self.assertEqual(self.create_as2, call[1]['json'])
self.assertEqual(self.create_as2, json_loads(call[1]['data']))
for inbox in inboxes:
resp = Response.get_by_id('http://orig/post %s' % inbox)
@ -666,7 +666,7 @@ class WebmentionTest(testutil.TestCase):
'image': [{'url': 'http://im/age', 'type': 'Image'}],
'attachment': [{'url': 'http://im/age', 'type': 'Image'}],
})
self.assertEqual(create, mock_post.call_args[1]['json'])
self.assertEqual(create, json_loads(mock_post.call_args[1]['data']))
def test_activitypub_follow(self, mock_get, mock_post):
mock_get.side_effect = [self.follow, self.actor]
@ -686,7 +686,7 @@ class WebmentionTest(testutil.TestCase):
args, kwargs = mock_post.call_args
self.assertEqual(('https://foo.com/inbox',), args)
self.assertEqual(self.follow_as2, kwargs['json'])
self.assertEqual(self.follow_as2, json_loads(kwargs['data']))
headers = kwargs['headers']
self.assertEqual(CONTENT_TYPE_AS2, headers['Content-Type'])