logo

pleroma

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

article_note_page_validator.ex (3328B)


  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.ArticleNotePageValidator do
  5. use Ecto.Schema
  6. alias Pleroma.EctoType.ActivityPub.ObjectValidators
  7. alias Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes
  8. alias Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations
  9. alias Pleroma.Web.ActivityPub.Transmogrifier
  10. import Ecto.Changeset
  11. @primary_key false
  12. @derive Jason.Encoder
  13. embedded_schema do
  14. quote do
  15. unquote do
  16. import Elixir.Pleroma.Web.ActivityPub.ObjectValidators.CommonFields
  17. message_fields()
  18. object_fields()
  19. status_object_fields()
  20. end
  21. end
  22. field(:replies, {:array, ObjectValidators.ObjectID}, default: [])
  23. end
  24. def cast_and_apply(data) do
  25. data
  26. |> cast_data
  27. |> apply_action(:insert)
  28. end
  29. def cast_and_validate(data) do
  30. data
  31. |> cast_data()
  32. |> validate_data()
  33. end
  34. def cast_data(data) do
  35. %__MODULE__{}
  36. |> changeset(data)
  37. end
  38. defp fix_url(%{"url" => url} = data) when is_bitstring(url), do: data
  39. defp fix_url(%{"url" => url} = data) when is_map(url), do: Map.put(data, "url", url["href"])
  40. defp fix_url(data), do: data
  41. defp fix_tag(%{"tag" => tag} = data) when is_list(tag) do
  42. Map.put(data, "tag", Enum.filter(tag, &is_map/1))
  43. end
  44. defp fix_tag(%{"tag" => tag} = data) when is_map(tag), do: Map.put(data, "tag", [tag])
  45. defp fix_tag(data), do: Map.drop(data, ["tag"])
  46. defp fix_replies(%{"replies" => %{"first" => %{"items" => replies}}} = data)
  47. when is_list(replies),
  48. do: Map.put(data, "replies", replies)
  49. defp fix_replies(%{"replies" => %{"items" => replies}} = data) when is_list(replies),
  50. do: Map.put(data, "replies", replies)
  51. # TODO: Pleroma does not have any support for Collections at the moment.
  52. # If the `replies` field is not something the ObjectID validator can handle,
  53. # the activity/object would be rejected, which is bad behavior.
  54. defp fix_replies(%{"replies" => replies} = data) when not is_list(replies),
  55. do: Map.drop(data, ["replies"])
  56. defp fix_replies(data), do: data
  57. def fix_attachments(%{"attachment" => attachment} = data) when is_map(attachment),
  58. do: Map.put(data, "attachment", [attachment])
  59. def fix_attachments(data), do: data
  60. defp fix(data) do
  61. data
  62. |> CommonFixes.fix_actor()
  63. |> CommonFixes.fix_object_defaults()
  64. |> fix_url()
  65. |> fix_tag()
  66. |> fix_replies()
  67. |> fix_attachments()
  68. |> CommonFixes.fix_quote_url()
  69. |> Transmogrifier.fix_emoji()
  70. |> Transmogrifier.fix_content_map()
  71. end
  72. def changeset(struct, data) do
  73. data = fix(data)
  74. struct
  75. |> cast(data, __schema__(:fields) -- [:attachment, :tag])
  76. |> cast_embed(:attachment)
  77. |> cast_embed(:tag)
  78. end
  79. defp validate_data(data_cng) do
  80. data_cng
  81. |> validate_inclusion(:type, ["Article", "Note", "Page"])
  82. |> validate_required([:id, :actor, :attributedTo, :type, :context, :published])
  83. |> CommonValidations.validate_any_presence([:cc, :to])
  84. |> CommonValidations.validate_fields_match([:actor, :attributedTo])
  85. |> CommonValidations.validate_actor_presence()
  86. |> CommonValidations.validate_host_match()
  87. end
  88. end