wm => AP: inline most objects as bare string ids, not composite objects

for interop
pull/489/head
Ryan Barrett 2023-04-19 16:21:21 -07:00
rodzic d9b1223392
commit 5aba64004f
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
3 zmienionych plików z 26 dodań i 47 usunięć

Wyświetl plik

@ -359,10 +359,11 @@ def postprocess_as2(activity, target=None, wrap=True):
# activity objects (for Like, Announce, etc): prefer id over url
obj = as1.get_object(activity)
id = obj.get('id')
if not id:
obj['id'] = util.get_first(obj, 'url') or target_id
elif target_id and id != target_id:
if target_id and type in as2.TYPES_WITH_OBJECT:
# inline most objects as bare string ids, not composite objects, for interop
activity['object'] = target_id
elif not id:
obj['id'] = util.get_first(obj, 'url') or target_id
elif g.user.is_homepage(id):
obj['id'] = g.user.actor_id()

Wyświetl plik

@ -124,9 +124,9 @@ REPOST_AS1_UNWRAPPED = {
REPOST_HCITE_HTML = """\
<html>
<body class="h-entry">
<a class="u-url" href="https://user.com/repost"></a>
<a class="u-url p-name" href="https://user.com/repost">reposted!</a>
<div class="u-repost-of h-cite">
<p>Reposted <a class="p-author h-card" href="https://mas.to/@foo">Mr. Foo</a>:</p>
<a class="p-author h-card" href="https://mas.to/@foo">Mr. Foo</a>:</p>
<a class="u-url" href="https://mas.to/toot/id">a post</a>
</div>
<a class="u-author h-card" href="https://user.com/">Ms. Baz</a>
@ -136,25 +136,6 @@ REPOST_HCITE_HTML = """\
"""
REPOST_HCITE = requests_response(REPOST_HTML, content_type=CONTENT_TYPE_HTML,
url='https://user.com/repost')
REPOST_HCITE_AS2 = {
'@context': 'https://www.w3.org/ns/activitystreams',
'type': 'Announce',
'id': 'http://localhost/r/https://user.com/repost',
'url': 'http://localhost/r/https://user.com/repost',
'object': {
'type': 'Note',
'id': 'https://mas.to/toot/id',
'url': 'https://mas.to/toot/id',
'attributedTo': [{
'type': 'Person',
'url': 'https://mas.to/@foo',
'name': 'Mr. Foo',
}],
'to': [as2.PUBLIC_AUDIENCE],
},
'to': [as2.PUBLIC_AUDIENCE],
'actor': 'http://localhost/user.com',
}
WEBMENTION_REL_LINK = requests_response(
'<html><head><link rel="webmention" href="/webmention"></html>')
@ -687,7 +668,7 @@ class WebmentionTest(testutil.TestCase):
self._test_announce(REPOST_HTML, REPOST_AS2, mock_get, mock_post)
def test_announce_repost_composite_hcite(self, mock_get, mock_post):
self._test_announce(REPOST_HCITE_HTML, REPOST_HCITE_AS2, mock_get, mock_post)
self._test_announce(REPOST_HCITE_HTML, REPOST_AS2, mock_get, mock_post)
def _test_announce(self, html, expected_as2, mock_get, mock_post):
self.make_followers()
@ -1184,7 +1165,8 @@ class WebmentionTest(testutil.TestCase):
'source': 'https://user.com/repost',
'target': 'https://fed.brid.gy/',
})
self.assertEqual(304, got.status_code)
self.assertEqual(200, got.status_code)
mock_post.assert_not_called()
def test_update_profile(self, mock_get, mock_post):
mock_get.side_effect = [ACTOR]

Wyświetl plik

@ -383,27 +383,7 @@ def _activitypub_targets(obj):
targets = common.remove_blocklisted(targets)
inboxes_to_targets = {}
if not targets or verb == 'share':
logger.info('Delivering to followers')
inboxes = set()
domain = g.user.key.id()
for follower in Follower.query().filter(
Follower.key > Key('Follower', domain + ' '),
Follower.key < Key('Follower', domain + CHAR_AFTER_SPACE)):
if follower.status != 'inactive' and follower.last_follow:
actor = follower.last_follow.get('actor')
if actor and isinstance(actor, dict):
inboxes.add(actor.get('endpoints', {}).get('sharedInbox') or
actor.get('publicInbox') or
actor.get('inbox'))
inboxes_to_targets = {inbox: None for inbox in inboxes}
if verb != 'share':
return inboxes_to_targets
if not targets:
error(f"Silo responses are not yet supported.", status=304)
target_obj = None
for target in targets:
# fetch target page as AS2 object
try:
@ -446,4 +426,20 @@ def _activitypub_targets(obj):
inbox_url = urllib.parse.urljoin(target, inbox_url)
inboxes_to_targets[inbox_url] = target_obj
if not targets or verb == 'share':
logger.info('Delivering to followers')
domain = g.user.key.id()
for follower in Follower.query().filter(
Follower.key > Key('Follower', domain + ' '),
Follower.key < Key('Follower', domain + CHAR_AFTER_SPACE)):
if follower.status != 'inactive' and follower.last_follow:
actor = follower.last_follow.get('actor')
if actor and isinstance(actor, dict):
inbox = (actor.get('endpoints', {}).get('sharedInbox') or
actor.get('publicInbox') or
actor.get('inbox'))
# HACK: use last target object from above for reposts, which
# has its resolved id
inboxes_to_targets[inbox] = (target_obj if verb == 'share' else None)
return inboxes_to_targets