Merge remote-tracking branch 'ilja/fix_tagpolicy_to_also_work_on_updates' into develop
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
This commit is contained in:
commit
d5828f1c5e
14 changed files with 375 additions and 29 deletions
|
@ -3,7 +3,7 @@
|
|||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy do
|
||||
@moduledoc "Adds expiration to all local Create activities"
|
||||
@moduledoc "Adds expiration to all local Create/Update activities"
|
||||
@behaviour Pleroma.Web.ActivityPub.MRF.Policy
|
||||
|
||||
@impl true
|
||||
|
@ -25,8 +25,13 @@ defp local?(%{"actor" => actor}) do
|
|||
String.starts_with?(actor, Pleroma.Web.Endpoint.url())
|
||||
end
|
||||
|
||||
defp note?(activity) do
|
||||
match?(%{"type" => "Create", "object" => %{"type" => "Note"}}, activity)
|
||||
defp note?(%{"type" => type, "object" => %{"type" => "Note"}})
|
||||
when type in ["Create", "Update"] do
|
||||
true
|
||||
end
|
||||
|
||||
defp note?(_) do
|
||||
false
|
||||
end
|
||||
|
||||
defp maybe_add_expiration(activity) do
|
||||
|
|
|
@ -29,7 +29,8 @@ defp contains_links?(%{"content" => content} = _object) do
|
|||
defp contains_links?(_), do: false
|
||||
|
||||
@impl true
|
||||
def filter(%{"type" => "Create", "actor" => actor, "object" => object} = message) do
|
||||
def filter(%{"type" => type, "actor" => actor, "object" => object} = message)
|
||||
when type in ["Create", "Update"] do
|
||||
with {:ok, %User{local: false} = u} <- User.get_or_fetch_by_ap_id(actor),
|
||||
{:contains_links, true} <- {:contains_links, contains_links?(object)},
|
||||
{:old_user, true} <- {:old_user, old_user?(u)} do
|
||||
|
|
|
@ -17,13 +17,14 @@ defp check_if_bot(user), do: check_by_actor_type(user) or check_by_nickname(user
|
|||
@impl true
|
||||
def filter(
|
||||
%{
|
||||
"type" => "Create",
|
||||
"type" => type,
|
||||
"to" => to,
|
||||
"cc" => cc,
|
||||
"actor" => actor,
|
||||
"object" => object
|
||||
} = message
|
||||
) do
|
||||
)
|
||||
when type in ["Create", "Update"] do
|
||||
user = User.get_cached_by_ap_id(actor)
|
||||
isbot = check_if_bot(user)
|
||||
|
||||
|
|
|
@ -73,8 +73,8 @@ defp get_recipient_count(message) do
|
|||
end
|
||||
|
||||
@impl true
|
||||
def filter(%{"type" => "Create", "object" => %{"type" => object_type}} = message)
|
||||
when object_type in ~w{Note Article} do
|
||||
def filter(%{"type" => type, "object" => %{"type" => object_type}} = message)
|
||||
when type in ~w{Create Update} and object_type in ~w{Note Article} do
|
||||
reject_threshold =
|
||||
Pleroma.Config.get(
|
||||
[:mrf_hellthread, :reject_threshold],
|
||||
|
|
|
@ -8,7 +8,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicy do
|
|||
@behaviour Pleroma.Web.ActivityPub.MRF.Policy
|
||||
|
||||
@impl true
|
||||
def filter(%{"type" => "Create"} = message) do
|
||||
def filter(%{"type" => type} = message) when type in ["Create", "Update"] do
|
||||
reject_actors = Pleroma.Config.get([:mrf_mention, :actors], [])
|
||||
recipients = (message["to"] || []) ++ (message["cc"] || [])
|
||||
|
||||
|
|
|
@ -40,9 +40,9 @@ defp check_reject(%{host: actor_host} = _actor_info, object) do
|
|||
|
||||
defp check_media_removal(
|
||||
%{host: actor_host} = _actor_info,
|
||||
%{"type" => "Create", "object" => %{"attachment" => child_attachment}} = object
|
||||
%{"type" => type, "object" => %{"attachment" => child_attachment}} = object
|
||||
)
|
||||
when length(child_attachment) > 0 do
|
||||
when type in ["Create", "Update"] and length(child_attachment) > 0 do
|
||||
media_removal =
|
||||
instance_list(:media_removal)
|
||||
|> MRF.subdomains_regex()
|
||||
|
@ -63,10 +63,11 @@ defp check_media_removal(_actor_info, object), do: {:ok, object}
|
|||
defp check_media_nsfw(
|
||||
%{host: actor_host} = _actor_info,
|
||||
%{
|
||||
"type" => "Create",
|
||||
"type" => type,
|
||||
"object" => %{} = _child_object
|
||||
} = object
|
||||
) do
|
||||
)
|
||||
when type in ["Create", "Update"] do
|
||||
media_nsfw =
|
||||
instance_list(:media_nsfw)
|
||||
|> MRF.subdomains_regex()
|
||||
|
|
|
@ -27,22 +27,22 @@ defp get_tags(_), do: []
|
|||
defp process_tag(
|
||||
"mrf_tag:media-force-nsfw",
|
||||
%{
|
||||
"type" => "Create",
|
||||
"type" => type,
|
||||
"object" => %{"attachment" => child_attachment}
|
||||
} = message
|
||||
)
|
||||
when length(child_attachment) > 0 do
|
||||
when length(child_attachment) > 0 and type in ["Create", "Update"] do
|
||||
{:ok, Kernel.put_in(message, ["object", "sensitive"], true)}
|
||||
end
|
||||
|
||||
defp process_tag(
|
||||
"mrf_tag:media-strip",
|
||||
%{
|
||||
"type" => "Create",
|
||||
"type" => type,
|
||||
"object" => %{"attachment" => child_attachment} = object
|
||||
} = message
|
||||
)
|
||||
when length(child_attachment) > 0 do
|
||||
when length(child_attachment) > 0 and type in ["Create", "Update"] do
|
||||
object = Map.delete(object, "attachment")
|
||||
message = Map.put(message, "object", object)
|
||||
|
||||
|
@ -52,13 +52,14 @@ defp process_tag(
|
|||
defp process_tag(
|
||||
"mrf_tag:force-unlisted",
|
||||
%{
|
||||
"type" => "Create",
|
||||
"type" => type,
|
||||
"to" => to,
|
||||
"cc" => cc,
|
||||
"actor" => actor,
|
||||
"object" => object
|
||||
} = message
|
||||
) do
|
||||
)
|
||||
when type in ["Create", "Update"] do
|
||||
user = User.get_cached_by_ap_id(actor)
|
||||
|
||||
if Enum.member?(to, Pleroma.Constants.as_public()) do
|
||||
|
@ -85,13 +86,14 @@ defp process_tag(
|
|||
defp process_tag(
|
||||
"mrf_tag:sandbox",
|
||||
%{
|
||||
"type" => "Create",
|
||||
"type" => type,
|
||||
"to" => to,
|
||||
"cc" => cc,
|
||||
"actor" => actor,
|
||||
"object" => object
|
||||
} = message
|
||||
) do
|
||||
)
|
||||
when type in ["Create", "Update"] do
|
||||
user = User.get_cached_by_ap_id(actor)
|
||||
|
||||
if Enum.member?(to, Pleroma.Constants.as_public()) or
|
||||
|
@ -152,7 +154,7 @@ def filter(%{"object" => target_actor, "type" => "Follow"} = message),
|
|||
do: filter_message(target_actor, message)
|
||||
|
||||
@impl true
|
||||
def filter(%{"actor" => actor, "type" => "Create"} = message),
|
||||
def filter(%{"actor" => actor, "type" => type} = message) when type in ["Create", "Update"],
|
||||
do: filter_message(actor, message)
|
||||
|
||||
@impl true
|
||||
|
|
|
@ -19,6 +19,16 @@ test "adds `expires_at` property" do
|
|||
})
|
||||
|
||||
assert Timex.diff(expires_at, DateTime.utc_now(), :days) == 364
|
||||
|
||||
assert {:ok, %{"type" => "Update", "expires_at" => expires_at}} =
|
||||
ActivityExpirationPolicy.filter(%{
|
||||
"id" => @id,
|
||||
"actor" => @local_actor,
|
||||
"type" => "Update",
|
||||
"object" => %{"type" => "Note"}
|
||||
})
|
||||
|
||||
assert Timex.diff(expires_at, DateTime.utc_now(), :days) == 364
|
||||
end
|
||||
|
||||
test "keeps existing `expires_at` if it less than the config setting" do
|
||||
|
@ -32,6 +42,15 @@ test "keeps existing `expires_at` if it less than the config setting" do
|
|||
"expires_at" => expires_at,
|
||||
"object" => %{"type" => "Note"}
|
||||
})
|
||||
|
||||
assert {:ok, %{"type" => "Update", "expires_at" => ^expires_at}} =
|
||||
ActivityExpirationPolicy.filter(%{
|
||||
"id" => @id,
|
||||
"actor" => @local_actor,
|
||||
"type" => "Update",
|
||||
"expires_at" => expires_at,
|
||||
"object" => %{"type" => "Note"}
|
||||
})
|
||||
end
|
||||
|
||||
test "overwrites existing `expires_at` if it greater than the config setting" do
|
||||
|
@ -47,6 +66,17 @@ test "overwrites existing `expires_at` if it greater than the config setting" do
|
|||
})
|
||||
|
||||
assert Timex.diff(expires_at, DateTime.utc_now(), :days) == 364
|
||||
|
||||
assert {:ok, %{"type" => "Update", "expires_at" => expires_at}} =
|
||||
ActivityExpirationPolicy.filter(%{
|
||||
"id" => @id,
|
||||
"actor" => @local_actor,
|
||||
"type" => "Update",
|
||||
"expires_at" => too_distant_future,
|
||||
"object" => %{"type" => "Note"}
|
||||
})
|
||||
|
||||
assert Timex.diff(expires_at, DateTime.utc_now(), :days) == 364
|
||||
end
|
||||
|
||||
test "ignores remote activities" do
|
||||
|
@ -59,9 +89,19 @@ test "ignores remote activities" do
|
|||
})
|
||||
|
||||
refute Map.has_key?(activity, "expires_at")
|
||||
|
||||
assert {:ok, activity} =
|
||||
ActivityExpirationPolicy.filter(%{
|
||||
"id" => "https://example.com/123",
|
||||
"actor" => "https://example.com/users/cofe",
|
||||
"type" => "Update",
|
||||
"object" => %{"type" => "Note"}
|
||||
})
|
||||
|
||||
refute Map.has_key?(activity, "expires_at")
|
||||
end
|
||||
|
||||
test "ignores non-Create/Note activities" do
|
||||
test "ignores non-Create/Update/Note activities" do
|
||||
assert {:ok, activity} =
|
||||
ActivityExpirationPolicy.filter(%{
|
||||
"id" => "https://example.com/123",
|
||||
|
|
|
@ -32,6 +32,28 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do
|
|||
}
|
||||
}
|
||||
|
||||
@linkless_update_message %{
|
||||
"type" => "Update",
|
||||
"object" => %{
|
||||
"content" => "hi world!"
|
||||
}
|
||||
}
|
||||
|
||||
@linkful_update_message %{
|
||||
"type" => "Update",
|
||||
"object" => %{
|
||||
"content" => "<a href='https://example.com'>hi world!</a>"
|
||||
}
|
||||
}
|
||||
|
||||
@response_update_message %{
|
||||
"type" => "Update",
|
||||
"object" => %{
|
||||
"name" => "yes",
|
||||
"type" => "Answer"
|
||||
}
|
||||
}
|
||||
|
||||
describe "with new user" do
|
||||
test "it allows posts without links" do
|
||||
user = insert(:user, local: false)
|
||||
|
@ -42,7 +64,12 @@ test "it allows posts without links" do
|
|||
@linkless_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
update_message =
|
||||
@linkless_update_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
{:ok, _message} = AntiLinkSpamPolicy.filter(message)
|
||||
{:ok, _update_message} = AntiLinkSpamPolicy.filter(update_message)
|
||||
end
|
||||
|
||||
test "it disallows posts with links" do
|
||||
|
@ -66,7 +93,24 @@ test "it disallows posts with links" do
|
|||
}
|
||||
}
|
||||
|
||||
update_message = %{
|
||||
"type" => "Update",
|
||||
"actor" => user.ap_id,
|
||||
"object" => %{
|
||||
"formerRepresentations" => %{
|
||||
"type" => "OrderedCollection",
|
||||
"orderedItems" => [
|
||||
%{
|
||||
"content" => "<a href='https://example.com'>hi world!</a>"
|
||||
}
|
||||
]
|
||||
},
|
||||
"content" => "mew"
|
||||
}
|
||||
}
|
||||
|
||||
{:reject, _} = MRF.filter_one(AntiLinkSpamPolicy, message)
|
||||
{:reject, _} = MRF.filter_one(AntiLinkSpamPolicy, update_message)
|
||||
end
|
||||
|
||||
test "it allows posts with links for local users" do
|
||||
|
@ -78,7 +122,12 @@ test "it allows posts with links for local users" do
|
|||
@linkful_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
update_message =
|
||||
@linkful_update_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
{:ok, _message} = AntiLinkSpamPolicy.filter(message)
|
||||
{:ok, _update_message} = AntiLinkSpamPolicy.filter(update_message)
|
||||
end
|
||||
|
||||
test "it disallows posts with links in history" do
|
||||
|
@ -90,7 +139,12 @@ test "it disallows posts with links in history" do
|
|||
@linkful_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
update_message =
|
||||
@linkful_update_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
{:reject, _} = AntiLinkSpamPolicy.filter(message)
|
||||
{:reject, _} = AntiLinkSpamPolicy.filter(update_message)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -104,7 +158,12 @@ test "it allows posts without links" do
|
|||
@linkless_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
update_message =
|
||||
@linkless_update_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
{:ok, _message} = AntiLinkSpamPolicy.filter(message)
|
||||
{:ok, _update_message} = AntiLinkSpamPolicy.filter(update_message)
|
||||
end
|
||||
|
||||
test "it allows posts with links" do
|
||||
|
@ -116,7 +175,12 @@ test "it allows posts with links" do
|
|||
@linkful_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
update_message =
|
||||
@linkful_update_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
{:ok, _message} = AntiLinkSpamPolicy.filter(message)
|
||||
{:ok, _update_message} = AntiLinkSpamPolicy.filter(update_message)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -130,7 +194,12 @@ test "it allows posts without links" do
|
|||
@linkless_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
update_message =
|
||||
@linkless_update_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
{:ok, _message} = AntiLinkSpamPolicy.filter(message)
|
||||
{:ok, _update_message} = AntiLinkSpamPolicy.filter(update_message)
|
||||
end
|
||||
|
||||
test "it allows posts with links" do
|
||||
|
@ -142,7 +211,12 @@ test "it allows posts with links" do
|
|||
@linkful_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
update_message =
|
||||
@linkful_update_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
{:ok, _message} = AntiLinkSpamPolicy.filter(message)
|
||||
{:ok, _update_message} = AntiLinkSpamPolicy.filter(update_message)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -161,9 +235,17 @@ test "it rejects posts without links" do
|
|||
@linkless_message
|
||||
|> Map.put("actor", "http://invalid.actor")
|
||||
|
||||
update_message =
|
||||
@linkless_update_message
|
||||
|> Map.put("actor", "http://invalid.actor")
|
||||
|
||||
assert capture_log(fn ->
|
||||
{:reject, _} = AntiLinkSpamPolicy.filter(message)
|
||||
end) =~ "[error] Could not decode user at fetch http://invalid.actor"
|
||||
|
||||
assert capture_log(fn ->
|
||||
{:reject, _} = AntiLinkSpamPolicy.filter(update_message)
|
||||
end) =~ "[error] Could not decode user at fetch http://invalid.actor"
|
||||
end
|
||||
|
||||
test "it rejects posts with links" do
|
||||
|
@ -171,9 +253,17 @@ test "it rejects posts with links" do
|
|||
@linkful_message
|
||||
|> Map.put("actor", "http://invalid.actor")
|
||||
|
||||
update_message =
|
||||
@linkful_update_message
|
||||
|> Map.put("actor", "http://invalid.actor")
|
||||
|
||||
assert capture_log(fn ->
|
||||
{:reject, _} = AntiLinkSpamPolicy.filter(message)
|
||||
end) =~ "[error] Could not decode user at fetch http://invalid.actor"
|
||||
|
||||
assert capture_log(fn ->
|
||||
{:reject, _} = AntiLinkSpamPolicy.filter(update_message)
|
||||
end) =~ "[error] Could not decode user at fetch http://invalid.actor"
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -185,7 +275,12 @@ test "it does not reject them or error out" do
|
|||
@response_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
update_message =
|
||||
@response_update_message
|
||||
|> Map.put("actor", user.ap_id)
|
||||
|
||||
{:ok, _message} = AntiLinkSpamPolicy.filter(message)
|
||||
{:ok, _update_message} = AntiLinkSpamPolicy.filter(update_message)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -26,35 +26,60 @@ defp generate_messages(actor) do
|
|||
}}
|
||||
end
|
||||
|
||||
defp generate_update_messages(actor) do
|
||||
{%{
|
||||
"actor" => actor.ap_id,
|
||||
"type" => "Update",
|
||||
"object" => %{},
|
||||
"to" => [@public, "f"],
|
||||
"cc" => [actor.follower_address, "d"]
|
||||
},
|
||||
%{
|
||||
"actor" => actor.ap_id,
|
||||
"type" => "Update",
|
||||
"object" => %{"to" => ["f", actor.follower_address], "cc" => ["d", @public]},
|
||||
"to" => ["f", actor.follower_address],
|
||||
"cc" => ["d", @public]
|
||||
}}
|
||||
end
|
||||
|
||||
test "removes from the federated timeline by nickname heuristics 1" do
|
||||
actor = insert(:user, %{nickname: "annoying_ebooks@example.com"})
|
||||
|
||||
{message, except_message} = generate_messages(actor)
|
||||
{update_message, except_update_message} = generate_update_messages(actor)
|
||||
|
||||
assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message}
|
||||
assert ForceBotUnlistedPolicy.filter(update_message) == {:ok, except_update_message}
|
||||
end
|
||||
|
||||
test "removes from the federated timeline by nickname heuristics 2" do
|
||||
actor = insert(:user, %{nickname: "cirnonewsnetworkbot@meow.cat"})
|
||||
|
||||
{message, except_message} = generate_messages(actor)
|
||||
{update_message, except_update_message} = generate_update_messages(actor)
|
||||
|
||||
assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message}
|
||||
assert ForceBotUnlistedPolicy.filter(update_message) == {:ok, except_update_message}
|
||||
end
|
||||
|
||||
test "removes from the federated timeline by actor type Application" do
|
||||
actor = insert(:user, %{actor_type: "Application"})
|
||||
|
||||
{message, except_message} = generate_messages(actor)
|
||||
{update_message, except_update_message} = generate_update_messages(actor)
|
||||
|
||||
assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message}
|
||||
assert ForceBotUnlistedPolicy.filter(update_message) == {:ok, except_update_message}
|
||||
end
|
||||
|
||||
test "removes from the federated timeline by actor type Service" do
|
||||
actor = insert(:user, %{actor_type: "Service"})
|
||||
|
||||
{message, except_message} = generate_messages(actor)
|
||||
{update_message, except_update_message} = generate_update_messages(actor)
|
||||
|
||||
assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message}
|
||||
assert ForceBotUnlistedPolicy.filter(update_message) == {:ok, except_update_message}
|
||||
end
|
||||
end
|
||||
|
|
|
@ -26,54 +26,86 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicyTest do
|
|||
}
|
||||
}
|
||||
|
||||
[user: user, message: message]
|
||||
update_message = %{
|
||||
"actor" => user.ap_id,
|
||||
"cc" => [user.follower_address],
|
||||
"type" => "Update",
|
||||
"to" => [
|
||||
"https://www.w3.org/ns/activitystreams#Public",
|
||||
"https://instance.tld/users/user1",
|
||||
"https://instance.tld/users/user2",
|
||||
"https://instance.tld/users/user3"
|
||||
],
|
||||
"object" => %{
|
||||
"type" => "Note"
|
||||
}
|
||||
}
|
||||
|
||||
[user: user, message: message, update_message: update_message]
|
||||
end
|
||||
|
||||
setup do: clear_config(:mrf_hellthread)
|
||||
|
||||
describe "reject" do
|
||||
test "rejects the message if the recipient count is above reject_threshold", %{
|
||||
message: message
|
||||
message: message,
|
||||
update_message: update_message
|
||||
} do
|
||||
clear_config([:mrf_hellthread], %{delist_threshold: 0, reject_threshold: 2})
|
||||
|
||||
assert {:reject, "[HellthreadPolicy] 3 recipients is over the limit of 2"} ==
|
||||
filter(message)
|
||||
|
||||
assert {:reject, "[HellthreadPolicy] 3 recipients is over the limit of 2"} ==
|
||||
filter(update_message)
|
||||
end
|
||||
|
||||
test "does not reject the message if the recipient count is below reject_threshold", %{
|
||||
message: message
|
||||
message: message,
|
||||
update_message: update_message
|
||||
} do
|
||||
clear_config([:mrf_hellthread], %{delist_threshold: 0, reject_threshold: 3})
|
||||
|
||||
assert {:ok, ^message} = filter(message)
|
||||
assert {:ok, ^update_message} = filter(update_message)
|
||||
end
|
||||
end
|
||||
|
||||
describe "delist" do
|
||||
test "delists the message if the recipient count is above delist_threshold", %{
|
||||
user: user,
|
||||
message: message
|
||||
message: message,
|
||||
update_message: update_message
|
||||
} do
|
||||
clear_config([:mrf_hellthread], %{delist_threshold: 2, reject_threshold: 0})
|
||||
|
||||
{:ok, message} = filter(message)
|
||||
assert user.follower_address in message["to"]
|
||||
assert "https://www.w3.org/ns/activitystreams#Public" in message["cc"]
|
||||
|
||||
{:ok, update_message} = filter(update_message)
|
||||
assert user.follower_address in update_message["to"]
|
||||
assert "https://www.w3.org/ns/activitystreams#Public" in update_message["cc"]
|
||||
end
|
||||
|
||||
test "does not delist the message if the recipient count is below delist_threshold", %{
|
||||
message: message
|
||||
message: message,
|
||||
update_message: update_message
|
||||
} do
|
||||
clear_config([:mrf_hellthread], %{delist_threshold: 4, reject_threshold: 0})
|
||||
|
||||
assert {:ok, ^message} = filter(message)
|
||||
assert {:ok, ^update_message} = filter(update_message)
|
||||
end
|
||||
end
|
||||
|
||||
test "excludes follower collection and public URI from threshold count", %{message: message} do
|
||||
test "excludes follower collection and public URI from threshold count", %{
|
||||
message: message,
|
||||
update_message: update_message
|
||||
} do
|
||||
clear_config([:mrf_hellthread], %{delist_threshold: 0, reject_threshold: 3})
|
||||
|
||||
assert {:ok, ^message} = filter(message)
|
||||
assert {:ok, ^update_message} = filter(update_message)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -18,7 +18,14 @@ test "pass filter if allow list is empty" do
|
|||
"cc" => ["https://example.com/blocked"]
|
||||
}
|
||||
|
||||
update_message = %{
|
||||
"type" => "Update",
|
||||
"to" => ["https://example.com/ok"],
|
||||
"cc" => ["https://example.com/blocked"]
|
||||
}
|
||||
|
||||
assert MentionPolicy.filter(message) == {:ok, message}
|
||||
assert MentionPolicy.filter(update_message) == {:ok, update_message}
|
||||
end
|
||||
|
||||
describe "allow" do
|
||||
|
@ -29,7 +36,12 @@ test "empty" do
|
|||
"type" => "Create"
|
||||
}
|
||||
|
||||
update_message = %{
|
||||
"type" => "Update"
|
||||
}
|
||||
|
||||
assert MentionPolicy.filter(message) == {:ok, message}
|
||||
assert MentionPolicy.filter(update_message) == {:ok, update_message}
|
||||
end
|
||||
|
||||
test "to" do
|
||||
|
@ -40,7 +52,13 @@ test "to" do
|
|||
"to" => ["https://example.com/ok"]
|
||||
}
|
||||
|
||||
update_message = %{
|
||||
"type" => "Update",
|
||||
"to" => ["https://example.com/ok"]
|
||||
}
|
||||
|
||||
assert MentionPolicy.filter(message) == {:ok, message}
|
||||
assert MentionPolicy.filter(update_message) == {:ok, update_message}
|
||||
end
|
||||
|
||||
test "cc" do
|
||||
|
@ -51,7 +69,13 @@ test "cc" do
|
|||
"cc" => ["https://example.com/ok"]
|
||||
}
|
||||
|
||||
update_message = %{
|
||||
"type" => "Update",
|
||||
"cc" => ["https://example.com/ok"]
|
||||
}
|
||||
|
||||
assert MentionPolicy.filter(message) == {:ok, message}
|
||||
assert MentionPolicy.filter(update_message) == {:ok, update_message}
|
||||
end
|
||||
|
||||
test "both" do
|
||||
|
@ -63,7 +87,14 @@ test "both" do
|
|||
"cc" => ["https://example.com/ok2"]
|
||||
}
|
||||
|
||||
update_message = %{
|
||||
"type" => "Update",
|
||||
"to" => ["https://example.com/ok"],
|
||||
"cc" => ["https://example.com/ok2"]
|
||||
}
|
||||
|
||||
assert MentionPolicy.filter(message) == {:ok, message}
|
||||
assert MentionPolicy.filter(update_message) == {:ok, update_message}
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -76,8 +107,16 @@ test "to" do
|
|||
"to" => ["https://example.com/blocked"]
|
||||
}
|
||||
|
||||
update_message = %{
|
||||
"type" => "Update",
|
||||
"to" => ["https://example.com/blocked"]
|
||||
}
|
||||
|
||||
assert MentionPolicy.filter(message) ==
|
||||
{:reject, "[MentionPolicy] Rejected for mention of https://example.com/blocked"}
|
||||
|
||||
assert MentionPolicy.filter(update_message) ==
|
||||
{:reject, "[MentionPolicy] Rejected for mention of https://example.com/blocked"}
|
||||
end
|
||||
|
||||
test "cc" do
|
||||
|
@ -89,8 +128,17 @@ test "cc" do
|
|||
"cc" => ["https://example.com/blocked"]
|
||||
}
|
||||
|
||||
update_message = %{
|
||||
"type" => "Update",
|
||||
"to" => ["https://example.com/ok"],
|
||||
"cc" => ["https://example.com/blocked"]
|
||||
}
|
||||
|
||||
assert MentionPolicy.filter(message) ==
|
||||
{:reject, "[MentionPolicy] Rejected for mention of https://example.com/blocked"}
|
||||
|
||||
assert MentionPolicy.filter(update_message) ==
|
||||
{:reject, "[MentionPolicy] Rejected for mention of https://example.com/blocked"}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -26,15 +26,18 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
|
|||
test "is empty" do
|
||||
clear_config([:mrf_simple, :media_removal], [])
|
||||
media_message = build_media_message()
|
||||
media_update_message = build_media_update_message()
|
||||
local_message = build_local_message()
|
||||
|
||||
assert SimplePolicy.filter(media_message) == {:ok, media_message}
|
||||
assert SimplePolicy.filter(media_update_message) == {:ok, media_update_message}
|
||||
assert SimplePolicy.filter(local_message) == {:ok, local_message}
|
||||
end
|
||||
|
||||
test "has a matching host" do
|
||||
clear_config([:mrf_simple, :media_removal], [{"remote.instance", "Some reason"}])
|
||||
media_message = build_media_message()
|
||||
media_update_message = build_media_update_message()
|
||||
local_message = build_local_message()
|
||||
|
||||
assert SimplePolicy.filter(media_message) ==
|
||||
|
@ -42,12 +45,18 @@ test "has a matching host" do
|
|||
media_message
|
||||
|> Map.put("object", Map.delete(media_message["object"], "attachment"))}
|
||||
|
||||
assert SimplePolicy.filter(media_update_message) ==
|
||||
{:ok,
|
||||
media_update_message
|
||||
|> Map.put("object", Map.delete(media_update_message["object"], "attachment"))}
|
||||
|
||||
assert SimplePolicy.filter(local_message) == {:ok, local_message}
|
||||
end
|
||||
|
||||
test "match with wildcard domain" do
|
||||
clear_config([:mrf_simple, :media_removal], [{"*.remote.instance", "Whatever reason"}])
|
||||
media_message = build_media_message()
|
||||
media_update_message = build_media_update_message()
|
||||
local_message = build_local_message()
|
||||
|
||||
assert SimplePolicy.filter(media_message) ==
|
||||
|
@ -55,6 +64,11 @@ test "match with wildcard domain" do
|
|||
media_message
|
||||
|> Map.put("object", Map.delete(media_message["object"], "attachment"))}
|
||||
|
||||
assert SimplePolicy.filter(media_update_message) ==
|
||||
{:ok,
|
||||
media_update_message
|
||||
|> Map.put("object", Map.delete(media_update_message["object"], "attachment"))}
|
||||
|
||||
assert SimplePolicy.filter(local_message) == {:ok, local_message}
|
||||
end
|
||||
end
|
||||
|
@ -63,31 +77,41 @@ test "match with wildcard domain" do
|
|||
test "is empty" do
|
||||
clear_config([:mrf_simple, :media_nsfw], [])
|
||||
media_message = build_media_message()
|
||||
media_update_message = build_media_update_message()
|
||||
local_message = build_local_message()
|
||||
|
||||
assert SimplePolicy.filter(media_message) == {:ok, media_message}
|
||||
assert SimplePolicy.filter(media_update_message) == {:ok, media_update_message}
|
||||
assert SimplePolicy.filter(local_message) == {:ok, local_message}
|
||||
end
|
||||
|
||||
test "has a matching host" do
|
||||
clear_config([:mrf_simple, :media_nsfw], [{"remote.instance", "Whetever"}])
|
||||
media_message = build_media_message()
|
||||
media_update_message = build_media_update_message()
|
||||
local_message = build_local_message()
|
||||
|
||||
assert SimplePolicy.filter(media_message) ==
|
||||
{:ok, put_in(media_message, ["object", "sensitive"], true)}
|
||||
|
||||
assert SimplePolicy.filter(media_update_message) ==
|
||||
{:ok, put_in(media_update_message, ["object", "sensitive"], true)}
|
||||
|
||||
assert SimplePolicy.filter(local_message) == {:ok, local_message}
|
||||
end
|
||||
|
||||
test "match with wildcard domain" do
|
||||
clear_config([:mrf_simple, :media_nsfw], [{"*.remote.instance", "yeah yeah"}])
|
||||
media_message = build_media_message()
|
||||
media_update_message = build_media_update_message()
|
||||
local_message = build_local_message()
|
||||
|
||||
assert SimplePolicy.filter(media_message) ==
|
||||
{:ok, put_in(media_message, ["object", "sensitive"], true)}
|
||||
|
||||
assert SimplePolicy.filter(media_update_message) ==
|
||||
{:ok, put_in(media_update_message, ["object", "sensitive"], true)}
|
||||
|
||||
assert SimplePolicy.filter(local_message) == {:ok, local_message}
|
||||
end
|
||||
end
|
||||
|
@ -104,6 +128,18 @@ defp build_media_message do
|
|||
}
|
||||
end
|
||||
|
||||
defp build_media_update_message do
|
||||
%{
|
||||
"actor" => "https://remote.instance/users/bob",
|
||||
"type" => "Update",
|
||||
"object" => %{
|
||||
"attachment" => [%{}],
|
||||
"tag" => ["foo"],
|
||||
"sensitive" => false
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
describe "when :report_removal" do
|
||||
test "is empty" do
|
||||
clear_config([:mrf_simple, :report_removal], [])
|
||||
|
|
|
@ -53,7 +53,24 @@ test "removes from public timelines" do
|
|||
"cc" => ["d"]
|
||||
}
|
||||
|
||||
edit_message = %{
|
||||
"actor" => actor.ap_id,
|
||||
"type" => "Update",
|
||||
"object" => %{},
|
||||
"to" => [@public, "f"],
|
||||
"cc" => [@public, "d"]
|
||||
}
|
||||
|
||||
edit_expect_message = %{
|
||||
"actor" => actor.ap_id,
|
||||
"type" => "Update",
|
||||
"object" => %{"to" => ["f", actor.follower_address], "cc" => ["d"]},
|
||||
"to" => ["f", actor.follower_address],
|
||||
"cc" => ["d"]
|
||||
}
|
||||
|
||||
assert TagPolicy.filter(message) == {:ok, except_message}
|
||||
assert TagPolicy.filter(edit_message) == {:ok, edit_expect_message}
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -77,7 +94,24 @@ test "removes from the federated timeline" do
|
|||
"cc" => ["d", @public]
|
||||
}
|
||||
|
||||
edit_message = %{
|
||||
"actor" => actor.ap_id,
|
||||
"type" => "Update",
|
||||
"object" => %{},
|
||||
"to" => [@public, "f"],
|
||||
"cc" => [actor.follower_address, "d"]
|
||||
}
|
||||
|
||||
edit_expect_message = %{
|
||||
"actor" => actor.ap_id,
|
||||
"type" => "Update",
|
||||
"object" => %{"to" => ["f", actor.follower_address], "cc" => ["d", @public]},
|
||||
"to" => ["f", actor.follower_address],
|
||||
"cc" => ["d", @public]
|
||||
}
|
||||
|
||||
assert TagPolicy.filter(message) == {:ok, except_message}
|
||||
assert TagPolicy.filter(edit_message) == {:ok, edit_expect_message}
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -97,7 +131,20 @@ test "removes attachments" do
|
|||
"object" => %{}
|
||||
}
|
||||
|
||||
edit_message = %{
|
||||
"actor" => actor.ap_id,
|
||||
"type" => "Update",
|
||||
"object" => %{"attachment" => ["file1"]}
|
||||
}
|
||||
|
||||
edit_expect_message = %{
|
||||
"actor" => actor.ap_id,
|
||||
"type" => "Update",
|
||||
"object" => %{}
|
||||
}
|
||||
|
||||
assert TagPolicy.filter(message) == {:ok, except_message}
|
||||
assert TagPolicy.filter(edit_message) == {:ok, edit_expect_message}
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -117,7 +164,20 @@ test "Mark as sensitive on presence of attachments" do
|
|||
"object" => %{"tag" => ["test"], "attachment" => ["file1"], "sensitive" => true}
|
||||
}
|
||||
|
||||
edit_message = %{
|
||||
"actor" => actor.ap_id,
|
||||
"type" => "Update",
|
||||
"object" => %{"tag" => ["test"], "attachment" => ["file1"]}
|
||||
}
|
||||
|
||||
edit_expect_message = %{
|
||||
"actor" => actor.ap_id,
|
||||
"type" => "Update",
|
||||
"object" => %{"tag" => ["test"], "attachment" => ["file1"], "sensitive" => true}
|
||||
}
|
||||
|
||||
assert TagPolicy.filter(message) == {:ok, except_message}
|
||||
assert TagPolicy.filter(edit_message) == {:ok, edit_expect_message}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue