kopia lustrzana https://dev.funkwhale.audio/funkwhale/funkwhale
				
				
				
			Fix #619: Use attributedTo instead of actor in library ActivityPub payload
							rodzic
							
								
									f9a9899ef9
								
							
						
					
					
						commit
						993783190a
					
				| 
						 | 
					@ -556,6 +556,7 @@ def get_additional_fields(data):
 | 
				
			||||||
PAGINATED_COLLECTION_JSONLD_MAPPING = {
 | 
					PAGINATED_COLLECTION_JSONLD_MAPPING = {
 | 
				
			||||||
    "totalItems": jsonld.first_val(contexts.AS.totalItems),
 | 
					    "totalItems": jsonld.first_val(contexts.AS.totalItems),
 | 
				
			||||||
    "actor": jsonld.first_id(contexts.AS.actor),
 | 
					    "actor": jsonld.first_id(contexts.AS.actor),
 | 
				
			||||||
 | 
					    "attributedTo": jsonld.first_id(contexts.AS.attributedTo),
 | 
				
			||||||
    "first": jsonld.first_id(contexts.AS.first),
 | 
					    "first": jsonld.first_id(contexts.AS.first),
 | 
				
			||||||
    "last": jsonld.first_id(contexts.AS.last),
 | 
					    "last": jsonld.first_id(contexts.AS.last),
 | 
				
			||||||
    "partOf": jsonld.first_id(contexts.AS.partOf),
 | 
					    "partOf": jsonld.first_id(contexts.AS.partOf),
 | 
				
			||||||
| 
						 | 
					@ -565,7 +566,8 @@ PAGINATED_COLLECTION_JSONLD_MAPPING = {
 | 
				
			||||||
class PaginatedCollectionSerializer(jsonld.JsonLdSerializer):
 | 
					class PaginatedCollectionSerializer(jsonld.JsonLdSerializer):
 | 
				
			||||||
    type = serializers.ChoiceField(choices=[contexts.AS.Collection])
 | 
					    type = serializers.ChoiceField(choices=[contexts.AS.Collection])
 | 
				
			||||||
    totalItems = serializers.IntegerField(min_value=0)
 | 
					    totalItems = serializers.IntegerField(min_value=0)
 | 
				
			||||||
    actor = serializers.URLField(max_length=500)
 | 
					    actor = serializers.URLField(max_length=500, required=False)
 | 
				
			||||||
 | 
					    attributedTo = serializers.URLField(max_length=500, required=False)
 | 
				
			||||||
    id = serializers.URLField(max_length=500)
 | 
					    id = serializers.URLField(max_length=500)
 | 
				
			||||||
    first = serializers.URLField(max_length=500)
 | 
					    first = serializers.URLField(max_length=500)
 | 
				
			||||||
    last = serializers.URLField(max_length=500)
 | 
					    last = serializers.URLField(max_length=500)
 | 
				
			||||||
| 
						 | 
					@ -573,6 +575,18 @@ class PaginatedCollectionSerializer(jsonld.JsonLdSerializer):
 | 
				
			||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
        jsonld_mapping = PAGINATED_COLLECTION_JSONLD_MAPPING
 | 
					        jsonld_mapping = PAGINATED_COLLECTION_JSONLD_MAPPING
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def validate(self, validated_data):
 | 
				
			||||||
 | 
					        d = super().validate(validated_data)
 | 
				
			||||||
 | 
					        actor = d.get("actor")
 | 
				
			||||||
 | 
					        attributed_to = d.get("attributedTo")
 | 
				
			||||||
 | 
					        if not actor and not attributed_to:
 | 
				
			||||||
 | 
					            raise serializers.ValidationError(
 | 
				
			||||||
 | 
					                "You need to provide at least actor or attributedTo"
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        d["attributedTo"] = attributed_to or actor
 | 
				
			||||||
 | 
					        return d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def to_representation(self, conf):
 | 
					    def to_representation(self, conf):
 | 
				
			||||||
        paginator = Paginator(conf["items"], conf.get("page_size", 20))
 | 
					        paginator = Paginator(conf["items"], conf.get("page_size", 20))
 | 
				
			||||||
        first = funkwhale_utils.set_query_parameter(conf["id"], page=1)
 | 
					        first = funkwhale_utils.set_query_parameter(conf["id"], page=1)
 | 
				
			||||||
| 
						 | 
					@ -580,7 +594,9 @@ class PaginatedCollectionSerializer(jsonld.JsonLdSerializer):
 | 
				
			||||||
        last = funkwhale_utils.set_query_parameter(conf["id"], page=paginator.num_pages)
 | 
					        last = funkwhale_utils.set_query_parameter(conf["id"], page=paginator.num_pages)
 | 
				
			||||||
        d = {
 | 
					        d = {
 | 
				
			||||||
            "id": conf["id"],
 | 
					            "id": conf["id"],
 | 
				
			||||||
 | 
					            # XXX Stable release: remove the obsolete actor field
 | 
				
			||||||
            "actor": conf["actor"].fid,
 | 
					            "actor": conf["actor"].fid,
 | 
				
			||||||
 | 
					            "attributedTo": conf["actor"].fid,
 | 
				
			||||||
            "totalItems": paginator.count,
 | 
					            "totalItems": paginator.count,
 | 
				
			||||||
            "type": conf.get("type", "Collection"),
 | 
					            "type": conf.get("type", "Collection"),
 | 
				
			||||||
            "current": current,
 | 
					            "current": current,
 | 
				
			||||||
| 
						 | 
					@ -624,7 +640,9 @@ class LibrarySerializer(PaginatedCollectionSerializer):
 | 
				
			||||||
            "name": library.name,
 | 
					            "name": library.name,
 | 
				
			||||||
            "summary": library.description,
 | 
					            "summary": library.description,
 | 
				
			||||||
            "page_size": 100,
 | 
					            "page_size": 100,
 | 
				
			||||||
 | 
					            # XXX Stable release: remove the obsolete actor field
 | 
				
			||||||
            "actor": library.actor,
 | 
					            "actor": library.actor,
 | 
				
			||||||
 | 
					            "attributedTo": library.actor,
 | 
				
			||||||
            "items": library.uploads.for_federation(),
 | 
					            "items": library.uploads.for_federation(),
 | 
				
			||||||
            "type": "Library",
 | 
					            "type": "Library",
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -637,7 +655,7 @@ class LibrarySerializer(PaginatedCollectionSerializer):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def create(self, validated_data):
 | 
					    def create(self, validated_data):
 | 
				
			||||||
        actor = utils.retrieve_ap_object(
 | 
					        actor = utils.retrieve_ap_object(
 | 
				
			||||||
            validated_data["actor"],
 | 
					            validated_data["attributedTo"],
 | 
				
			||||||
            actor=self.context.get("fetch_actor"),
 | 
					            actor=self.context.get("fetch_actor"),
 | 
				
			||||||
            queryset=models.Actor,
 | 
					            queryset=models.Actor,
 | 
				
			||||||
            serializer_class=ActorSerializer,
 | 
					            serializer_class=ActorSerializer,
 | 
				
			||||||
| 
						 | 
					@ -661,7 +679,8 @@ class CollectionPageSerializer(jsonld.JsonLdSerializer):
 | 
				
			||||||
    type = serializers.ChoiceField(choices=[contexts.AS.CollectionPage])
 | 
					    type = serializers.ChoiceField(choices=[contexts.AS.CollectionPage])
 | 
				
			||||||
    totalItems = serializers.IntegerField(min_value=0)
 | 
					    totalItems = serializers.IntegerField(min_value=0)
 | 
				
			||||||
    items = serializers.ListField()
 | 
					    items = serializers.ListField()
 | 
				
			||||||
    actor = serializers.URLField(max_length=500)
 | 
					    actor = serializers.URLField(max_length=500, required=False)
 | 
				
			||||||
 | 
					    attributedTo = serializers.URLField(max_length=500, required=False)
 | 
				
			||||||
    id = serializers.URLField(max_length=500)
 | 
					    id = serializers.URLField(max_length=500)
 | 
				
			||||||
    first = serializers.URLField(max_length=500)
 | 
					    first = serializers.URLField(max_length=500)
 | 
				
			||||||
    last = serializers.URLField(max_length=500)
 | 
					    last = serializers.URLField(max_length=500)
 | 
				
			||||||
| 
						 | 
					@ -674,6 +693,7 @@ class CollectionPageSerializer(jsonld.JsonLdSerializer):
 | 
				
			||||||
            "totalItems": jsonld.first_val(contexts.AS.totalItems),
 | 
					            "totalItems": jsonld.first_val(contexts.AS.totalItems),
 | 
				
			||||||
            "items": jsonld.raw(contexts.AS.items),
 | 
					            "items": jsonld.raw(contexts.AS.items),
 | 
				
			||||||
            "actor": jsonld.first_id(contexts.AS.actor),
 | 
					            "actor": jsonld.first_id(contexts.AS.actor),
 | 
				
			||||||
 | 
					            "attributedTo": jsonld.first_id(contexts.AS.attributedTo),
 | 
				
			||||||
            "first": jsonld.first_id(contexts.AS.first),
 | 
					            "first": jsonld.first_id(contexts.AS.first),
 | 
				
			||||||
            "last": jsonld.first_id(contexts.AS.last),
 | 
					            "last": jsonld.first_id(contexts.AS.last),
 | 
				
			||||||
            "next": jsonld.first_id(contexts.AS.next),
 | 
					            "next": jsonld.first_id(contexts.AS.next),
 | 
				
			||||||
| 
						 | 
					@ -706,7 +726,9 @@ class CollectionPageSerializer(jsonld.JsonLdSerializer):
 | 
				
			||||||
        d = {
 | 
					        d = {
 | 
				
			||||||
            "id": id,
 | 
					            "id": id,
 | 
				
			||||||
            "partOf": conf["id"],
 | 
					            "partOf": conf["id"],
 | 
				
			||||||
 | 
					            # XXX Stable release: remove the obsolete actor field
 | 
				
			||||||
            "actor": conf["actor"].fid,
 | 
					            "actor": conf["actor"].fid,
 | 
				
			||||||
 | 
					            "attributedTo": conf["actor"].fid,
 | 
				
			||||||
            "totalItems": page.paginator.count,
 | 
					            "totalItems": page.paginator.count,
 | 
				
			||||||
            "type": "CollectionPage",
 | 
					            "type": "CollectionPage",
 | 
				
			||||||
            "first": first,
 | 
					            "first": first,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -334,6 +334,7 @@ def test_paginated_collection_serializer(factories):
 | 
				
			||||||
        "type": "Collection",
 | 
					        "type": "Collection",
 | 
				
			||||||
        "id": conf["id"],
 | 
					        "id": conf["id"],
 | 
				
			||||||
        "actor": actor.fid,
 | 
					        "actor": actor.fid,
 | 
				
			||||||
 | 
					        "attributedTo": actor.fid,
 | 
				
			||||||
        "totalItems": len(uploads),
 | 
					        "totalItems": len(uploads),
 | 
				
			||||||
        "current": conf["id"] + "?page=1",
 | 
					        "current": conf["id"] + "?page=1",
 | 
				
			||||||
        "last": conf["id"] + "?page=3",
 | 
					        "last": conf["id"] + "?page=3",
 | 
				
			||||||
| 
						 | 
					@ -352,6 +353,7 @@ def test_paginated_collection_serializer_validation():
 | 
				
			||||||
        "id": "https://test.federation/test",
 | 
					        "id": "https://test.federation/test",
 | 
				
			||||||
        "totalItems": 5,
 | 
					        "totalItems": 5,
 | 
				
			||||||
        "actor": "http://test.actor",
 | 
					        "actor": "http://test.actor",
 | 
				
			||||||
 | 
					        "attributedTo": "http://test.actor",
 | 
				
			||||||
        "first": "https://test.federation/test?page=1",
 | 
					        "first": "https://test.federation/test?page=1",
 | 
				
			||||||
        "last": "https://test.federation/test?page=1",
 | 
					        "last": "https://test.federation/test?page=1",
 | 
				
			||||||
        "items": [],
 | 
					        "items": [],
 | 
				
			||||||
| 
						 | 
					@ -362,7 +364,7 @@ def test_paginated_collection_serializer_validation():
 | 
				
			||||||
    assert serializer.is_valid(raise_exception=True) is True
 | 
					    assert serializer.is_valid(raise_exception=True) is True
 | 
				
			||||||
    assert serializer.validated_data["totalItems"] == 5
 | 
					    assert serializer.validated_data["totalItems"] == 5
 | 
				
			||||||
    assert serializer.validated_data["id"] == data["id"]
 | 
					    assert serializer.validated_data["id"] == data["id"]
 | 
				
			||||||
    assert serializer.validated_data["actor"] == data["actor"]
 | 
					    assert serializer.validated_data["attributedTo"] == data["actor"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_collection_page_serializer_validation():
 | 
					def test_collection_page_serializer_validation():
 | 
				
			||||||
| 
						 | 
					@ -373,6 +375,7 @@ def test_collection_page_serializer_validation():
 | 
				
			||||||
        "id": base + "?page=2",
 | 
					        "id": base + "?page=2",
 | 
				
			||||||
        "totalItems": 5,
 | 
					        "totalItems": 5,
 | 
				
			||||||
        "actor": "https://test.actor",
 | 
					        "actor": "https://test.actor",
 | 
				
			||||||
 | 
					        "attributedTo": "https://test.actor",
 | 
				
			||||||
        "items": [],
 | 
					        "items": [],
 | 
				
			||||||
        "first": "https://test.federation/test?page=1",
 | 
					        "first": "https://test.federation/test?page=1",
 | 
				
			||||||
        "last": "https://test.federation/test?page=3",
 | 
					        "last": "https://test.federation/test?page=3",
 | 
				
			||||||
| 
						 | 
					@ -386,7 +389,7 @@ def test_collection_page_serializer_validation():
 | 
				
			||||||
    assert serializer.is_valid(raise_exception=True) is True
 | 
					    assert serializer.is_valid(raise_exception=True) is True
 | 
				
			||||||
    assert serializer.validated_data["totalItems"] == 5
 | 
					    assert serializer.validated_data["totalItems"] == 5
 | 
				
			||||||
    assert serializer.validated_data["id"] == data["id"]
 | 
					    assert serializer.validated_data["id"] == data["id"]
 | 
				
			||||||
    assert serializer.validated_data["actor"] == data["actor"]
 | 
					    assert serializer.validated_data["attributedTo"] == data["actor"]
 | 
				
			||||||
    assert serializer.validated_data["items"] == []
 | 
					    assert serializer.validated_data["items"] == []
 | 
				
			||||||
    assert serializer.validated_data["prev"] == data["prev"]
 | 
					    assert serializer.validated_data["prev"] == data["prev"]
 | 
				
			||||||
    assert serializer.validated_data["next"] == data["next"]
 | 
					    assert serializer.validated_data["next"] == data["next"]
 | 
				
			||||||
| 
						 | 
					@ -398,7 +401,7 @@ def test_collection_page_serializer_can_validate_child():
 | 
				
			||||||
        "@context": jsonld.get_default_context(),
 | 
					        "@context": jsonld.get_default_context(),
 | 
				
			||||||
        "type": "CollectionPage",
 | 
					        "type": "CollectionPage",
 | 
				
			||||||
        "id": "https://test.page?page=2",
 | 
					        "id": "https://test.page?page=2",
 | 
				
			||||||
        "actor": "https://test.actor",
 | 
					        "attributedTo": "https://test.actor",
 | 
				
			||||||
        "first": "https://test.page?page=1",
 | 
					        "first": "https://test.page?page=1",
 | 
				
			||||||
        "last": "https://test.page?page=3",
 | 
					        "last": "https://test.page?page=3",
 | 
				
			||||||
        "partOf": "https://test.page",
 | 
					        "partOf": "https://test.page",
 | 
				
			||||||
| 
						 | 
					@ -430,6 +433,7 @@ def test_collection_page_serializer(factories):
 | 
				
			||||||
        "type": "CollectionPage",
 | 
					        "type": "CollectionPage",
 | 
				
			||||||
        "id": conf["id"] + "?page=2",
 | 
					        "id": conf["id"] + "?page=2",
 | 
				
			||||||
        "actor": actor.fid,
 | 
					        "actor": actor.fid,
 | 
				
			||||||
 | 
					        "attributedTo": actor.fid,
 | 
				
			||||||
        "totalItems": len(uploads),
 | 
					        "totalItems": len(uploads),
 | 
				
			||||||
        "partOf": conf["id"],
 | 
					        "partOf": conf["id"],
 | 
				
			||||||
        "prev": conf["id"] + "?page=1",
 | 
					        "prev": conf["id"] + "?page=1",
 | 
				
			||||||
| 
						 | 
					@ -464,6 +468,7 @@ def test_music_library_serializer_to_ap(factories):
 | 
				
			||||||
        "name": library.name,
 | 
					        "name": library.name,
 | 
				
			||||||
        "summary": library.description,
 | 
					        "summary": library.description,
 | 
				
			||||||
        "actor": library.actor.fid,
 | 
					        "actor": library.actor.fid,
 | 
				
			||||||
 | 
					        "attributedTo": library.actor.fid,
 | 
				
			||||||
        "totalItems": 0,
 | 
					        "totalItems": 0,
 | 
				
			||||||
        "current": library.fid + "?page=1",
 | 
					        "current": library.fid + "?page=1",
 | 
				
			||||||
        "last": library.fid + "?page=1",
 | 
					        "last": library.fid + "?page=1",
 | 
				
			||||||
| 
						 | 
					@ -487,7 +492,7 @@ def test_music_library_serializer_from_public(factories, mocker):
 | 
				
			||||||
        "type": "Library",
 | 
					        "type": "Library",
 | 
				
			||||||
        "id": "https://library.id",
 | 
					        "id": "https://library.id",
 | 
				
			||||||
        "followers": "https://library.id/followers",
 | 
					        "followers": "https://library.id/followers",
 | 
				
			||||||
        "actor": actor.fid,
 | 
					        "attributedTo": actor.fid,
 | 
				
			||||||
        "totalItems": 12,
 | 
					        "totalItems": 12,
 | 
				
			||||||
        "first": "https://library.id?page=1",
 | 
					        "first": "https://library.id?page=1",
 | 
				
			||||||
        "last": "https://library.id?page=2",
 | 
					        "last": "https://library.id?page=2",
 | 
				
			||||||
| 
						 | 
					@ -527,7 +532,7 @@ def test_music_library_serializer_from_private(factories, mocker):
 | 
				
			||||||
        "type": "Library",
 | 
					        "type": "Library",
 | 
				
			||||||
        "id": "https://library.id",
 | 
					        "id": "https://library.id",
 | 
				
			||||||
        "followers": "https://library.id/followers",
 | 
					        "followers": "https://library.id/followers",
 | 
				
			||||||
        "actor": actor.fid,
 | 
					        "attributedTo": actor.fid,
 | 
				
			||||||
        "totalItems": 12,
 | 
					        "totalItems": 12,
 | 
				
			||||||
        "first": "https://library.id?page=1",
 | 
					        "first": "https://library.id?page=1",
 | 
				
			||||||
        "last": "https://library.id?page=2",
 | 
					        "last": "https://library.id?page=2",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					Use attributedTo instead of actor in library ActivityPub payload (#619)
 | 
				
			||||||
| 
						 | 
					@ -585,7 +585,7 @@ Example
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "type": "Library",
 | 
					    "type": "Library",
 | 
				
			||||||
    "id": "https://awesome.music/federation/music/libraries/dc702491-f6ce-441b-9da0-cecbed08bcc6",
 | 
					    "id": "https://awesome.music/federation/music/libraries/dc702491-f6ce-441b-9da0-cecbed08bcc6",
 | 
				
			||||||
    "actor": "https://awesome.music/federation/actors/MyNameIsTroll",
 | 
					    "attributedTo": "https://awesome.music/federation/actors/Alice",
 | 
				
			||||||
    "name": "My awesome library",
 | 
					    "name": "My awesome library",
 | 
				
			||||||
    "followers": "https://awesome.music/federation/music/libraries/dc702491-f6ce-441b-9da0-cecbed08bcc6/followers",
 | 
					    "followers": "https://awesome.music/federation/music/libraries/dc702491-f6ce-441b-9da0-cecbed08bcc6/followers",
 | 
				
			||||||
    "summary": "This library is for restricted use only",
 | 
					    "summary": "This library is for restricted use only",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Ładowanie…
	
		Reference in New Issue