logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

chat_validation_test.exs (7779B)


  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. defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatValidationTest do
  5. use Pleroma.DataCase
  6. alias Pleroma.Object
  7. alias Pleroma.UnstubbedConfigMock, as: ConfigMock
  8. alias Pleroma.Web.ActivityPub.ActivityPub
  9. alias Pleroma.Web.ActivityPub.Builder
  10. alias Pleroma.Web.ActivityPub.ObjectValidator
  11. alias Pleroma.Web.CommonAPI
  12. import Mox
  13. import Pleroma.Factory
  14. describe "chat message create activities" do
  15. test "it is invalid if the object already exists" do
  16. user = insert(:user)
  17. recipient = insert(:user)
  18. {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "hey")
  19. object = Object.normalize(activity, fetch: false)
  20. {:ok, create_data, _} = Builder.create(user, object.data, [recipient.ap_id])
  21. {:error, cng} = ObjectValidator.validate(create_data, [])
  22. assert {:object, {"The object to create already exists", []}} in cng.errors
  23. end
  24. test "it is invalid if the object data has a different `to` or `actor` field" do
  25. user = insert(:user)
  26. recipient = insert(:user)
  27. {:ok, object_data, _} = Builder.chat_message(recipient, user.ap_id, "Hey")
  28. {:ok, create_data, _} = Builder.create(user, object_data, [recipient.ap_id])
  29. {:error, cng} = ObjectValidator.validate(create_data, [])
  30. assert {:to, {"Recipients don't match with object recipients", []}} in cng.errors
  31. assert {:actor, {"Actor doesn't match with object actor", []}} in cng.errors
  32. end
  33. end
  34. describe "chat messages" do
  35. setup do
  36. clear_config([:instance, :remote_limit])
  37. user = insert(:user)
  38. recipient = insert(:user, local: false)
  39. {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "hey :firefox:")
  40. %{user: user, recipient: recipient, valid_chat_message: valid_chat_message}
  41. end
  42. test "let's through some basic html", %{user: user, recipient: recipient} do
  43. {:ok, valid_chat_message, _} =
  44. Builder.chat_message(
  45. user,
  46. recipient.ap_id,
  47. "hey <a href='https://example.org'>example</a> <script>alert('uguu')</script>"
  48. )
  49. assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
  50. assert object["content"] ==
  51. "hey <a href=\"https://example.org\">example</a> alert(&#39;uguu&#39;)"
  52. end
  53. test "validates for a basic object we build", %{valid_chat_message: valid_chat_message} do
  54. assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
  55. assert valid_chat_message == object
  56. assert match?(%{"firefox" => _}, object["emoji"])
  57. end
  58. test "validates for a basic object with an attachment", %{
  59. valid_chat_message: valid_chat_message,
  60. user: user
  61. } do
  62. file = %Plug.Upload{
  63. content_type: "image/jpeg",
  64. path: Path.absname("test/fixtures/image.jpg"),
  65. filename: "an_image.jpg"
  66. }
  67. ConfigMock
  68. |> stub_with(Pleroma.Test.StaticConfig)
  69. {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
  70. valid_chat_message =
  71. valid_chat_message
  72. |> Map.put("attachment", attachment.data)
  73. assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
  74. assert object["attachment"]
  75. end
  76. test "validates for a basic object with an attachment in an array", %{
  77. valid_chat_message: valid_chat_message,
  78. user: user
  79. } do
  80. file = %Plug.Upload{
  81. content_type: "image/jpeg",
  82. path: Path.absname("test/fixtures/image.jpg"),
  83. filename: "an_image.jpg"
  84. }
  85. ConfigMock
  86. |> stub_with(Pleroma.Test.StaticConfig)
  87. {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
  88. valid_chat_message =
  89. valid_chat_message
  90. |> Map.put("attachment", [attachment.data])
  91. assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
  92. assert object["attachment"]
  93. end
  94. test "validates for a basic object with an attachment but without content", %{
  95. valid_chat_message: valid_chat_message,
  96. user: user
  97. } do
  98. file = %Plug.Upload{
  99. content_type: "image/jpeg",
  100. path: Path.absname("test/fixtures/image.jpg"),
  101. filename: "an_image.jpg"
  102. }
  103. ConfigMock
  104. |> stub_with(Pleroma.Test.StaticConfig)
  105. {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
  106. valid_chat_message =
  107. valid_chat_message
  108. |> Map.put("attachment", attachment.data)
  109. |> Map.delete("content")
  110. assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
  111. assert object["attachment"]
  112. end
  113. test "validates for a basic object with content but attachment set to empty array", %{
  114. user: user,
  115. recipient: recipient
  116. } do
  117. {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "Hello!")
  118. valid_chat_message =
  119. valid_chat_message
  120. |> Map.put("attachment", [])
  121. assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
  122. assert object == Map.drop(valid_chat_message, ["attachment"])
  123. end
  124. test "does not validate if the message has no content", %{
  125. valid_chat_message: valid_chat_message
  126. } do
  127. contentless =
  128. valid_chat_message
  129. |> Map.delete("content")
  130. refute match?({:ok, _object, _meta}, ObjectValidator.validate(contentless, []))
  131. end
  132. test "does not validate if the message is longer than the remote_limit", %{
  133. valid_chat_message: valid_chat_message
  134. } do
  135. clear_config([:instance, :remote_limit], 2)
  136. refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
  137. end
  138. test "does not validate if the recipient is blocking the actor", %{
  139. valid_chat_message: valid_chat_message,
  140. user: user,
  141. recipient: recipient
  142. } do
  143. Pleroma.User.block(recipient, user)
  144. refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
  145. end
  146. test "does not validate if the recipient is not accepting chat messages", %{
  147. valid_chat_message: valid_chat_message,
  148. recipient: recipient
  149. } do
  150. recipient
  151. |> Ecto.Changeset.change(%{accepts_chat_messages: false})
  152. |> Pleroma.Repo.update!()
  153. refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
  154. end
  155. test "does not validate if the actor or the recipient is not in our system", %{
  156. valid_chat_message: valid_chat_message
  157. } do
  158. chat_message =
  159. valid_chat_message
  160. |> Map.put("actor", "https://raymoo.com/raymoo")
  161. {:error, _} = ObjectValidator.validate(chat_message, [])
  162. chat_message =
  163. valid_chat_message
  164. |> Map.put("to", ["https://raymoo.com/raymoo"])
  165. {:error, _} = ObjectValidator.validate(chat_message, [])
  166. end
  167. test "does not validate for a message with multiple recipients", %{
  168. valid_chat_message: valid_chat_message,
  169. user: user,
  170. recipient: recipient
  171. } do
  172. chat_message =
  173. valid_chat_message
  174. |> Map.put("to", [user.ap_id, recipient.ap_id])
  175. assert {:error, _} = ObjectValidator.validate(chat_message, [])
  176. end
  177. test "does not validate if it doesn't concern local users" do
  178. user = insert(:user, local: false)
  179. recipient = insert(:user, local: false)
  180. {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "hey")
  181. assert {:error, _} = ObjectValidator.validate(valid_chat_message, [])
  182. end
  183. end
  184. end