From a1fd83164df0fa9e6d8ded81e8b0d11c3f980427 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Wed, 6 May 2020 03:35:58 +0200 Subject: Add AttachmentValidator for NoteValidator --- .../object_validators/attachment_validator.ex | 73 ++++++++++++++++++++++ .../object_validators/note_validator.ex | 7 ++- 2 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex diff --git a/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex new file mode 100644 index 000000000..b4f687f74 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex @@ -0,0 +1,73 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator do + use Ecto.Schema + + alias Pleroma.Web.ActivityPub.ObjectValidators + alias Pleroma.Web.ActivityPub.ObjectValidators.Types + + import Ecto.Changeset + + @primary_key false + + embedded_schema do + embeds_one(:url, ObjectValidators.AttachmentURLValidator) + field(:mediaType, :string) + field(:type, :string) + field(:name, :string) + end + + def cast_and_validate(data) do + data + |> cast_data() + |> validate_data() + end + + def cast_data(data) do + %__MODULE__{} + |> cast(data, __schema__(:fields)) + end + + def validate_data(data_cng) do + data_cng + |> validate_inclusion(:type, ["Audio", "Video", "Image", "Document", "Link"]) + |> validate_format(:mediaType, ~r[.+/.+]) + |> validate_required([:url]) + end +end + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.AttachmentURLValidator do + use Ecto.Schema + + alias Pleroma.Web.ActivityPub.ObjectValidators.Types + + import Ecto.Changeset + + @primary_key false + + embedded_schema do + field(:href, Types.Uri) + field(:mediaType, :string) + field(:type, :string) + end + + def cast_and_validate(data) do + data + |> cast_data() + |> validate_data() + end + + def cast_data(data) do + %__MODULE__{} + |> cast(data, __schema__(:fields)) + end + + def validate_data(data_cng) do + data_cng + |> validate_inclusion(:type, ["Audio", "Video", "Image", "Link"]) + |> validate_format(:mediaType, ~r[.+/.+]) + |> validate_required([:href]) + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex b/lib/pleroma/web/activity_pub/object_validators/note_validator.ex index 462a5620a..2396257c5 100644 --- a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/note_validator.ex @@ -5,6 +5,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do use Ecto.Schema + alias Pleroma.Web.ActivityPub.ObjectValidators alias Pleroma.Web.ActivityPub.ObjectValidators.Types import Ecto.Changeset @@ -29,8 +30,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do # TODO: Write type field(:emoji, :map, default: %{}) field(:sensitive, :boolean, default: false) - # TODO: Write type - field(:attachment, {:array, :map}, default: []) + embeds_many(:attachment, ObjectValidators.AttachmentValidator) field(:replies_count, :integer, default: 0) field(:like_count, :integer, default: 0) field(:announcement_count, :integer, default: 0) @@ -53,7 +53,8 @@ def cast_and_validate(data) do def cast_data(data) do %__MODULE__{} - |> cast(data, __schema__(:fields)) + |> cast(data, __schema__(:fields) -- [:attachment]) + |> cast_embed(:attachment) end def validate_data(data_cng) do -- cgit v1.2.3