1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 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, 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
74 test "validates for a basic object with an attachment", %{
75 valid_chat_message: valid_chat_message,
79 content_type: "image/jpg",
80 path: Path.absname("test/fixtures/image.jpg"),
81 filename: "an_image.jpg"
84 {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
88 |> Map.put("attachment", attachment.data)
90 assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
92 assert object["attachment"]
95 test "validates for a basic object with an attachment in an array", %{
96 valid_chat_message: valid_chat_message,
100 content_type: "image/jpg",
101 path: Path.absname("test/fixtures/image.jpg"),
102 filename: "an_image.jpg"
105 {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
109 |> Map.put("attachment", [attachment.data])
111 assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
113 assert object["attachment"]
116 test "validates for a basic object with an attachment but without content", %{
117 valid_chat_message: valid_chat_message,
121 content_type: "image/jpg",
122 path: Path.absname("test/fixtures/image.jpg"),
123 filename: "an_image.jpg"
126 {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
130 |> Map.put("attachment", attachment.data)
131 |> Map.delete("content")
133 assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
135 assert object["attachment"]
138 test "does not validate if the message has no content", %{
139 valid_chat_message: valid_chat_message
143 |> Map.delete("content")
145 refute match?({:ok, _object, _meta}, ObjectValidator.validate(contentless, []))
148 test "does not validate if the message is longer than the remote_limit", %{
149 valid_chat_message: valid_chat_message
151 Pleroma.Config.put([:instance, :remote_limit], 2)
152 refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
155 test "does not validate if the recipient is blocking the actor", %{
156 valid_chat_message: valid_chat_message,
160 Pleroma.User.block(recipient, user)
161 refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
164 test "does not validate if the recipient is not accepting chat messages", %{
165 valid_chat_message: valid_chat_message,
169 |> Ecto.Changeset.change(%{accepts_chat_messages: false})
170 |> Pleroma.Repo.update!()
172 refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
175 test "does not validate if the actor or the recipient is not in our system", %{
176 valid_chat_message: valid_chat_message
180 |> Map.put("actor", "https://raymoo.com/raymoo")
182 {:error, _} = ObjectValidator.validate(chat_message, [])
186 |> Map.put("to", ["https://raymoo.com/raymoo"])
188 {:error, _} = ObjectValidator.validate(chat_message, [])
191 test "does not validate for a message with multiple recipients", %{
192 valid_chat_message: valid_chat_message,
198 |> Map.put("to", [user.ap_id, recipient.ap_id])
200 assert {:error, _} = ObjectValidator.validate(chat_message, [])
203 test "does not validate if it doesn't concern local users" do
204 user = insert(:user, local: false)
205 recipient = insert(:user, local: false)
207 {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "hey")
208 assert {:error, _} = ObjectValidator.validate(valid_chat_message, [])