Add support for actor icon being a list (Bridgy)

This commit is contained in:
Haelwenn (lanodan) Monnier 2021-03-15 06:43:12 +01:00
parent 13aa98d689
commit b1d4b2b81e
No known key found for this signature in database
GPG Key ID: D5B7A8E43C997DEE
3 changed files with 119 additions and 16 deletions

View File

@ -1250,21 +1250,17 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
defp get_actor_url(_url), do: nil defp get_actor_url(_url), do: nil
defp normalize_image(%{"url" => url}) do
%{
"type" => "Image",
"url" => [%{"href" => url}]
}
end
defp normalize_image(urls) when is_list(urls), do: urls |> List.first() |> normalize_image()
defp normalize_image(_), do: nil
defp object_to_user_data(data) do defp object_to_user_data(data) do
avatar =
data["icon"]["url"] &&
%{
"type" => "Image",
"url" => [%{"href" => data["icon"]["url"]}]
}
banner =
data["image"]["url"] &&
%{
"type" => "Image",
"url" => [%{"href" => data["image"]["url"]}]
}
fields = fields =
data data
|> Map.get("attachment", []) |> Map.get("attachment", [])
@ -1308,13 +1304,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
ap_id: data["id"], ap_id: data["id"],
uri: get_actor_url(data["url"]), uri: get_actor_url(data["url"]),
ap_enabled: true, ap_enabled: true,
banner: banner, banner: normalize_image(data["image"]),
fields: fields, fields: fields,
emoji: emojis, emoji: emojis,
is_locked: is_locked, is_locked: is_locked,
is_discoverable: is_discoverable, is_discoverable: is_discoverable,
invisible: invisible, invisible: invisible,
avatar: avatar, avatar: normalize_image(data["icon"]),
name: data["name"], name: data["name"],
follower_address: data["followers"], follower_address: data["followers"],
following_address: data["following"], following_address: data["following"],

80
test/fixtures/bridgy/actor.json vendored Normal file
View File

@ -0,0 +1,80 @@
{
"id": "https://fed.brid.gy/jk.nipponalba.scot",
"url": "https://fed.brid.gy/r/https://jk.nipponalba.scot",
"urls": [
{
"value": "https://jk.nipponalba.scot"
},
{
"value": "https://social.nipponalba.scot/jk"
},
{
"value": "https://px.nipponalba.scot/jk"
}
],
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Person",
"name": "J K 🇯🇵🏴󠁧󠁢󠁳󠁣󠁴󠁿",
"image": [
{
"url": "https://jk.nipponalba.scot/images/profile.jpg",
"type": "Image",
"name": "profile picture"
}
],
"tag": [
{
"type": "Tag",
"name": "Craft Beer"
},
{
"type": "Tag",
"name": "Single Malt Whisky"
},
{
"type": "Tag",
"name": "Homebrewing"
},
{
"type": "Tag",
"name": "Scottish Politics"
},
{
"type": "Tag",
"name": "Scottish History"
},
{
"type": "Tag",
"name": "Japanese History"
},
{
"type": "Tag",
"name": "Tech"
},
{
"type": "Tag",
"name": "Veganism"
},
{
"type": "Tag",
"name": "Cooking"
}
],
"icon": [
{
"url": "https://jk.nipponalba.scot/images/profile.jpg",
"type": "Image",
"name": "profile picture"
}
],
"preferredUsername": "jk.nipponalba.scot",
"summary": "",
"publicKey": {
"id": "jk.nipponalba.scot",
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDdarxwzxnNbJ2hneWOYHkYJowk\npyigQtxlUd0VjgSQHwxU9kWqfbrHBVADyTtcqi/4dAzQd3UnCI1TPNnn4LPZY9PW\noiWd3Zl1/EfLFxO7LU9GS7fcSLQkyj5JNhSlN3I8QPudZbybrgRDVZYooDe1D+52\n5KLGqC2ajrIVOiDRTQIDAQAB\n-----END PUBLIC KEY-----"
},
"inbox": "https://fed.brid.gy/jk.nipponalba.scot/inbox",
"outbox": "https://fed.brid.gy/jk.nipponalba.scot/outbox",
"following": "https://fed.brid.gy/jk.nipponalba.scot/following",
"followers": "https://fed.brid.gy/jk.nipponalba.scot/followers"
}

View File

@ -208,6 +208,33 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
assert user.name == "Bernie2020 group" assert user.name == "Bernie2020 group"
assert user.actor_type == "Group" assert user.actor_type == "Group"
end end
test "works for bridgy actors" do
user_id = "https://fed.brid.gy/jk.nipponalba.scot"
Tesla.Mock.mock(fn
%{method: :get, url: ^user_id} ->
%Tesla.Env{
status: 200,
body: File.read!("test/fixtures/bridgy/actor.json"),
headers: [{"content-type", "application/activity+json"}]
}
end)
{:ok, user} = ActivityPub.make_user_from_ap_id(user_id)
assert user.actor_type == "Person"
assert user.avatar == %{
"type" => "Image",
"url" => [%{"href" => "https://jk.nipponalba.scot/images/profile.jpg"}]
}
assert user.banner == %{
"type" => "Image",
"url" => [%{"href" => "https://jk.nipponalba.scot/images/profile.jpg"}]
}
end
end end
test "it fetches the appropriate tag-restricted posts" do test "it fetches the appropriate tag-restricted posts" do