kopia lustrzana https://github.com/snarfed/bridgy-fed
wm => AP: inline most objects as bare string ids, not composite objects
for interoppull/489/head
rodzic
d9b1223392
commit
5aba64004f
|
@ -359,10 +359,11 @@ def postprocess_as2(activity, target=None, wrap=True):
|
||||||
# activity objects (for Like, Announce, etc): prefer id over url
|
# activity objects (for Like, Announce, etc): prefer id over url
|
||||||
obj = as1.get_object(activity)
|
obj = as1.get_object(activity)
|
||||||
id = obj.get('id')
|
id = obj.get('id')
|
||||||
if not id:
|
if target_id and type in as2.TYPES_WITH_OBJECT:
|
||||||
obj['id'] = util.get_first(obj, 'url') or target_id
|
# inline most objects as bare string ids, not composite objects, for interop
|
||||||
elif target_id and id != target_id:
|
|
||||||
activity['object'] = target_id
|
activity['object'] = target_id
|
||||||
|
elif not id:
|
||||||
|
obj['id'] = util.get_first(obj, 'url') or target_id
|
||||||
elif g.user.is_homepage(id):
|
elif g.user.is_homepage(id):
|
||||||
obj['id'] = g.user.actor_id()
|
obj['id'] = g.user.actor_id()
|
||||||
|
|
||||||
|
|
|
@ -124,9 +124,9 @@ REPOST_AS1_UNWRAPPED = {
|
||||||
REPOST_HCITE_HTML = """\
|
REPOST_HCITE_HTML = """\
|
||||||
<html>
|
<html>
|
||||||
<body class="h-entry">
|
<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">
|
<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>
|
<a class="u-url" href="https://mas.to/toot/id">a post</a>
|
||||||
</div>
|
</div>
|
||||||
<a class="u-author h-card" href="https://user.com/">Ms. ☕ Baz</a>
|
<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,
|
REPOST_HCITE = requests_response(REPOST_HTML, content_type=CONTENT_TYPE_HTML,
|
||||||
url='https://user.com/repost')
|
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(
|
WEBMENTION_REL_LINK = requests_response(
|
||||||
'<html><head><link rel="webmention" href="/webmention"></html>')
|
'<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)
|
self._test_announce(REPOST_HTML, REPOST_AS2, mock_get, mock_post)
|
||||||
|
|
||||||
def test_announce_repost_composite_hcite(self, 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):
|
def _test_announce(self, html, expected_as2, mock_get, mock_post):
|
||||||
self.make_followers()
|
self.make_followers()
|
||||||
|
@ -1184,7 +1165,8 @@ class WebmentionTest(testutil.TestCase):
|
||||||
'source': 'https://user.com/repost',
|
'source': 'https://user.com/repost',
|
||||||
'target': 'https://fed.brid.gy/',
|
'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):
|
def test_update_profile(self, mock_get, mock_post):
|
||||||
mock_get.side_effect = [ACTOR]
|
mock_get.side_effect = [ACTOR]
|
||||||
|
|
|
@ -383,27 +383,7 @@ def _activitypub_targets(obj):
|
||||||
targets = common.remove_blocklisted(targets)
|
targets = common.remove_blocklisted(targets)
|
||||||
|
|
||||||
inboxes_to_targets = {}
|
inboxes_to_targets = {}
|
||||||
if not targets or verb == 'share':
|
target_obj = None
|
||||||
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)
|
|
||||||
|
|
||||||
for target in targets:
|
for target in targets:
|
||||||
# fetch target page as AS2 object
|
# fetch target page as AS2 object
|
||||||
try:
|
try:
|
||||||
|
@ -446,4 +426,20 @@ def _activitypub_targets(obj):
|
||||||
inbox_url = urllib.parse.urljoin(target, inbox_url)
|
inbox_url = urllib.parse.urljoin(target, inbox_url)
|
||||||
inboxes_to_targets[inbox_url] = target_obj
|
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
|
return inboxes_to_targets
|
||||||
|
|
Ładowanie…
Reference in New Issue