Remove all follower collections but actor's from "cc"
This commit is contained in:
parent
d46cc7896e
commit
2bbc2a801f
3 changed files with 86 additions and 24 deletions
|
@ -65,7 +65,11 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def fix_explicit_addressing(%{"to" => to, "cc" => cc} = object, explicit_mentions) do
|
def fix_explicit_addressing(
|
||||||
|
%{"to" => to, "cc" => cc} = object,
|
||||||
|
explicit_mentions,
|
||||||
|
follower_collection
|
||||||
|
) do
|
||||||
explicit_to =
|
explicit_to =
|
||||||
to
|
to
|
||||||
|> Enum.filter(fn x -> x in explicit_mentions end)
|
|> Enum.filter(fn x -> x in explicit_mentions end)
|
||||||
|
@ -76,6 +80,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|
||||||
|
|
||||||
final_cc =
|
final_cc =
|
||||||
(cc ++ explicit_cc)
|
(cc ++ explicit_cc)
|
||||||
|
|> Enum.reject(fn x -> String.ends_with?(x, "/followers") and x != follower_collection end)
|
||||||
|> Enum.uniq()
|
|> Enum.uniq()
|
||||||
|
|
||||||
object
|
object
|
||||||
|
@ -83,7 +88,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|
||||||
|> Map.put("cc", final_cc)
|
|> Map.put("cc", final_cc)
|
||||||
end
|
end
|
||||||
|
|
||||||
def fix_explicit_addressing(object, _explicit_mentions), do: object
|
def fix_explicit_addressing(object, _explicit_mentions, _followers_collection), do: object
|
||||||
|
|
||||||
# if directMessage flag is set to true, leave the addressing alone
|
# if directMessage flag is set to true, leave the addressing alone
|
||||||
def fix_explicit_addressing(%{"directMessage" => true} = object), do: object
|
def fix_explicit_addressing(%{"directMessage" => true} = object), do: object
|
||||||
|
@ -98,8 +103,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|
||||||
explicit_mentions =
|
explicit_mentions =
|
||||||
explicit_mentions ++ ["https://www.w3.org/ns/activitystreams#Public", follower_collection]
|
explicit_mentions ++ ["https://www.w3.org/ns/activitystreams#Public", follower_collection]
|
||||||
|
|
||||||
object
|
fix_explicit_addressing(object, explicit_mentions, follower_collection)
|
||||||
|> fix_explicit_addressing(explicit_mentions)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# if as:Public is addressed, then make sure the followers collection is also addressed
|
# if as:Public is addressed, then make sure the followers collection is also addressed
|
||||||
|
@ -136,7 +140,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|
||||||
|> fix_addressing_list("cc")
|
|> fix_addressing_list("cc")
|
||||||
|> fix_addressing_list("bto")
|
|> fix_addressing_list("bto")
|
||||||
|> fix_addressing_list("bcc")
|
|> fix_addressing_list("bcc")
|
||||||
|> fix_explicit_addressing
|
|> fix_explicit_addressing()
|
||||||
|> fix_implicit_addressing(followers_collection)
|
|> fix_implicit_addressing(followers_collection)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.ActivityPub.ObjectView
|
alias Pleroma.Web.ActivityPub.ObjectView
|
||||||
alias Pleroma.Web.ActivityPub.UserView
|
alias Pleroma.Web.ActivityPub.UserView
|
||||||
|
alias Pleroma.Web.ActivityPub.Utils
|
||||||
|
|
||||||
setup_all do
|
setup_all do
|
||||||
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
|
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
|
||||||
|
@ -234,13 +235,17 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "/users/:nickname/inbox" do
|
describe "/users/:nickname/inbox" do
|
||||||
test "it inserts an incoming activity into the database", %{conn: conn} do
|
setup do
|
||||||
user = insert(:user)
|
|
||||||
|
|
||||||
data =
|
data =
|
||||||
File.read!("test/fixtures/mastodon-post-activity.json")
|
File.read!("test/fixtures/mastodon-post-activity.json")
|
||||||
|> Poison.decode!()
|
|> Poison.decode!()
|
||||||
|> Map.put("bcc", [user.ap_id])
|
|
||||||
|
[data: data]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it inserts an incoming activity into the database", %{conn: conn, data: data} do
|
||||||
|
user = insert(:user)
|
||||||
|
data = Map.put(data, "bcc", [user.ap_id])
|
||||||
|
|
||||||
conn =
|
conn =
|
||||||
conn
|
conn
|
||||||
|
@ -253,16 +258,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|
||||||
assert Activity.get_by_ap_id(data["id"])
|
assert Activity.get_by_ap_id(data["id"])
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it accepts messages from actors that are followed by the user", %{conn: conn} do
|
test "it accepts messages from actors that are followed by the user", %{
|
||||||
|
conn: conn,
|
||||||
|
data: data
|
||||||
|
} do
|
||||||
recipient = insert(:user)
|
recipient = insert(:user)
|
||||||
actor = insert(:user, %{ap_id: "http://mastodon.example.org/users/actor"})
|
actor = insert(:user, %{ap_id: "http://mastodon.example.org/users/actor"})
|
||||||
|
|
||||||
{:ok, recipient} = User.follow(recipient, actor)
|
{:ok, recipient} = User.follow(recipient, actor)
|
||||||
|
|
||||||
data =
|
|
||||||
File.read!("test/fixtures/mastodon-post-activity.json")
|
|
||||||
|> Poison.decode!()
|
|
||||||
|
|
||||||
object =
|
object =
|
||||||
data["object"]
|
data["object"]
|
||||||
|> Map.put("attributedTo", actor.ap_id)
|
|> Map.put("attributedTo", actor.ap_id)
|
||||||
|
@ -309,13 +313,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|
||||||
assert response(conn, 200) =~ note_activity.data["object"]["content"]
|
assert response(conn, 200) =~ note_activity.data["object"]["content"]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it clears `unreachable` federation status of the sender", %{conn: conn} do
|
test "it clears `unreachable` federation status of the sender", %{conn: conn, data: data} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
data = Map.put(data, "bcc", [user.ap_id])
|
||||||
data =
|
|
||||||
File.read!("test/fixtures/mastodon-post-activity.json")
|
|
||||||
|> Poison.decode!()
|
|
||||||
|> Map.put("bcc", [user.ap_id])
|
|
||||||
|
|
||||||
sender_host = URI.parse(data["actor"]).host
|
sender_host = URI.parse(data["actor"]).host
|
||||||
Instances.set_consistently_unreachable(sender_host)
|
Instances.set_consistently_unreachable(sender_host)
|
||||||
|
@ -330,6 +330,47 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|
||||||
assert "ok" == json_response(conn, 200)
|
assert "ok" == json_response(conn, 200)
|
||||||
assert Instances.reachable?(sender_host)
|
assert Instances.reachable?(sender_host)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "it removes all follower collections but actor's", %{conn: conn} do
|
||||||
|
[actor, recipient] = insert_pair(:user)
|
||||||
|
|
||||||
|
data =
|
||||||
|
File.read!("test/fixtures/activitypub-client-post-activity.json")
|
||||||
|
|> Poison.decode!()
|
||||||
|
|
||||||
|
object = Map.put(data["object"], "attributedTo", actor.ap_id)
|
||||||
|
|
||||||
|
data =
|
||||||
|
data
|
||||||
|
|> Map.put("id", Utils.generate_object_id())
|
||||||
|
|> Map.put("actor", actor.ap_id)
|
||||||
|
|> Map.put("object", object)
|
||||||
|
|> Map.put("cc", [
|
||||||
|
recipient.follower_address,
|
||||||
|
actor.follower_address
|
||||||
|
])
|
||||||
|
|> Map.put("to", [
|
||||||
|
recipient.ap_id,
|
||||||
|
recipient.follower_address,
|
||||||
|
"https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
])
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> assign(:valid_signature, true)
|
||||||
|
|> put_req_header("content-type", "application/activity+json")
|
||||||
|
|> post("/users/#{recipient.nickname}/inbox", data)
|
||||||
|
|> json_response(200)
|
||||||
|
|
||||||
|
activity = Activity.get_by_ap_id(data["id"])
|
||||||
|
|
||||||
|
assert activity.id
|
||||||
|
assert actor.follower_address in activity.recipients
|
||||||
|
assert actor.follower_address in activity.data["cc"]
|
||||||
|
|
||||||
|
refute recipient.follower_address in activity.recipients
|
||||||
|
refute recipient.follower_address in activity.data["cc"]
|
||||||
|
refute recipient.follower_address in activity.data["to"]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "/users/:nickname/outbox" do
|
describe "/users/:nickname/outbox" do
|
||||||
|
|
|
@ -1211,9 +1211,12 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "fix_explicit_addressing" do
|
describe "fix_explicit_addressing" do
|
||||||
test "moves non-explicitly mentioned actors to cc" do
|
setup do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
[user: user]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "moves non-explicitly mentioned actors to cc", %{user: user} do
|
||||||
explicitly_mentioned_actors = [
|
explicitly_mentioned_actors = [
|
||||||
"https://pleroma.gold/users/user1",
|
"https://pleroma.gold/users/user1",
|
||||||
"https://pleroma.gold/user2"
|
"https://pleroma.gold/user2"
|
||||||
|
@ -1235,9 +1238,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
|
||||||
assert "https://social.beepboop.ga/users/dirb" in fixed_object["cc"]
|
assert "https://social.beepboop.ga/users/dirb" in fixed_object["cc"]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "does not move actor's follower collection to cc" do
|
test "does not move actor's follower collection to cc", %{user: user} do
|
||||||
user = insert(:user)
|
|
||||||
|
|
||||||
object = %{
|
object = %{
|
||||||
"actor" => user.ap_id,
|
"actor" => user.ap_id,
|
||||||
"to" => [user.follower_address],
|
"to" => [user.follower_address],
|
||||||
|
@ -1248,5 +1249,21 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
|
||||||
assert user.follower_address in fixed_object["to"]
|
assert user.follower_address in fixed_object["to"]
|
||||||
refute user.follower_address in fixed_object["cc"]
|
refute user.follower_address in fixed_object["cc"]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "removes recipient's follower collection from cc", %{user: user} do
|
||||||
|
recipient = insert(:user)
|
||||||
|
|
||||||
|
object = %{
|
||||||
|
"actor" => user.ap_id,
|
||||||
|
"to" => [recipient.ap_id, "https://www.w3.org/ns/activitystreams#Public"],
|
||||||
|
"cc" => [user.follower_address, recipient.follower_address]
|
||||||
|
}
|
||||||
|
|
||||||
|
fixed_object = Transmogrifier.fix_explicit_addressing(object)
|
||||||
|
|
||||||
|
assert user.follower_address in fixed_object["cc"]
|
||||||
|
refute recipient.follower_address in fixed_object["cc"]
|
||||||
|
refute recipient.follower_address in fixed_object["to"]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue