1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatValidationTest do
8 alias Pleroma.Web.ActivityPub.ActivityPub
9 alias Pleroma.Web.ActivityPub.Builder
10 alias Pleroma.Web.ActivityPub.ObjectValidator
11 alias Pleroma.Web.CommonAPI
13 import Pleroma.Factory
15 describe "chat message create activities" do
16 test "it is invalid if the object already exists" do
18 recipient = insert(:user)
19 {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "hey")
20 object = Object.normalize(activity, fetch: false)
22 {:ok, create_data, _} = Builder.create(user, object.data, [recipient.ap_id])
24 {:error, cng} = ObjectValidator.validate(create_data, [])
26 assert {:object, {"The object to create already exists", []}} in cng.errors
29 test "it is invalid if the object data has a different `to` or `actor` field" do
31 recipient = insert(:user)
32 {:ok, object_data, _} = Builder.chat_message(recipient, user.ap_id, "Hey")
34 {:ok, create_data, _} = Builder.create(user, object_data, [recipient.ap_id])
36 {:error, cng} = ObjectValidator.validate(create_data, [])
38 assert {:to, {"Recipients don't match with object recipients", []}} in cng.errors
39 assert {:actor, {"Actor doesn't match with object actor", []}} in cng.errors
43 describe "chat messages" do
45 clear_config([:instance, :remote_limit])
47 recipient = insert(:user, local: false)
49 {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "hey :firefox:")
51 %{user: user, recipient: recipient, valid_chat_message: valid_chat_message}
54 test "let's through some basic html", %{user: user, recipient: recipient} do
55 {:ok, valid_chat_message, _} =
59 "hey <a href='https://example.org'>example</a> <script>alert('uguu')</script>"
62 assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
64 assert object["content"] ==
65 "hey <a href=\"https://example.org\">example</a> alert('uguu')"
68 test "validates for a basic object we build", %{valid_chat_message: valid_chat_message} do
69 assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
71 assert Map.put(valid_chat_message, "attachment", nil) == object
72 assert match?(%{"firefox" => _}, object["emoji"])
75 test "validates for a basic object with an attachment", %{
76 valid_chat_message: valid_chat_message,
80 content_type: "image/jpeg",
81 path: Path.absname("test/fixtures/image.jpg"),
82 filename: "an_image.jpg"
85 {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
89 |> Map.put("attachment", attachment.data)
91 assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
93 assert object["attachment"]
96 test "validates for a basic object with an attachment in an array", %{
97 valid_chat_message: valid_chat_message,
101 content_type: "image/jpeg",
102 path: Path.absname("test/fixtures/image.jpg"),
103 filename: "an_image.jpg"
106 {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
110 |> Map.put("attachment", [attachment.data])
112 assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
114 assert object["attachment"]
117 test "validates for a basic object with an attachment but without content", %{
118 valid_chat_message: valid_chat_message,
122 content_type: "image/jpeg",
123 path: Path.absname("test/fixtures/image.jpg"),
124 filename: "an_image.jpg"
127 {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
131 |> Map.put("attachment", attachment.data)
132 |> Map.delete("content")
134 assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
136 assert object["attachment"]
139 test "does not validate if the message has no content", %{
140 valid_chat_message: valid_chat_message
144 |> Map.delete("content")
146 refute match?({:ok, _object, _meta}, ObjectValidator.validate(contentless, []))
149 test "does not validate if the message is longer than the remote_limit", %{
150 valid_chat_message: valid_chat_message
152 clear_config([:instance, :remote_limit], 2)
153 refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
156 test "does not validate if the recipient is blocking the actor", %{
157 valid_chat_message: valid_chat_message,
161 Pleroma.User.block(recipient, user)
162 refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
165 test "does not validate if the recipient is not accepting chat messages", %{
166 valid_chat_message: valid_chat_message,
170 |> Ecto.Changeset.change(%{accepts_chat_messages: false})
171 |> Pleroma.Repo.update!()
173 refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
176 test "does not validate if the actor or the recipient is not in our system", %{
177 valid_chat_message: valid_chat_message
181 |> Map.put("actor", "https://raymoo.com/raymoo")
183 {:error, _} = ObjectValidator.validate(chat_message, [])
187 |> Map.put("to", ["https://raymoo.com/raymoo"])
189 {:error, _} = ObjectValidator.validate(chat_message, [])
192 test "does not validate for a message with multiple recipients", %{
193 valid_chat_message: valid_chat_message,
199 |> Map.put("to", [user.ap_id, recipient.ap_id])
201 assert {:error, _} = ObjectValidator.validate(chat_message, [])
204 test "does not validate if it doesn't concern local users" do
205 user = insert(:user, local: false)
206 recipient = insert(:user, local: false)
208 {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "hey")
209 assert {:error, _} = ObjectValidator.validate(valid_chat_message, [])