logo

pleroma

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

federator_test.exs (6616B)


  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.FederatorTest do
  5. alias Pleroma.Instances
  6. alias Pleroma.Tests.ObanHelpers
  7. alias Pleroma.Web.CommonAPI
  8. alias Pleroma.Web.Federator
  9. alias Pleroma.Workers.PublisherWorker
  10. use Pleroma.DataCase
  11. use Oban.Testing, repo: Pleroma.Repo
  12. import Pleroma.Factory
  13. import Mock
  14. setup_all do
  15. Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
  16. :ok
  17. end
  18. setup_all do: clear_config([:instance, :federating], true)
  19. setup do: clear_config([:instance, :allow_relay])
  20. setup do: clear_config([:mrf, :policies])
  21. setup do: clear_config([:mrf_keyword])
  22. describe "Publish an activity" do
  23. setup do
  24. user = insert(:user)
  25. {:ok, activity} = CommonAPI.post(user, %{status: "HI"})
  26. relay_mock = {
  27. Pleroma.Web.ActivityPub.Relay,
  28. [],
  29. [publish: fn _activity -> send(self(), :relay_publish) end]
  30. }
  31. %{activity: activity, relay_mock: relay_mock}
  32. end
  33. test "to shared inbox when multiple actors from same instance are recipients" do
  34. user = insert(:user)
  35. shared_inbox = "https://domain.com/inbox"
  36. follower_one =
  37. insert(:user, %{
  38. local: false,
  39. nickname: "nick1@domain.com",
  40. ap_id: "https://domain.com/users/nick1",
  41. inbox: "https://domain.com/users/nick1/inbox",
  42. shared_inbox: shared_inbox
  43. })
  44. follower_two =
  45. insert(:user, %{
  46. local: false,
  47. nickname: "nick2@domain.com",
  48. ap_id: "https://domain.com/users/nick2",
  49. inbox: "https://domain.com/users/nick2/inbox",
  50. shared_inbox: shared_inbox
  51. })
  52. {:ok, _, _} = Pleroma.User.follow(follower_one, user)
  53. {:ok, _, _} = Pleroma.User.follow(follower_two, user)
  54. {:ok, _activity} = CommonAPI.post(user, %{status: "Happy Friday everyone!"})
  55. ObanHelpers.perform(all_enqueued(worker: PublisherWorker))
  56. inboxes =
  57. all_enqueued(worker: PublisherWorker)
  58. |> Enum.filter(&(get_in(&1, [Access.key(:args), Access.key("op")]) == "publish_one"))
  59. |> Enum.map(&get_in(&1, [Access.key(:args), Access.key("params"), Access.key("inbox")]))
  60. assert [shared_inbox] == inboxes
  61. end
  62. test "with relays active, it publishes to the relay", %{
  63. activity: activity,
  64. relay_mock: relay_mock
  65. } do
  66. with_mocks([relay_mock]) do
  67. Federator.publish(activity)
  68. ObanHelpers.perform(all_enqueued(worker: PublisherWorker))
  69. end
  70. assert_received :relay_publish
  71. end
  72. test "with relays deactivated, it does not publish to the relay", %{
  73. activity: activity,
  74. relay_mock: relay_mock
  75. } do
  76. clear_config([:instance, :allow_relay], false)
  77. with_mocks([relay_mock]) do
  78. Federator.publish(activity)
  79. ObanHelpers.perform(all_enqueued(worker: PublisherWorker))
  80. end
  81. refute_received :relay_publish
  82. end
  83. end
  84. describe "Targets reachability filtering in `publish`" do
  85. test "it federates only to reachable instances via AP" do
  86. user = insert(:user)
  87. {inbox1, inbox2} =
  88. {"https://domain.com/users/nick1/inbox", "https://domain2.com/users/nick2/inbox"}
  89. insert(:user, %{
  90. local: false,
  91. nickname: "nick1@domain.com",
  92. ap_id: "https://domain.com/users/nick1",
  93. inbox: inbox1
  94. })
  95. insert(:user, %{
  96. local: false,
  97. nickname: "nick2@domain2.com",
  98. ap_id: "https://domain2.com/users/nick2",
  99. inbox: inbox2
  100. })
  101. dt = NaiveDateTime.utc_now()
  102. Instances.set_unreachable(inbox1, dt)
  103. Instances.set_consistently_unreachable(URI.parse(inbox2).host)
  104. {:ok, _activity} =
  105. CommonAPI.post(user, %{status: "HI @nick1@domain.com, @nick2@domain2.com!"})
  106. expected_dt = NaiveDateTime.to_iso8601(dt)
  107. ObanHelpers.perform(all_enqueued(worker: PublisherWorker))
  108. assert ObanHelpers.member?(
  109. %{
  110. "op" => "publish_one",
  111. "params" => %{"inbox" => inbox1, "unreachable_since" => expected_dt}
  112. },
  113. all_enqueued(worker: PublisherWorker)
  114. )
  115. end
  116. end
  117. describe "Receive an activity" do
  118. test "successfully processes incoming AP docs with correct origin" do
  119. params = %{
  120. "@context" => "https://www.w3.org/ns/activitystreams",
  121. "actor" => "http://mastodon.example.org/users/admin",
  122. "type" => "Create",
  123. "id" => "http://mastodon.example.org/users/admin/activities/1",
  124. "object" => %{
  125. "type" => "Note",
  126. "content" => "hi world!",
  127. "id" => "http://mastodon.example.org/users/admin/objects/1",
  128. "attributedTo" => "http://mastodon.example.org/users/admin",
  129. "to" => ["https://www.w3.org/ns/activitystreams#Public"]
  130. },
  131. "to" => ["https://www.w3.org/ns/activitystreams#Public"]
  132. }
  133. assert {:ok, job} = Federator.incoming_ap_doc(params)
  134. assert {:ok, _activity} = ObanHelpers.perform(job)
  135. assert {:ok, job} = Federator.incoming_ap_doc(params)
  136. assert {:cancel, :already_present} = ObanHelpers.perform(job)
  137. end
  138. test "rejects incoming AP docs with incorrect origin" do
  139. params = %{
  140. "@context" => "https://www.w3.org/ns/activitystreams",
  141. "actor" => "https://niu.moe/users/rye",
  142. "type" => "Create",
  143. "id" => "http://mastodon.example.org/users/admin/activities/1",
  144. "object" => %{
  145. "type" => "Note",
  146. "content" => "hi world!",
  147. "id" => "http://mastodon.example.org/users/admin/objects/1",
  148. "attributedTo" => "http://mastodon.example.org/users/admin",
  149. "to" => ["https://www.w3.org/ns/activitystreams#Public"]
  150. },
  151. "to" => ["https://www.w3.org/ns/activitystreams#Public"]
  152. }
  153. assert {:ok, job} = Federator.incoming_ap_doc(params)
  154. assert {:cancel, :origin_containment_failed} = ObanHelpers.perform(job)
  155. end
  156. test "it does not crash if MRF rejects the post" do
  157. clear_config([:mrf_keyword, :reject], ["lain"])
  158. clear_config(
  159. [:mrf, :policies],
  160. Pleroma.Web.ActivityPub.MRF.KeywordPolicy
  161. )
  162. params =
  163. File.read!("test/fixtures/mastodon-post-activity.json")
  164. |> Jason.decode!()
  165. assert {:ok, job} = Federator.incoming_ap_doc(params)
  166. assert {:cancel, _} = ObanHelpers.perform(job)
  167. end
  168. end
  169. end