62 lines
1.5 KiB
Elixir
62 lines
1.5 KiB
Elixir
|
# Pleroma: A lightweight social networking server
|
||
|
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
|
||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||
|
|
||
|
defmodule Pleroma.Web.ActivityPub.MRF.NoEmptyPolicy do
|
||
|
@moduledoc "Filter local activities which have no content"
|
||
|
@behaviour Pleroma.Web.ActivityPub.MRF
|
||
|
|
||
|
alias Pleroma.Web
|
||
|
|
||
|
@impl true
|
||
|
def filter(%{"actor" => actor} = object) do
|
||
|
with true <- is_local?(actor),
|
||
|
true <- is_note?(object),
|
||
|
false <- has_attachment?(object),
|
||
|
true <- only_mentions?(object) do
|
||
|
{:reject, "[NoEmptyPolicy]"}
|
||
|
else
|
||
|
_ ->
|
||
|
{:ok, object}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def filter(object), do: {:ok, object}
|
||
|
|
||
|
defp is_local?(actor) do
|
||
|
if actor |> String.starts_with?("#{Web.base_url()}") do
|
||
|
true
|
||
|
else
|
||
|
false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
defp has_attachment?(%{
|
||
|
"type" => "Create",
|
||
|
"object" => %{"type" => "Note", "attachment" => attachments}
|
||
|
})
|
||
|
when length(attachments) > 0,
|
||
|
do: true
|
||
|
|
||
|
defp has_attachment?(_), do: false
|
||
|
|
||
|
defp only_mentions?(%{"type" => "Create", "object" => %{"type" => "Note", "source" => source}}) do
|
||
|
non_mentions =
|
||
|
source |> String.split() |> Enum.filter(&(not String.starts_with?(&1, "@"))) |> length
|
||
|
|
||
|
if non_mentions > 0 do
|
||
|
false
|
||
|
else
|
||
|
true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
defp only_mentions?(_), do: false
|
||
|
|
||
|
defp is_note?(%{"type" => "Create", "object" => %{"type" => "Note"}}), do: true
|
||
|
defp is_note?(_), do: false
|
||
|
|
||
|
@impl true
|
||
|
def describe, do: {:ok, %{}}
|
||
|
end
|