forked from AkkomaGang/akkoma
{Answer,Question}Validator: Keep both actor and attributedTo for now but sync them
This commit is contained in:
parent
c19bdc811e
commit
bfe2dafd39
6 changed files with 39 additions and 7 deletions
|
@ -120,6 +120,7 @@ def answer(user, object, name) do
|
||||||
%{
|
%{
|
||||||
"type" => "Answer",
|
"type" => "Answer",
|
||||||
"actor" => user.ap_id,
|
"actor" => user.ap_id,
|
||||||
|
"attributedTo" => user.ap_id,
|
||||||
"cc" => [object.data["actor"]],
|
"cc" => [object.data["actor"]],
|
||||||
"to" => [],
|
"to" => [],
|
||||||
"name" => name,
|
"name" => name,
|
||||||
|
|
|
@ -26,6 +26,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AnswerValidator do
|
||||||
field(:name, :string)
|
field(:name, :string)
|
||||||
field(:inReplyTo, :string)
|
field(:inReplyTo, :string)
|
||||||
field(:attributedTo, ObjectValidators.ObjectID)
|
field(:attributedTo, ObjectValidators.ObjectID)
|
||||||
|
|
||||||
|
# TODO: Remove actor on objects
|
||||||
field(:actor, ObjectValidators.ObjectID)
|
field(:actor, ObjectValidators.ObjectID)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -54,8 +56,10 @@ def changeset(struct, data) do
|
||||||
def validate_data(data_cng) do
|
def validate_data(data_cng) do
|
||||||
data_cng
|
data_cng
|
||||||
|> validate_inclusion(:type, ["Answer"])
|
|> validate_inclusion(:type, ["Answer"])
|
||||||
|> validate_required([:id, :inReplyTo, :name])
|
|> validate_required([:id, :inReplyTo, :name, :attributedTo, :actor])
|
||||||
|> CommonValidations.validate_any_presence([:cc, :to])
|
|> 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
|
||||||
end
|
end
|
||||||
|
|
|
@ -115,4 +115,22 @@ def validate_host_match(cng, fields \\ [:id, :actor]) do
|
||||||
end)
|
end)
|
||||||
end
|
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
|
end
|
||||||
|
|
|
@ -87,14 +87,14 @@ def validate_object_nonexistence(cng) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate_actors_match(cng, meta) do
|
def validate_actors_match(cng, meta) do
|
||||||
object_actor = meta[:object_data]["actor"]
|
attributed_to = meta[:object_data]["attributedTo"] || meta[:object_data]["actor"]
|
||||||
|
|
||||||
cng
|
cng
|
||||||
|> validate_change(:actor, fn :actor, actor ->
|
|> validate_change(:actor, fn :actor, actor ->
|
||||||
if actor == object_actor do
|
if actor == attributed_to do
|
||||||
[]
|
[]
|
||||||
else
|
else
|
||||||
[{:actor, "Actor doesn't match with object actor"}]
|
[{:actor, "Actor doesn't match with object attributedTo"}]
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
|
@ -28,7 +28,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.QuestionValidator do
|
||||||
field(:type, :string)
|
field(:type, :string)
|
||||||
field(:content, :string)
|
field(:content, :string)
|
||||||
field(:context, :string)
|
field(:context, :string)
|
||||||
|
|
||||||
|
# TODO: Remove actor on objects
|
||||||
field(:actor, ObjectValidators.ObjectID)
|
field(:actor, ObjectValidators.ObjectID)
|
||||||
|
|
||||||
field(:attributedTo, ObjectValidators.ObjectID)
|
field(:attributedTo, ObjectValidators.ObjectID)
|
||||||
field(:summary, :string)
|
field(:summary, :string)
|
||||||
field(:published, ObjectValidators.DateTime)
|
field(:published, ObjectValidators.DateTime)
|
||||||
|
@ -108,8 +111,9 @@ def changeset(struct, data) do
|
||||||
def validate_data(data_cng) do
|
def validate_data(data_cng) do
|
||||||
data_cng
|
data_cng
|
||||||
|> validate_inclusion(:type, ["Question"])
|
|> 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_any_presence([:cc, :to])
|
||||||
|
|> CommonValidations.validate_fields_match([:actor, :attributedTo])
|
||||||
|> CommonValidations.validate_actor_is_active()
|
|> CommonValidations.validate_actor_is_active()
|
||||||
|> CommonValidations.validate_any_presence([:oneOf, :anyOf])
|
|> CommonValidations.validate_any_presence([:oneOf, :anyOf])
|
||||||
|> CommonValidations.validate_host_match()
|
|> CommonValidations.validate_host_match()
|
||||||
|
|
|
@ -157,7 +157,12 @@ def fix_addressing(object) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def fix_actor(%{"attributedTo" => actor} = object) do
|
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
|
end
|
||||||
|
|
||||||
def fix_in_reply_to(object, options \\ [])
|
def fix_in_reply_to(object, options \\ [])
|
||||||
|
|
Loading…
Reference in a new issue