logo

pleroma

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

tag_validator.ex (2293B)


  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.TagValidator do
  5. use Ecto.Schema
  6. alias Pleroma.EctoType.ActivityPub.ObjectValidators
  7. import Ecto.Changeset
  8. require Pleroma.Constants
  9. @primary_key false
  10. embedded_schema do
  11. # Common
  12. field(:type, :string)
  13. field(:name, :string)
  14. # Mention, Hashtag, Link
  15. field(:href, ObjectValidators.Uri)
  16. # Link
  17. field(:mediaType, :string)
  18. # Emoji
  19. embeds_one :icon, IconObjectValidator, primary_key: false do
  20. field(:type, :string)
  21. field(:url, ObjectValidators.Uri)
  22. end
  23. field(:updated, ObjectValidators.DateTime)
  24. field(:id, ObjectValidators.Uri)
  25. end
  26. def cast_and_validate(data) do
  27. data
  28. |> cast_data()
  29. end
  30. def cast_data(data) do
  31. %__MODULE__{}
  32. |> changeset(data)
  33. end
  34. def changeset(struct, %{"type" => "Mention"} = data) do
  35. struct
  36. |> cast(data, [:type, :name, :href])
  37. |> validate_required([:type, :href])
  38. end
  39. def changeset(struct, %{"type" => "Hashtag", "name" => name} = data) do
  40. name =
  41. cond do
  42. "#" <> name -> name
  43. name -> name
  44. end
  45. |> String.downcase()
  46. data = Map.put(data, "name", name)
  47. struct
  48. |> cast(data, [:type, :name, :href])
  49. |> validate_required([:type, :name])
  50. end
  51. def changeset(struct, %{"type" => "Emoji"} = data) do
  52. data = Map.put(data, "name", String.trim(data["name"], ":"))
  53. struct
  54. |> cast(data, [:type, :name, :updated, :id])
  55. |> cast_embed(:icon, with: &icon_changeset/2)
  56. |> validate_required([:type, :name, :icon])
  57. end
  58. def changeset(struct, %{"type" => "Link"} = data) do
  59. struct
  60. |> cast(data, [:type, :name, :mediaType, :href])
  61. |> validate_inclusion(:mediaType, Pleroma.Constants.activity_json_mime_types())
  62. |> validate_required([:type, :href, :mediaType])
  63. end
  64. def changeset(struct, %{"type" => _} = data) do
  65. struct
  66. |> cast(data, [])
  67. |> Map.put(:action, :ignore)
  68. end
  69. def icon_changeset(struct, data) do
  70. struct
  71. |> cast(data, [:type, :url])
  72. |> validate_inclusion(:type, ~w[Image])
  73. |> validate_required([:type, :url])
  74. end
  75. end