diff options
| author | Haelwenn (lanodan) Monnier <contact@hacktivis.me> | 2020-06-11 20:43:01 +0200 | 
|---|---|---|
| committer | Haelwenn (lanodan) Monnier <contact@hacktivis.me> | 2020-07-15 11:39:54 +0200 | 
| commit | c5efaf6b00bf582a6eef7b5728fe5042f5fcc702 (patch) | |
| tree | ba1d4bd8314f89b6994f8b9ee842e3c1f76b0f14 | |
| parent | 7bcd7a959519ea023b075142aa36005f80503ba4 (diff) | |
| download | pleroma-c5efaf6b00bf582a6eef7b5728fe5042f5fcc702.tar.gz pleroma-c5efaf6b00bf582a6eef7b5728fe5042f5fcc702.zip  | |
AnswerValidator: Create
4 files changed, 81 insertions, 6 deletions
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 462aa57a6..d8cc8d24f 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -95,7 +95,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do    defp increase_poll_votes_if_vote(_create_data), do: :noop -  @object_types ["ChatMessage", "Question"] +  @object_types ["ChatMessage", "Question", "Answer"]    @spec persist(map(), keyword()) :: {:ok, Activity.t() | Object.t()}    def persist(%{"type" => type} = object, meta) when type in @object_types do      with {:ok, object} <- Object.create(object) do diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 5cc66d7bd..c89311187 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -13,6 +13,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do    alias Pleroma.Object    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator +  alias Pleroma.Web.ActivityPub.ObjectValidators.AnswerValidator    alias Pleroma.Web.ActivityPub.ObjectValidators.BlockValidator    alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator    alias Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator @@ -117,6 +118,16 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do      end    end +  def validate(%{"type" => "Answer"} = object, meta) do +    with {:ok, object} <- +           object +           |> AnswerValidator.cast_and_validate() +           |> Ecto.Changeset.apply_action(:insert) do +      object = stringify_keys(object) +      {:ok, object, meta} +    end +  end +    def validate(%{"type" => "EmojiReact"} = object, meta) do      with {:ok, object} <-             object @@ -143,9 +154,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do    end    def validate( -        %{"type" => "Create", "object" => %{"type" => "Question"} = object} = create_activity, +        %{"type" => "Create", "object" => %{"type" => objtype} = object} = create_activity,          meta -      ) do +      ) +      when objtype in ["Question", "Answer"] do      with {:ok, object_data} <- cast_and_apply(object),           meta = Keyword.put(meta, :object_data, object_data |> stringify_keys),           {:ok, create_activity} <- @@ -175,6 +187,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do      QuestionValidator.cast_and_apply(object)    end +  def cast_and_apply(%{"type" => "Answer"} = object) do +    QuestionValidator.cast_and_apply(object) +  end +    def cast_and_apply(o), do: {:error, {:validator_not_set, o}}    # is_struct/1 isn't present in Elixir 1.8.x diff --git a/lib/pleroma/web/activity_pub/object_validators/answer_validator.ex b/lib/pleroma/web/activity_pub/object_validators/answer_validator.ex new file mode 100644 index 000000000..0b51eccfa --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/answer_validator.ex @@ -0,0 +1,58 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.AnswerValidator do +  use Ecto.Schema + +  alias Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations +  alias Pleroma.Web.ActivityPub.ObjectValidators.Types + +  import Ecto.Changeset + +  @primary_key false +  @derive Jason.Encoder + +  # Extends from NoteValidator +  embedded_schema do +    field(:id, Types.ObjectID, primary_key: true) +    field(:to, {:array, :string}, default: []) +    field(:cc, {:array, :string}, default: []) +    field(:bto, {:array, :string}, default: []) +    field(:bcc, {:array, :string}, default: []) +    field(:type, :string) +    field(:name, :string) +    field(:inReplyTo, :string) +    field(:attributedTo, Types.ObjectID) +  end + +  def cast_and_apply(data) do +    data +    |> cast_data +    |> apply_action(:insert) +  end + +  def cast_and_validate(data) do +    data +    |> cast_data() +    |> validate_data() +  end + +  def cast_data(data) do +    %__MODULE__{} +    |> changeset(data) +  end + +  def changeset(struct, data) do +    struct +    |> cast(data, __schema__(:fields)) +  end + +  def validate_data(data_cng) do +    data_cng +    |> validate_inclusion(:type, ["Answer"]) +    |> validate_required([:id, :inReplyTo, :name]) +    |> CommonValidations.validate_any_presence([:cc, :to]) +    |> CommonValidations.validate_actor_presence() +  end +end diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index da5dc23bc..9900602e4 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -457,7 +457,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do          %{"type" => "Create", "object" => %{"type" => objtype} = object} = data,          options        ) -      when objtype in ["Article", "Event", "Note", "Video", "Page", "Answer", "Audio"] do +      when objtype in ["Article", "Event", "Note", "Video", "Page", "Audio"] do      actor = Containment.get_actor(data)      with nil <- Activity.get_create_by_object_ap_id(object["id"]), @@ -614,9 +614,10 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do    end    def handle_incoming( -        %{"type" => "Create", "object" => %{"type" => "Question"} = object} = data, +        %{"type" => "Create", "object" => %{"type" => objtype} = object} = data,          _options -      ) do +      ) +      when objtype in ["Question", "Answer"] do      data =        data        |> Map.put("object", fix_object(object))  | 
