commit: ba3aa4f86da77ece8ac472c40da180ab1921c304
parent 0d914e17bedb49a5efb8c0268d4a6df2e7ffdf96
Author: tusooa <tusooa@kazv.moe>
Date: Tue, 20 Jun 2023 10:14:01 -0400
Fix edge cases
Diffstat:
3 files changed, 86 insertions(+), 36 deletions(-)
diff --git a/lib/pleroma/constants.ex b/lib/pleroma/constants.ex
@@ -42,6 +42,18 @@ defmodule Pleroma.Constants do
]
)
+ const(status_object_types,
+ do: [
+ "Note",
+ "Question",
+ "Audio",
+ "Video",
+ "Event",
+ "Article",
+ "Page"
+ ]
+ )
+
const(updatable_object_types,
do: [
"Note",
diff --git a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
@@ -31,8 +31,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
def history_awareness, do: :manual
@impl Pleroma.Web.ActivityPub.MRF.Policy
- def filter(%{"type" => type, "object" => %{} = object} = message)
- when type in ["Create", "Update"] do
+ def filter(%{"type" => type, "object" => %{"type" => objtype} = object} = message)
+ when type in ["Create", "Update"] and objtype in Pleroma.Constants.status_object_types() do
with {:ok, object} <-
Updater.do_with_history(object, fn object ->
{:ok, process_remove(object, :url, config_remove_url())}
@@ -102,46 +102,51 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
end
defp process_remove_impl(object, extract_from_tag, extract_from_emoji, patterns) do
- processed_tag =
- Enum.filter(
- object["tag"],
- fn
- %{"type" => "Emoji"} = tag ->
- str = extract_from_tag.(tag)
-
- if is_binary(str) do
- not match_any?(str, patterns)
- else
- true
+ object =
+ if object["tag"] do
+ Map.put(
+ object,
+ "tag",
+ Enum.filter(
+ object["tag"],
+ fn
+ %{"type" => "Emoji"} = tag ->
+ str = extract_from_tag.(tag)
+
+ if is_binary(str) do
+ not match_any?(str, patterns)
+ else
+ true
+ end
+
+ _ ->
+ true
end
+ )
+ )
+ else
+ object
+ end
- _ ->
- true
- end
- )
-
- processed_emoji =
+ object =
if object["emoji"] do
- object["emoji"]
- |> Enum.reduce(%{}, fn {name, url} = emoji, acc ->
- if not match_any?(extract_from_emoji.(emoji), patterns) do
- Map.put(acc, name, url)
- else
- acc
- end
- end)
+ Map.put(
+ object,
+ "emoji",
+ object["emoji"]
+ |> Enum.reduce(%{}, fn {name, url} = emoji, acc ->
+ if not match_any?(extract_from_emoji.(emoji), patterns) do
+ Map.put(acc, name, url)
+ else
+ acc
+ end
+ end)
+ )
else
- nil
+ object
end
- if processed_emoji do
- object
- |> Map.put("tag", processed_tag)
- |> Map.put("emoji", processed_emoji)
- else
- object
- |> Map.put("tag", processed_tag)
- end
+ object
end
defp matched_emoji_checker(urls, shortcodes) do
diff --git a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
@@ -389,4 +389,37 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do
} = filtered
end
end
+
+ describe "edge cases" do
+ setup do
+ clear_config([:mrf_emoji, :remove_url], [
+ "https://example.org/test.png",
+ ~r{/biribiri/mikoto_smile[23]\.png},
+ "nekomimi_girl_emoji"
+ ])
+
+ :ok
+ end
+
+ test "non-statuses" do
+ answer = @status_data |> put_in(["object", "type"], "Answer")
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, answer)
+
+ assert filtered == answer
+ end
+
+ test "without tag" do
+ status = @status_data |> Map.put("object", Map.drop(@status_data["object"], ["tag"]))
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, status)
+
+ refute Map.has_key?(filtered["object"], "tag")
+ end
+
+ test "without emoji" do
+ status = @status_data |> Map.put("object", Map.drop(@status_data["object"], ["emoji"]))
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, status)
+
+ refute Map.has_key?(filtered["object"], "emoji")
+ end
+ end
end