logo

pleroma

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

receiver_worker_test.exs (7393B)


  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.Workers.ReceiverWorkerTest do
  5. use Pleroma.DataCase
  6. use Oban.Testing, repo: Pleroma.Repo
  7. import Mock
  8. import Pleroma.Factory
  9. alias Pleroma.User
  10. alias Pleroma.Web.Federator
  11. alias Pleroma.Workers.ReceiverWorker
  12. test "it does not retry MRF reject" do
  13. params = insert(:note).data
  14. with_mock Pleroma.Web.ActivityPub.Transmogrifier,
  15. handle_incoming: fn _ -> {:reject, "MRF"} end do
  16. assert {:cancel, {:reject, "MRF"}} =
  17. ReceiverWorker.perform(%Oban.Job{
  18. args: %{"op" => "incoming_ap_doc", "params" => params}
  19. })
  20. end
  21. end
  22. test "it does not retry ObjectValidator reject" do
  23. params =
  24. insert(:note_activity).data
  25. |> Map.put("id", Pleroma.Web.ActivityPub.Utils.generate_activity_id())
  26. |> Map.put("object", %{
  27. "type" => "Note",
  28. "id" => Pleroma.Web.ActivityPub.Utils.generate_object_id()
  29. })
  30. with_mock Pleroma.Web.ActivityPub.ObjectValidator, [:passthrough],
  31. validate: fn _, _ -> {:error, %Ecto.Changeset{}} end do
  32. assert {:cancel, {:error, %Ecto.Changeset{}}} =
  33. ReceiverWorker.perform(%Oban.Job{
  34. args: %{"op" => "incoming_ap_doc", "params" => params}
  35. })
  36. end
  37. end
  38. test "it does not retry duplicates" do
  39. params = insert(:note_activity).data
  40. assert {:cancel, :already_present} =
  41. ReceiverWorker.perform(%Oban.Job{
  42. args: %{"op" => "incoming_ap_doc", "params" => params}
  43. })
  44. end
  45. describe "cancels on a failed user fetch" do
  46. setup do
  47. Tesla.Mock.mock(fn
  48. %{url: "https://springfield.social/users/bart"} ->
  49. %Tesla.Env{
  50. status: 403,
  51. body: ""
  52. }
  53. %{url: "https://springfield.social/users/troymcclure"} ->
  54. %Tesla.Env{
  55. status: 404,
  56. body: ""
  57. }
  58. %{url: "https://springfield.social/users/hankscorpio"} ->
  59. %Tesla.Env{
  60. status: 410,
  61. body: ""
  62. }
  63. end)
  64. end
  65. test "when request returns a 403" do
  66. params =
  67. insert(:note_activity).data
  68. |> Map.put("actor", "https://springfield.social/users/bart")
  69. {:ok, oban_job} =
  70. Federator.incoming_ap_doc(%{
  71. method: "POST",
  72. req_headers: [],
  73. request_path: "/inbox",
  74. params: params,
  75. query_string: ""
  76. })
  77. assert {:cancel, {:error, :forbidden}} = ReceiverWorker.perform(oban_job)
  78. end
  79. test "when request returns a 404" do
  80. params =
  81. insert(:note_activity).data
  82. |> Map.put("actor", "https://springfield.social/users/troymcclure")
  83. {:ok, oban_job} =
  84. Federator.incoming_ap_doc(%{
  85. method: "POST",
  86. req_headers: [],
  87. request_path: "/inbox",
  88. params: params,
  89. query_string: ""
  90. })
  91. assert {:cancel, {:error, :not_found}} = ReceiverWorker.perform(oban_job)
  92. end
  93. test "when request returns a 410" do
  94. params =
  95. insert(:note_activity).data
  96. |> Map.put("actor", "https://springfield.social/users/hankscorpio")
  97. {:ok, oban_job} =
  98. Federator.incoming_ap_doc(%{
  99. method: "POST",
  100. req_headers: [],
  101. request_path: "/inbox",
  102. params: params,
  103. query_string: ""
  104. })
  105. assert {:cancel, {:error, :not_found}} = ReceiverWorker.perform(oban_job)
  106. end
  107. test "when user account is disabled" do
  108. user = insert(:user)
  109. fake_activity = URI.parse(user.ap_id) |> Map.put(:path, "/fake-activity") |> to_string
  110. params =
  111. insert(:note_activity, user: user).data
  112. |> Map.put("id", fake_activity)
  113. {:ok, %User{}} = User.set_activation(user, false)
  114. {:ok, oban_job} =
  115. Federator.incoming_ap_doc(%{
  116. method: "POST",
  117. req_headers: [],
  118. request_path: "/inbox",
  119. params: params,
  120. query_string: ""
  121. })
  122. assert {:cancel, {:user_active, false}} = ReceiverWorker.perform(oban_job)
  123. end
  124. end
  125. test "it can validate the signature" do
  126. Tesla.Mock.mock(fn
  127. %{url: "https://phpc.social/users/denniskoch"} ->
  128. %Tesla.Env{
  129. status: 200,
  130. body: File.read!("test/fixtures/denniskoch.json"),
  131. headers: [{"content-type", "application/activity+json"}]
  132. }
  133. %{url: "https://phpc.social/users/denniskoch/collections/featured"} ->
  134. %Tesla.Env{
  135. status: 200,
  136. headers: [{"content-type", "application/activity+json"}],
  137. body:
  138. File.read!("test/fixtures/users_mock/masto_featured.json")
  139. |> String.replace("{{domain}}", "phpc.social")
  140. |> String.replace("{{nickname}}", "denniskoch")
  141. }
  142. end)
  143. params =
  144. File.read!("test/fixtures/receiver_worker_signature_activity.json") |> Jason.decode!()
  145. req_headers = [
  146. ["accept-encoding", "gzip"],
  147. ["content-length", "5184"],
  148. ["content-type", "application/activity+json"],
  149. ["date", "Thu, 25 Jul 2024 13:33:31 GMT"],
  150. ["digest", "SHA-256=ouge/6HP2/QryG6F3JNtZ6vzs/hSwMk67xdxe87eH7A="],
  151. ["host", "bikeshed.party"],
  152. [
  153. "signature",
  154. "keyId=\"https://mastodon.social/users/bastianallgeier#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) host date digest content-type\",signature=\"ymE3vn5Iw50N6ukSp8oIuXJB5SBjGAGjBasdTDvn+ahZIzq2SIJfmVCsIIzyqIROnhWyQoTbavTclVojEqdaeOx+Ejz2wBnRBmhz5oemJLk4RnnCH0lwMWyzeY98YAvxi9Rq57Gojuv/1lBqyGa+rDzynyJpAMyFk17XIZpjMKuTNMCbjMDy76ILHqArykAIL/v1zxkgwxY/+ELzxqMpNqtZ+kQ29znNMUBB3eVZ/mNAHAz6o33Y9VKxM2jw+08vtuIZOusXyiHbRiaj2g5HtN2WBUw1MzzfRfHF2/yy7rcipobeoyk5RvP5SyHV3WrIeZ3iyoNfmv33y8fxllF0EA==\""
  155. ],
  156. [
  157. "user-agent",
  158. "http.rb/5.2.0 (Mastodon/4.3.0-nightly.2024-07-25; +https://mastodon.social/)"
  159. ]
  160. ]
  161. {:ok, oban_job} =
  162. Federator.incoming_ap_doc(%{
  163. method: "POST",
  164. req_headers: req_headers,
  165. request_path: "/inbox",
  166. params: params,
  167. query_string: ""
  168. })
  169. assert {:ok, %Pleroma.Activity{}} = ReceiverWorker.perform(oban_job)
  170. end
  171. test "cancels due to origin containment" do
  172. params =
  173. insert(:note_activity).data
  174. |> Map.put("id", "https://notorigindomain.com/activity")
  175. {:ok, oban_job} =
  176. Federator.incoming_ap_doc(%{
  177. method: "POST",
  178. req_headers: [],
  179. request_path: "/inbox",
  180. params: params,
  181. query_string: ""
  182. })
  183. assert {:cancel, :origin_containment_failed} = ReceiverWorker.perform(oban_job)
  184. end
  185. test "canceled due to deleted object" do
  186. params =
  187. insert(:announce_activity).data
  188. |> Map.put("object", "http://localhost:4001/deleted")
  189. Tesla.Mock.mock(fn
  190. %{url: "http://localhost:4001/deleted"} ->
  191. %Tesla.Env{
  192. status: 404,
  193. body: ""
  194. }
  195. end)
  196. {:ok, oban_job} =
  197. Federator.incoming_ap_doc(%{
  198. method: "POST",
  199. req_headers: [],
  200. request_path: "/inbox",
  201. params: params,
  202. query_string: ""
  203. })
  204. assert {:cancel, _} = ReceiverWorker.perform(oban_job)
  205. end
  206. end