1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatValidationTest do
8 alias Pleroma.UnstubbedConfigMock, as: ConfigMock
9 alias Pleroma.Web.ActivityPub.ActivityPub
10 alias Pleroma.Web.ActivityPub.Builder
11 alias Pleroma.Web.ActivityPub.ObjectValidator
12 alias Pleroma.Web.CommonAPI
15 import Pleroma.Factory
17 describe "chat message create activities" do
18 test "it is invalid if the object already exists" do
20 recipient = insert(:user)
21 {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "hey")
22 object = Object.normalize(activity, fetch: false)
24 {:ok, create_data, _} = Builder.create(user, object.data, [recipient.ap_id])
26 {:error, cng} = ObjectValidator.validate(create_data, [])
28 assert {:object, {"The object to create already exists", []}} in cng.errors
31 test "it is invalid if the object data has a different `to` or `actor` field" do
33 recipient = insert(:user)
34 {:ok, object_data, _} = Builder.chat_message(recipient, user.ap_id, "Hey")
36 {:ok, create_data, _} = Builder.create(user, object_data, [recipient.ap_id])
38 {:error, cng} = ObjectValidator.validate(create_data, [])
40 assert {:to, {"Recipients don't match with object recipients", []}} in cng.errors
41 assert {:actor, {"Actor doesn't match with object actor", []}} in cng.errors
45 describe "chat messages" do
47 clear_config([:instance, :remote_limit])
49 recipient = insert(:user, local: false)
51 {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "hey :firefox:")
53 %{user: user, recipient: recipient, valid_chat_message: valid_chat_message}
56 test "let's through some basic html", %{user: user, recipient: recipient} do
57 {:ok, valid_chat_message, _} =
61 "hey <a href='https://example.org'>example</a> <script>alert('uguu')</script>"
64 assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
66 assert object["content"] ==
67 "hey <a href=\"https://example.org\">example</a> alert('uguu')"
70 test "validates for a basic object we build", %{valid_chat_message: valid_chat_message} do
71 assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
73 assert valid_chat_message == object
74 assert match?(%{"firefox" => _}, object["emoji"])
77 test "validates for a basic object with an attachment", %{
78 valid_chat_message: valid_chat_message,
82 content_type: "image/jpeg",
83 path: Path.absname("test/fixtures/image.jpg"),
84 filename: "an_image.jpg"
88 |> stub_with(Pleroma.Test.StaticConfig)
90 {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
94 |> Map.put("attachment", attachment.data)
96 assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
98 assert object["attachment"]
101 test "validates for a basic object with an attachment in an array", %{
102 valid_chat_message: valid_chat_message,
106 content_type: "image/jpeg",
107 path: Path.absname("test/fixtures/image.jpg"),
108 filename: "an_image.jpg"
112 |> stub_with(Pleroma.Test.StaticConfig)
114 {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
118 |> Map.put("attachment", [attachment.data])
120 assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
122 assert object["attachment"]
125 test "validates for a basic object with an attachment but without content", %{
126 valid_chat_message: valid_chat_message,
130 content_type: "image/jpeg",
131 path: Path.absname("test/fixtures/image.jpg"),
132 filename: "an_image.jpg"
136 |> stub_with(Pleroma.Test.StaticConfig)
138 {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
142 |> Map.put("attachment", attachment.data)
143 |> Map.delete("content")
145 assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
147 assert object["attachment"]
150 test "validates for a basic object with content but attachment set to empty array", %{
154 {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "Hello!")
158 |> Map.put("attachment", [])
160 assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
162 assert object == Map.drop(valid_chat_message, ["attachment"])
165 test "does not validate if the message has no content", %{
166 valid_chat_message: valid_chat_message
170 |> Map.delete("content")
172 refute match?({:ok, _object, _meta}, ObjectValidator.validate(contentless, []))
175 test "does not validate if the message is longer than the remote_limit", %{
176 valid_chat_message: valid_chat_message
178 clear_config([:instance, :remote_limit], 2)
179 refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
182 test "does not validate if the recipient is blocking the actor", %{
183 valid_chat_message: valid_chat_message,
187 Pleroma.User.block(recipient, user)
188 refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
191 test "does not validate if the recipient is not accepting chat messages", %{
192 valid_chat_message: valid_chat_message,
196 |> Ecto.Changeset.change(%{accepts_chat_messages: false})
197 |> Pleroma.Repo.update!()
199 refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
202 test "does not validate if the actor or the recipient is not in our system", %{
203 valid_chat_message: valid_chat_message
207 |> Map.put("actor", "https://raymoo.com/raymoo")
209 {:error, _} = ObjectValidator.validate(chat_message, [])
213 |> Map.put("to", ["https://raymoo.com/raymoo"])
215 {:error, _} = ObjectValidator.validate(chat_message, [])
218 test "does not validate for a message with multiple recipients", %{
219 valid_chat_message: valid_chat_message,
225 |> Map.put("to", [user.ap_id, recipient.ap_id])
227 assert {:error, _} = ObjectValidator.validate(chat_message, [])
230 test "does not validate if it doesn't concern local users" do
231 user = insert(:user, local: false)
232 recipient = insert(:user, local: false)
234 {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "hey")
235 assert {:error, _} = ObjectValidator.validate(valid_chat_message, [])