logo

pleroma

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

undo_validator.ex (1724B)


  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.ObjectValidators.UndoValidator do
  5. use Ecto.Schema
  6. alias Pleroma.Activity
  7. alias Pleroma.User
  8. import Ecto.Changeset
  9. import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations
  10. @primary_key false
  11. embedded_schema do
  12. quote do
  13. unquote do
  14. import Elixir.Pleroma.Web.ActivityPub.ObjectValidators.CommonFields
  15. message_fields()
  16. activity_fields()
  17. end
  18. end
  19. end
  20. def cast_and_validate(data) do
  21. data
  22. |> cast_data()
  23. |> validate_data()
  24. end
  25. def cast_data(data) do
  26. %__MODULE__{}
  27. |> changeset(data)
  28. end
  29. def changeset(struct, data) do
  30. struct
  31. |> cast(data, __schema__(:fields))
  32. end
  33. defp validate_data(data_cng) do
  34. data_cng
  35. |> validate_inclusion(:type, ["Undo"])
  36. |> validate_required([:id, :type, :object, :actor, :to, :cc])
  37. |> validate_undo_actor(:actor)
  38. |> validate_object_presence()
  39. |> validate_undo_rights()
  40. end
  41. def validate_undo_rights(cng) do
  42. actor = get_field(cng, :actor)
  43. object = get_field(cng, :object)
  44. with %Activity{data: %{"actor" => object_actor}} <- Activity.get_by_ap_id(object),
  45. true <- object_actor != actor do
  46. cng
  47. |> add_error(:actor, "not the same as object actor")
  48. else
  49. _ -> cng
  50. end
  51. end
  52. defp validate_undo_actor(cng, field_name) do
  53. validate_change(cng, field_name, fn field_name, actor ->
  54. case User.get_cached_by_ap_id(actor) do
  55. %User{} -> []
  56. _ -> [{field_name, "can't find user"}]
  57. end
  58. end)
  59. end
  60. end