logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

tag_policy.ex (4584B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.ActivityPub.MRF.TagPolicy do
  5. alias Pleroma.User
  6. @behaviour Pleroma.Web.ActivityPub.MRF.Policy
  7. @moduledoc """
  8. Apply policies based on user tags
  9. This policy applies policies on a user activities depending on their tags
  10. on your instance.
  11. - `mrf_tag:media-force-nsfw`: Mark as sensitive on presence of attachments
  12. - `mrf_tag:media-strip`: Remove attachments
  13. - `mrf_tag:force-unlisted`: Mark as unlisted (removes from the federated timeline)
  14. - `mrf_tag:sandbox`: Remove from public (local and federated) timelines
  15. - `mrf_tag:disable-remote-subscription`: Reject non-local follow requests
  16. - `mrf_tag:disable-any-subscription`: Reject any follow requests
  17. """
  18. require Pleroma.Constants
  19. defp get_tags(%User{tags: tags}) when is_list(tags), do: tags
  20. defp get_tags(_), do: []
  21. defp process_tag(
  22. "mrf_tag:media-force-nsfw",
  23. %{
  24. "type" => type,
  25. "object" => %{"attachment" => child_attachment}
  26. } = message
  27. )
  28. when length(child_attachment) > 0 and type in ["Create", "Update"] do
  29. {:ok, Kernel.put_in(message, ["object", "sensitive"], true)}
  30. end
  31. defp process_tag(
  32. "mrf_tag:media-strip",
  33. %{
  34. "type" => type,
  35. "object" => %{"attachment" => child_attachment} = object
  36. } = message
  37. )
  38. when length(child_attachment) > 0 and type in ["Create", "Update"] do
  39. object = Map.delete(object, "attachment")
  40. message = Map.put(message, "object", object)
  41. {:ok, message}
  42. end
  43. defp process_tag(
  44. "mrf_tag:force-unlisted",
  45. %{
  46. "type" => "Create",
  47. "to" => to,
  48. "cc" => cc,
  49. "actor" => actor,
  50. "object" => object
  51. } = message
  52. ) do
  53. user = User.get_cached_by_ap_id(actor)
  54. if Enum.member?(to, Pleroma.Constants.as_public()) do
  55. to = List.delete(to, Pleroma.Constants.as_public()) ++ [user.follower_address]
  56. cc = List.delete(cc, user.follower_address) ++ [Pleroma.Constants.as_public()]
  57. object =
  58. object
  59. |> Map.put("to", to)
  60. |> Map.put("cc", cc)
  61. message =
  62. message
  63. |> Map.put("to", to)
  64. |> Map.put("cc", cc)
  65. |> Map.put("object", object)
  66. {:ok, message}
  67. else
  68. {:ok, message}
  69. end
  70. end
  71. defp process_tag(
  72. "mrf_tag:sandbox",
  73. %{
  74. "type" => "Create",
  75. "to" => to,
  76. "cc" => cc,
  77. "actor" => actor,
  78. "object" => object
  79. } = message
  80. ) do
  81. user = User.get_cached_by_ap_id(actor)
  82. if Enum.member?(to, Pleroma.Constants.as_public()) or
  83. Enum.member?(cc, Pleroma.Constants.as_public()) do
  84. to = List.delete(to, Pleroma.Constants.as_public()) ++ [user.follower_address]
  85. cc = List.delete(cc, Pleroma.Constants.as_public())
  86. object =
  87. object
  88. |> Map.put("to", to)
  89. |> Map.put("cc", cc)
  90. message =
  91. message
  92. |> Map.put("to", to)
  93. |> Map.put("cc", cc)
  94. |> Map.put("object", object)
  95. {:ok, message}
  96. else
  97. {:ok, message}
  98. end
  99. end
  100. defp process_tag(
  101. "mrf_tag:disable-remote-subscription",
  102. %{"type" => "Follow", "actor" => actor} = message
  103. ) do
  104. user = User.get_cached_by_ap_id(actor)
  105. if user.local == true do
  106. {:ok, message}
  107. else
  108. {:reject,
  109. "[TagPolicy] Follow from #{actor} tagged with mrf_tag:disable-remote-subscription"}
  110. end
  111. end
  112. defp process_tag("mrf_tag:disable-any-subscription", %{"type" => "Follow", "actor" => actor}),
  113. do: {:reject, "[TagPolicy] Follow from #{actor} tagged with mrf_tag:disable-any-subscription"}
  114. defp process_tag(_, message), do: {:ok, message}
  115. def filter_message(actor, message) do
  116. User.get_cached_by_ap_id(actor)
  117. |> get_tags()
  118. |> Enum.reduce({:ok, message}, fn
  119. tag, {:ok, message} ->
  120. process_tag(tag, message)
  121. _, error ->
  122. error
  123. end)
  124. end
  125. @impl true
  126. def filter(%{"object" => target_actor, "type" => "Follow"} = message),
  127. do: filter_message(target_actor, message)
  128. @impl true
  129. def filter(%{"actor" => actor, "type" => type} = message) when type in ["Create", "Update"],
  130. do: filter_message(actor, message)
  131. @impl true
  132. def filter(message), do: {:ok, message}
  133. @impl true
  134. def describe, do: {:ok, %{}}
  135. end