diff options
| -rw-r--r-- | lib/pleroma/web/activity_pub/builder.ex | 15 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/object_validator.ex | 11 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/object_validators/update_validator.ex | 43 | ||||
| -rw-r--r-- | test/web/activity_pub/object_validator_test.exs | 20 | 
4 files changed, 89 insertions, 0 deletions
| diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex index 1aac62c69..135a5c431 100644 --- a/lib/pleroma/web/activity_pub/builder.ex +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -123,6 +123,21 @@ defmodule Pleroma.Web.ActivityPub.Builder do      end    end +  # Retricted to user updates for now, always public +  @spec update(User.t(), Object.t()) :: {:ok, map(), keyword()} +  def update(actor, object) do +    to = [Pleroma.Constants.as_public(), actor.follower_address] + +    {:ok, +     %{ +       "id" => Utils.generate_activity_id(), +       "type" => "Update", +       "actor" => actor.ap_id, +       "object" => object, +       "to" => to +     }, []} +  end +    @spec announce(User.t(), Object.t(), keyword()) :: {:ok, map(), keyword()}    def announce(actor, object, options \\ []) do      public? = Keyword.get(options, :public, false) diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 6a83a2c33..804a9d06e 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -19,10 +19,21 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do    alias Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator    alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator    alias Pleroma.Web.ActivityPub.ObjectValidators.UndoValidator +  alias Pleroma.Web.ActivityPub.ObjectValidators.UpdateValidator    @spec validate(map(), keyword()) :: {:ok, map(), keyword()} | {:error, any()}    def validate(object, meta) +  def validate(%{"type" => "Update"} = object, meta) do +    with {:ok, object} <- +           object +           |> UpdateValidator.cast_and_validate() +           |> Ecto.Changeset.apply_action(:insert) do +      object = stringify_keys(object) +      {:ok, object, meta} +    end +  end +    def validate(%{"type" => "Undo"} = object, meta) do      with {:ok, object} <-             object diff --git a/lib/pleroma/web/activity_pub/object_validators/update_validator.ex b/lib/pleroma/web/activity_pub/object_validators/update_validator.ex new file mode 100644 index 000000000..94d72491b --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/update_validator.ex @@ -0,0 +1,43 @@ +# 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.UpdateValidator do +  use Ecto.Schema + +  alias Pleroma.EctoType.ActivityPub.ObjectValidators + +  import Ecto.Changeset +  import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations + +  @primary_key false + +  embedded_schema do +    field(:id, ObjectValidators.ObjectID, primary_key: true) +    field(:type, :string) +    field(:actor, ObjectValidators.ObjectID) +    field(:to, ObjectValidators.Recipients, default: []) +    field(:cc, ObjectValidators.Recipients, default: []) +    # In this case, we save the full object in this activity instead of just a +    # reference, so we can always see what was actually changed by this. +    field(:object, :map) +  end + +  def cast_data(data) do +    %__MODULE__{} +    |> cast(data, __schema__(:fields)) +  end + +  def validate_data(cng) do +    cng +    |> validate_required([:id, :type, :actor, :to, :cc, :object]) +    |> validate_inclusion(:type, ["Update"]) +    |> validate_actor_presence() +  end + +  def cast_and_validate(data) do +    data +    |> cast_data +    |> validate_data +  end +end diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index 31224abe0..adb56092d 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -622,4 +622,24 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do        assert {:actor, {"can not announce this object publicly", []}} in cng.errors      end    end + +  describe "updates" do +    setup do +      user = insert(:user) + +      object = %{ +        "id" => user.ap_id, +        "name" => "A new name", +        "summary" => "A new bio" +      } + +      {:ok, valid_update, []} = Builder.update(user, object) + +      %{user: user, valid_update: valid_update} +    end + +    test "validates a basic object", %{valid_update: valid_update} do +      assert {:ok, _update, []} = ObjectValidator.validate(valid_update, []) +    end +  end  end | 
