mirror of
https://git.pleroma.social/pleroma/pleroma.git
synced 2024-12-22 16:16:34 +00:00
Transmogrifier Test: Extract Announce handling.
This commit is contained in:
parent
15c7e3b4bf
commit
7d381b16b7
4 changed files with 308 additions and 171 deletions
|
@ -677,13 +677,14 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|
||||||
_options
|
_options
|
||||||
) do
|
) do
|
||||||
with actor <- Containment.get_actor(data),
|
with actor <- Containment.get_actor(data),
|
||||||
{:ok, %User{} = actor} <- User.get_or_fetch_by_ap_id(actor),
|
{_, {:ok, %User{} = actor}} <- {:fetch_user, User.get_or_fetch_by_ap_id(actor)},
|
||||||
{:ok, object} <- get_embedded_obj_helper(object_id, actor),
|
{_, {:ok, object}} <- {:get_embedded, get_embedded_obj_helper(object_id, actor)},
|
||||||
public <- Visibility.is_public?(data),
|
public <- Visibility.is_public?(data),
|
||||||
{:ok, activity, _object} <- ActivityPub.announce(actor, object, id, false, public) do
|
{_, {:ok, activity, _object}} <-
|
||||||
|
{:announce, ActivityPub.announce(actor, object, id, false, public)} do
|
||||||
{:ok, activity}
|
{:ok, activity}
|
||||||
else
|
else
|
||||||
_e -> :error
|
e -> {:error, e}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1 +1,88 @@
|
||||||
{"@context":["https://www.w3.org/ns/activitystreams","https://puckipedia.com/-/context"],"actor":{"endpoints":"https://puckipedia.com/#endpoints","followers":"https://puckipedia.com/followers","following":"https://puckipedia.com/following","icon":{"mediaType":"image/png","type":"Image","url":"https://puckipedia.com/images/avatar.png"},"id":"https://puckipedia.com/","inbox":"https://puckipedia.com/inbox","kroeg:blocks":{"id":"https://puckipedia.com/blocks"},"liked":"https://puckipedia.com/liked","manuallyApprovesFollowers":false,"name":"HACKER TEEN PUCKIPEDIA 👩💻","outbox":"https://puckipedia.com/outbox","preferredUsername":"puckipedia","publicKey":{"id":"https://puckipedia.com/#key","owner":"https://puckipedia.com/","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvN05xIcFE0Qgany7Rht4\n0ZI5wu++IT7K5iSqRimBYkpoeHbVcT9RFlW+aWH/QJJW/YgZ7+LMr8AMCrKrwSpS\nCndyrpx4O4lZ3FNRLu7tbklh01rGZfE6R1SFfYBpvMvImc9nYT6iezYDbv6NkHku\no3aVhjql216XlA0OhIrqQme9sAdrLbjbMrTUS8douCTkDOX+JFj1ghHCqdYEMZJI\nOY9kovtgnqyxFLm0RsPGsO1+g/OVojqG+VqHz6O2lceaTVQLlnZ4gOhLVG1tVsA2\nRfXQK+R/VgXncYE+BlQVd/tcdGAz7CDL7PP3rP65gmARnafhGR96cCOi/KzlAXSO\nMwIDAQAB\n-----END PUBLIC KEY-----","type":[]},"summary":"<p>federated hacker teen<br/>\n[<a href=\"https://pronoun.is/she\">she</a>/<a href=\"https://pronoun.is/they\">they</a>]</p>","type":"Person","updated":"2017-12-19T16:56:29.7576707+00:00"},"cc":"http://mastodon.example.org/users/admin","id":"https://puckipedia.com/cc56a9658e","object":{"as:sensitive":false,"attributedTo":{"endpoints":{"sharedInbox":"https://mastodon.social/inbox","type":[]},"followers":"http://mastodon.example.org/users/admin/followers","following":"http://mastodon.example.org/users/admin/following","icon":{"mediaType":"image/png","type":"Image","url":"https://files.mastodon.social/accounts/avatars/000/015/163/original/70ca6c52b01ca913.png"},"id":"http://mastodon.example.org/users/admin","inbox":"http://mastodon.example.org/users/admin/inbox","manuallyApprovesFollowers":{"@value":"False","type":"xsd:boolean"},"name":"","outbox":"http://mastodon.example.org/users/admin/outbox","preferredUsername":"revenant","publicKey":{"id":"http://mastodon.example.org/users/admin#main-key","owner":"http://mastodon.example.org/users/admin","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0gEN3wPW7gkE2gQqnmfB\n1ychjmFIf2LIwY0oCJLiGE/xpZrUKoq+eWH30AP7mATw4LD0gOYABL/ijqPUrPqR\nDXLL+0CqMP8HsZKvRlj9KArMK3YtNiSGGj2U7iReiRrD7nJzjJlsjjJXflLZhZ7/\nenSv1CcaeK8tB0PoAgShy/MyfhPF7WI5/Zm9DmmDQFvUEnDYKXAf/vG/IWw1EyMC\nkbaEYJeIowQU3GsbPxzRGI22bQtfotm431Ch2MbNo+kyzmYVFLAVoSGNMzvJwOPg\nTxLIIBeQXG7MinRyK887yPKhxhcALea4yCcALaa+3jPE7yqwIKYwTHtSlblsHDAo\nmQIDAQAB\n-----END PUBLIC KEY-----\n","type":[]},"summary":"<p>neatly partitioned meats and cheeses appeal to me on an aesthetic level | any pronouns | revenant1.net</p>","type":"Person","url":"https://mastodon.social/@revenant"},"cc":"http://mastodon.example.org/users/admin/followers","content":"<p>the name's jond (jeans bond)</p>","contentMap":{"en":"<p>the name's jond (jeans bond)</p>"},"conversation":"tag:mastodon.social,2018-09-25:objectId=55659382:objectType=Conversation","id":"http://mastodon.example.org/users/admin/statuses/100787282858396771","ostatus:atomUri":"http://mastodon.example.org/users/admin/statuses/100787282858396771","published":"2018-09-25T16:11:29Z","to":"https://www.w3.org/ns/activitystreams#Public","type":"Note","url":"https://mastodon.social/@revenant/100787282858396771"},"to":["https://www.w3.org/ns/activitystreams#Public","https://puckipedia.com/followers"],"type":"Announce"}
|
{
|
||||||
|
"@context" : [
|
||||||
|
"https://www.w3.org/ns/activitystreams",
|
||||||
|
"https://puckipedia.com/-/context"
|
||||||
|
],
|
||||||
|
"actor" : {
|
||||||
|
"endpoints" : "https://puckipedia.com/#endpoints",
|
||||||
|
"followers" : "https://puckipedia.com/followers",
|
||||||
|
"following" : "https://puckipedia.com/following",
|
||||||
|
"icon" : {
|
||||||
|
"mediaType" : "image/png",
|
||||||
|
"type" : "Image",
|
||||||
|
"url" : "https://puckipedia.com/images/avatar.png"
|
||||||
|
},
|
||||||
|
"id" : "https://puckipedia.com/",
|
||||||
|
"inbox" : "https://puckipedia.com/inbox",
|
||||||
|
"kroeg:blocks" : {
|
||||||
|
"id" : "https://puckipedia.com/blocks"
|
||||||
|
},
|
||||||
|
"liked" : "https://puckipedia.com/liked",
|
||||||
|
"manuallyApprovesFollowers" : false,
|
||||||
|
"name" : "HACKER TEEN PUCKIPEDIA ð©âð»",
|
||||||
|
"outbox" : "https://puckipedia.com/outbox",
|
||||||
|
"preferredUsername" : "puckipedia",
|
||||||
|
"publicKey" : {
|
||||||
|
"id" : "https://puckipedia.com/#key",
|
||||||
|
"owner" : "https://puckipedia.com/",
|
||||||
|
"publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvN05xIcFE0Qgany7Rht4\n0ZI5wu++IT7K5iSqRimBYkpoeHbVcT9RFlW+aWH/QJJW/YgZ7+LMr8AMCrKrwSpS\nCndyrpx4O4lZ3FNRLu7tbklh01rGZfE6R1SFfYBpvMvImc9nYT6iezYDbv6NkHku\no3aVhjql216XlA0OhIrqQme9sAdrLbjbMrTUS8douCTkDOX+JFj1ghHCqdYEMZJI\nOY9kovtgnqyxFLm0RsPGsO1+g/OVojqG+VqHz6O2lceaTVQLlnZ4gOhLVG1tVsA2\nRfXQK+R/VgXncYE+BlQVd/tcdGAz7CDL7PP3rP65gmARnafhGR96cCOi/KzlAXSO\nMwIDAQAB\n-----END PUBLIC KEY-----",
|
||||||
|
"type" : []
|
||||||
|
},
|
||||||
|
"summary" : "<p>federated hacker teen<br/>\n[<a href=\"https://pronoun.is/she\">she</a>/<a href=\"https://pronoun.is/they\">they</a>]</p>",
|
||||||
|
"type" : "Person",
|
||||||
|
"updated" : "2017-12-19T16:56:29.7576707+00:00"
|
||||||
|
},
|
||||||
|
"cc" : "http://mastodon.example.org/users/admin",
|
||||||
|
"id" : "https://puckipedia.com/cc56a9658e",
|
||||||
|
"object" : {
|
||||||
|
"as:sensitive" : false,
|
||||||
|
"attributedTo" : {
|
||||||
|
"endpoints" : {
|
||||||
|
"sharedInbox" : "https://mastodon.social/inbox",
|
||||||
|
"type" : []
|
||||||
|
},
|
||||||
|
"followers" : "http://mastodon.example.org/users/admin/followers",
|
||||||
|
"following" : "http://mastodon.example.org/users/admin/following",
|
||||||
|
"icon" : {
|
||||||
|
"mediaType" : "image/png",
|
||||||
|
"type" : "Image",
|
||||||
|
"url" : "https://files.mastodon.social/accounts/avatars/000/015/163/original/70ca6c52b01ca913.png"
|
||||||
|
},
|
||||||
|
"id" : "http://mastodon.example.org/users/admin",
|
||||||
|
"inbox" : "http://mastodon.example.org/users/admin/inbox",
|
||||||
|
"manuallyApprovesFollowers" : {
|
||||||
|
"@value" : "False",
|
||||||
|
"type" : "xsd:boolean"
|
||||||
|
},
|
||||||
|
"name" : "",
|
||||||
|
"outbox" : "http://mastodon.example.org/users/admin/outbox",
|
||||||
|
"preferredUsername" : "revenant",
|
||||||
|
"publicKey" : {
|
||||||
|
"id" : "http://mastodon.example.org/users/admin#main-key",
|
||||||
|
"owner" : "http://mastodon.example.org/users/admin",
|
||||||
|
"publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0gEN3wPW7gkE2gQqnmfB\n1ychjmFIf2LIwY0oCJLiGE/xpZrUKoq+eWH30AP7mATw4LD0gOYABL/ijqPUrPqR\nDXLL+0CqMP8HsZKvRlj9KArMK3YtNiSGGj2U7iReiRrD7nJzjJlsjjJXflLZhZ7/\nenSv1CcaeK8tB0PoAgShy/MyfhPF7WI5/Zm9DmmDQFvUEnDYKXAf/vG/IWw1EyMC\nkbaEYJeIowQU3GsbPxzRGI22bQtfotm431Ch2MbNo+kyzmYVFLAVoSGNMzvJwOPg\nTxLIIBeQXG7MinRyK887yPKhxhcALea4yCcALaa+3jPE7yqwIKYwTHtSlblsHDAo\nmQIDAQAB\n-----END PUBLIC KEY-----\n",
|
||||||
|
"type" : []
|
||||||
|
},
|
||||||
|
"summary" : "<p>neatly partitioned meats and cheeses appeal to me on an aesthetic level | any pronouns | revenant1.net</p>",
|
||||||
|
"type" : "Person",
|
||||||
|
"url" : "https://mastodon.social/@revenant"
|
||||||
|
},
|
||||||
|
"cc" : "http://mastodon.example.org/users/admin/followers",
|
||||||
|
"content" : "<p>the name's jond (jeans bond)</p>",
|
||||||
|
"contentMap" : {
|
||||||
|
"en" : "<p>the name's jond (jeans bond)</p>"
|
||||||
|
},
|
||||||
|
"conversation" : "tag:mastodon.social,2018-09-25:objectId=55659382:objectType=Conversation",
|
||||||
|
"id" : "http://mastodon.example.org/users/admin/statuses/100787282858396771",
|
||||||
|
"ostatus:atomUri" : "http://mastodon.example.org/users/admin/statuses/100787282858396771",
|
||||||
|
"published" : "2018-09-25T16:11:29Z",
|
||||||
|
"to" : "https://www.w3.org/ns/activitystreams#Public",
|
||||||
|
"type" : "Note",
|
||||||
|
"url" : "https://mastodon.social/@revenant/100787282858396771"
|
||||||
|
},
|
||||||
|
"to" : [
|
||||||
|
"https://www.w3.org/ns/activitystreams#Public",
|
||||||
|
"https://puckipedia.com/followers"
|
||||||
|
],
|
||||||
|
"type" : "Announce"
|
||||||
|
}
|
||||||
|
|
158
test/web/activity_pub/transmogrifier/announce_handling_test.exs
Normal file
158
test/web/activity_pub/transmogrifier/announce_handling_test.exs
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.ActivityPub.Transmogrifier.AnnounceHandlingTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
|
||||||
|
alias Pleroma.Activity
|
||||||
|
alias Pleroma.Object
|
||||||
|
alias Pleroma.Web.CommonAPI
|
||||||
|
alias Pleroma.Web.ActivityPub.Transmogrifier
|
||||||
|
|
||||||
|
import Pleroma.Factory
|
||||||
|
|
||||||
|
test "it works for incoming honk announces" do
|
||||||
|
_user = insert(:user, ap_id: "https://honktest/u/test", local: false)
|
||||||
|
other_user = insert(:user)
|
||||||
|
{:ok, post} = CommonAPI.post(other_user, %{status: "bonkeronk"})
|
||||||
|
|
||||||
|
announce = %{
|
||||||
|
"@context" => "https://www.w3.org/ns/activitystreams",
|
||||||
|
"actor" => "https://honktest/u/test",
|
||||||
|
"id" => "https://honktest/u/test/bonk/1793M7B9MQ48847vdx",
|
||||||
|
"object" => post.data["object"],
|
||||||
|
"published" => "2019-06-25T19:33:58Z",
|
||||||
|
"to" => "https://www.w3.org/ns/activitystreams#Public",
|
||||||
|
"type" => "Announce"
|
||||||
|
}
|
||||||
|
|
||||||
|
{:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(announce)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it works for incoming announces with actor being inlined (kroeg)" do
|
||||||
|
data = File.read!("test/fixtures/kroeg-announce-with-inline-actor.json") |> Poison.decode!()
|
||||||
|
|
||||||
|
_user = insert(:user, local: false, ap_id: data["actor"]["id"])
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, post} = CommonAPI.post(other_user, %{status: "kroegeroeg"})
|
||||||
|
|
||||||
|
data =
|
||||||
|
data
|
||||||
|
|> put_in(["object", "id"], post.data["object"])
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
|
||||||
|
assert data["actor"] == "https://puckipedia.com/"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it works for incoming announces, fetching the announced object" do
|
||||||
|
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
|
||||||
|
data = File.read!("test/fixtures/mastodon-announce.json") |> Poison.decode!()
|
||||||
|
|
||||||
|
_user = insert(:user, local: false, ap_id: data["actor"])
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
|
||||||
|
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
||||||
|
assert data["type"] == "Announce"
|
||||||
|
|
||||||
|
assert data["id"] ==
|
||||||
|
"http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
|
||||||
|
|
||||||
|
assert data["object"] ==
|
||||||
|
"http://mastodon.example.org/users/admin/statuses/99541947525187367"
|
||||||
|
|
||||||
|
assert(Activity.get_create_by_object_ap_id(data["object"]))
|
||||||
|
end
|
||||||
|
|
||||||
|
@tag capture_log: true
|
||||||
|
test "it works for incoming announces with an existing activity" do
|
||||||
|
user = insert(:user)
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{status: "hey"})
|
||||||
|
|
||||||
|
data =
|
||||||
|
File.read!("test/fixtures/mastodon-announce.json")
|
||||||
|
|> Poison.decode!()
|
||||||
|
|> Map.put("object", activity.data["object"])
|
||||||
|
|
||||||
|
_user = insert(:user, local: false, ap_id: data["actor"])
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
|
||||||
|
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
||||||
|
assert data["type"] == "Announce"
|
||||||
|
|
||||||
|
assert data["id"] ==
|
||||||
|
"http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
|
||||||
|
|
||||||
|
assert data["object"] == activity.data["object"]
|
||||||
|
|
||||||
|
assert Activity.get_create_by_object_ap_id(data["object"]).id == activity.id
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it works for incoming announces with an inlined activity" do
|
||||||
|
data =
|
||||||
|
File.read!("test/fixtures/mastodon-announce-private.json")
|
||||||
|
|> Poison.decode!()
|
||||||
|
|
||||||
|
_user =
|
||||||
|
insert(:user,
|
||||||
|
local: false,
|
||||||
|
ap_id: data["actor"],
|
||||||
|
follower_address: data["actor"] <> "/followers"
|
||||||
|
)
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
|
||||||
|
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
||||||
|
assert data["type"] == "Announce"
|
||||||
|
|
||||||
|
assert data["id"] ==
|
||||||
|
"http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
|
||||||
|
|
||||||
|
object = Object.normalize(data["object"])
|
||||||
|
|
||||||
|
assert object.data["id"] == "http://mastodon.example.org/@admin/99541947525187368"
|
||||||
|
assert object.data["content"] == "this is a private toot"
|
||||||
|
end
|
||||||
|
|
||||||
|
@tag capture_log: true
|
||||||
|
test "it rejects incoming announces with an inlined activity from another origin" do
|
||||||
|
Tesla.Mock.mock(fn
|
||||||
|
%{method: :get} -> %Tesla.Env{status: 404, body: ""}
|
||||||
|
end)
|
||||||
|
|
||||||
|
data =
|
||||||
|
File.read!("test/fixtures/bogus-mastodon-announce.json")
|
||||||
|
|> Poison.decode!()
|
||||||
|
|
||||||
|
_user = insert(:user, local: false, ap_id: data["actor"])
|
||||||
|
|
||||||
|
assert {:error, e} = Transmogrifier.handle_incoming(data)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it does not clobber the addressing on announce activities" do
|
||||||
|
user = insert(:user)
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{status: "hey"})
|
||||||
|
|
||||||
|
data =
|
||||||
|
File.read!("test/fixtures/mastodon-announce.json")
|
||||||
|
|> Poison.decode!()
|
||||||
|
|> Map.put("object", Object.normalize(activity).data["id"])
|
||||||
|
|> Map.put("to", ["http://mastodon.example.org/users/admin/followers"])
|
||||||
|
|> Map.put("cc", [])
|
||||||
|
|
||||||
|
_user =
|
||||||
|
insert(:user,
|
||||||
|
local: false,
|
||||||
|
ap_id: data["actor"],
|
||||||
|
follower_address: "http://mastodon.example.org/users/admin/followers"
|
||||||
|
)
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
|
||||||
|
assert data["to"] == ["http://mastodon.example.org/users/admin/followers"]
|
||||||
|
end
|
||||||
|
end
|
|
@ -28,6 +28,63 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
|
||||||
setup do: clear_config([:instance, :max_remote_account_fields])
|
setup do: clear_config([:instance, :max_remote_account_fields])
|
||||||
|
|
||||||
describe "handle_incoming" do
|
describe "handle_incoming" do
|
||||||
|
test "it works for incoming notices with tag not being an array (kroeg)" do
|
||||||
|
data = File.read!("test/fixtures/kroeg-array-less-emoji.json") |> Poison.decode!()
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
object = Object.normalize(data["object"])
|
||||||
|
|
||||||
|
assert object.data["emoji"] == %{
|
||||||
|
"icon_e_smile" => "https://puckipedia.com/forum/images/smilies/icon_e_smile.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
data = File.read!("test/fixtures/kroeg-array-less-hashtag.json") |> Poison.decode!()
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
object = Object.normalize(data["object"])
|
||||||
|
|
||||||
|
assert "test" in object.data["tag"]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it works for incoming notices with url not being a string (prismo)" do
|
||||||
|
data = File.read!("test/fixtures/prismo-url-map.json") |> Poison.decode!()
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
object = Object.normalize(data["object"])
|
||||||
|
|
||||||
|
assert object.data["url"] == "https://prismo.news/posts/83"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it cleans up incoming notices which are not really DMs" do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
to = [user.ap_id, other_user.ap_id]
|
||||||
|
|
||||||
|
data =
|
||||||
|
File.read!("test/fixtures/mastodon-post-activity.json")
|
||||||
|
|> Poison.decode!()
|
||||||
|
|> Map.put("to", to)
|
||||||
|
|> Map.put("cc", [])
|
||||||
|
|
||||||
|
object =
|
||||||
|
data["object"]
|
||||||
|
|> Map.put("to", to)
|
||||||
|
|> Map.put("cc", [])
|
||||||
|
|
||||||
|
data = Map.put(data, "object", object)
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false} = activity} = Transmogrifier.handle_incoming(data)
|
||||||
|
|
||||||
|
assert data["to"] == []
|
||||||
|
assert data["cc"] == to
|
||||||
|
|
||||||
|
object_data = Object.normalize(activity).data
|
||||||
|
|
||||||
|
assert object_data["to"] == []
|
||||||
|
assert object_data["cc"] == to
|
||||||
|
end
|
||||||
|
|
||||||
test "it ignores an incoming notice if we already have it" do
|
test "it ignores an incoming notice if we already have it" do
|
||||||
activity = insert(:note_activity)
|
activity = insert(:note_activity)
|
||||||
|
|
||||||
|
@ -260,172 +317,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
|
||||||
"<p>henlo from my Psion netBook</p><p>message sent from my Psion netBook</p>"
|
"<p>henlo from my Psion netBook</p><p>message sent from my Psion netBook</p>"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it works for incoming honk announces" do
|
|
||||||
_user = insert(:user, ap_id: "https://honktest/u/test", local: false)
|
|
||||||
other_user = insert(:user)
|
|
||||||
{:ok, post} = CommonAPI.post(other_user, %{status: "bonkeronk"})
|
|
||||||
|
|
||||||
announce = %{
|
|
||||||
"@context" => "https://www.w3.org/ns/activitystreams",
|
|
||||||
"actor" => "https://honktest/u/test",
|
|
||||||
"id" => "https://honktest/u/test/bonk/1793M7B9MQ48847vdx",
|
|
||||||
"object" => post.data["object"],
|
|
||||||
"published" => "2019-06-25T19:33:58Z",
|
|
||||||
"to" => "https://www.w3.org/ns/activitystreams#Public",
|
|
||||||
"type" => "Announce"
|
|
||||||
}
|
|
||||||
|
|
||||||
{:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(announce)
|
|
||||||
end
|
|
||||||
|
|
||||||
test "it works for incoming announces with actor being inlined (kroeg)" do
|
|
||||||
data = File.read!("test/fixtures/kroeg-announce-with-inline-actor.json") |> Poison.decode!()
|
|
||||||
|
|
||||||
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
|
||||||
|
|
||||||
assert data["actor"] == "https://puckipedia.com/"
|
|
||||||
end
|
|
||||||
|
|
||||||
test "it works for incoming notices with tag not being an array (kroeg)" do
|
|
||||||
data = File.read!("test/fixtures/kroeg-array-less-emoji.json") |> Poison.decode!()
|
|
||||||
|
|
||||||
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
|
||||||
object = Object.normalize(data["object"])
|
|
||||||
|
|
||||||
assert object.data["emoji"] == %{
|
|
||||||
"icon_e_smile" => "https://puckipedia.com/forum/images/smilies/icon_e_smile.png"
|
|
||||||
}
|
|
||||||
|
|
||||||
data = File.read!("test/fixtures/kroeg-array-less-hashtag.json") |> Poison.decode!()
|
|
||||||
|
|
||||||
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
|
||||||
object = Object.normalize(data["object"])
|
|
||||||
|
|
||||||
assert "test" in object.data["tag"]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "it works for incoming notices with url not being a string (prismo)" do
|
|
||||||
data = File.read!("test/fixtures/prismo-url-map.json") |> Poison.decode!()
|
|
||||||
|
|
||||||
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
|
||||||
object = Object.normalize(data["object"])
|
|
||||||
|
|
||||||
assert object.data["url"] == "https://prismo.news/posts/83"
|
|
||||||
end
|
|
||||||
|
|
||||||
test "it cleans up incoming notices which are not really DMs" do
|
|
||||||
user = insert(:user)
|
|
||||||
other_user = insert(:user)
|
|
||||||
|
|
||||||
to = [user.ap_id, other_user.ap_id]
|
|
||||||
|
|
||||||
data =
|
|
||||||
File.read!("test/fixtures/mastodon-post-activity.json")
|
|
||||||
|> Poison.decode!()
|
|
||||||
|> Map.put("to", to)
|
|
||||||
|> Map.put("cc", [])
|
|
||||||
|
|
||||||
object =
|
|
||||||
data["object"]
|
|
||||||
|> Map.put("to", to)
|
|
||||||
|> Map.put("cc", [])
|
|
||||||
|
|
||||||
data = Map.put(data, "object", object)
|
|
||||||
|
|
||||||
{:ok, %Activity{data: data, local: false} = activity} = Transmogrifier.handle_incoming(data)
|
|
||||||
|
|
||||||
assert data["to"] == []
|
|
||||||
assert data["cc"] == to
|
|
||||||
|
|
||||||
object_data = Object.normalize(activity).data
|
|
||||||
|
|
||||||
assert object_data["to"] == []
|
|
||||||
assert object_data["cc"] == to
|
|
||||||
end
|
|
||||||
|
|
||||||
test "it works for incoming announces" do
|
|
||||||
data = File.read!("test/fixtures/mastodon-announce.json") |> Poison.decode!()
|
|
||||||
|
|
||||||
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
|
||||||
|
|
||||||
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
|
||||||
assert data["type"] == "Announce"
|
|
||||||
|
|
||||||
assert data["id"] ==
|
|
||||||
"http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
|
|
||||||
|
|
||||||
assert data["object"] ==
|
|
||||||
"http://mastodon.example.org/users/admin/statuses/99541947525187367"
|
|
||||||
|
|
||||||
assert Activity.get_create_by_object_ap_id(data["object"])
|
|
||||||
end
|
|
||||||
|
|
||||||
test "it works for incoming announces with an existing activity" do
|
|
||||||
user = insert(:user)
|
|
||||||
{:ok, activity} = CommonAPI.post(user, %{status: "hey"})
|
|
||||||
|
|
||||||
data =
|
|
||||||
File.read!("test/fixtures/mastodon-announce.json")
|
|
||||||
|> Poison.decode!()
|
|
||||||
|> Map.put("object", activity.data["object"])
|
|
||||||
|
|
||||||
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
|
||||||
|
|
||||||
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
|
||||||
assert data["type"] == "Announce"
|
|
||||||
|
|
||||||
assert data["id"] ==
|
|
||||||
"http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
|
|
||||||
|
|
||||||
assert data["object"] == activity.data["object"]
|
|
||||||
|
|
||||||
assert Activity.get_create_by_object_ap_id(data["object"]).id == activity.id
|
|
||||||
end
|
|
||||||
|
|
||||||
test "it works for incoming announces with an inlined activity" do
|
|
||||||
data =
|
|
||||||
File.read!("test/fixtures/mastodon-announce-private.json")
|
|
||||||
|> Poison.decode!()
|
|
||||||
|
|
||||||
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
|
||||||
|
|
||||||
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
|
||||||
assert data["type"] == "Announce"
|
|
||||||
|
|
||||||
assert data["id"] ==
|
|
||||||
"http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
|
|
||||||
|
|
||||||
object = Object.normalize(data["object"])
|
|
||||||
|
|
||||||
assert object.data["id"] == "http://mastodon.example.org/@admin/99541947525187368"
|
|
||||||
assert object.data["content"] == "this is a private toot"
|
|
||||||
end
|
|
||||||
|
|
||||||
@tag capture_log: true
|
|
||||||
test "it rejects incoming announces with an inlined activity from another origin" do
|
|
||||||
data =
|
|
||||||
File.read!("test/fixtures/bogus-mastodon-announce.json")
|
|
||||||
|> Poison.decode!()
|
|
||||||
|
|
||||||
assert :error = Transmogrifier.handle_incoming(data)
|
|
||||||
end
|
|
||||||
|
|
||||||
test "it does not clobber the addressing on announce activities" do
|
|
||||||
user = insert(:user)
|
|
||||||
{:ok, activity} = CommonAPI.post(user, %{status: "hey"})
|
|
||||||
|
|
||||||
data =
|
|
||||||
File.read!("test/fixtures/mastodon-announce.json")
|
|
||||||
|> Poison.decode!()
|
|
||||||
|> Map.put("object", Object.normalize(activity).data["id"])
|
|
||||||
|> Map.put("to", ["http://mastodon.example.org/users/admin/followers"])
|
|
||||||
|> Map.put("cc", [])
|
|
||||||
|
|
||||||
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
|
||||||
|
|
||||||
assert data["to"] == ["http://mastodon.example.org/users/admin/followers"]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "it ensures that as:Public activities make it to their followers collection" do
|
test "it ensures that as:Public activities make it to their followers collection" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue