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.

92 lines
2.3KB

  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. # 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. field(:id, ObjectValidators.ObjectID, primary_key: true)
  16. field(:actor, ObjectValidators.ObjectID)
  17. field(:type, :string)
  18. field(:to, ObjectValidators.Recipients, default: [])
  19. field(:object, ObjectValidators.ObjectID)
  20. end
  21. def cast_and_apply(data) do
  22. data
  23. |> cast_data
  24. |> apply_action(:insert)
  25. end
  26. def cast_data(data) do
  27. cast(%__MODULE__{}, data, __schema__(:fields))
  28. end
  29. def cast_and_validate(data, meta \\ []) do
  30. cast_data(data)
  31. |> validate_data(meta)
  32. end
  33. defp validate_data(cng, meta) do
  34. cng
  35. |> validate_required([:id, :actor, :to, :type, :object])
  36. |> validate_inclusion(:type, ["Create"])
  37. |> validate_actor_presence()
  38. |> validate_recipients_match(meta)
  39. |> validate_actors_match(meta)
  40. |> validate_object_nonexistence()
  41. end
  42. def validate_object_nonexistence(cng) do
  43. cng
  44. |> validate_change(:object, fn :object, object_id ->
  45. if Object.get_cached_by_ap_id(object_id) do
  46. [{:object, "The object to create already exists"}]
  47. else
  48. []
  49. end
  50. end)
  51. end
  52. def validate_actors_match(cng, meta) do
  53. object_actor = meta[:object_data]["actor"]
  54. cng
  55. |> validate_change(:actor, fn :actor, actor ->
  56. if actor == object_actor do
  57. []
  58. else
  59. [{:actor, "Actor doesn't match with object actor"}]
  60. end
  61. end)
  62. end
  63. def validate_recipients_match(cng, meta) do
  64. object_recipients = meta[:object_data]["to"] || []
  65. cng
  66. |> validate_change(:to, fn :to, recipients ->
  67. activity_set = MapSet.new(recipients)
  68. object_set = MapSet.new(object_recipients)
  69. if MapSet.equal?(activity_set, object_set) do
  70. []
  71. else
  72. [{:to, "Recipients don't match with object recipients"}]
  73. end
  74. end)
  75. end
  76. end