Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
1.6KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.ActivityPub.ObjectValidators.UndoValidator do
  5. use Ecto.Schema
  6. alias Pleroma.Activity
  7. alias Pleroma.EctoType.ActivityPub.ObjectValidators
  8. import Ecto.Changeset
  9. import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations
  10. @primary_key false
  11. embedded_schema do
  12. field(:id, ObjectValidators.ObjectID, primary_key: true)
  13. field(:type, :string)
  14. field(:object, ObjectValidators.ObjectID)
  15. field(:actor, ObjectValidators.ObjectID)
  16. field(:to, ObjectValidators.Recipients, default: [])
  17. field(:cc, ObjectValidators.Recipients, default: [])
  18. end
  19. def cast_and_validate(data) do
  20. data
  21. |> cast_data()
  22. |> validate_data()
  23. end
  24. def cast_data(data) do
  25. %__MODULE__{}
  26. |> changeset(data)
  27. end
  28. def changeset(struct, data) do
  29. struct
  30. |> cast(data, __schema__(:fields))
  31. end
  32. defp validate_data(data_cng) do
  33. data_cng
  34. |> validate_inclusion(:type, ["Undo"])
  35. |> validate_required([:id, :type, :object, :actor, :to, :cc])
  36. |> validate_actor_presence()
  37. |> validate_object_presence()
  38. |> validate_undo_rights()
  39. end
  40. def validate_undo_rights(cng) do
  41. actor = get_field(cng, :actor)
  42. object = get_field(cng, :object)
  43. with %Activity{data: %{"actor" => object_actor}} <- Activity.get_by_ap_id(object),
  44. true <- object_actor != actor do
  45. cng
  46. |> add_error(:actor, "not the same as object actor")
  47. else
  48. _ -> cng
  49. end
  50. end
  51. end