MRF.ForceFollowersOnlyReplyDirectPolicy

Force replies to followers-only posts to always be direct
This commit is contained in:
Mark Felder 2024-03-15 15:10:45 -04:00
parent df7a8d4efe
commit 4ef6b3c9bf

View file

@ -0,0 +1,54 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2024 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.ActivityPub.MRF.ForceFollowersOnlyReplyDirectPolicy do
@moduledoc "Forces direct scope on replies to followers-only activites"
alias Pleroma.User
@behaviour Pleroma.Web.ActivityPub.MRF.Policy
@impl true
def filter(%{"type" => type, "object" => %{"inReplyTo" => parent_post_ap_id}} = activity)
when type in ["Create", "Update"] do
reply_user = User.get_cached_by_ap_id(activity["actor"])
if followers_only?(parent_post_ap_id) do
direct_to = activity["to"] -- [reply_user.follower_address]
activity =
activity
|> Map.put("cc", [])
|> Map.put("to", direct_to)
|> Map.put("directMessage", true)
|> put_in(["object", "cc"], [])
|> put_in(["object", "to"], direct_to)
{:ok, activity}
else
{:ok, activity}
end
end
@impl true
def filter(activity), do: {:ok, activity}
@impl true
def describe, do: {:ok, %{}}
defp followers_only?(parent_ap_id) do
with %Pleroma.Object{} = object <- Pleroma.Object.get_by_ap_id(parent_ap_id),
object_data <- Map.get(object, :data),
%Pleroma.User{} = user <- User.get_cached_by_ap_id(object_data["actor"]) do
if user.follower_address in object_data["to"] do
true
else
false
end
else
_ ->
false
end
end
end