diff options
Diffstat (limited to 'lib')
6 files changed, 39 insertions, 7 deletions
diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex index e97381954..49ce5a938 100644 --- a/lib/pleroma/web/activity_pub/builder.ex +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -120,6 +120,7 @@ defmodule Pleroma.Web.ActivityPub.Builder do       %{         "type" => "Answer",         "actor" => user.ap_id, +       "attributedTo" => user.ap_id,         "cc" => [object.data["actor"]],         "to" => [],         "name" => name, diff --git a/lib/pleroma/web/activity_pub/object_validators/answer_validator.ex b/lib/pleroma/web/activity_pub/object_validators/answer_validator.ex index 9861eec7f..ebddd5038 100644 --- a/lib/pleroma/web/activity_pub/object_validators/answer_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/answer_validator.ex @@ -26,6 +26,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AnswerValidator do      field(:name, :string)      field(:inReplyTo, :string)      field(:attributedTo, ObjectValidators.ObjectID) + +    # TODO: Remove actor on objects      field(:actor, ObjectValidators.ObjectID)    end @@ -54,8 +56,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AnswerValidator do    def validate_data(data_cng) do      data_cng      |> validate_inclusion(:type, ["Answer"]) -    |> validate_required([:id, :inReplyTo, :name]) +    |> validate_required([:id, :inReplyTo, :name, :attributedTo, :actor])      |> CommonValidations.validate_any_presence([:cc, :to]) -    |> CommonValidations.validate_actor_presence() +    |> CommonValidations.validate_fields_match([:actor, :attributedTo]) +    |> CommonValidations.validate_actor_is_active() +    |> CommonValidations.validate_host_match()    end  end diff --git a/lib/pleroma/web/activity_pub/object_validators/common_validations.ex b/lib/pleroma/web/activity_pub/object_validators/common_validations.ex index 140555a45..e981dacaa 100644 --- a/lib/pleroma/web/activity_pub/object_validators/common_validations.ex +++ b/lib/pleroma/web/activity_pub/object_validators/common_validations.ex @@ -115,4 +115,22 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations do        end)      end    end + +  def validate_fields_match(cng, fields) do +    unique_fields = +      fields +      |> Enum.map(fn field -> get_field(cng, field) end) +      |> Enum.uniq() +      |> Enum.count() + +    if unique_fields == 1 do +      cng +    else +      fields +      |> Enum.reduce(cng, fn field, cng -> +        cng +        |> add_error(field, "Fields #{inspect(fields)} aren't matching") +      end) +    end +  end  end diff --git a/lib/pleroma/web/activity_pub/object_validators/create_generic_validator.ex b/lib/pleroma/web/activity_pub/object_validators/create_generic_validator.ex index 97e2def10..54ea14f89 100644 --- a/lib/pleroma/web/activity_pub/object_validators/create_generic_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/create_generic_validator.ex @@ -87,14 +87,14 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CreateGenericValidator do    end    def validate_actors_match(cng, meta) do -    object_actor = meta[:object_data]["actor"] +    attributed_to = meta[:object_data]["attributedTo"] || meta[:object_data]["actor"]      cng      |> validate_change(:actor, fn :actor, actor -> -      if actor == object_actor do +      if actor == attributed_to do          []        else -        [{:actor, "Actor doesn't match with object actor"}] +        [{:actor, "Actor doesn't match with object attributedTo"}]        end      end)    end diff --git a/lib/pleroma/web/activity_pub/object_validators/question_validator.ex b/lib/pleroma/web/activity_pub/object_validators/question_validator.ex index 53cf35d40..466b3e6c2 100644 --- a/lib/pleroma/web/activity_pub/object_validators/question_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/question_validator.ex @@ -28,7 +28,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.QuestionValidator do      field(:type, :string)      field(:content, :string)      field(:context, :string) + +    # TODO: Remove actor on objects      field(:actor, ObjectValidators.ObjectID) +      field(:attributedTo, ObjectValidators.ObjectID)      field(:summary, :string)      field(:published, ObjectValidators.DateTime) @@ -108,8 +111,9 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.QuestionValidator do    def validate_data(data_cng) do      data_cng      |> validate_inclusion(:type, ["Question"]) -    |> validate_required([:id, :actor, :type, :content, :context]) +    |> validate_required([:id, :actor, :attributedTo, :type, :content, :context])      |> CommonValidations.validate_any_presence([:cc, :to]) +    |> CommonValidations.validate_fields_match([:actor, :attributedTo])      |> CommonValidations.validate_actor_is_active()      |> CommonValidations.validate_any_presence([:oneOf, :anyOf])      |> CommonValidations.validate_host_match() diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 0ad982720..6ab8a52c1 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -157,7 +157,12 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do    end    def fix_actor(%{"attributedTo" => actor} = object) do -    Map.put(object, "actor", Containment.get_actor(%{"actor" => actor})) +    actor = Containment.get_actor(%{"actor" => actor}) + +    # TODO: Remove actor field for Objects +    object +    |> Map.put("actor", actor) +    |> Map.put("attributedTo", actor)    end    def fix_in_reply_to(object, options \\ [])  | 
