logo

pleroma

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

pipeline.ex (2908B)


  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.Pipeline do
  5. alias Pleroma.Activity
  6. alias Pleroma.Config
  7. alias Pleroma.Object
  8. alias Pleroma.Repo
  9. alias Pleroma.Utils
  10. alias Pleroma.Web.ActivityPub.ActivityPub
  11. alias Pleroma.Web.ActivityPub.MRF
  12. alias Pleroma.Web.ActivityPub.ObjectValidator
  13. alias Pleroma.Web.ActivityPub.SideEffects
  14. alias Pleroma.Web.ActivityPub.Visibility
  15. alias Pleroma.Web.Federator
  16. defp side_effects, do: Config.get([:pipeline, :side_effects], SideEffects)
  17. defp federator, do: Config.get([:pipeline, :federator], Federator)
  18. defp object_validator, do: Config.get([:pipeline, :object_validator], ObjectValidator)
  19. defp mrf, do: Config.get([:pipeline, :mrf], MRF)
  20. defp activity_pub, do: Config.get([:pipeline, :activity_pub], ActivityPub)
  21. defp config, do: Config.get([:pipeline, :config], Config)
  22. @spec common_pipeline(map(), keyword()) ::
  23. {:ok, Activity.t() | Object.t(), keyword()} | {:error, any()}
  24. def common_pipeline(object, meta) do
  25. case Repo.transaction(fn -> do_common_pipeline(object, meta) end, Utils.query_timeout()) do
  26. {:ok, {:ok, activity, meta}} ->
  27. side_effects().handle_after_transaction(meta)
  28. {:ok, activity, meta}
  29. {:ok, value} ->
  30. value
  31. {:error, e} ->
  32. {:error, e}
  33. {:reject, e} ->
  34. {:reject, e}
  35. end
  36. end
  37. def do_common_pipeline(%{__struct__: _}, _meta), do: {:error, :is_struct}
  38. def do_common_pipeline(message, meta) do
  39. with {_, {:ok, message, meta}} <- {:validate, object_validator().validate(message, meta)},
  40. {_, {:ok, message, meta}} <- {:mrf, mrf().pipeline_filter(message, meta)},
  41. {_, {:ok, message, meta}} <- {:persist, activity_pub().persist(message, meta)},
  42. {_, {:ok, message, meta}} <- {:side_effects, side_effects().handle(message, meta)},
  43. {_, {:ok, _}} <- {:federation, maybe_federate(message, meta)} do
  44. {:ok, message, meta}
  45. else
  46. {:mrf, {:reject, message, _}} -> {:reject, message}
  47. e -> {:error, e}
  48. end
  49. end
  50. defp maybe_federate(%Object{}, _), do: {:ok, :not_federated}
  51. defp maybe_federate(%Activity{} = activity, meta) do
  52. with {:ok, local} <- Keyword.fetch(meta, :local) do
  53. do_not_federate = meta[:do_not_federate] || !config().get([:instance, :federating])
  54. if !do_not_federate and local and not Visibility.local_public?(activity) do
  55. activity =
  56. if object = Keyword.get(meta, :object_data) do
  57. %{activity | data: Map.put(activity.data, "object", object)}
  58. else
  59. activity
  60. end
  61. federator().publish(activity)
  62. {:ok, :federated}
  63. else
  64. {:ok, :not_federated}
  65. end
  66. else
  67. _e -> {:error, :badarg}
  68. end
  69. end
  70. end