diff options
| author | Alex Gleason <alex@alexgleason.me> | 2020-07-16 14:51:36 -0500 | 
|---|---|---|
| committer | Alex Gleason <alex@alexgleason.me> | 2020-07-16 14:51:36 -0500 | 
| commit | 38425ebdbf157377ccb0402f78dc3d02f81c55f5 (patch) | |
| tree | 740f32837d28e918f097c948d89827d99434d5b2 /test/plugs | |
| parent | 8daacc911498d827fd68ea3d34eb1be9ae4a1ffe (diff) | |
| parent | 3a2b2cb6f2d6ce39ae0d246649189c021c535992 (diff) | |
| download | pleroma-38425ebdbf157377ccb0402f78dc3d02f81c55f5.tar.gz pleroma-38425ebdbf157377ccb0402f78dc3d02f81c55f5.zip | |
Merge remote-tracking branch 'upstream/develop' into linkify
Diffstat (limited to 'test/plugs')
| -rw-r--r-- | test/plugs/admin_secret_authentication_plug_test.exs | 13 | ||||
| -rw-r--r-- | test/plugs/http_security_plug_test.exs | 90 | ||||
| -rw-r--r-- | test/plugs/instance_static_test.exs | 2 | ||||
| -rw-r--r-- | test/plugs/user_is_admin_plug_test.exs | 114 | 
4 files changed, 99 insertions, 120 deletions
| diff --git a/test/plugs/admin_secret_authentication_plug_test.exs b/test/plugs/admin_secret_authentication_plug_test.exs index 100016c62..89df03c4b 100644 --- a/test/plugs/admin_secret_authentication_plug_test.exs +++ b/test/plugs/admin_secret_authentication_plug_test.exs @@ -4,9 +4,14 @@  defmodule Pleroma.Plugs.AdminSecretAuthenticationPlugTest do    use Pleroma.Web.ConnCase, async: true + +  import Mock    import Pleroma.Factory    alias Pleroma.Plugs.AdminSecretAuthenticationPlug +  alias Pleroma.Plugs.OAuthScopesPlug +  alias Pleroma.Plugs.PlugHelper +  alias Pleroma.Plugs.RateLimiter    test "does nothing if a user is assigned", %{conn: conn} do      user = insert(:user) @@ -25,6 +30,10 @@ defmodule Pleroma.Plugs.AdminSecretAuthenticationPlugTest do    describe "when secret set it assigns an admin user" do      setup do: clear_config([:admin_token]) +    setup_with_mocks([{RateLimiter, [:passthrough], []}]) do +      :ok +    end +      test "with `admin_token` query parameter", %{conn: conn} do        Pleroma.Config.put(:admin_token, "password123") @@ -33,12 +42,14 @@ defmodule Pleroma.Plugs.AdminSecretAuthenticationPlugTest do          |> AdminSecretAuthenticationPlug.call(%{})        refute conn.assigns[:user] +      assert called(RateLimiter.call(conn, name: :authentication))        conn =          %{conn | params: %{"admin_token" => "password123"}}          |> AdminSecretAuthenticationPlug.call(%{})        assert conn.assigns[:user].is_admin +      assert PlugHelper.plug_skipped?(conn, OAuthScopesPlug)      end      test "with `x-admin-token` HTTP header", %{conn: conn} do @@ -50,6 +61,7 @@ defmodule Pleroma.Plugs.AdminSecretAuthenticationPlugTest do          |> AdminSecretAuthenticationPlug.call(%{})        refute conn.assigns[:user] +      assert called(RateLimiter.call(conn, name: :authentication))        conn =          conn @@ -57,6 +69,7 @@ defmodule Pleroma.Plugs.AdminSecretAuthenticationPlugTest do          |> AdminSecretAuthenticationPlug.call(%{})        assert conn.assigns[:user].is_admin +      assert PlugHelper.plug_skipped?(conn, OAuthScopesPlug)      end    end  end diff --git a/test/plugs/http_security_plug_test.exs b/test/plugs/http_security_plug_test.exs index 63b4d3f31..2297e3dac 100644 --- a/test/plugs/http_security_plug_test.exs +++ b/test/plugs/http_security_plug_test.exs @@ -4,17 +4,12 @@  defmodule Pleroma.Web.Plugs.HTTPSecurityPlugTest do    use Pleroma.Web.ConnCase +    alias Pleroma.Config    alias Plug.Conn -  setup do: clear_config([:http_securiy, :enabled]) -  setup do: clear_config([:http_security, :sts]) -  setup do: clear_config([:http_security, :referrer_policy]) -    describe "http security enabled" do -    setup do -      Config.put([:http_security, :enabled], true) -    end +    setup do: clear_config([:http_security, :enabled], true)      test "it sends CSP headers when enabled", %{conn: conn} do        conn = get(conn, "/api/v1/instance") @@ -29,7 +24,7 @@ defmodule Pleroma.Web.Plugs.HTTPSecurityPlugTest do      end      test "it sends STS headers when enabled", %{conn: conn} do -      Config.put([:http_security, :sts], true) +      clear_config([:http_security, :sts], true)        conn = get(conn, "/api/v1/instance") @@ -38,7 +33,7 @@ defmodule Pleroma.Web.Plugs.HTTPSecurityPlugTest do      end      test "it does not send STS headers when disabled", %{conn: conn} do -      Config.put([:http_security, :sts], false) +      clear_config([:http_security, :sts], false)        conn = get(conn, "/api/v1/instance") @@ -47,23 +42,19 @@ defmodule Pleroma.Web.Plugs.HTTPSecurityPlugTest do      end      test "referrer-policy header reflects configured value", %{conn: conn} do -      conn = get(conn, "/api/v1/instance") +      resp = get(conn, "/api/v1/instance") -      assert Conn.get_resp_header(conn, "referrer-policy") == ["same-origin"] +      assert Conn.get_resp_header(resp, "referrer-policy") == ["same-origin"] -      Config.put([:http_security, :referrer_policy], "no-referrer") +      clear_config([:http_security, :referrer_policy], "no-referrer") -      conn = -        build_conn() -        |> get("/api/v1/instance") +      resp = get(conn, "/api/v1/instance") -      assert Conn.get_resp_header(conn, "referrer-policy") == ["no-referrer"] +      assert Conn.get_resp_header(resp, "referrer-policy") == ["no-referrer"]      end -    test "it sends `report-to` & `report-uri` CSP response headers" do -      conn = -        build_conn() -        |> get("/api/v1/instance") +    test "it sends `report-to` & `report-uri` CSP response headers", %{conn: conn} do +      conn = get(conn, "/api/v1/instance")        [csp] = Conn.get_resp_header(conn, "content-security-policy") @@ -74,10 +65,67 @@ defmodule Pleroma.Web.Plugs.HTTPSecurityPlugTest do        assert reply_to ==                 "{\"endpoints\":[{\"url\":\"https://endpoint.com\"}],\"group\":\"csp-endpoint\",\"max-age\":10886400}"      end + +    test "default values for img-src and media-src with disabled media proxy", %{conn: conn} do +      conn = get(conn, "/api/v1/instance") + +      [csp] = Conn.get_resp_header(conn, "content-security-policy") +      assert csp =~ "media-src 'self' https:;" +      assert csp =~ "img-src 'self' data: blob: https:;" +    end +  end + +  describe "img-src and media-src" do +    setup do +      clear_config([:http_security, :enabled], true) +      clear_config([:media_proxy, :enabled], true) +      clear_config([:media_proxy, :proxy_opts, :redirect_on_failure], false) +    end + +    test "media_proxy with base_url", %{conn: conn} do +      url = "https://example.com" +      clear_config([:media_proxy, :base_url], url) +      assert_media_img_src(conn, url) +    end + +    test "upload with base url", %{conn: conn} do +      url = "https://example2.com" +      clear_config([Pleroma.Upload, :base_url], url) +      assert_media_img_src(conn, url) +    end + +    test "with S3 public endpoint", %{conn: conn} do +      url = "https://example3.com" +      clear_config([Pleroma.Uploaders.S3, :public_endpoint], url) +      assert_media_img_src(conn, url) +    end + +    test "with captcha endpoint", %{conn: conn} do +      clear_config([Pleroma.Captcha.Mock, :endpoint], "https://captcha.com") +      assert_media_img_src(conn, "https://captcha.com") +    end + +    test "with media_proxy whitelist", %{conn: conn} do +      clear_config([:media_proxy, :whitelist], ["https://example6.com", "https://example7.com"]) +      assert_media_img_src(conn, "https://example7.com https://example6.com") +    end + +    # TODO: delete after removing support bare domains for media proxy whitelist +    test "with media_proxy bare domains whitelist (deprecated)", %{conn: conn} do +      clear_config([:media_proxy, :whitelist], ["example4.com", "example5.com"]) +      assert_media_img_src(conn, "example5.com example4.com") +    end +  end + +  defp assert_media_img_src(conn, url) do +    conn = get(conn, "/api/v1/instance") +    [csp] = Conn.get_resp_header(conn, "content-security-policy") +    assert csp =~ "media-src 'self' #{url};" +    assert csp =~ "img-src 'self' data: blob: #{url};"    end    test "it does not send CSP headers when disabled", %{conn: conn} do -    Config.put([:http_security, :enabled], false) +    clear_config([:http_security, :enabled], false)      conn = get(conn, "/api/v1/instance") diff --git a/test/plugs/instance_static_test.exs b/test/plugs/instance_static_test.exs index b8f070d6a..be2613ad0 100644 --- a/test/plugs/instance_static_test.exs +++ b/test/plugs/instance_static_test.exs @@ -16,7 +16,7 @@ defmodule Pleroma.Web.RuntimeStaticPlugTest do    test "overrides index" do      bundled_index = get(build_conn(), "/") -    assert html_response(bundled_index, 200) == File.read!("priv/static/index.html") +    refute html_response(bundled_index, 200) == "hello world"      File.write!(@dir <> "/index.html", "hello world") diff --git a/test/plugs/user_is_admin_plug_test.exs b/test/plugs/user_is_admin_plug_test.exs index fd6a50e53..8bc00e444 100644 --- a/test/plugs/user_is_admin_plug_test.exs +++ b/test/plugs/user_is_admin_plug_test.exs @@ -8,112 +8,30 @@ defmodule Pleroma.Plugs.UserIsAdminPlugTest do    alias Pleroma.Plugs.UserIsAdminPlug    import Pleroma.Factory -  describe "unless [:auth, :enforce_oauth_admin_scope_usage]," do -    setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false) +  test "accepts a user that is an admin" do +    user = insert(:user, is_admin: true) -    test "accepts a user that is an admin" do -      user = insert(:user, is_admin: true) +    conn = assign(build_conn(), :user, user) -      conn = assign(build_conn(), :user, user) +    ret_conn = UserIsAdminPlug.call(conn, %{}) -      ret_conn = UserIsAdminPlug.call(conn, %{}) - -      assert conn == ret_conn -    end - -    test "denies a user that isn't an admin" do -      user = insert(:user) - -      conn = -        build_conn() -        |> assign(:user, user) -        |> UserIsAdminPlug.call(%{}) - -      assert conn.status == 403 -    end - -    test "denies when a user isn't set" do -      conn = UserIsAdminPlug.call(build_conn(), %{}) - -      assert conn.status == 403 -    end +    assert conn == ret_conn    end -  describe "with [:auth, :enforce_oauth_admin_scope_usage]," do -    setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], true) - -    setup do -      admin_user = insert(:user, is_admin: true) -      non_admin_user = insert(:user, is_admin: false) -      blank_user = nil - -      {:ok, %{users: [admin_user, non_admin_user, blank_user]}} -    end - -    test "if token has any of admin scopes, accepts a user that is an admin", %{conn: conn} do -      user = insert(:user, is_admin: true) -      token = insert(:oauth_token, user: user, scopes: ["admin:something"]) - -      conn = -        conn -        |> assign(:user, user) -        |> assign(:token, token) +  test "denies a user that isn't an admin" do +    user = insert(:user) -      ret_conn = UserIsAdminPlug.call(conn, %{}) +    conn = +      build_conn() +      |> assign(:user, user) +      |> UserIsAdminPlug.call(%{}) -      assert conn == ret_conn -    end - -    test "if token has any of admin scopes, denies a user that isn't an admin", %{conn: conn} do -      user = insert(:user, is_admin: false) -      token = insert(:oauth_token, user: user, scopes: ["admin:something"]) - -      conn = -        conn -        |> assign(:user, user) -        |> assign(:token, token) -        |> UserIsAdminPlug.call(%{}) - -      assert conn.status == 403 -    end - -    test "if token has any of admin scopes, denies when a user isn't set", %{conn: conn} do -      token = insert(:oauth_token, scopes: ["admin:something"]) - -      conn = -        conn -        |> assign(:user, nil) -        |> assign(:token, token) -        |> UserIsAdminPlug.call(%{}) - -      assert conn.status == 403 -    end - -    test "if token lacks admin scopes, denies users regardless of is_admin flag", -         %{users: users} do -      for user <- users do -        token = insert(:oauth_token, user: user) - -        conn = -          build_conn() -          |> assign(:user, user) -          |> assign(:token, token) -          |> UserIsAdminPlug.call(%{}) - -        assert conn.status == 403 -      end -    end +    assert conn.status == 403 +  end -    test "if token is missing, denies users regardless of is_admin flag", %{users: users} do -      for user <- users do -        conn = -          build_conn() -          |> assign(:user, user) -          |> assign(:token, nil) -          |> UserIsAdminPlug.call(%{}) +  test "denies when a user isn't set" do +    conn = UserIsAdminPlug.call(build_conn(), %{}) -        assert conn.status == 403 -      end -    end +    assert conn.status == 403    end  end | 
