logo

pleroma

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

create_chat_message_validator.ex (2430B)


  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. # NOTES
  5. # - Can probably be a generic create validator
  6. # - doesn't embed, will only get the object id
  7. defmodule Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator do
  8. use Ecto.Schema
  9. alias Pleroma.EctoType.ActivityPub.ObjectValidators
  10. alias Pleroma.Object
  11. import Ecto.Changeset
  12. import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations
  13. @primary_key false
  14. embedded_schema do
  15. quote do
  16. unquote do
  17. import Elixir.Pleroma.Web.ActivityPub.ObjectValidators.CommonFields
  18. activity_fields()
  19. end
  20. end
  21. field(:id, ObjectValidators.ObjectID, primary_key: true)
  22. field(:type, :string)
  23. field(:to, ObjectValidators.Recipients, default: [])
  24. end
  25. def cast_and_apply(data) do
  26. data
  27. |> cast_data
  28. |> apply_action(:insert)
  29. end
  30. def cast_data(data) do
  31. cast(%__MODULE__{}, data, __schema__(:fields))
  32. end
  33. def cast_and_validate(data, meta \\ []) do
  34. cast_data(data)
  35. |> validate_data(meta)
  36. end
  37. defp validate_data(cng, meta) do
  38. cng
  39. |> validate_required([:id, :actor, :to, :type, :object])
  40. |> validate_inclusion(:type, ["Create"])
  41. |> validate_actor_presence()
  42. |> validate_recipients_match(meta)
  43. |> validate_actors_match(meta)
  44. |> validate_object_nonexistence()
  45. end
  46. def validate_object_nonexistence(cng) do
  47. cng
  48. |> validate_change(:object, fn :object, object_id ->
  49. if Object.get_cached_by_ap_id(object_id) do
  50. [{:object, "The object to create already exists"}]
  51. else
  52. []
  53. end
  54. end)
  55. end
  56. def validate_actors_match(cng, meta) do
  57. object_actor = meta[:object_data]["actor"]
  58. cng
  59. |> validate_change(:actor, fn :actor, actor ->
  60. if actor == object_actor do
  61. []
  62. else
  63. [{:actor, "Actor doesn't match with object actor"}]
  64. end
  65. end)
  66. end
  67. def validate_recipients_match(cng, meta) do
  68. object_recipients = meta[:object_data]["to"] || []
  69. cng
  70. |> validate_change(:to, fn :to, recipients ->
  71. activity_set = MapSet.new(recipients)
  72. object_set = MapSet.new(object_recipients)
  73. if MapSet.equal?(activity_set, object_set) do
  74. []
  75. else
  76. [{:to, "Recipients don't match with object recipients"}]
  77. end
  78. end)
  79. end
  80. end