forked from AkkomaGang/akkoma
MRF.ObjectAgePolicy: Check objects alongside Create activities
ObjectAgePolicy only checked Create activites, which still resulted in some old posts making it to user timelines, even when it was enabled. This fixes that issue by also checking objects of an updatable type as defined in `Pleroma.Constants.updatable_object_types`.
This commit is contained in:
parent
c0a99df06a
commit
50f7b6367f
3 changed files with 71 additions and 24 deletions
|
|
@ -43,17 +43,19 @@ defmodule Pleroma.Constants do
|
|||
]
|
||||
)
|
||||
|
||||
const(updatable_object_types,
|
||||
do: [
|
||||
"Note",
|
||||
"Question",
|
||||
"Audio",
|
||||
"Video",
|
||||
"Event",
|
||||
"Article",
|
||||
"Page"
|
||||
]
|
||||
)
|
||||
@updatable_object_types [
|
||||
"Note",
|
||||
"Question",
|
||||
"Audio",
|
||||
"Video",
|
||||
"Event",
|
||||
"Article",
|
||||
"Page"
|
||||
]
|
||||
|
||||
const(updatable_object_types, do: @updatable_object_types)
|
||||
|
||||
const(object_types, do: @updatable_object_types ++ ["Answer"])
|
||||
|
||||
const(actor_types,
|
||||
do: [
|
||||
|
|
|
|||
|
|
@ -11,12 +11,36 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy do
|
|||
@moduledoc "Filter activities depending on their age"
|
||||
@behaviour Pleroma.Web.ActivityPub.MRF.Policy
|
||||
|
||||
defp check_date(%{"object" => %{"published" => published}} = message) do
|
||||
defp update_to_cc(message, to, cc) do
|
||||
message =
|
||||
message
|
||||
|> Map.put("to", to)
|
||||
|> Map.put("cc", cc)
|
||||
|
||||
if Map.has_key?(message, "object") do
|
||||
message
|
||||
|> Kernel.put_in(["object", "to"], to)
|
||||
|> Kernel.put_in(["object", "cc"], cc)
|
||||
else
|
||||
message
|
||||
end
|
||||
end
|
||||
|
||||
defp check_date(%{"object" => %{"published" => _} = object} = activity) do
|
||||
with {:ok, object} <- check_date(object) do
|
||||
activity = activity |> Map.put("object", object)
|
||||
{:ok, activity}
|
||||
else
|
||||
e -> e
|
||||
end
|
||||
end
|
||||
|
||||
defp check_date(%{"published" => published} = object) do
|
||||
with %DateTime{} = now <- DateTime.utc_now(),
|
||||
{:ok, %DateTime{} = then, _} <- DateTime.from_iso8601(published),
|
||||
max_ttl <- Config.get([:mrf_object_age, :threshold]),
|
||||
{:ttl, false} <- {:ttl, DateTime.diff(now, then) > max_ttl} do
|
||||
{:ok, message}
|
||||
{:ok, object}
|
||||
else
|
||||
{:ttl, true} ->
|
||||
{:reject, nil}
|
||||
|
|
@ -47,10 +71,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy do
|
|||
|
||||
message =
|
||||
message
|
||||
|> Map.put("to", to)
|
||||
|> Map.put("cc", cc)
|
||||
|> Kernel.put_in(["object", "to"], to)
|
||||
|> Kernel.put_in(["object", "cc"], cc)
|
||||
|> update_to_cc(to, cc)
|
||||
|
||||
{:ok, message}
|
||||
else
|
||||
|
|
@ -70,10 +91,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy do
|
|||
|
||||
message =
|
||||
message
|
||||
|> Map.put("to", to)
|
||||
|> Map.put("cc", cc)
|
||||
|> Kernel.put_in(["object", "to"], to)
|
||||
|> Kernel.put_in(["object", "cc"], cc)
|
||||
|> update_to_cc(to, cc)
|
||||
|
||||
{:ok, message}
|
||||
else
|
||||
|
|
@ -85,11 +103,18 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy do
|
|||
end
|
||||
end
|
||||
|
||||
@impl true
|
||||
def filter(%{"type" => "Create", "object" => %{"published" => _}} = message) do
|
||||
defp maybe_check_reject(message, _actions, false) do
|
||||
{:ok, message}
|
||||
end
|
||||
|
||||
defp maybe_check_reject(message, actions, true) do
|
||||
check_reject(message, actions)
|
||||
end
|
||||
|
||||
defp check(message, allow_reject) do
|
||||
with actions <- Config.get([:mrf_object_age, :actions]),
|
||||
{:reject, _} <- check_date(message),
|
||||
{:ok, message} <- check_reject(message, actions),
|
||||
{:ok, message} <- maybe_check_reject(message, actions, allow_reject),
|
||||
{:ok, message} <- check_delist(message, actions),
|
||||
{:ok, message} <- check_strip_followers(message, actions) do
|
||||
{:ok, message}
|
||||
|
|
@ -99,6 +124,17 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy do
|
|||
end
|
||||
end
|
||||
|
||||
@impl true
|
||||
def filter(%{"type" => "Create", "object" => %{"published" => _}} = message) do
|
||||
check(message, true)
|
||||
end
|
||||
|
||||
@impl true
|
||||
def filter(%{"type" => type, "published" => _} = message)
|
||||
when type in Pleroma.Constants.object_types() do
|
||||
check(message, false)
|
||||
end
|
||||
|
||||
@impl true
|
||||
def filter(message), do: {:ok, message}
|
||||
|
||||
|
|
|
|||
|
|
@ -57,6 +57,15 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicyTest do
|
|||
assert match?({:reject, _}, ObjectAgePolicy.filter(data))
|
||||
end
|
||||
|
||||
test "it doesn't reject a fetched post" do
|
||||
clear_config([:mrf_object_age, :actions], [:reject])
|
||||
|
||||
data = get_old_message()
|
||||
object = data["object"]
|
||||
|
||||
assert match?({:ok, _}, ObjectAgePolicy.filter(object))
|
||||
end
|
||||
|
||||
test "it allows a new post" do
|
||||
clear_config([:mrf_object_age, :actions], [:reject])
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue