kopia lustrzana https://gitlab.com/jaywink/federation
Support incoming retraction of ActivityPub shares
rodzic
27a77e1316
commit
a5fe105b6c
|
@ -21,7 +21,6 @@ MAPPINGS = {
|
||||||
"Note": ActivitypubPost,
|
"Note": ActivitypubPost,
|
||||||
"Page": ActivitypubPost,
|
"Page": ActivitypubPost,
|
||||||
"Person": ActivitypubProfile,
|
"Person": ActivitypubProfile,
|
||||||
"Undo": ActivitypubFollow, # Technically not correct, but for now we support only undoing a follow of a profile
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OBJECTS = (
|
OBJECTS = (
|
||||||
|
@ -31,15 +30,23 @@ OBJECTS = (
|
||||||
"Person",
|
"Person",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
UNDO_MAPPINGS = {
|
||||||
|
"Follow": ActivitypubFollow,
|
||||||
|
"Announce": ActivitypubRetraction,
|
||||||
|
}
|
||||||
|
|
||||||
def element_to_objects(payload: Dict) -> List:
|
def element_to_objects(payload: Dict) -> List:
|
||||||
"""
|
"""
|
||||||
Transform an Element to a list of entities.
|
Transform an Element to a list of entities.
|
||||||
"""
|
"""
|
||||||
|
cls = None
|
||||||
entities = []
|
entities = []
|
||||||
is_object = True if payload.get('type') in OBJECTS else False
|
is_object = True if payload.get('type') in OBJECTS else False
|
||||||
if payload.get('type') == "Delete":
|
if payload.get('type') == "Delete":
|
||||||
cls = ActivitypubRetraction
|
cls = ActivitypubRetraction
|
||||||
|
elif payload.get('type') == "Undo":
|
||||||
|
if isinstance(payload.get('object'), dict):
|
||||||
|
cls = UNDO_MAPPINGS.get(payload["object"]["type"])
|
||||||
elif isinstance(payload.get('object'), dict) and payload["object"].get('type'):
|
elif isinstance(payload.get('object'), dict) and payload["object"].get('type'):
|
||||||
if payload["object"]["type"] == "Note" and payload["object"].get("inReplyTo"):
|
if payload["object"]["type"] == "Note" and payload["object"].get("inReplyTo"):
|
||||||
cls = ActivitypubComment
|
cls = ActivitypubComment
|
||||||
|
@ -233,7 +240,7 @@ def transform_attribute(key: str, value: Union[str, Dict, int], transformed: Dic
|
||||||
transformed["target_id"] = value
|
transformed["target_id"] = value
|
||||||
elif key == "name":
|
elif key == "name":
|
||||||
transformed["name"] = value
|
transformed["name"] = value
|
||||||
elif key == "object":
|
elif key == "object" and not is_object:
|
||||||
if isinstance(value, dict):
|
if isinstance(value, dict):
|
||||||
if cls == ActivitypubAccept:
|
if cls == ActivitypubAccept:
|
||||||
transformed["target_id"] = value.get("id")
|
transformed["target_id"] = value.get("id")
|
||||||
|
|
|
@ -9,7 +9,7 @@ from federation.entities.activitypub.mappers import message_to_objects, get_outb
|
||||||
from federation.entities.base import Accept, Follow, Profile, Post, Comment
|
from federation.entities.base import Accept, Follow, Profile, Post, Comment
|
||||||
from federation.tests.fixtures.payloads import (
|
from federation.tests.fixtures.payloads import (
|
||||||
ACTIVITYPUB_FOLLOW, ACTIVITYPUB_PROFILE, ACTIVITYPUB_PROFILE_INVALID, ACTIVITYPUB_UNDO_FOLLOW, ACTIVITYPUB_POST,
|
ACTIVITYPUB_FOLLOW, ACTIVITYPUB_PROFILE, ACTIVITYPUB_PROFILE_INVALID, ACTIVITYPUB_UNDO_FOLLOW, ACTIVITYPUB_POST,
|
||||||
ACTIVITYPUB_COMMENT, ACTIVITYPUB_RETRACTION, ACTIVITYPUB_SHARE)
|
ACTIVITYPUB_COMMENT, ACTIVITYPUB_RETRACTION, ACTIVITYPUB_SHARE, ACTIVITYPUB_RETRACTION_SHARE)
|
||||||
from federation.types import UserType, ReceiverVariant
|
from federation.types import UserType, ReceiverVariant
|
||||||
|
|
||||||
|
|
||||||
|
@ -180,6 +180,15 @@ class TestActivitypubEntityMappersReceive:
|
||||||
assert entity.target_id == "https://friendica.feneas.org/objects/76158462-165d-3386-aa23-ba2090614385"
|
assert entity.target_id == "https://friendica.feneas.org/objects/76158462-165d-3386-aa23-ba2090614385"
|
||||||
assert entity.entity_type == "Object"
|
assert entity.entity_type == "Object"
|
||||||
|
|
||||||
|
def test_message_to_objects_retraction__share(self):
|
||||||
|
entities = message_to_objects(ACTIVITYPUB_RETRACTION_SHARE, "https://mastodon.social/users/jaywink")
|
||||||
|
assert len(entities) == 1
|
||||||
|
entity = entities[0]
|
||||||
|
assert isinstance(entity, ActivitypubRetraction)
|
||||||
|
assert entity.actor_id == "https://mastodon.social/users/jaywink"
|
||||||
|
assert entity.target_id == "https://mastodon.social/users/jaywink/statuses/102571932479036987/activity"
|
||||||
|
assert entity.entity_type == "Object"
|
||||||
|
|
||||||
@pytest.mark.skip
|
@pytest.mark.skip
|
||||||
def test_message_to_objects_reshare_extra_properties(self):
|
def test_message_to_objects_reshare_extra_properties(self):
|
||||||
entities = message_to_objects(DIASPORA_RESHARE_WITH_EXTRA_PROPERTIES, "alice@example.org")
|
entities = message_to_objects(DIASPORA_RESHARE_WITH_EXTRA_PROPERTIES, "alice@example.org")
|
||||||
|
|
|
@ -183,6 +183,25 @@ ACTIVITYPUB_RETRACTION = {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ACTIVITYPUB_RETRACTION_SHARE = {'@context': 'https://www.w3.org/ns/activitystreams',
|
||||||
|
'id': 'https://mastodon.social/users/jaywink#announces/102571932479036987/undo',
|
||||||
|
'type': 'Undo',
|
||||||
|
'actor': 'https://mastodon.social/users/jaywink',
|
||||||
|
'to': ['https://www.w3.org/ns/activitystreams#Public'],
|
||||||
|
'object': {'id': 'https://mastodon.social/users/jaywink/statuses/102571932479036987/activity',
|
||||||
|
'type': 'Announce',
|
||||||
|
'actor': 'https://mastodon.social/users/jaywink',
|
||||||
|
'published': '2019-08-06T20:31:21Z',
|
||||||
|
'to': ['https://www.w3.org/ns/activitystreams#Public'],
|
||||||
|
'cc': ['https://mastodon.art/users/asterii',
|
||||||
|
'https://mastodon.social/users/jaywink/followers'],
|
||||||
|
'object': 'https://mastodon.art/users/asterii/statuses/102571181579804095',
|
||||||
|
'atomUri': 'https://mastodon.social/users/jaywink/statuses/102571932479036987/activity'},
|
||||||
|
'signature': {'type': 'RsaSignature2017',
|
||||||
|
'creator': 'https://mastodon.social/users/jaywink#main-key',
|
||||||
|
'created': '2019-08-06T20:32:23Z',
|
||||||
|
'signatureValue': 'erI90OrrLqK1DiTqb4OO72XLcE7m74Fs4cH6s0plKKELHa7BZFQmtQYXKEgA9LwIUdSRrIurAUiaDWAw2sQZDg7opYo9x3z+GJDMZ3KxhBND7iHO8ZeGhV1ZBBKUMuBb3BfhOkd3ADp+RQ/fHcw6kOcViV2VsQduinAgQRpiutmGCLd/7eshqSF/aL4tFoAOyCskkm/5JDMNp2nnHNoXXJ+SZf7a8C6YPNDxWd7GzyQNeWkTBBdCJBPvS4HI0wQrTWemBvy6uP8k5QQ7FnqrrRrk/7zrcibFSInuYxiRTRV++rQ3irIbXNtoLhWQd36Iu5U22BclmkS1AAVBDUIj8w=='}}
|
||||||
|
|
||||||
ACTIVITYPUB_SHARE = {
|
ACTIVITYPUB_SHARE = {
|
||||||
'@context': 'https://www.w3.org/ns/activitystreams',
|
'@context': 'https://www.w3.org/ns/activitystreams',
|
||||||
'id': 'https://mastodon.social/users/jaywink/statuses/102560701449465612/activity',
|
'id': 'https://mastodon.social/users/jaywink/statuses/102560701449465612/activity',
|
||||||
|
|
Ładowanie…
Reference in New Issue