logo

pleroma

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

http_signature_plug_test.exs (2775B)


  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.Plugs.HTTPSignaturePlugTest do
  5. use Pleroma.Web.ConnCase
  6. alias Pleroma.Web.Plugs.HTTPSignaturePlug
  7. import Plug.Conn
  8. import Phoenix.Controller, only: [put_format: 2]
  9. import Mock
  10. test "it call HTTPSignatures to check validity if the actor sighed it" do
  11. params = %{"actor" => "http://mastodon.example.org/users/admin"}
  12. conn = build_conn(:get, "/doesntmattter", params)
  13. with_mock HTTPSignatures, validate_conn: fn _ -> true end do
  14. conn =
  15. conn
  16. |> put_req_header(
  17. "signature",
  18. "keyId=\"http://mastodon.example.org/users/admin#main-key"
  19. )
  20. |> put_format("activity+json")
  21. |> HTTPSignaturePlug.call(%{})
  22. assert conn.assigns.valid_signature == true
  23. assert conn.halted == false
  24. assert called(HTTPSignatures.validate_conn(:_))
  25. end
  26. end
  27. describe "requires a signature when `authorized_fetch_mode` is enabled" do
  28. setup do
  29. clear_config([:activitypub, :authorized_fetch_mode], true)
  30. params = %{"actor" => "http://mastodon.example.org/users/admin"}
  31. conn = build_conn(:get, "/doesntmattter", params) |> put_format("activity+json")
  32. [conn: conn]
  33. end
  34. test "when signature header is present", %{conn: conn} do
  35. with_mock HTTPSignatures, validate_conn: fn _ -> false end do
  36. conn =
  37. conn
  38. |> put_req_header(
  39. "signature",
  40. "keyId=\"http://mastodon.example.org/users/admin#main-key"
  41. )
  42. |> HTTPSignaturePlug.call(%{})
  43. assert conn.assigns.valid_signature == false
  44. assert conn.halted == true
  45. assert conn.status == 401
  46. assert conn.state == :sent
  47. assert conn.resp_body == "Request not signed"
  48. assert called(HTTPSignatures.validate_conn(:_))
  49. end
  50. with_mock HTTPSignatures, validate_conn: fn _ -> true end do
  51. conn =
  52. conn
  53. |> put_req_header(
  54. "signature",
  55. "keyId=\"http://mastodon.example.org/users/admin#main-key"
  56. )
  57. |> HTTPSignaturePlug.call(%{})
  58. assert conn.assigns.valid_signature == true
  59. assert conn.halted == false
  60. assert called(HTTPSignatures.validate_conn(:_))
  61. end
  62. end
  63. test "halts the connection when `signature` header is not present", %{conn: conn} do
  64. conn = HTTPSignaturePlug.call(conn, %{})
  65. assert conn.assigns[:valid_signature] == nil
  66. assert conn.halted == true
  67. assert conn.status == 401
  68. assert conn.state == :sent
  69. assert conn.resp_body == "Request not signed"
  70. end
  71. end
  72. end