Make NoEmptyPolicy work with Update

This commit is contained in:
Tusooa Zhu 2022-07-23 23:24:25 -04:00 committed by FloatingGhost
parent 1dfbf9edb6
commit 32baa9b9f0
4 changed files with 35 additions and 20 deletions

View file

@ -11,6 +11,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.NoEmptyPolicy do
@impl true @impl true
def filter(%{"actor" => actor} = object) do def filter(%{"actor" => actor} = object) do
with true <- is_local?(actor), with true <- is_local?(actor),
true <- is_eligible_type?(object),
true <- is_note?(object), true <- is_note?(object),
false <- has_attachment?(object), false <- has_attachment?(object),
true <- only_mentions?(object) do true <- only_mentions?(object) do
@ -32,7 +33,6 @@ defp is_local?(actor) do
end end
defp has_attachment?(%{ defp has_attachment?(%{
"type" => "Create",
"object" => %{"type" => "Note", "attachment" => attachments} "object" => %{"type" => "Note", "attachment" => attachments}
}) })
when length(attachments) > 0, when length(attachments) > 0,
@ -40,23 +40,13 @@ defp has_attachment?(%{
defp has_attachment?(_), do: false defp has_attachment?(_), do: false
defp only_mentions?(%{"type" => "Create", "object" => %{"type" => "Note", "source" => source}}) defp only_mentions?(%{"object" => %{"type" => "Note", "source" => source}}) do
when is_binary(source) do source =
non_mentions = case source do
source |> String.split() |> Enum.filter(&(not String.starts_with?(&1, "@"))) |> length %{"content" => text} -> text
_ -> source
if non_mentions > 0 do
false
else
true
end
end end
defp only_mentions?(%{
"type" => "Create",
"object" => %{"type" => "Note", "source" => %{"content" => source}}
})
when is_binary(source) do
non_mentions = non_mentions =
source |> String.split() |> Enum.filter(&(not String.starts_with?(&1, "@"))) |> length source |> String.split() |> Enum.filter(&(not String.starts_with?(&1, "@"))) |> length
@ -69,9 +59,12 @@ defp only_mentions?(%{
defp only_mentions?(_), do: false defp only_mentions?(_), do: false
defp is_note?(%{"type" => "Create", "object" => %{"type" => "Note"}}), do: true defp is_note?(%{"object" => %{"type" => "Note"}}), do: true
defp is_note?(_), do: false defp is_note?(_), do: false
defp is_eligible_type?(%{"type" => type}) when type in ["Create", "Update"], do: true
defp is_eligible_type?(_), do: false
@impl true @impl true
def describe, do: {:ok, %{}} def describe, do: {:ok, %{}}
end end

View file

@ -221,7 +221,6 @@ defp object(draft) do
|> Map.put("emoji", emoji) |> Map.put("emoji", emoji)
|> Map.put("source", %{ |> Map.put("source", %{
"content" => draft.status, "content" => draft.status,
"mediaType" => draft.params[:content_type]
"mediaType" => Utils.get_content_type(draft.params[:content_type]) "mediaType" => Utils.get_content_type(draft.params[:content_type])
}) })
|> Map.put("generator", draft.params[:generator]) |> Map.put("generator", draft.params[:generator])

View file

@ -153,4 +153,27 @@ test "Notes with no content are denied" do
assert NoEmptyPolicy.filter(message) == {:reject, "[NoEmptyPolicy]"} assert NoEmptyPolicy.filter(message) == {:reject, "[NoEmptyPolicy]"}
end end
test "works with Update" do
message = %{
"actor" => "http://localhost:4001/users/testuser",
"cc" => ["http://localhost:4001/users/testuser/followers"],
"object" => %{
"actor" => "http://localhost:4001/users/testuser",
"attachment" => [],
"cc" => ["http://localhost:4001/users/testuser/followers"],
"source" => "",
"to" => [
"https://www.w3.org/ns/activitystreams#Public"
],
"type" => "Note"
},
"to" => [
"https://www.w3.org/ns/activitystreams#Public"
],
"type" => "Update"
}
assert NoEmptyPolicy.filter(message) == {:reject, "[NoEmptyPolicy]"}
end
end end