logo

pleroma

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

node_info_test.exs (8214B)


  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.NodeInfoTest do
  5. use Pleroma.Web.ConnCase, async: false
  6. import Pleroma.Factory
  7. setup do: clear_config([:mrf_simple])
  8. setup do: clear_config(:instance)
  9. test "GET /.well-known/nodeinfo", %{conn: conn} do
  10. links =
  11. conn
  12. |> get("/.well-known/nodeinfo")
  13. |> json_response(200)
  14. |> Map.fetch!("links")
  15. Enum.each(links, fn link ->
  16. href = Map.fetch!(link, "href")
  17. conn
  18. |> get(href)
  19. |> json_response(200)
  20. end)
  21. end
  22. test "nodeinfo shows staff accounts", %{conn: conn} do
  23. moderator = insert(:user, local: true, is_moderator: true)
  24. admin = insert(:user, local: true, is_admin: true)
  25. conn =
  26. conn
  27. |> get("/nodeinfo/2.1.json")
  28. assert result = json_response(conn, 200)
  29. assert moderator.ap_id in result["metadata"]["staffAccounts"]
  30. assert admin.ap_id in result["metadata"]["staffAccounts"]
  31. end
  32. test "nodeinfo shows roles and privileges", %{conn: conn} do
  33. clear_config([:instance, :moderator_privileges], [:cofe])
  34. clear_config([:instance, :admin_privileges], [:suya, :cofe])
  35. conn =
  36. conn
  37. |> get("/nodeinfo/2.1.json")
  38. assert result = json_response(conn, 200)
  39. assert %{"admin" => ["suya", "cofe"], "moderator" => ["cofe"]} == result["metadata"]["roles"]
  40. end
  41. test "nodeinfo shows restricted nicknames", %{conn: conn} do
  42. conn =
  43. conn
  44. |> get("/nodeinfo/2.1.json")
  45. assert result = json_response(conn, 200)
  46. assert Config.get([Pleroma.User, :restricted_nicknames]) ==
  47. result["metadata"]["restrictedNicknames"]
  48. end
  49. test "returns software.repository field in nodeinfo 2.1", %{conn: conn} do
  50. conn
  51. |> get("/.well-known/nodeinfo")
  52. |> json_response(200)
  53. conn =
  54. conn
  55. |> get("/nodeinfo/2.1.json")
  56. assert result = json_response(conn, 200)
  57. assert Pleroma.Application.repository() == result["software"]["repository"]
  58. end
  59. test "returns fieldsLimits field", %{conn: conn} do
  60. clear_config([:instance, :max_account_fields], 10)
  61. clear_config([:instance, :max_remote_account_fields], 15)
  62. clear_config([:instance, :account_field_name_length], 255)
  63. clear_config([:instance, :account_field_value_length], 2048)
  64. response =
  65. conn
  66. |> get("/nodeinfo/2.1.json")
  67. |> json_response(:ok)
  68. assert response["metadata"]["fieldsLimits"]["maxFields"] == 10
  69. assert response["metadata"]["fieldsLimits"]["maxRemoteFields"] == 15
  70. assert response["metadata"]["fieldsLimits"]["nameLength"] == 255
  71. assert response["metadata"]["fieldsLimits"]["valueLength"] == 2048
  72. end
  73. test "it returns the safe_dm_mentions feature if enabled", %{conn: conn} do
  74. clear_config([:instance, :safe_dm_mentions], true)
  75. response =
  76. conn
  77. |> get("/nodeinfo/2.1.json")
  78. |> json_response(:ok)
  79. assert "safe_dm_mentions" in response["metadata"]["features"]
  80. clear_config([:instance, :safe_dm_mentions], false)
  81. response =
  82. conn
  83. |> get("/nodeinfo/2.1.json")
  84. |> json_response(:ok)
  85. refute "safe_dm_mentions" in response["metadata"]["features"]
  86. end
  87. describe "`metadata/federation/enabled`" do
  88. setup do: clear_config([:instance, :federating])
  89. test "it shows if federation is enabled/disabled", %{conn: conn} do
  90. clear_config([:instance, :federating], true)
  91. response =
  92. conn
  93. |> get("/nodeinfo/2.1.json")
  94. |> json_response(:ok)
  95. assert response["metadata"]["federation"]["enabled"] == true
  96. clear_config([:instance, :federating], false)
  97. response =
  98. conn
  99. |> get("/nodeinfo/2.1.json")
  100. |> json_response(:ok)
  101. assert response["metadata"]["federation"]["enabled"] == false
  102. end
  103. end
  104. test "it shows default features flags", %{conn: conn} do
  105. response =
  106. conn
  107. |> get("/nodeinfo/2.1.json")
  108. |> json_response(:ok)
  109. default_features = [
  110. "pleroma_api",
  111. "mastodon_api",
  112. "mastodon_api_streaming",
  113. "polls",
  114. "pleroma_explicit_addressing",
  115. "shareable_emoji_packs",
  116. "multifetch",
  117. "pleroma_emoji_reactions",
  118. "pleroma:api/v1/notifications:include_types_filter",
  119. "pleroma_chat_messages"
  120. ]
  121. assert MapSet.subset?(
  122. MapSet.new(default_features),
  123. MapSet.new(response["metadata"]["features"])
  124. )
  125. end
  126. describe "Quarantined instances" do
  127. setup do
  128. clear_config([:mrf, :transparency], true)
  129. quarantined_instances = [{"example.com", "reason to quarantine"}]
  130. clear_config([:instance, :quarantined_instances], quarantined_instances)
  131. end
  132. test "shows quarantined instances data if enabled", %{conn: conn} do
  133. expected_config = ["example.com"]
  134. response =
  135. conn
  136. |> get("/nodeinfo/2.1.json")
  137. |> json_response(:ok)
  138. assert response["metadata"]["federation"]["quarantined_instances"] == expected_config
  139. end
  140. test "shows extra information in the quarantined_info field for relevant entries", %{
  141. conn: conn
  142. } do
  143. clear_config([:mrf, :transparency], true)
  144. expected_config = %{
  145. "quarantined_instances" => %{
  146. "example.com" => %{"reason" => "reason to quarantine"}
  147. }
  148. }
  149. response =
  150. conn
  151. |> get("/nodeinfo/2.1.json")
  152. |> json_response(:ok)
  153. assert response["metadata"]["federation"]["quarantined_instances_info"] == expected_config
  154. end
  155. end
  156. describe "MRF SimplePolicy" do
  157. setup do
  158. clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.SimplePolicy])
  159. clear_config([:mrf, :transparency], true)
  160. end
  161. test "shows MRF transparency data if enabled", %{conn: conn} do
  162. simple_config = %{"reject" => [{"example.com", ""}]}
  163. clear_config(:mrf_simple, simple_config)
  164. expected_config = %{"reject" => ["example.com"]}
  165. response =
  166. conn
  167. |> get("/nodeinfo/2.1.json")
  168. |> json_response(:ok)
  169. assert response["metadata"]["federation"]["mrf_simple"] == expected_config
  170. end
  171. test "performs exclusions from MRF transparency data if configured", %{conn: conn} do
  172. clear_config([:mrf, :transparency_exclusions], [
  173. {"other.site", "We don't want them to know"}
  174. ])
  175. simple_config = %{"reject" => [{"example.com", ""}, {"other.site", ""}]}
  176. clear_config(:mrf_simple, simple_config)
  177. expected_config = %{"reject" => ["example.com"]}
  178. response =
  179. conn
  180. |> get("/nodeinfo/2.1.json")
  181. |> json_response(:ok)
  182. assert response["metadata"]["federation"]["mrf_simple"] == expected_config
  183. assert response["metadata"]["federation"]["exclusions"] == true
  184. end
  185. test "shows extra information in the mrf_simple_info field for relevant entries", %{
  186. conn: conn
  187. } do
  188. simple_config = %{
  189. media_removal: [{"no.media", "LEEWWWDD >//<"}],
  190. media_nsfw: [],
  191. federated_timeline_removal: [{"no.ftl", ""}],
  192. report_removal: [],
  193. reject: [
  194. {"example.instance", "Some reason"},
  195. {"uwu.owo", "awoo to much"},
  196. {"no.reason", ""}
  197. ],
  198. followers_only: [],
  199. accept: [],
  200. avatar_removal: [],
  201. banner_removal: [],
  202. reject_deletes: [
  203. {"peak.me", "I want to peak at what they don't want me to see, eheh"}
  204. ]
  205. }
  206. clear_config(:mrf_simple, simple_config)
  207. clear_config([:mrf, :transparency_exclusions], [
  208. {"peak.me", "I don't want them to know"}
  209. ])
  210. expected_config = %{
  211. "media_removal" => %{
  212. "no.media" => %{"reason" => "LEEWWWDD >//<"}
  213. },
  214. "reject" => %{
  215. "example.instance" => %{"reason" => "Some reason"},
  216. "uwu.owo" => %{"reason" => "awoo to much"}
  217. }
  218. }
  219. response =
  220. conn
  221. |> get("/nodeinfo/2.1.json")
  222. |> json_response(:ok)
  223. assert response["metadata"]["federation"]["mrf_simple_info"] == expected_config
  224. end
  225. end
  226. end