logo

pleroma

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

receiver_worker.ex (2022B)


  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.Workers.ReceiverWorker do
  5. alias Pleroma.Signature
  6. alias Pleroma.User
  7. alias Pleroma.Web.Federator
  8. use Pleroma.Workers.WorkerHelper, queue: "federator_incoming"
  9. @impl Oban.Worker
  10. def perform(%Job{
  11. args: %{"op" => "incoming_ap_doc", "req_headers" => req_headers, "params" => params}
  12. }) do
  13. # Oban's serialization converts our tuple headers to lists.
  14. # Revert it for the signature validation.
  15. req_headers = Enum.into(req_headers, [], &List.to_tuple(&1))
  16. conn_data = %{params: params, req_headers: req_headers}
  17. with {:ok, %User{} = _actor} <- User.get_or_fetch_by_ap_id(conn_data.params["actor"]),
  18. {:ok, _public_key} <- Signature.refetch_public_key(conn_data),
  19. {:signature, true} <- {:signature, HTTPSignatures.validate_conn(conn_data)},
  20. {:ok, res} <- Federator.perform(:incoming_ap_doc, params) do
  21. {:ok, res}
  22. else
  23. e -> process_errors(e)
  24. end
  25. end
  26. def perform(%Job{args: %{"op" => "incoming_ap_doc", "params" => params}}) do
  27. with {:ok, res} <- Federator.perform(:incoming_ap_doc, params) do
  28. {:ok, res}
  29. else
  30. e -> process_errors(e)
  31. end
  32. end
  33. @impl Oban.Worker
  34. def timeout(%_{args: %{"timeout" => timeout}}), do: timeout
  35. def timeout(_job), do: :timer.seconds(5)
  36. defp process_errors(errors) do
  37. case errors do
  38. {:error, :origin_containment_failed} -> {:cancel, :origin_containment_failed}
  39. {:error, :already_present} -> {:cancel, :already_present}
  40. {:error, {:validate_object, reason}} -> {:cancel, reason}
  41. {:error, {:error, {:validate, reason}}} -> {:cancel, reason}
  42. {:error, {:reject, reason}} -> {:cancel, reason}
  43. {:signature, false} -> {:cancel, :invalid_signature}
  44. {:error, {:error, reason = "Object has been deleted"}} -> {:cancel, reason}
  45. e -> e
  46. end
  47. end
  48. end