forked from AkkomaGang/akkoma
AnnounceValidator: Validate for existing announce
This commit is contained in:
parent
17a8342c1e
commit
0d5bce018d
2 changed files with 29 additions and 1 deletions
|
@ -6,9 +6,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator do
|
||||||
use Ecto.Schema
|
use Ecto.Schema
|
||||||
|
|
||||||
alias Pleroma.Web.ActivityPub.ObjectValidators.Types
|
alias Pleroma.Web.ActivityPub.ObjectValidators.Types
|
||||||
|
alias Pleroma.Web.ActivityPub.Utils
|
||||||
|
|
||||||
import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations
|
|
||||||
import Ecto.Changeset
|
import Ecto.Changeset
|
||||||
|
import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations
|
||||||
|
|
||||||
@primary_key false
|
@primary_key false
|
||||||
|
|
||||||
|
@ -49,5 +50,19 @@ def validate_data(data_cng) do
|
||||||
|> validate_required([:id, :type, :object, :actor, :context, :to, :cc])
|
|> validate_required([:id, :type, :object, :actor, :context, :to, :cc])
|
||||||
|> validate_actor_presence()
|
|> validate_actor_presence()
|
||||||
|> validate_object_presence()
|
|> validate_object_presence()
|
||||||
|
|> validate_existing_announce()
|
||||||
|
end
|
||||||
|
|
||||||
|
def validate_existing_announce(cng) do
|
||||||
|
actor = get_field(cng, :actor)
|
||||||
|
object = get_field(cng, :object)
|
||||||
|
|
||||||
|
if actor && object && Utils.get_existing_announce(actor, %{data: %{"id" => object}}) do
|
||||||
|
cng
|
||||||
|
|> add_error(:actor, "already announced this object")
|
||||||
|
|> add_error(:object, "already announced by this actor")
|
||||||
|
else
|
||||||
|
cng
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -329,5 +329,18 @@ test "returns an error if we don't have the actor", %{valid_announce: valid_anno
|
||||||
|
|
||||||
assert {:actor, {"can't find user", []}} in cng.errors
|
assert {:actor, {"can't find user", []}} in cng.errors
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "returns an error if the actor already announced the object", %{
|
||||||
|
valid_announce: valid_announce,
|
||||||
|
announcer: announcer,
|
||||||
|
post_activity: post_activity
|
||||||
|
} do
|
||||||
|
_announce = CommonAPI.repeat(post_activity.id, announcer)
|
||||||
|
|
||||||
|
{:error, cng} = ObjectValidator.validate(valid_announce, [])
|
||||||
|
|
||||||
|
assert {:actor, {"already announced this object", []}} in cng.errors
|
||||||
|
assert {:object, {"already announced by this actor", []}} in cng.errors
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue