Fix edge cases
This commit is contained in:
parent
0d914e17be
commit
ba3aa4f86d
|
@ -42,6 +42,18 @@ defmodule Pleroma.Constants do
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const(status_object_types,
|
||||||
|
do: [
|
||||||
|
"Note",
|
||||||
|
"Question",
|
||||||
|
"Audio",
|
||||||
|
"Video",
|
||||||
|
"Event",
|
||||||
|
"Article",
|
||||||
|
"Page"
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
const(updatable_object_types,
|
const(updatable_object_types,
|
||||||
do: [
|
do: [
|
||||||
"Note",
|
"Note",
|
||||||
|
|
|
@ -31,8 +31,8 @@ defp config_unlist_shortcode do
|
||||||
def history_awareness, do: :manual
|
def history_awareness, do: :manual
|
||||||
|
|
||||||
@impl Pleroma.Web.ActivityPub.MRF.Policy
|
@impl Pleroma.Web.ActivityPub.MRF.Policy
|
||||||
def filter(%{"type" => type, "object" => %{} = object} = message)
|
def filter(%{"type" => type, "object" => %{"type" => objtype} = object} = message)
|
||||||
when type in ["Create", "Update"] do
|
when type in ["Create", "Update"] and objtype in Pleroma.Constants.status_object_types() do
|
||||||
with {:ok, object} <-
|
with {:ok, object} <-
|
||||||
Updater.do_with_history(object, fn object ->
|
Updater.do_with_history(object, fn object ->
|
||||||
{:ok, process_remove(object, :url, config_remove_url())}
|
{:ok, process_remove(object, :url, config_remove_url())}
|
||||||
|
@ -102,46 +102,51 @@ defp process_remove(object, :shortcode, patterns) do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp process_remove_impl(object, extract_from_tag, extract_from_emoji, patterns) do
|
defp process_remove_impl(object, extract_from_tag, extract_from_emoji, patterns) do
|
||||||
processed_tag =
|
object =
|
||||||
Enum.filter(
|
if object["tag"] do
|
||||||
object["tag"],
|
Map.put(
|
||||||
fn
|
object,
|
||||||
%{"type" => "Emoji"} = tag ->
|
"tag",
|
||||||
str = extract_from_tag.(tag)
|
Enum.filter(
|
||||||
|
object["tag"],
|
||||||
|
fn
|
||||||
|
%{"type" => "Emoji"} = tag ->
|
||||||
|
str = extract_from_tag.(tag)
|
||||||
|
|
||||||
if is_binary(str) do
|
if is_binary(str) do
|
||||||
not match_any?(str, patterns)
|
not match_any?(str, patterns)
|
||||||
else
|
else
|
||||||
true
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
true
|
||||||
end
|
end
|
||||||
|
)
|
||||||
_ ->
|
)
|
||||||
true
|
|
||||||
end
|
|
||||||
)
|
|
||||||
|
|
||||||
processed_emoji =
|
|
||||||
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)
|
|
||||||
else
|
else
|
||||||
nil
|
object
|
||||||
end
|
end
|
||||||
|
|
||||||
if processed_emoji do
|
object =
|
||||||
object
|
if object["emoji"] do
|
||||||
|> Map.put("tag", processed_tag)
|
Map.put(
|
||||||
|> Map.put("emoji", processed_emoji)
|
object,
|
||||||
else
|
"emoji",
|
||||||
object
|
object["emoji"]
|
||||||
|> Map.put("tag", processed_tag)
|
|> Enum.reduce(%{}, fn {name, url} = emoji, acc ->
|
||||||
end
|
if not match_any?(extract_from_emoji.(emoji), patterns) do
|
||||||
|
Map.put(acc, name, url)
|
||||||
|
else
|
||||||
|
acc
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
)
|
||||||
|
else
|
||||||
|
object
|
||||||
|
end
|
||||||
|
|
||||||
|
object
|
||||||
end
|
end
|
||||||
|
|
||||||
defp matched_emoji_checker(urls, shortcodes) do
|
defp matched_emoji_checker(urls, shortcodes) do
|
||||||
|
|
|
@ -389,4 +389,37 @@ test "processes status with history" do
|
||||||
} = filtered
|
} = filtered
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
Loading…
Reference in New Issue