Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
3.9KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Integration.MastodonWebsocketTest do
  5. use Pleroma.DataCase
  6. import ExUnit.CaptureLog
  7. import Pleroma.Factory
  8. alias Pleroma.Integration.WebsocketClient
  9. alias Pleroma.Web.CommonAPI
  10. alias Pleroma.Web.OAuth
  11. @path Pleroma.Web.Endpoint.url()
  12. |> URI.parse()
  13. |> Map.put(:scheme, "ws")
  14. |> Map.put(:path, "/api/v1/streaming")
  15. |> URI.to_string()
  16. setup_all do
  17. start_supervised(Pleroma.Web.Streamer.supervisor())
  18. :ok
  19. end
  20. def start_socket(qs \\ nil, headers \\ []) do
  21. path =
  22. case qs do
  23. nil -> @path
  24. qs -> @path <> qs
  25. end
  26. WebsocketClient.start_link(self(), path, headers)
  27. end
  28. test "refuses invalid requests" do
  29. capture_log(fn ->
  30. assert {:error, {400, _}} = start_socket()
  31. assert {:error, {404, _}} = start_socket("?stream=ncjdk")
  32. Process.sleep(30)
  33. end)
  34. end
  35. test "requires authentication and a valid token for protected streams" do
  36. capture_log(fn ->
  37. assert {:error, {403, _}} = start_socket("?stream=user&access_token=aaaaaaaaaaaa")
  38. assert {:error, {403, _}} = start_socket("?stream=user")
  39. Process.sleep(30)
  40. end)
  41. end
  42. test "allows public streams without authentication" do
  43. assert {:ok, _} = start_socket("?stream=public")
  44. assert {:ok, _} = start_socket("?stream=public:local")
  45. assert {:ok, _} = start_socket("?stream=hashtag&tag=lain")
  46. end
  47. test "receives well formatted events" do
  48. user = insert(:user)
  49. {:ok, _} = start_socket("?stream=public")
  50. {:ok, activity} = CommonAPI.post(user, %{"status" => "nice echo chamber"})
  51. assert_receive {:text, raw_json}, 1_000
  52. assert {:ok, json} = Jason.decode(raw_json)
  53. assert "update" == json["event"]
  54. assert json["payload"]
  55. assert {:ok, json} = Jason.decode(json["payload"])
  56. view_json =
  57. Pleroma.Web.MastodonAPI.StatusView.render("status.json", activity: activity, for: nil)
  58. |> Jason.encode!()
  59. |> Jason.decode!()
  60. assert json == view_json
  61. end
  62. describe "with a valid user token" do
  63. setup do
  64. {:ok, app} =
  65. Pleroma.Repo.insert(
  66. OAuth.App.register_changeset(%OAuth.App{}, %{
  67. client_name: "client",
  68. scopes: ["scope"],
  69. redirect_uris: "url"
  70. })
  71. )
  72. user = insert(:user)
  73. {:ok, auth} = OAuth.Authorization.create_authorization(app, user)
  74. {:ok, token} = OAuth.Token.exchange_token(app, auth)
  75. %{user: user, token: token}
  76. end
  77. test "accepts valid tokens", state do
  78. assert {:ok, _} = start_socket("?stream=user&access_token=#{state.token.token}")
  79. end
  80. test "accepts the 'user' stream", %{token: token} = _state do
  81. assert {:ok, _} = start_socket("?stream=user&access_token=#{token.token}")
  82. assert capture_log(fn ->
  83. assert {:error, {403, "Forbidden"}} = start_socket("?stream=user")
  84. Process.sleep(30)
  85. end) =~ ":badarg"
  86. end
  87. test "accepts the 'user:notification' stream", %{token: token} = _state do
  88. assert {:ok, _} = start_socket("?stream=user:notification&access_token=#{token.token}")
  89. assert capture_log(fn ->
  90. assert {:error, {403, "Forbidden"}} = start_socket("?stream=user:notification")
  91. Process.sleep(30)
  92. end) =~ ":badarg"
  93. end
  94. test "accepts valid token on Sec-WebSocket-Protocol header", %{token: token} do
  95. assert {:ok, _} = start_socket("?stream=user", [{"Sec-WebSocket-Protocol", token.token}])
  96. assert capture_log(fn ->
  97. assert {:error, {403, "Forbidden"}} =
  98. start_socket("?stream=user", [{"Sec-WebSocket-Protocol", "I am a friend"}])
  99. Process.sleep(30)
  100. end) =~ ":badarg"
  101. end
  102. end
  103. end