X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;ds=inline;f=lib%2Fpleroma%2Fweb%2Factivity_pub%2Fobject_validators%2Faccept_reject_validator.ex;h=0561a9ddf1f719cdbf7a0b314df3836e3bd3129a;hb=a079ec3a3cdfd42d2cbd51c7698c2c87828e5778;hp=179beda581df0a4cd224e9d7228e0f2d65893fc5;hpb=d8d4e962304c5424de4d171d25445b7135a67a09;p=akkoma
diff --git a/lib/pleroma/web/activity_pub/object_validators/accept_reject_validator.ex b/lib/pleroma/web/activity_pub/object_validators/accept_reject_validator.ex
index 179beda58..0561a9ddf 100644
--- a/lib/pleroma/web/activity_pub/object_validators/accept_reject_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/accept_reject_validator.ex
@@ -1,12 +1,12 @@
# Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors
+# Copyright © 2017-2021 Pleroma Authors
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.ActivityPub.ObjectValidators.AcceptRejectValidator do
use Ecto.Schema
alias Pleroma.Activity
- alias Pleroma.EctoType.ActivityPub.ObjectValidators
+ alias Pleroma.User
import Ecto.Changeset
import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations
@@ -14,12 +14,13 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AcceptRejectValidator do
@primary_key false
embedded_schema do
- field(:id, ObjectValidators.ObjectID, primary_key: true)
- field(:type, :string)
- field(:object, ObjectValidators.ObjectID)
- field(:actor, ObjectValidators.ObjectID)
- field(:to, ObjectValidators.Recipients, default: [])
- field(:cc, ObjectValidators.Recipients, default: [])
+ quote do
+ unquote do
+ import Elixir.Pleroma.Web.ActivityPub.ObjectValidators.CommonFields
+ message_fields()
+ activity_fields()
+ end
+ end
end
def cast_data(data) do
@@ -27,9 +28,9 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AcceptRejectValidator do
|> cast(data, __schema__(:fields))
end
- def validate_data(cng) do
+ defp validate_data(cng) do
cng
- |> validate_required([:id, :type, :actor, :to, :cc, :object])
+ |> validate_required([:type, :actor, :to, :cc, :object])
|> validate_inclusion(:type, ["Accept", "Reject"])
|> validate_actor_presence()
|> validate_object_presence(allowed_types: ["Follow"])
@@ -38,6 +39,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AcceptRejectValidator do
def cast_and_validate(data) do
data
+ |> maybe_fetch_object()
|> cast_data
|> validate_data
end
@@ -53,4 +55,31 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AcceptRejectValidator do
|> add_error(:actor, "can't accept or reject the given activity")
end
end
+
+ defp maybe_fetch_object(%{"object" => %{} = object} = activity) do
+ # If we don't have an ID, we may have to fetch the object
+ if Map.has_key?(object, "id") do
+ # Do nothing
+ activity
+ else
+ Map.put(activity, "object", fetch_transient_object(object))
+ end
+ end
+
+ defp maybe_fetch_object(activity), do: activity
+
+ defp fetch_transient_object(
+ %{"actor" => actor, "object" => target, "type" => "Follow"} = object
+ ) do
+ with %User{} = actor <- User.get_cached_by_ap_id(actor),
+ %User{local: true} = target <- User.get_cached_by_ap_id(target),
+ %Activity{} = activity <- Activity.follow_activity(actor, target) do
+ activity.data
+ else
+ _e ->
+ object
+ end
+ end
+
+ defp fetch_transient_object(_), do: {:error, "not a supported transient object"}
end