logo

pleroma

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

delete_validator.ex (1973B)


  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.DeleteValidator do
  5. use Ecto.Schema
  6. alias Pleroma.Activity
  7. alias Pleroma.EctoType.ActivityPub.ObjectValidators
  8. alias Pleroma.User
  9. import Ecto.Changeset
  10. import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations
  11. @primary_key false
  12. embedded_schema do
  13. quote do
  14. unquote do
  15. import Elixir.Pleroma.Web.ActivityPub.ObjectValidators.CommonFields
  16. message_fields()
  17. activity_fields()
  18. end
  19. end
  20. field(:deleted_activity_id, ObjectValidators.ObjectID)
  21. end
  22. def cast_data(data) do
  23. %__MODULE__{}
  24. |> cast(data, __schema__(:fields))
  25. end
  26. def add_deleted_activity_id(cng) do
  27. object =
  28. cng
  29. |> get_field(:object)
  30. with %Activity{id: id} <- Activity.get_create_by_object_ap_id(object) do
  31. cng
  32. |> put_change(:deleted_activity_id, id)
  33. else
  34. _ -> cng
  35. end
  36. end
  37. @deletable_types ~w{
  38. Answer
  39. Article
  40. Audio
  41. ChatMessage
  42. Event
  43. Note
  44. Page
  45. Question
  46. Tombstone
  47. Video
  48. }
  49. defp validate_data(cng) do
  50. cng
  51. |> validate_required([:id, :type, :actor, :to, :cc, :object])
  52. |> validate_inclusion(:type, ["Delete"])
  53. |> validate_delete_actor(:actor)
  54. |> validate_modification_rights(:messages_delete)
  55. |> validate_object_or_user_presence(allowed_types: @deletable_types)
  56. |> add_deleted_activity_id()
  57. end
  58. def do_not_federate?(cng) do
  59. !same_domain?(cng)
  60. end
  61. def cast_and_validate(data) do
  62. data
  63. |> cast_data
  64. |> validate_data
  65. end
  66. defp validate_delete_actor(cng, field_name) do
  67. validate_change(cng, field_name, fn field_name, actor ->
  68. case User.get_cached_by_ap_id(actor) do
  69. %User{} -> []
  70. _ -> [{field_name, "can't find user"}]
  71. end
  72. end)
  73. end
  74. end