forked from AkkomaGang/akkoma
Merge pull request 'Allow for attachment to be a single object in user data' (#783) from single-attachment into develop
Reviewed-on: AkkomaGang/akkoma#783
This commit is contained in:
commit
5bdef8c724
6 changed files with 159 additions and 5 deletions
|
@ -1545,11 +1545,19 @@ defp normalize_also_known_as(aka) when is_list(aka), do: aka
|
||||||
defp normalize_also_known_as(aka) when is_binary(aka), do: [aka]
|
defp normalize_also_known_as(aka) when is_binary(aka), do: [aka]
|
||||||
defp normalize_also_known_as(nil), do: []
|
defp normalize_also_known_as(nil), do: []
|
||||||
|
|
||||||
|
defp normalize_attachment(%{} = attachment), do: [attachment]
|
||||||
|
defp normalize_attachment(attachment) when is_list(attachment), do: attachment
|
||||||
|
defp normalize_attachment(_), do: []
|
||||||
|
|
||||||
defp object_to_user_data(data, additional) do
|
defp object_to_user_data(data, additional) do
|
||||||
fields =
|
fields =
|
||||||
data
|
data
|
||||||
|> Map.get("attachment", [])
|
|> Map.get("attachment", [])
|
||||||
|> Enum.filter(fn %{"type" => t} -> t == "PropertyValue" end)
|
|> normalize_attachment()
|
||||||
|
|> Enum.filter(fn
|
||||||
|
%{"type" => t} -> t == "PropertyValue"
|
||||||
|
_ -> false
|
||||||
|
end)
|
||||||
|> Enum.map(fn fields -> Map.take(fields, ["name", "value"]) end)
|
|> Enum.map(fn fields -> Map.take(fields, ["name", "value"]) end)
|
||||||
|
|
||||||
emojis =
|
emojis =
|
||||||
|
|
51
test/fixtures/users_mock/nonsense_attachment_user.json
vendored
Normal file
51
test/fixtures/users_mock/nonsense_attachment_user.json
vendored
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
{
|
||||||
|
"@context": [
|
||||||
|
"https://www.w3.org/ns/activitystreams",
|
||||||
|
{
|
||||||
|
"blurhash": "toot:blurhash",
|
||||||
|
"Emoji": "toot:Emoji",
|
||||||
|
"focalPoint": {
|
||||||
|
"@container": "@list",
|
||||||
|
"@id": "toot:focalPoint"
|
||||||
|
},
|
||||||
|
"Hashtag": "as:Hashtag",
|
||||||
|
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
|
||||||
|
"sensitive": "as:sensitive",
|
||||||
|
"toot": "http://joinmastodon.org/ns#",
|
||||||
|
"votersCount": "toot:votersCount",
|
||||||
|
"featured": {
|
||||||
|
"@id": "toot:featured",
|
||||||
|
"@type": "@id"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"https://w3id.org/security/v1"
|
||||||
|
],
|
||||||
|
"id": "https://fedi.vision/@vote@fedi.vision/",
|
||||||
|
"type": "Person",
|
||||||
|
"toot:discoverable": true,
|
||||||
|
"inbox": "https://fedi.vision/@vote@fedi.vision/inbox/",
|
||||||
|
"publicKey": {
|
||||||
|
"id": "https://fedi.vision/@vote@fedi.vision/#main-key",
|
||||||
|
"owner": "https://fedi.vision/@vote@fedi.vision/",
|
||||||
|
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj2f+uQtdoBO9X/u2Qso4\nxHYdfy8zB24m9Gg982/ts88DAMLxZUzX0JsBWT7coL0Ipf4NSbVaqS6nKrr2P8Qs\nf97wMhowyuYxK22BMPcbpfZkFj3tVT/JkDx2iujBJJ5ZBO5KRlupjDTqV4rOAY7F\n58ad0jK9PsJNJMsJ/b8+0t3Q/K+RqCGVmtK+iPSigOYoiKoquyRzHLTfP+mpOlDa\n3f+uyAbFya7CpcgBx1zz0PALWA+oh/zhZK4yT6719Esa8SDcoJ0ws70zMxWekq1A\n3ia88/Io6SY2qFNBpzzXGO3JK8OFRFtmPV8ZfAh5Pv6y52iuTJ21kxjAG7ZTP/fY\nBQIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
},
|
||||||
|
"attachment": {
|
||||||
|
"haha": "you expected a proper object, but it was me, random nonsense"
|
||||||
|
},
|
||||||
|
"endpoints": {
|
||||||
|
"sharedInbox": "https://fedi.vision/inbox/"
|
||||||
|
},
|
||||||
|
"followers": "https://fedi.vision/@vote@fedi.vision/followers/",
|
||||||
|
"following": "https://fedi.vision/@vote@fedi.vision/following/",
|
||||||
|
"icon": {
|
||||||
|
"type": "Image",
|
||||||
|
"mediaType": "image/webp",
|
||||||
|
"url": "https://eu-central-1.linodeobjects.com:443/st4/profile_images/2024/5/9/RwqTbeYx16gauXPXvt-CaysOnGw.webp"
|
||||||
|
},
|
||||||
|
"name": "FediVision Vote Bot",
|
||||||
|
"outbox": "https://fedi.vision/@vote@fedi.vision/outbox/",
|
||||||
|
"preferredUsername": "vote",
|
||||||
|
"published": "2024-05-09T09:04:04Z",
|
||||||
|
"summary": "<p>New in 2024, this is the bot that will count your #Fedivision vote! Accept no substitutes!</p><p>Send this account a toot in the form<br> vote ABCD EFGH IJKL<br>substituting the (up to) three codes for the songs you want to win. Punctuation ignored, case insensitive, order is unimportant. Only your latest toot counts, so change your vote with a new toot.</p>",
|
||||||
|
"url": "https://fedi.vision/@vote/"
|
||||||
|
}
|
53
test/fixtures/users_mock/takahe_user.json
vendored
Normal file
53
test/fixtures/users_mock/takahe_user.json
vendored
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
{
|
||||||
|
"@context": [
|
||||||
|
"https://www.w3.org/ns/activitystreams",
|
||||||
|
{
|
||||||
|
"blurhash": "toot:blurhash",
|
||||||
|
"Emoji": "toot:Emoji",
|
||||||
|
"focalPoint": {
|
||||||
|
"@container": "@list",
|
||||||
|
"@id": "toot:focalPoint"
|
||||||
|
},
|
||||||
|
"Hashtag": "as:Hashtag",
|
||||||
|
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
|
||||||
|
"sensitive": "as:sensitive",
|
||||||
|
"toot": "http://joinmastodon.org/ns#",
|
||||||
|
"votersCount": "toot:votersCount",
|
||||||
|
"featured": {
|
||||||
|
"@id": "toot:featured",
|
||||||
|
"@type": "@id"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"https://w3id.org/security/v1"
|
||||||
|
],
|
||||||
|
"id": "https://fedi.vision/@vote@fedi.vision/",
|
||||||
|
"type": "Person",
|
||||||
|
"toot:discoverable": true,
|
||||||
|
"inbox": "https://fedi.vision/@vote@fedi.vision/inbox/",
|
||||||
|
"publicKey": {
|
||||||
|
"id": "https://fedi.vision/@vote@fedi.vision/#main-key",
|
||||||
|
"owner": "https://fedi.vision/@vote@fedi.vision/",
|
||||||
|
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj2f+uQtdoBO9X/u2Qso4\nxHYdfy8zB24m9Gg982/ts88DAMLxZUzX0JsBWT7coL0Ipf4NSbVaqS6nKrr2P8Qs\nf97wMhowyuYxK22BMPcbpfZkFj3tVT/JkDx2iujBJJ5ZBO5KRlupjDTqV4rOAY7F\n58ad0jK9PsJNJMsJ/b8+0t3Q/K+RqCGVmtK+iPSigOYoiKoquyRzHLTfP+mpOlDa\n3f+uyAbFya7CpcgBx1zz0PALWA+oh/zhZK4yT6719Esa8SDcoJ0ws70zMxWekq1A\n3ia88/Io6SY2qFNBpzzXGO3JK8OFRFtmPV8ZfAh5Pv6y52iuTJ21kxjAG7ZTP/fY\nBQIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
},
|
||||||
|
"attachment": {
|
||||||
|
"type": "PropertyValue",
|
||||||
|
"value": "<a href=\"https://fedivision.party/vote\" rel=\"nofollow\"><span class=\"invisible\">https://</span>fedivision.party/vote</a>",
|
||||||
|
"name": "More details"
|
||||||
|
},
|
||||||
|
"endpoints": {
|
||||||
|
"sharedInbox": "https://fedi.vision/inbox/"
|
||||||
|
},
|
||||||
|
"followers": "https://fedi.vision/@vote@fedi.vision/followers/",
|
||||||
|
"following": "https://fedi.vision/@vote@fedi.vision/following/",
|
||||||
|
"icon": {
|
||||||
|
"type": "Image",
|
||||||
|
"mediaType": "image/webp",
|
||||||
|
"url": "https://eu-central-1.linodeobjects.com:443/st4/profile_images/2024/5/9/RwqTbeYx16gauXPXvt-CaysOnGw.webp"
|
||||||
|
},
|
||||||
|
"name": "FediVision Vote Bot",
|
||||||
|
"outbox": "https://fedi.vision/@vote@fedi.vision/outbox/",
|
||||||
|
"preferredUsername": "vote",
|
||||||
|
"published": "2024-05-09T09:04:04Z",
|
||||||
|
"summary": "<p>New in 2024, this is the bot that will count your #Fedivision vote! Accept no substitutes!</p><p>Send this account a toot in the form<br> vote ABCD EFGH IJKL<br>substituting the (up to) three codes for the songs you want to win. Punctuation ignored, case insensitive, order is unimportant. Only your latest toot counts, so change your vote with a new toot.</p>",
|
||||||
|
"url": "https://fedi.vision/@vote/"
|
||||||
|
}
|
|
@ -50,13 +50,13 @@ test "with errors" do
|
||||||
defp assert_app(name, redirect, scopes) do
|
defp assert_app(name, redirect, scopes) do
|
||||||
app = Repo.get_by(Pleroma.Web.OAuth.App, client_name: name)
|
app = Repo.get_by(Pleroma.Web.OAuth.App, client_name: name)
|
||||||
|
|
||||||
assert_receive {:mix_shell, :info, [message]}, 1_000
|
assert_receive {:mix_shell, :info, [message]}, 5_000
|
||||||
assert message == "#{name} successfully created:"
|
assert message == "#{name} successfully created:"
|
||||||
|
|
||||||
assert_receive {:mix_shell, :info, [message]}, 1_000
|
assert_receive {:mix_shell, :info, [message]}, 5_000
|
||||||
assert message == "App client_id: #{app.client_id}"
|
assert message == "App client_id: #{app.client_id}"
|
||||||
|
|
||||||
assert_receive {:mix_shell, :info, [message]}, 1_000
|
assert_receive {:mix_shell, :info, [message]}, 5_000
|
||||||
assert message == "App client_secret: #{app.client_secret}"
|
assert message == "App client_secret: #{app.client_secret}"
|
||||||
|
|
||||||
assert app.scopes == scopes
|
assert app.scopes == scopes
|
||||||
|
|
|
@ -4,7 +4,7 @@ defmodule Pleroma.HTTP.BackoffTest do
|
||||||
alias Pleroma.HTTP.Backoff
|
alias Pleroma.HTTP.Backoff
|
||||||
|
|
||||||
defp within_tolerance?(ttl, expected) do
|
defp within_tolerance?(ttl, expected) do
|
||||||
ttl > expected - 10 and ttl < expected + 10
|
ttl > expected - 15 and ttl < expected + 15
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "get/3" do
|
describe "get/3" do
|
||||||
|
|
|
@ -233,6 +233,48 @@ test "works for bridgy actors" do
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "works for takahe actors" do
|
||||||
|
user_id = "https://fedi.vision/@vote@fedi.vision/"
|
||||||
|
|
||||||
|
Tesla.Mock.mock(fn
|
||||||
|
%{method: :get, url: ^user_id} ->
|
||||||
|
%Tesla.Env{
|
||||||
|
status: 200,
|
||||||
|
body: File.read!("test/fixtures/users_mock/takahe_user.json"),
|
||||||
|
headers: [{"content-type", "application/activity+json"}]
|
||||||
|
}
|
||||||
|
end)
|
||||||
|
|
||||||
|
{:ok, user} = ActivityPub.make_user_from_ap_id(user_id)
|
||||||
|
|
||||||
|
assert user.actor_type == "Person"
|
||||||
|
|
||||||
|
assert [
|
||||||
|
%{
|
||||||
|
"name" => "More details"
|
||||||
|
}
|
||||||
|
] = user.fields
|
||||||
|
end
|
||||||
|
|
||||||
|
test "works for actors with malformed attachment fields" do
|
||||||
|
user_id = "https://fedi.vision/@vote@fedi.vision/"
|
||||||
|
|
||||||
|
Tesla.Mock.mock(fn
|
||||||
|
%{method: :get, url: ^user_id} ->
|
||||||
|
%Tesla.Env{
|
||||||
|
status: 200,
|
||||||
|
body: File.read!("test/fixtures/users_mock/nonsense_attachment_user.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.fields
|
||||||
|
end
|
||||||
|
|
||||||
test "fetches user featured collection" do
|
test "fetches user featured collection" do
|
||||||
ap_id = "https://example.com/users/lain"
|
ap_id = "https://example.com/users/lain"
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue