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.

114 lines
3.0KB

  1. defmodule Pleroma.MediaProxyTest do
  2. use ExUnit.Case
  3. import Pleroma.Web.MediaProxy
  4. describe "when enabled" do
  5. setup do
  6. enabled = Pleroma.Config.get([:media_proxy, :enabled])
  7. unless enabled do
  8. Pleroma.Config.put([:media_proxy, :enabled], true)
  9. on_exit(fn -> Pleroma.Config.put([:media_proxy, :enabled], enabled) end)
  10. end
  11. :ok
  12. end
  13. test "ignores invalid url" do
  14. assert url(nil) == nil
  15. assert url("") == nil
  16. end
  17. test "ignores relative url" do
  18. assert url("/local") == "/local"
  19. assert url("/") == "/"
  20. end
  21. test "ignores local url" do
  22. local_url = Pleroma.Web.Endpoint.url() <> "/hello"
  23. local_root = Pleroma.Web.Endpoint.url()
  24. assert url(local_url) == local_url
  25. assert url(local_root) == local_root
  26. end
  27. test "encodes and decodes URL" do
  28. url = "https://pleroma.soykaf.com/static/logo.png"
  29. encoded = url(url)
  30. assert String.starts_with?(
  31. encoded,
  32. Pleroma.Config.get([:media_proxy, :base_url], Pleroma.Web.base_url())
  33. )
  34. assert String.ends_with?(encoded, "/logo.png")
  35. assert decode_result(encoded) == url
  36. end
  37. test "encodes and decodes URL without a path" do
  38. url = "https://pleroma.soykaf.com"
  39. encoded = url(url)
  40. assert decode_result(encoded) == url
  41. end
  42. test "encodes and decodes URL without an extension" do
  43. url = "https://pleroma.soykaf.com/path/"
  44. encoded = url(url)
  45. assert String.ends_with?(encoded, "/path")
  46. assert decode_result(encoded) == url
  47. end
  48. test "encodes and decodes URL and ignores query params for the path" do
  49. url = "https://pleroma.soykaf.com/static/logo.png?93939393939&bunny=true"
  50. encoded = url(url)
  51. assert String.ends_with?(encoded, "/logo.png")
  52. assert decode_result(encoded) == url
  53. end
  54. test "validates signature" do
  55. secret_key_base = Pleroma.Config.get([Pleroma.Web.Endpoint, :secret_key_base])
  56. on_exit(fn ->
  57. Pleroma.Config.put([Pleroma.Web.Endpoint, :secret_key_base], secret_key_base)
  58. end)
  59. encoded = url("https://pleroma.social")
  60. Pleroma.Config.put(
  61. [Pleroma.Web.Endpoint, :secret_key_base],
  62. "00000000000000000000000000000000000000000000000"
  63. )
  64. [_, "proxy", sig, base64 | _] = URI.parse(encoded).path |> String.split("/")
  65. assert decode_url(sig, base64) == {:error, :invalid_signature}
  66. end
  67. end
  68. describe "when disabled" do
  69. setup do
  70. enabled = Pleroma.Config.get([:media_proxy, :enabled])
  71. if enabled do
  72. Pleroma.Config.put([:media_proxy, :enabled], false)
  73. on_exit(fn ->
  74. Pleroma.Config.put([:media_proxy, :enabled], enabled)
  75. :ok
  76. end)
  77. end
  78. :ok
  79. end
  80. test "does not encode remote urls" do
  81. assert url("https://google.fr") == "https://google.fr"
  82. end
  83. end
  84. defp decode_result(encoded) do
  85. [_, "proxy", sig, base64 | _] = URI.parse(encoded).path |> String.split("/")
  86. {:ok, decoded} = decode_url(sig, base64)
  87. decoded
  88. end
  89. end