diff options
| author | Ivan Tashkinov <ivantashkinov@gmail.com> | 2019-12-06 20:33:47 +0300 | 
|---|---|---|
| committer | Ivan Tashkinov <ivantashkinov@gmail.com> | 2019-12-06 20:33:47 +0300 | 
| commit | 40e1817f707c3c2ef253009c7363cd81b11322a6 (patch) | |
| tree | 745e6b50be36a9f5a4e8f145134ce9554ec4c02a /test | |
| parent | 93a80ee9155bf5257aa92afaca2fe017f28aabfa (diff) | |
| download | pleroma-40e1817f707c3c2ef253009c7363cd81b11322a6.tar.gz pleroma-40e1817f707c3c2ef253009c7363cd81b11322a6.zip  | |
[#1427] Fixes / improvements of admin scopes support. Added tests.
Diffstat (limited to 'test')
| -rw-r--r-- | test/plugs/user_is_admin_plug_test.exs | 104 | ||||
| -rw-r--r-- | test/web/admin_api/admin_api_controller_test.exs | 47 | 
2 files changed, 127 insertions, 24 deletions
diff --git a/test/plugs/user_is_admin_plug_test.exs b/test/plugs/user_is_admin_plug_test.exs index 136dcc54e..154c9b195 100644 --- a/test/plugs/user_is_admin_plug_test.exs +++ b/test/plugs/user_is_admin_plug_test.exs @@ -8,36 +8,96 @@ defmodule Pleroma.Plugs.UserIsAdminPlugTest do    alias Pleroma.Plugs.UserIsAdminPlug    import Pleroma.Factory -  test "accepts a user that is admin" do -    user = insert(:user, is_admin: true) +  describe "unless [:auth, :enforce_oauth_admin_scope_usage]," do +    clear_config([:auth, :enforce_oauth_admin_scope_usage]) do +      Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], false) +    end -    conn = -      build_conn() -      |> assign(:user, user) +    test "accepts a user that is admin" do +      user = insert(:user, is_admin: true) -    ret_conn = -      conn -      |> UserIsAdminPlug.call(%{}) +      conn = assign(build_conn(), :user, user) -    assert conn == ret_conn -  end +      ret_conn = UserIsAdminPlug.call(conn, %{}) + +      assert conn == ret_conn +    end + +    test "denies a user that isn't admin" do +      user = insert(:user) + +      conn = +        build_conn() +        |> assign(:user, user) +        |> UserIsAdminPlug.call(%{}) -  test "denies a user that isn't admin" do -    user = insert(:user) +      assert conn.status == 403 +    end -    conn = -      build_conn() -      |> assign(:user, user) -      |> UserIsAdminPlug.call(%{}) +    test "denies when a user isn't set" do +      conn = UserIsAdminPlug.call(build_conn(), %{}) -    assert conn.status == 403 +      assert conn.status == 403 +    end    end -  test "denies when a user isn't set" do -    conn = -      build_conn() -      |> UserIsAdminPlug.call(%{}) +  describe "with [:auth, :enforce_oauth_admin_scope_usage]," do +    clear_config([:auth, :enforce_oauth_admin_scope_usage]) do +      Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], true) +    end + +    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 + +    # Note: in real-life scenarios only users with is_admin flag can possess admin-scoped tokens; +    #   however, the following test stresses out that is_admin flag is not checked if we got token +    test "if token has any of admin scopes, accepts users regardless of is_admin flag", +         %{users: users} do +      for user <- users do +        token = insert(:oauth_token, user: user, scopes: ["admin:something"]) + +        conn = +          build_conn() +          |> assign(:user, user) +          |> assign(:token, token) +          |> UserIsAdminPlug.call(%{}) + +        ret_conn = UserIsAdminPlug.call(conn, %{}) + +        assert conn == ret_conn +      end +    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 + +    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(%{}) -    assert conn.status == 403 +        assert conn.status == 403 +      end +    end    end  end diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index d0131fd90..2fc23ad6c 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -24,6 +24,49 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      :ok    end +  clear_config([:auth, :enforce_oauth_admin_scope_usage]) do +    Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], false) +  end + +  describe "with [:auth, :enforce_oauth_admin_scope_usage]," do +    clear_config([:auth, :enforce_oauth_admin_scope_usage]) do +      Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], true) +    end + +    test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or broader scope" do +      user = insert(:user) +      admin = insert(:user, is_admin: true) + +      good_token1 = insert(:oauth_token, user: admin, scopes: ["admin"]) +      good_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read"]) +      good_token3 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts"]) + +      bad_token1 = insert(:oauth_token, user: admin, scopes: ["read:accounts"]) +      bad_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts:partial"]) +      bad_token3 = nil + +      for good_token <- [good_token1, good_token2, good_token3] do +        conn = +          build_conn() +          |> assign(:user, admin) +          |> assign(:token, good_token) +          |> get("/api/pleroma/admin/users/#{user.nickname}") + +        assert json_response(conn, 200) +      end + +      for bad_token <- [bad_token1, bad_token2, bad_token3] do +        conn = +          build_conn() +          |> assign(:user, admin) +          |> assign(:token, bad_token) +          |> get("/api/pleroma/admin/users/#{user.nickname}") + +        assert json_response(conn, :forbidden) +      end +    end +  end +    describe "DELETE /api/pleroma/admin/users" do      test "single user" do        admin = insert(:user, is_admin: true) @@ -97,7 +140,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert ["lain", "lain2"] -- Enum.map(log_entry.data["subjects"], & &1["nickname"]) == []      end -    test "Cannot create user with exisiting email" do +    test "Cannot create user with existing email" do        admin = insert(:user, is_admin: true)        user = insert(:user) @@ -128,7 +171,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do               ]      end -    test "Cannot create user with exisiting nickname" do +    test "Cannot create user with existing nickname" do        admin = insert(:user, is_admin: true)        user = insert(:user)  | 
