diff options
Diffstat (limited to 'test/web/oauth')
| -rw-r--r-- | test/web/oauth/app_test.exs | 44 | ||||
| -rw-r--r-- | test/web/oauth/authorization_test.exs | 77 | ||||
| -rw-r--r-- | test/web/oauth/ldap_authorization_test.exs | 135 | ||||
| -rw-r--r-- | test/web/oauth/mfa_controller_test.exs | 306 | ||||
| -rw-r--r-- | test/web/oauth/oauth_controller_test.exs | 1232 | ||||
| -rw-r--r-- | test/web/oauth/token/utils_test.exs | 53 | ||||
| -rw-r--r-- | test/web/oauth/token_test.exs | 72 | 
7 files changed, 0 insertions, 1919 deletions
| diff --git a/test/web/oauth/app_test.exs b/test/web/oauth/app_test.exs deleted file mode 100644 index 993a490e0..000000000 --- a/test/web/oauth/app_test.exs +++ /dev/null @@ -1,44 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.OAuth.AppTest do -  use Pleroma.DataCase - -  alias Pleroma.Web.OAuth.App -  import Pleroma.Factory - -  describe "get_or_make/2" do -    test "gets exist app" do -      attrs = %{client_name: "Mastodon-Local", redirect_uris: "."} -      app = insert(:oauth_app, Map.merge(attrs, %{scopes: ["read", "write"]})) -      {:ok, %App{} = exist_app} = App.get_or_make(attrs, []) -      assert exist_app == app -    end - -    test "make app" do -      attrs = %{client_name: "Mastodon-Local", redirect_uris: "."} -      {:ok, %App{} = app} = App.get_or_make(attrs, ["write"]) -      assert app.scopes == ["write"] -    end - -    test "gets exist app and updates scopes" do -      attrs = %{client_name: "Mastodon-Local", redirect_uris: "."} -      app = insert(:oauth_app, Map.merge(attrs, %{scopes: ["read", "write"]})) -      {:ok, %App{} = exist_app} = App.get_or_make(attrs, ["read", "write", "follow", "push"]) -      assert exist_app.id == app.id -      assert exist_app.scopes == ["read", "write", "follow", "push"] -    end - -    test "has unique client_id" do -      insert(:oauth_app, client_name: "", redirect_uris: "", client_id: "boop") - -      error = -        catch_error(insert(:oauth_app, client_name: "", redirect_uris: "", client_id: "boop")) - -      assert %Ecto.ConstraintError{} = error -      assert error.constraint == "apps_client_id_index" -      assert error.type == :unique -    end -  end -end diff --git a/test/web/oauth/authorization_test.exs b/test/web/oauth/authorization_test.exs deleted file mode 100644 index d74b26cf8..000000000 --- a/test/web/oauth/authorization_test.exs +++ /dev/null @@ -1,77 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.OAuth.AuthorizationTest do -  use Pleroma.DataCase -  alias Pleroma.Web.OAuth.App -  alias Pleroma.Web.OAuth.Authorization -  import Pleroma.Factory - -  setup do -    {:ok, app} = -      Repo.insert( -        App.register_changeset(%App{}, %{ -          client_name: "client", -          scopes: ["read", "write"], -          redirect_uris: "url" -        }) -      ) - -    %{app: app} -  end - -  test "create an authorization token for a valid app", %{app: app} do -    user = insert(:user) - -    {:ok, auth1} = Authorization.create_authorization(app, user) -    assert auth1.scopes == app.scopes - -    {:ok, auth2} = Authorization.create_authorization(app, user, ["read"]) -    assert auth2.scopes == ["read"] - -    for auth <- [auth1, auth2] do -      assert auth.user_id == user.id -      assert auth.app_id == app.id -      assert String.length(auth.token) > 10 -      assert auth.used == false -    end -  end - -  test "use up a token", %{app: app} do -    user = insert(:user) - -    {:ok, auth} = Authorization.create_authorization(app, user) - -    {:ok, auth} = Authorization.use_token(auth) - -    assert auth.used == true - -    assert {:error, "already used"} == Authorization.use_token(auth) - -    expired_auth = %Authorization{ -      user_id: user.id, -      app_id: app.id, -      valid_until: NaiveDateTime.add(NaiveDateTime.utc_now(), -10), -      token: "mytoken", -      used: false -    } - -    {:ok, expired_auth} = Repo.insert(expired_auth) - -    assert {:error, "token expired"} == Authorization.use_token(expired_auth) -  end - -  test "delete authorizations", %{app: app} do -    user = insert(:user) - -    {:ok, auth} = Authorization.create_authorization(app, user) -    {:ok, auth} = Authorization.use_token(auth) - -    Authorization.delete_user_authorizations(user) - -    {_, invalid} = Authorization.use_token(auth) - -    assert auth != invalid -  end -end diff --git a/test/web/oauth/ldap_authorization_test.exs b/test/web/oauth/ldap_authorization_test.exs deleted file mode 100644 index 63b1c0eb8..000000000 --- a/test/web/oauth/ldap_authorization_test.exs +++ /dev/null @@ -1,135 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.OAuth.LDAPAuthorizationTest do -  use Pleroma.Web.ConnCase -  alias Pleroma.Repo -  alias Pleroma.Web.OAuth.Token -  import Pleroma.Factory -  import Mock - -  @skip if !Code.ensure_loaded?(:eldap), do: :skip - -  setup_all do: clear_config([:ldap, :enabled], true) - -  setup_all do: clear_config(Pleroma.Web.Auth.Authenticator, Pleroma.Web.Auth.LDAPAuthenticator) - -  @tag @skip -  test "authorizes the existing user using LDAP credentials" do -    password = "testpassword" -    user = insert(:user, password_hash: Pbkdf2.hash_pwd_salt(password)) -    app = insert(:oauth_app, scopes: ["read", "write"]) - -    host = Pleroma.Config.get([:ldap, :host]) |> to_charlist -    port = Pleroma.Config.get([:ldap, :port]) - -    with_mocks [ -      {:eldap, [], -       [ -         open: fn [^host], [{:port, ^port}, {:ssl, false} | _] -> {:ok, self()} end, -         simple_bind: fn _connection, _dn, ^password -> :ok end, -         close: fn _connection -> -           send(self(), :close_connection) -           :ok -         end -       ]} -    ] do -      conn = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "password", -          "username" => user.nickname, -          "password" => password, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) - -      assert %{"access_token" => token} = json_response(conn, 200) - -      token = Repo.get_by(Token, token: token) - -      assert token.user_id == user.id -      assert_received :close_connection -    end -  end - -  @tag @skip -  test "creates a new user after successful LDAP authorization" do -    password = "testpassword" -    user = build(:user) -    app = insert(:oauth_app, scopes: ["read", "write"]) - -    host = Pleroma.Config.get([:ldap, :host]) |> to_charlist -    port = Pleroma.Config.get([:ldap, :port]) - -    with_mocks [ -      {:eldap, [], -       [ -         open: fn [^host], [{:port, ^port}, {:ssl, false} | _] -> {:ok, self()} end, -         simple_bind: fn _connection, _dn, ^password -> :ok end, -         equalityMatch: fn _type, _value -> :ok end, -         wholeSubtree: fn -> :ok end, -         search: fn _connection, _options -> -           {:ok, {:eldap_search_result, [{:eldap_entry, '', []}], []}} -         end, -         close: fn _connection -> -           send(self(), :close_connection) -           :ok -         end -       ]} -    ] do -      conn = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "password", -          "username" => user.nickname, -          "password" => password, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) - -      assert %{"access_token" => token} = json_response(conn, 200) - -      token = Repo.get_by(Token, token: token) |> Repo.preload(:user) - -      assert token.user.nickname == user.nickname -      assert_received :close_connection -    end -  end - -  @tag @skip -  test "disallow authorization for wrong LDAP credentials" do -    password = "testpassword" -    user = insert(:user, password_hash: Pbkdf2.hash_pwd_salt(password)) -    app = insert(:oauth_app, scopes: ["read", "write"]) - -    host = Pleroma.Config.get([:ldap, :host]) |> to_charlist -    port = Pleroma.Config.get([:ldap, :port]) - -    with_mocks [ -      {:eldap, [], -       [ -         open: fn [^host], [{:port, ^port}, {:ssl, false} | _] -> {:ok, self()} end, -         simple_bind: fn _connection, _dn, ^password -> {:error, :invalidCredentials} end, -         close: fn _connection -> -           send(self(), :close_connection) -           :ok -         end -       ]} -    ] do -      conn = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "password", -          "username" => user.nickname, -          "password" => password, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) - -      assert %{"error" => "Invalid credentials"} = json_response(conn, 400) -      assert_received :close_connection -    end -  end -end diff --git a/test/web/oauth/mfa_controller_test.exs b/test/web/oauth/mfa_controller_test.exs deleted file mode 100644 index 3c341facd..000000000 --- a/test/web/oauth/mfa_controller_test.exs +++ /dev/null @@ -1,306 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.OAuth.MFAControllerTest do -  use Pleroma.Web.ConnCase -  import Pleroma.Factory - -  alias Pleroma.MFA -  alias Pleroma.MFA.BackupCodes -  alias Pleroma.MFA.TOTP -  alias Pleroma.Repo -  alias Pleroma.Web.OAuth.Authorization -  alias Pleroma.Web.OAuth.OAuthController - -  setup %{conn: conn} do -    otp_secret = TOTP.generate_secret() - -    user = -      insert(:user, -        multi_factor_authentication_settings: %MFA.Settings{ -          enabled: true, -          backup_codes: [Pbkdf2.hash_pwd_salt("test-code")], -          totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} -        } -      ) - -    app = insert(:oauth_app) -    {:ok, conn: conn, user: user, app: app} -  end - -  describe "show" do -    setup %{conn: conn, user: user, app: app} do -      mfa_token = -        insert(:mfa_token, -          user: user, -          authorization: build(:oauth_authorization, app: app, scopes: ["write"]) -        ) - -      {:ok, conn: conn, mfa_token: mfa_token} -    end - -    test "GET /oauth/mfa renders mfa forms", %{conn: conn, mfa_token: mfa_token} do -      conn = -        get( -          conn, -          "/oauth/mfa", -          %{ -            "mfa_token" => mfa_token.token, -            "state" => "a_state", -            "redirect_uri" => "http://localhost:8080/callback" -          } -        ) - -      assert response = html_response(conn, 200) -      assert response =~ "Two-factor authentication" -      assert response =~ mfa_token.token -      assert response =~ "http://localhost:8080/callback" -    end - -    test "GET /oauth/mfa renders mfa recovery forms", %{conn: conn, mfa_token: mfa_token} do -      conn = -        get( -          conn, -          "/oauth/mfa", -          %{ -            "mfa_token" => mfa_token.token, -            "state" => "a_state", -            "redirect_uri" => "http://localhost:8080/callback", -            "challenge_type" => "recovery" -          } -        ) - -      assert response = html_response(conn, 200) -      assert response =~ "Two-factor recovery" -      assert response =~ mfa_token.token -      assert response =~ "http://localhost:8080/callback" -    end -  end - -  describe "verify" do -    setup %{conn: conn, user: user, app: app} do -      mfa_token = -        insert(:mfa_token, -          user: user, -          authorization: build(:oauth_authorization, app: app, scopes: ["write"]) -        ) - -      {:ok, conn: conn, user: user, mfa_token: mfa_token, app: app} -    end - -    test "POST /oauth/mfa/verify, verify totp code", %{ -      conn: conn, -      user: user, -      mfa_token: mfa_token, -      app: app -    } do -      otp_token = TOTP.generate_token(user.multi_factor_authentication_settings.totp.secret) - -      conn = -        conn -        |> post("/oauth/mfa/verify", %{ -          "mfa" => %{ -            "mfa_token" => mfa_token.token, -            "challenge_type" => "totp", -            "code" => otp_token, -            "state" => "a_state", -            "redirect_uri" => OAuthController.default_redirect_uri(app) -          } -        }) - -      target = redirected_to(conn) -      target_url = %URI{URI.parse(target) | query: nil} |> URI.to_string() -      query = URI.parse(target).query |> URI.query_decoder() |> Map.new() -      assert %{"state" => "a_state", "code" => code} = query -      assert target_url == OAuthController.default_redirect_uri(app) -      auth = Repo.get_by(Authorization, token: code) -      assert auth.scopes == ["write"] -    end - -    test "POST /oauth/mfa/verify, verify recovery code", %{ -      conn: conn, -      mfa_token: mfa_token, -      app: app -    } do -      conn = -        conn -        |> post("/oauth/mfa/verify", %{ -          "mfa" => %{ -            "mfa_token" => mfa_token.token, -            "challenge_type" => "recovery", -            "code" => "test-code", -            "state" => "a_state", -            "redirect_uri" => OAuthController.default_redirect_uri(app) -          } -        }) - -      target = redirected_to(conn) -      target_url = %URI{URI.parse(target) | query: nil} |> URI.to_string() -      query = URI.parse(target).query |> URI.query_decoder() |> Map.new() -      assert %{"state" => "a_state", "code" => code} = query -      assert target_url == OAuthController.default_redirect_uri(app) -      auth = Repo.get_by(Authorization, token: code) -      assert auth.scopes == ["write"] -    end -  end - -  describe "challenge/totp" do -    test "returns access token with valid code", %{conn: conn, user: user, app: app} do -      otp_token = TOTP.generate_token(user.multi_factor_authentication_settings.totp.secret) - -      mfa_token = -        insert(:mfa_token, -          user: user, -          authorization: build(:oauth_authorization, app: app, scopes: ["write"]) -        ) - -      response = -        conn -        |> post("/oauth/mfa/challenge", %{ -          "mfa_token" => mfa_token.token, -          "challenge_type" => "totp", -          "code" => otp_token, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) -        |> json_response(:ok) - -      ap_id = user.ap_id - -      assert match?( -               %{ -                 "access_token" => _, -                 "expires_in" => 600, -                 "me" => ^ap_id, -                 "refresh_token" => _, -                 "scope" => "write", -                 "token_type" => "Bearer" -               }, -               response -             ) -    end - -    test "returns errors when mfa token invalid", %{conn: conn, user: user, app: app} do -      otp_token = TOTP.generate_token(user.multi_factor_authentication_settings.totp.secret) - -      response = -        conn -        |> post("/oauth/mfa/challenge", %{ -          "mfa_token" => "XXX", -          "challenge_type" => "totp", -          "code" => otp_token, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) -        |> json_response(400) - -      assert response == %{"error" => "Invalid code"} -    end - -    test "returns error when otp code is invalid", %{conn: conn, user: user, app: app} do -      mfa_token = insert(:mfa_token, user: user) - -      response = -        conn -        |> post("/oauth/mfa/challenge", %{ -          "mfa_token" => mfa_token.token, -          "challenge_type" => "totp", -          "code" => "XXX", -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) -        |> json_response(400) - -      assert response == %{"error" => "Invalid code"} -    end - -    test "returns error when client credentails is wrong ", %{conn: conn, user: user} do -      otp_token = TOTP.generate_token(user.multi_factor_authentication_settings.totp.secret) -      mfa_token = insert(:mfa_token, user: user) - -      response = -        conn -        |> post("/oauth/mfa/challenge", %{ -          "mfa_token" => mfa_token.token, -          "challenge_type" => "totp", -          "code" => otp_token, -          "client_id" => "xxx", -          "client_secret" => "xxx" -        }) -        |> json_response(400) - -      assert response == %{"error" => "Invalid code"} -    end -  end - -  describe "challenge/recovery" do -    setup %{conn: conn} do -      app = insert(:oauth_app) -      {:ok, conn: conn, app: app} -    end - -    test "returns access token with valid code", %{conn: conn, app: app} do -      otp_secret = TOTP.generate_secret() - -      [code | _] = backup_codes = BackupCodes.generate() - -      hashed_codes = -        backup_codes -        |> Enum.map(&Pbkdf2.hash_pwd_salt(&1)) - -      user = -        insert(:user, -          multi_factor_authentication_settings: %MFA.Settings{ -            enabled: true, -            backup_codes: hashed_codes, -            totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} -          } -        ) - -      mfa_token = -        insert(:mfa_token, -          user: user, -          authorization: build(:oauth_authorization, app: app, scopes: ["write"]) -        ) - -      response = -        conn -        |> post("/oauth/mfa/challenge", %{ -          "mfa_token" => mfa_token.token, -          "challenge_type" => "recovery", -          "code" => code, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) -        |> json_response(:ok) - -      ap_id = user.ap_id - -      assert match?( -               %{ -                 "access_token" => _, -                 "expires_in" => 600, -                 "me" => ^ap_id, -                 "refresh_token" => _, -                 "scope" => "write", -                 "token_type" => "Bearer" -               }, -               response -             ) - -      error_response = -        conn -        |> post("/oauth/mfa/challenge", %{ -          "mfa_token" => mfa_token.token, -          "challenge_type" => "recovery", -          "code" => code, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) -        |> json_response(400) - -      assert error_response == %{"error" => "Invalid code"} -    end -  end -end diff --git a/test/web/oauth/oauth_controller_test.exs b/test/web/oauth/oauth_controller_test.exs deleted file mode 100644 index 1200126b8..000000000 --- a/test/web/oauth/oauth_controller_test.exs +++ /dev/null @@ -1,1232 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.OAuth.OAuthControllerTest do -  use Pleroma.Web.ConnCase -  import Pleroma.Factory - -  alias Pleroma.MFA -  alias Pleroma.MFA.TOTP -  alias Pleroma.Repo -  alias Pleroma.User -  alias Pleroma.Web.OAuth.Authorization -  alias Pleroma.Web.OAuth.OAuthController -  alias Pleroma.Web.OAuth.Token - -  @session_opts [ -    store: :cookie, -    key: "_test", -    signing_salt: "cooldude" -  ] -  setup do -    clear_config([:instance, :account_activation_required]) -    clear_config([:instance, :account_approval_required]) -  end - -  describe "in OAuth consumer mode, " do -    setup do -      [ -        app: insert(:oauth_app), -        conn: -          build_conn() -          |> Plug.Session.call(Plug.Session.init(@session_opts)) -          |> fetch_session() -      ] -    end - -    setup do: clear_config([:auth, :oauth_consumer_strategies], ~w(twitter facebook)) - -    test "GET /oauth/authorize renders auth forms, including OAuth consumer form", %{ -      app: app, -      conn: conn -    } do -      conn = -        get( -          conn, -          "/oauth/authorize", -          %{ -            "response_type" => "code", -            "client_id" => app.client_id, -            "redirect_uri" => OAuthController.default_redirect_uri(app), -            "scope" => "read" -          } -        ) - -      assert response = html_response(conn, 200) -      assert response =~ "Sign in with Twitter" -      assert response =~ o_auth_path(conn, :prepare_request) -    end - -    test "GET /oauth/prepare_request encodes parameters as `state` and redirects", %{ -      app: app, -      conn: conn -    } do -      conn = -        get( -          conn, -          "/oauth/prepare_request", -          %{ -            "provider" => "twitter", -            "authorization" => %{ -              "scope" => "read follow", -              "client_id" => app.client_id, -              "redirect_uri" => OAuthController.default_redirect_uri(app), -              "state" => "a_state" -            } -          } -        ) - -      assert response = html_response(conn, 302) - -      redirect_query = URI.parse(redirected_to(conn)).query -      assert %{"state" => state_param} = URI.decode_query(redirect_query) -      assert {:ok, state_components} = Poison.decode(state_param) - -      expected_client_id = app.client_id -      expected_redirect_uri = app.redirect_uris - -      assert %{ -               "scope" => "read follow", -               "client_id" => ^expected_client_id, -               "redirect_uri" => ^expected_redirect_uri, -               "state" => "a_state" -             } = state_components -    end - -    test "with user-bound registration, GET /oauth/<provider>/callback redirects to `redirect_uri` with `code`", -         %{app: app, conn: conn} do -      registration = insert(:registration) -      redirect_uri = OAuthController.default_redirect_uri(app) - -      state_params = %{ -        "scope" => Enum.join(app.scopes, " "), -        "client_id" => app.client_id, -        "redirect_uri" => redirect_uri, -        "state" => "" -      } - -      conn = -        conn -        |> assign(:ueberauth_auth, %{provider: registration.provider, uid: registration.uid}) -        |> get( -          "/oauth/twitter/callback", -          %{ -            "oauth_token" => "G-5a3AAAAAAAwMH9AAABaektfSM", -            "oauth_verifier" => "QZl8vUqNvXMTKpdmUnGejJxuHG75WWWs", -            "provider" => "twitter", -            "state" => Poison.encode!(state_params) -          } -        ) - -      assert response = html_response(conn, 302) -      assert redirected_to(conn) =~ ~r/#{redirect_uri}\?code=.+/ -    end - -    test "with user-unbound registration, GET /oauth/<provider>/callback renders registration_details page", -         %{app: app, conn: conn} do -      user = insert(:user) - -      state_params = %{ -        "scope" => "read write", -        "client_id" => app.client_id, -        "redirect_uri" => OAuthController.default_redirect_uri(app), -        "state" => "a_state" -      } - -      conn = -        conn -        |> assign(:ueberauth_auth, %{ -          provider: "twitter", -          uid: "171799000", -          info: %{nickname: user.nickname, email: user.email, name: user.name, description: nil} -        }) -        |> get( -          "/oauth/twitter/callback", -          %{ -            "oauth_token" => "G-5a3AAAAAAAwMH9AAABaektfSM", -            "oauth_verifier" => "QZl8vUqNvXMTKpdmUnGejJxuHG75WWWs", -            "provider" => "twitter", -            "state" => Poison.encode!(state_params) -          } -        ) - -      assert response = html_response(conn, 200) -      assert response =~ ~r/name="op" type="submit" value="register"/ -      assert response =~ ~r/name="op" type="submit" value="connect"/ -      assert response =~ user.email -      assert response =~ user.nickname -    end - -    test "on authentication error, GET /oauth/<provider>/callback redirects to `redirect_uri`", %{ -      app: app, -      conn: conn -    } do -      state_params = %{ -        "scope" => Enum.join(app.scopes, " "), -        "client_id" => app.client_id, -        "redirect_uri" => OAuthController.default_redirect_uri(app), -        "state" => "" -      } - -      conn = -        conn -        |> assign(:ueberauth_failure, %{errors: [%{message: "(error description)"}]}) -        |> get( -          "/oauth/twitter/callback", -          %{ -            "oauth_token" => "G-5a3AAAAAAAwMH9AAABaektfSM", -            "oauth_verifier" => "QZl8vUqNvXMTKpdmUnGejJxuHG75WWWs", -            "provider" => "twitter", -            "state" => Poison.encode!(state_params) -          } -        ) - -      assert response = html_response(conn, 302) -      assert redirected_to(conn) == app.redirect_uris -      assert get_flash(conn, :error) == "Failed to authenticate: (error description)." -    end - -    test "GET /oauth/registration_details renders registration details form", %{ -      app: app, -      conn: conn -    } do -      conn = -        get( -          conn, -          "/oauth/registration_details", -          %{ -            "authorization" => %{ -              "scopes" => app.scopes, -              "client_id" => app.client_id, -              "redirect_uri" => OAuthController.default_redirect_uri(app), -              "state" => "a_state", -              "nickname" => nil, -              "email" => "john@doe.com" -            } -          } -        ) - -      assert response = html_response(conn, 200) -      assert response =~ ~r/name="op" type="submit" value="register"/ -      assert response =~ ~r/name="op" type="submit" value="connect"/ -    end - -    test "with valid params, POST /oauth/register?op=register redirects to `redirect_uri` with `code`", -         %{ -           app: app, -           conn: conn -         } do -      registration = insert(:registration, user: nil, info: %{"nickname" => nil, "email" => nil}) -      redirect_uri = OAuthController.default_redirect_uri(app) - -      conn = -        conn -        |> put_session(:registration_id, registration.id) -        |> post( -          "/oauth/register", -          %{ -            "op" => "register", -            "authorization" => %{ -              "scopes" => app.scopes, -              "client_id" => app.client_id, -              "redirect_uri" => redirect_uri, -              "state" => "a_state", -              "nickname" => "availablenick", -              "email" => "available@email.com" -            } -          } -        ) - -      assert response = html_response(conn, 302) -      assert redirected_to(conn) =~ ~r/#{redirect_uri}\?code=.+/ -    end - -    test "with unlisted `redirect_uri`, POST /oauth/register?op=register results in HTTP 401", -         %{ -           app: app, -           conn: conn -         } do -      registration = insert(:registration, user: nil, info: %{"nickname" => nil, "email" => nil}) -      unlisted_redirect_uri = "http://cross-site-request.com" - -      conn = -        conn -        |> put_session(:registration_id, registration.id) -        |> post( -          "/oauth/register", -          %{ -            "op" => "register", -            "authorization" => %{ -              "scopes" => app.scopes, -              "client_id" => app.client_id, -              "redirect_uri" => unlisted_redirect_uri, -              "state" => "a_state", -              "nickname" => "availablenick", -              "email" => "available@email.com" -            } -          } -        ) - -      assert response = html_response(conn, 401) -    end - -    test "with invalid params, POST /oauth/register?op=register renders registration_details page", -         %{ -           app: app, -           conn: conn -         } do -      another_user = insert(:user) -      registration = insert(:registration, user: nil, info: %{"nickname" => nil, "email" => nil}) - -      params = %{ -        "op" => "register", -        "authorization" => %{ -          "scopes" => app.scopes, -          "client_id" => app.client_id, -          "redirect_uri" => OAuthController.default_redirect_uri(app), -          "state" => "a_state", -          "nickname" => "availablenickname", -          "email" => "available@email.com" -        } -      } - -      for {bad_param, bad_param_value} <- -            [{"nickname", another_user.nickname}, {"email", another_user.email}] do -        bad_registration_attrs = %{ -          "authorization" => Map.put(params["authorization"], bad_param, bad_param_value) -        } - -        bad_params = Map.merge(params, bad_registration_attrs) - -        conn = -          conn -          |> put_session(:registration_id, registration.id) -          |> post("/oauth/register", bad_params) - -        assert html_response(conn, 403) =~ ~r/name="op" type="submit" value="register"/ -        assert get_flash(conn, :error) == "Error: #{bad_param} has already been taken." -      end -    end - -    test "with valid params, POST /oauth/register?op=connect redirects to `redirect_uri` with `code`", -         %{ -           app: app, -           conn: conn -         } do -      user = insert(:user, password_hash: Pbkdf2.hash_pwd_salt("testpassword")) -      registration = insert(:registration, user: nil) -      redirect_uri = OAuthController.default_redirect_uri(app) - -      conn = -        conn -        |> put_session(:registration_id, registration.id) -        |> post( -          "/oauth/register", -          %{ -            "op" => "connect", -            "authorization" => %{ -              "scopes" => app.scopes, -              "client_id" => app.client_id, -              "redirect_uri" => redirect_uri, -              "state" => "a_state", -              "name" => user.nickname, -              "password" => "testpassword" -            } -          } -        ) - -      assert response = html_response(conn, 302) -      assert redirected_to(conn) =~ ~r/#{redirect_uri}\?code=.+/ -    end - -    test "with unlisted `redirect_uri`, POST /oauth/register?op=connect results in HTTP 401`", -         %{ -           app: app, -           conn: conn -         } do -      user = insert(:user, password_hash: Pbkdf2.hash_pwd_salt("testpassword")) -      registration = insert(:registration, user: nil) -      unlisted_redirect_uri = "http://cross-site-request.com" - -      conn = -        conn -        |> put_session(:registration_id, registration.id) -        |> post( -          "/oauth/register", -          %{ -            "op" => "connect", -            "authorization" => %{ -              "scopes" => app.scopes, -              "client_id" => app.client_id, -              "redirect_uri" => unlisted_redirect_uri, -              "state" => "a_state", -              "name" => user.nickname, -              "password" => "testpassword" -            } -          } -        ) - -      assert response = html_response(conn, 401) -    end - -    test "with invalid params, POST /oauth/register?op=connect renders registration_details page", -         %{ -           app: app, -           conn: conn -         } do -      user = insert(:user) -      registration = insert(:registration, user: nil) - -      params = %{ -        "op" => "connect", -        "authorization" => %{ -          "scopes" => app.scopes, -          "client_id" => app.client_id, -          "redirect_uri" => OAuthController.default_redirect_uri(app), -          "state" => "a_state", -          "name" => user.nickname, -          "password" => "wrong password" -        } -      } - -      conn = -        conn -        |> put_session(:registration_id, registration.id) -        |> post("/oauth/register", params) - -      assert html_response(conn, 401) =~ ~r/name="op" type="submit" value="connect"/ -      assert get_flash(conn, :error) == "Invalid Username/Password" -    end -  end - -  describe "GET /oauth/authorize" do -    setup do -      [ -        app: insert(:oauth_app, redirect_uris: "https://redirect.url"), -        conn: -          build_conn() -          |> Plug.Session.call(Plug.Session.init(@session_opts)) -          |> fetch_session() -      ] -    end - -    test "renders authentication page", %{app: app, conn: conn} do -      conn = -        get( -          conn, -          "/oauth/authorize", -          %{ -            "response_type" => "code", -            "client_id" => app.client_id, -            "redirect_uri" => OAuthController.default_redirect_uri(app), -            "scope" => "read" -          } -        ) - -      assert html_response(conn, 200) =~ ~s(type="submit") -    end - -    test "properly handles internal calls with `authorization`-wrapped params", %{ -      app: app, -      conn: conn -    } do -      conn = -        get( -          conn, -          "/oauth/authorize", -          %{ -            "authorization" => %{ -              "response_type" => "code", -              "client_id" => app.client_id, -              "redirect_uri" => OAuthController.default_redirect_uri(app), -              "scope" => "read" -            } -          } -        ) - -      assert html_response(conn, 200) =~ ~s(type="submit") -    end - -    test "renders authentication page if user is already authenticated but `force_login` is tru-ish", -         %{app: app, conn: conn} do -      token = insert(:oauth_token, app: app) - -      conn = -        conn -        |> put_session(:oauth_token, token.token) -        |> get( -          "/oauth/authorize", -          %{ -            "response_type" => "code", -            "client_id" => app.client_id, -            "redirect_uri" => OAuthController.default_redirect_uri(app), -            "scope" => "read", -            "force_login" => "true" -          } -        ) - -      assert html_response(conn, 200) =~ ~s(type="submit") -    end - -    test "renders authentication page if user is already authenticated but user request with another client", -         %{ -           app: app, -           conn: conn -         } do -      token = insert(:oauth_token, app: app) - -      conn = -        conn -        |> put_session(:oauth_token, token.token) -        |> get( -          "/oauth/authorize", -          %{ -            "response_type" => "code", -            "client_id" => "another_client_id", -            "redirect_uri" => OAuthController.default_redirect_uri(app), -            "scope" => "read" -          } -        ) - -      assert html_response(conn, 200) =~ ~s(type="submit") -    end - -    test "with existing authentication and non-OOB `redirect_uri`, redirects to app with `token` and `state` params", -         %{ -           app: app, -           conn: conn -         } do -      token = insert(:oauth_token, app: app) - -      conn = -        conn -        |> put_session(:oauth_token, token.token) -        |> get( -          "/oauth/authorize", -          %{ -            "response_type" => "code", -            "client_id" => app.client_id, -            "redirect_uri" => OAuthController.default_redirect_uri(app), -            "state" => "specific_client_state", -            "scope" => "read" -          } -        ) - -      assert URI.decode(redirected_to(conn)) == -               "https://redirect.url?access_token=#{token.token}&state=specific_client_state" -    end - -    test "with existing authentication and unlisted non-OOB `redirect_uri`, redirects without credentials", -         %{ -           app: app, -           conn: conn -         } do -      unlisted_redirect_uri = "http://cross-site-request.com" -      token = insert(:oauth_token, app: app) - -      conn = -        conn -        |> put_session(:oauth_token, token.token) -        |> get( -          "/oauth/authorize", -          %{ -            "response_type" => "code", -            "client_id" => app.client_id, -            "redirect_uri" => unlisted_redirect_uri, -            "state" => "specific_client_state", -            "scope" => "read" -          } -        ) - -      assert redirected_to(conn) == unlisted_redirect_uri -    end - -    test "with existing authentication and OOB `redirect_uri`, redirects to app with `token` and `state` params", -         %{ -           app: app, -           conn: conn -         } do -      token = insert(:oauth_token, app: app) - -      conn = -        conn -        |> put_session(:oauth_token, token.token) -        |> get( -          "/oauth/authorize", -          %{ -            "response_type" => "code", -            "client_id" => app.client_id, -            "redirect_uri" => "urn:ietf:wg:oauth:2.0:oob", -            "scope" => "read" -          } -        ) - -      assert html_response(conn, 200) =~ "Authorization exists" -    end -  end - -  describe "POST /oauth/authorize" do -    test "redirects with oauth authorization, " <> -           "granting requested app-supported scopes to both admin- and non-admin users" do -      app_scopes = ["read", "write", "admin", "secret_scope"] -      app = insert(:oauth_app, scopes: app_scopes) -      redirect_uri = OAuthController.default_redirect_uri(app) - -      non_admin = insert(:user, is_admin: false) -      admin = insert(:user, is_admin: true) -      scopes_subset = ["read:subscope", "write", "admin"] - -      # In case scope param is missing, expecting _all_ app-supported scopes to be granted -      for user <- [non_admin, admin], -          {requested_scopes, expected_scopes} <- -            %{scopes_subset => scopes_subset, nil: app_scopes} do -        conn = -          post( -            build_conn(), -            "/oauth/authorize", -            %{ -              "authorization" => %{ -                "name" => user.nickname, -                "password" => "test", -                "client_id" => app.client_id, -                "redirect_uri" => redirect_uri, -                "scope" => requested_scopes, -                "state" => "statepassed" -              } -            } -          ) - -        target = redirected_to(conn) -        assert target =~ redirect_uri - -        query = URI.parse(target).query |> URI.query_decoder() |> Map.new() - -        assert %{"state" => "statepassed", "code" => code} = query -        auth = Repo.get_by(Authorization, token: code) -        assert auth -        assert auth.scopes == expected_scopes -      end -    end - -    test "redirect to on two-factor auth page" do -      otp_secret = TOTP.generate_secret() - -      user = -        insert(:user, -          multi_factor_authentication_settings: %MFA.Settings{ -            enabled: true, -            totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} -          } -        ) - -      app = insert(:oauth_app, scopes: ["read", "write", "follow"]) - -      conn = -        build_conn() -        |> post("/oauth/authorize", %{ -          "authorization" => %{ -            "name" => user.nickname, -            "password" => "test", -            "client_id" => app.client_id, -            "redirect_uri" => app.redirect_uris, -            "scope" => "read write", -            "state" => "statepassed" -          } -        }) - -      result = html_response(conn, 200) - -      mfa_token = Repo.get_by(MFA.Token, user_id: user.id) -      assert result =~ app.redirect_uris -      assert result =~ "statepassed" -      assert result =~ mfa_token.token -      assert result =~ "Two-factor authentication" -    end - -    test "returns 401 for wrong credentials", %{conn: conn} do -      user = insert(:user) -      app = insert(:oauth_app) -      redirect_uri = OAuthController.default_redirect_uri(app) - -      result = -        conn -        |> post("/oauth/authorize", %{ -          "authorization" => %{ -            "name" => user.nickname, -            "password" => "wrong", -            "client_id" => app.client_id, -            "redirect_uri" => redirect_uri, -            "state" => "statepassed", -            "scope" => Enum.join(app.scopes, " ") -          } -        }) -        |> html_response(:unauthorized) - -      # Keep the details -      assert result =~ app.client_id -      assert result =~ redirect_uri - -      # Error message -      assert result =~ "Invalid Username/Password" -    end - -    test "returns 401 for missing scopes" do -      user = insert(:user, is_admin: false) -      app = insert(:oauth_app, scopes: ["read", "write", "admin"]) -      redirect_uri = OAuthController.default_redirect_uri(app) - -      result = -        build_conn() -        |> post("/oauth/authorize", %{ -          "authorization" => %{ -            "name" => user.nickname, -            "password" => "test", -            "client_id" => app.client_id, -            "redirect_uri" => redirect_uri, -            "state" => "statepassed", -            "scope" => "" -          } -        }) -        |> html_response(:unauthorized) - -      # Keep the details -      assert result =~ app.client_id -      assert result =~ redirect_uri - -      # Error message -      assert result =~ "This action is outside the authorized scopes" -    end - -    test "returns 401 for scopes beyond app scopes hierarchy", %{conn: conn} do -      user = insert(:user) -      app = insert(:oauth_app, scopes: ["read", "write"]) -      redirect_uri = OAuthController.default_redirect_uri(app) - -      result = -        conn -        |> post("/oauth/authorize", %{ -          "authorization" => %{ -            "name" => user.nickname, -            "password" => "test", -            "client_id" => app.client_id, -            "redirect_uri" => redirect_uri, -            "state" => "statepassed", -            "scope" => "read write follow" -          } -        }) -        |> html_response(:unauthorized) - -      # Keep the details -      assert result =~ app.client_id -      assert result =~ redirect_uri - -      # Error message -      assert result =~ "This action is outside the authorized scopes" -    end -  end - -  describe "POST /oauth/token" do -    test "issues a token for an all-body request" do -      user = insert(:user) -      app = insert(:oauth_app, scopes: ["read", "write"]) - -      {:ok, auth} = Authorization.create_authorization(app, user, ["write"]) - -      conn = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "authorization_code", -          "code" => auth.token, -          "redirect_uri" => OAuthController.default_redirect_uri(app), -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) - -      assert %{"access_token" => token, "me" => ap_id} = json_response(conn, 200) - -      token = Repo.get_by(Token, token: token) -      assert token -      assert token.scopes == auth.scopes -      assert user.ap_id == ap_id -    end - -    test "issues a token for `password` grant_type with valid credentials, with full permissions by default" do -      password = "testpassword" -      user = insert(:user, password_hash: Pbkdf2.hash_pwd_salt(password)) - -      app = insert(:oauth_app, scopes: ["read", "write"]) - -      # Note: "scope" param is intentionally omitted -      conn = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "password", -          "username" => user.nickname, -          "password" => password, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) - -      assert %{"access_token" => token} = json_response(conn, 200) - -      token = Repo.get_by(Token, token: token) -      assert token -      assert token.scopes == app.scopes -    end - -    test "issues a mfa token for `password` grant_type, when MFA enabled" do -      password = "testpassword" -      otp_secret = TOTP.generate_secret() - -      user = -        insert(:user, -          password_hash: Pbkdf2.hash_pwd_salt(password), -          multi_factor_authentication_settings: %MFA.Settings{ -            enabled: true, -            totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} -          } -        ) - -      app = insert(:oauth_app, scopes: ["read", "write"]) - -      response = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "password", -          "username" => user.nickname, -          "password" => password, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) -        |> json_response(403) - -      assert match?( -               %{ -                 "supported_challenge_types" => "totp", -                 "mfa_token" => _, -                 "error" => "mfa_required" -               }, -               response -             ) - -      token = Repo.get_by(MFA.Token, token: response["mfa_token"]) -      assert token.user_id == user.id -      assert token.authorization_id -    end - -    test "issues a token for request with HTTP basic auth client credentials" do -      user = insert(:user) -      app = insert(:oauth_app, scopes: ["scope1", "scope2", "scope3"]) - -      {:ok, auth} = Authorization.create_authorization(app, user, ["scope1", "scope2"]) -      assert auth.scopes == ["scope1", "scope2"] - -      app_encoded = -        (URI.encode_www_form(app.client_id) <> ":" <> URI.encode_www_form(app.client_secret)) -        |> Base.encode64() - -      conn = -        build_conn() -        |> put_req_header("authorization", "Basic " <> app_encoded) -        |> post("/oauth/token", %{ -          "grant_type" => "authorization_code", -          "code" => auth.token, -          "redirect_uri" => OAuthController.default_redirect_uri(app) -        }) - -      assert %{"access_token" => token, "scope" => scope} = json_response(conn, 200) - -      assert scope == "scope1 scope2" - -      token = Repo.get_by(Token, token: token) -      assert token -      assert token.scopes == ["scope1", "scope2"] -    end - -    test "issue a token for client_credentials grant type" do -      app = insert(:oauth_app, scopes: ["read", "write"]) - -      conn = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "client_credentials", -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) - -      assert %{"access_token" => token, "refresh_token" => refresh, "scope" => scope} = -               json_response(conn, 200) - -      assert token -      token_from_db = Repo.get_by(Token, token: token) -      assert token_from_db -      assert refresh -      assert scope == "read write" -    end - -    test "rejects token exchange with invalid client credentials" do -      user = insert(:user) -      app = insert(:oauth_app) - -      {:ok, auth} = Authorization.create_authorization(app, user) - -      conn = -        build_conn() -        |> put_req_header("authorization", "Basic JTIxOiVGMCU5RiVBNCVCNwo=") -        |> post("/oauth/token", %{ -          "grant_type" => "authorization_code", -          "code" => auth.token, -          "redirect_uri" => OAuthController.default_redirect_uri(app) -        }) - -      assert resp = json_response(conn, 400) -      assert %{"error" => _} = resp -      refute Map.has_key?(resp, "access_token") -    end - -    test "rejects token exchange for valid credentials belonging to unconfirmed user and confirmation is required" do -      Pleroma.Config.put([:instance, :account_activation_required], true) -      password = "testpassword" - -      {:ok, user} = -        insert(:user, password_hash: Pbkdf2.hash_pwd_salt(password)) -        |> User.confirmation_changeset(need_confirmation: true) -        |> User.update_and_set_cache() - -      refute Pleroma.User.account_status(user) == :active - -      app = insert(:oauth_app) - -      conn = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "password", -          "username" => user.nickname, -          "password" => password, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) - -      assert resp = json_response(conn, 403) -      assert %{"error" => _} = resp -      refute Map.has_key?(resp, "access_token") -    end - -    test "rejects token exchange for valid credentials belonging to deactivated user" do -      password = "testpassword" - -      user = -        insert(:user, -          password_hash: Pbkdf2.hash_pwd_salt(password), -          deactivated: true -        ) - -      app = insert(:oauth_app) - -      resp = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "password", -          "username" => user.nickname, -          "password" => password, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) -        |> json_response(403) - -      assert resp == %{ -               "error" => "Your account is currently disabled", -               "identifier" => "account_is_disabled" -             } -    end - -    test "rejects token exchange for user with password_reset_pending set to true" do -      password = "testpassword" - -      user = -        insert(:user, -          password_hash: Pbkdf2.hash_pwd_salt(password), -          password_reset_pending: true -        ) - -      app = insert(:oauth_app, scopes: ["read", "write"]) - -      resp = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "password", -          "username" => user.nickname, -          "password" => password, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) -        |> json_response(403) - -      assert resp == %{ -               "error" => "Password reset is required", -               "identifier" => "password_reset_required" -             } -    end - -    test "rejects token exchange for user with confirmation_pending set to true" do -      Pleroma.Config.put([:instance, :account_activation_required], true) -      password = "testpassword" - -      user = -        insert(:user, -          password_hash: Pbkdf2.hash_pwd_salt(password), -          confirmation_pending: true -        ) - -      app = insert(:oauth_app, scopes: ["read", "write"]) - -      resp = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "password", -          "username" => user.nickname, -          "password" => password, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) -        |> json_response(403) - -      assert resp == %{ -               "error" => "Your login is missing a confirmed e-mail address", -               "identifier" => "missing_confirmed_email" -             } -    end - -    test "rejects token exchange for valid credentials belonging to an unapproved user" do -      password = "testpassword" - -      user = insert(:user, password_hash: Pbkdf2.hash_pwd_salt(password), approval_pending: true) - -      refute Pleroma.User.account_status(user) == :active - -      app = insert(:oauth_app) - -      conn = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "password", -          "username" => user.nickname, -          "password" => password, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) - -      assert resp = json_response(conn, 403) -      assert %{"error" => _} = resp -      refute Map.has_key?(resp, "access_token") -    end - -    test "rejects an invalid authorization code" do -      app = insert(:oauth_app) - -      conn = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "authorization_code", -          "code" => "Imobviouslyinvalid", -          "redirect_uri" => OAuthController.default_redirect_uri(app), -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) - -      assert resp = json_response(conn, 400) -      assert %{"error" => _} = json_response(conn, 400) -      refute Map.has_key?(resp, "access_token") -    end -  end - -  describe "POST /oauth/token - refresh token" do -    setup do: clear_config([:oauth2, :issue_new_refresh_token]) - -    test "issues a new access token with keep fresh token" do -      Pleroma.Config.put([:oauth2, :issue_new_refresh_token], true) -      user = insert(:user) -      app = insert(:oauth_app, scopes: ["read", "write"]) - -      {:ok, auth} = Authorization.create_authorization(app, user, ["write"]) -      {:ok, token} = Token.exchange_token(app, auth) - -      response = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "refresh_token", -          "refresh_token" => token.refresh_token, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) -        |> json_response(200) - -      ap_id = user.ap_id - -      assert match?( -               %{ -                 "scope" => "write", -                 "token_type" => "Bearer", -                 "expires_in" => 600, -                 "access_token" => _, -                 "refresh_token" => _, -                 "me" => ^ap_id -               }, -               response -             ) - -      refute Repo.get_by(Token, token: token.token) -      new_token = Repo.get_by(Token, token: response["access_token"]) -      assert new_token.refresh_token == token.refresh_token -      assert new_token.scopes == auth.scopes -      assert new_token.user_id == user.id -      assert new_token.app_id == app.id -    end - -    test "issues a new access token with new fresh token" do -      Pleroma.Config.put([:oauth2, :issue_new_refresh_token], false) -      user = insert(:user) -      app = insert(:oauth_app, scopes: ["read", "write"]) - -      {:ok, auth} = Authorization.create_authorization(app, user, ["write"]) -      {:ok, token} = Token.exchange_token(app, auth) - -      response = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "refresh_token", -          "refresh_token" => token.refresh_token, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) -        |> json_response(200) - -      ap_id = user.ap_id - -      assert match?( -               %{ -                 "scope" => "write", -                 "token_type" => "Bearer", -                 "expires_in" => 600, -                 "access_token" => _, -                 "refresh_token" => _, -                 "me" => ^ap_id -               }, -               response -             ) - -      refute Repo.get_by(Token, token: token.token) -      new_token = Repo.get_by(Token, token: response["access_token"]) -      refute new_token.refresh_token == token.refresh_token -      assert new_token.scopes == auth.scopes -      assert new_token.user_id == user.id -      assert new_token.app_id == app.id -    end - -    test "returns 400 if we try use access token" do -      user = insert(:user) -      app = insert(:oauth_app, scopes: ["read", "write"]) - -      {:ok, auth} = Authorization.create_authorization(app, user, ["write"]) -      {:ok, token} = Token.exchange_token(app, auth) - -      response = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "refresh_token", -          "refresh_token" => token.token, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) -        |> json_response(400) - -      assert %{"error" => "Invalid credentials"} == response -    end - -    test "returns 400 if refresh_token invalid" do -      app = insert(:oauth_app, scopes: ["read", "write"]) - -      response = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "refresh_token", -          "refresh_token" => "token.refresh_token", -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) -        |> json_response(400) - -      assert %{"error" => "Invalid credentials"} == response -    end - -    test "issues a new token if token expired" do -      user = insert(:user) -      app = insert(:oauth_app, scopes: ["read", "write"]) - -      {:ok, auth} = Authorization.create_authorization(app, user, ["write"]) -      {:ok, token} = Token.exchange_token(app, auth) - -      change = -        Ecto.Changeset.change( -          token, -          %{valid_until: NaiveDateTime.add(NaiveDateTime.utc_now(), -86_400 * 30)} -        ) - -      {:ok, access_token} = Repo.update(change) - -      response = -        build_conn() -        |> post("/oauth/token", %{ -          "grant_type" => "refresh_token", -          "refresh_token" => access_token.refresh_token, -          "client_id" => app.client_id, -          "client_secret" => app.client_secret -        }) -        |> json_response(200) - -      ap_id = user.ap_id - -      assert match?( -               %{ -                 "scope" => "write", -                 "token_type" => "Bearer", -                 "expires_in" => 600, -                 "access_token" => _, -                 "refresh_token" => _, -                 "me" => ^ap_id -               }, -               response -             ) - -      refute Repo.get_by(Token, token: token.token) -      token = Repo.get_by(Token, token: response["access_token"]) -      assert token -      assert token.scopes == auth.scopes -      assert token.user_id == user.id -      assert token.app_id == app.id -    end -  end - -  describe "POST /oauth/token - bad request" do -    test "returns 500" do -      response = -        build_conn() -        |> post("/oauth/token", %{}) -        |> json_response(500) - -      assert %{"error" => "Bad request"} == response -    end -  end - -  describe "POST /oauth/revoke - bad request" do -    test "returns 500" do -      response = -        build_conn() -        |> post("/oauth/revoke", %{}) -        |> json_response(500) - -      assert %{"error" => "Bad request"} == response -    end -  end -end diff --git a/test/web/oauth/token/utils_test.exs b/test/web/oauth/token/utils_test.exs deleted file mode 100644 index a610d92f8..000000000 --- a/test/web/oauth/token/utils_test.exs +++ /dev/null @@ -1,53 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.OAuth.Token.UtilsTest do -  use Pleroma.DataCase -  alias Pleroma.Web.OAuth.Token.Utils -  import Pleroma.Factory - -  describe "fetch_app/1" do -    test "returns error when credentials is invalid" do -      assert {:error, :not_found} = -               Utils.fetch_app(%Plug.Conn{params: %{"client_id" => 1, "client_secret" => "x"}}) -    end - -    test "returns App by params credentails" do -      app = insert(:oauth_app) - -      assert {:ok, load_app} = -               Utils.fetch_app(%Plug.Conn{ -                 params: %{"client_id" => app.client_id, "client_secret" => app.client_secret} -               }) - -      assert load_app == app -    end - -    test "returns App by header credentails" do -      app = insert(:oauth_app) -      header = "Basic " <> Base.encode64("#{app.client_id}:#{app.client_secret}") - -      conn = -        %Plug.Conn{} -        |> Plug.Conn.put_req_header("authorization", header) - -      assert {:ok, load_app} = Utils.fetch_app(conn) -      assert load_app == app -    end -  end - -  describe "format_created_at/1" do -    test "returns formatted created at" do -      token = insert(:oauth_token) -      date = Utils.format_created_at(token) - -      token_date = -        token.inserted_at -        |> DateTime.from_naive!("Etc/UTC") -        |> DateTime.to_unix() - -      assert token_date == date -    end -  end -end diff --git a/test/web/oauth/token_test.exs b/test/web/oauth/token_test.exs deleted file mode 100644 index c88b9cc98..000000000 --- a/test/web/oauth/token_test.exs +++ /dev/null @@ -1,72 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.OAuth.TokenTest do -  use Pleroma.DataCase -  alias Pleroma.Repo -  alias Pleroma.Web.OAuth.App -  alias Pleroma.Web.OAuth.Authorization -  alias Pleroma.Web.OAuth.Token - -  import Pleroma.Factory - -  test "exchanges a auth token for an access token, preserving `scopes`" do -    {:ok, app} = -      Repo.insert( -        App.register_changeset(%App{}, %{ -          client_name: "client", -          scopes: ["read", "write"], -          redirect_uris: "url" -        }) -      ) - -    user = insert(:user) - -    {:ok, auth} = Authorization.create_authorization(app, user, ["read"]) -    assert auth.scopes == ["read"] - -    {:ok, token} = Token.exchange_token(app, auth) - -    assert token.app_id == app.id -    assert token.user_id == user.id -    assert token.scopes == auth.scopes -    assert String.length(token.token) > 10 -    assert String.length(token.refresh_token) > 10 - -    auth = Repo.get(Authorization, auth.id) -    {:error, "already used"} = Token.exchange_token(app, auth) -  end - -  test "deletes all tokens of a user" do -    {:ok, app1} = -      Repo.insert( -        App.register_changeset(%App{}, %{ -          client_name: "client1", -          scopes: ["scope"], -          redirect_uris: "url" -        }) -      ) - -    {:ok, app2} = -      Repo.insert( -        App.register_changeset(%App{}, %{ -          client_name: "client2", -          scopes: ["scope"], -          redirect_uris: "url" -        }) -      ) - -    user = insert(:user) - -    {:ok, auth1} = Authorization.create_authorization(app1, user) -    {:ok, auth2} = Authorization.create_authorization(app2, user) - -    {:ok, _token1} = Token.exchange_token(app1, auth1) -    {:ok, _token2} = Token.exchange_token(app2, auth2) - -    {tokens, _} = Token.delete_user_tokens(user) - -    assert tokens == 2 -  end -end | 
