First
[anni] / test / pleroma / web / activity_pub / object_validators / delete_validation_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.ActivityPub.ObjectValidators.DeleteValidationTest do
6   use Pleroma.DataCase, async: false
7
8   alias Pleroma.Object
9   alias Pleroma.Web.ActivityPub.Builder
10   alias Pleroma.Web.ActivityPub.ObjectValidator
11   alias Pleroma.Web.CommonAPI
12
13   import Pleroma.Factory
14
15   describe "deletes" do
16     setup do
17       user = insert(:user)
18       {:ok, post_activity} = CommonAPI.post(user, %{status: "cancel me daddy"})
19
20       {:ok, valid_post_delete, _} = Builder.delete(user, post_activity.data["object"])
21       {:ok, valid_user_delete, _} = Builder.delete(user, user.ap_id)
22
23       %{user: user, valid_post_delete: valid_post_delete, valid_user_delete: valid_user_delete}
24     end
25
26     test "it is valid for a post deletion", %{valid_post_delete: valid_post_delete} do
27       {:ok, valid_post_delete, _} = ObjectValidator.validate(valid_post_delete, [])
28
29       assert valid_post_delete["deleted_activity_id"]
30     end
31
32     test "it is invalid if the object isn't in a list of certain types", %{
33       valid_post_delete: valid_post_delete
34     } do
35       object = Object.get_by_ap_id(valid_post_delete["object"])
36
37       data =
38         object.data
39         |> Map.put("type", "Like")
40
41       {:ok, _object} =
42         object
43         |> Ecto.Changeset.change(%{data: data})
44         |> Object.update_and_set_cache()
45
46       {:error, cng} = ObjectValidator.validate(valid_post_delete, [])
47       assert {:object, {"object not in allowed types", []}} in cng.errors
48     end
49
50     test "it is valid for a user deletion", %{valid_user_delete: valid_user_delete} do
51       assert match?({:ok, _, _}, ObjectValidator.validate(valid_user_delete, []))
52     end
53
54     test "it's invalid if the id is missing", %{valid_post_delete: valid_post_delete} do
55       no_id =
56         valid_post_delete
57         |> Map.delete("id")
58
59       {:error, cng} = ObjectValidator.validate(no_id, [])
60
61       assert {:id, {"can't be blank", [validation: :required]}} in cng.errors
62     end
63
64     test "it's invalid if the object doesn't exist", %{valid_post_delete: valid_post_delete} do
65       missing_object =
66         valid_post_delete
67         |> Map.put("object", "http://does.not/exist")
68
69       {:error, cng} = ObjectValidator.validate(missing_object, [])
70
71       assert {:object, {"can't find object", []}} in cng.errors
72     end
73
74     test "it's invalid if the actor of the object and the actor of delete are from different domains",
75          %{valid_post_delete: valid_post_delete} do
76       valid_user = insert(:user)
77
78       valid_other_actor =
79         valid_post_delete
80         |> Map.put("actor", valid_user.ap_id)
81
82       assert match?({:ok, _, _}, ObjectValidator.validate(valid_other_actor, []))
83
84       invalid_other_actor =
85         valid_post_delete
86         |> Map.put("actor", "https://gensokyo.2hu/users/raymoo")
87
88       {:error, cng} = ObjectValidator.validate(invalid_other_actor, [])
89
90       assert {:actor, {"is not allowed to modify object", []}} in cng.errors
91     end
92
93     test "it's only valid if the actor of the object is a privileged local user",
94          %{valid_post_delete: valid_post_delete} do
95       clear_config([:instance, :moderator_privileges], [:messages_delete])
96
97       user =
98         insert(:user, local: true, is_moderator: true, ap_id: "https://gensokyo.2hu/users/raymoo")
99
100       post_delete_with_moderator_actor =
101         valid_post_delete
102         |> Map.put("actor", user.ap_id)
103
104       {:ok, _, meta} = ObjectValidator.validate(post_delete_with_moderator_actor, [])
105
106       assert meta[:do_not_federate]
107
108       clear_config([:instance, :moderator_privileges], [])
109
110       {:error, cng} = ObjectValidator.validate(post_delete_with_moderator_actor, [])
111
112       assert {:actor, {"is not allowed to modify object", []}} in cng.errors
113     end
114   end
115 end