diff options
| -rw-r--r-- | lib/pleroma/web/controller_helper.ex | 5 | ||||
| -rw-r--r-- | lib/pleroma/web/oauth/oauth_controller.ex | 37 | ||||
| -rw-r--r-- | lib/pleroma/web/router.ex | 15 | 
3 files changed, 44 insertions, 13 deletions
diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index 4d6192db0..6fc5a3cb6 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -5,6 +5,11 @@  defmodule Pleroma.Web.ControllerHelper do    use Pleroma.Web, :controller +  # As in MastoAPI, per https://api.rubyonrails.org/classes/ActiveModel/Type/Boolean.html +  @falsy_param_values [false, 0, "0", "f", "F", "false", "FALSE", "off", "OFF"] +  def truthy_param?(nil), do: nil +  def truthy_param?(value), do: value not in @falsy_param_values +    def oauth_scopes(params, default) do      # Note: `scopes` is used by Mastodon — supporting it but sticking to      # OAuth's standard `scope` wherever we control it diff --git a/lib/pleroma/web/oauth/oauth_controller.ex b/lib/pleroma/web/oauth/oauth_controller.ex index ebb3dd253..0221b4c6f 100644 --- a/lib/pleroma/web/oauth/oauth_controller.ex +++ b/lib/pleroma/web/oauth/oauth_controller.ex @@ -8,6 +8,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do    alias Pleroma.Repo    alias Pleroma.User    alias Pleroma.Web.Auth.Authenticator +  alias Pleroma.Web.ControllerHelper    alias Pleroma.Web.OAuth.App    alias Pleroma.Web.OAuth.Authorization    alias Pleroma.Web.OAuth.Token @@ -19,7 +20,28 @@ defmodule Pleroma.Web.OAuth.OAuthController do    action_fallback(Pleroma.Web.OAuth.FallbackController) -  def authorize(conn, params) do +  def authorize(%{assigns: %{token: %Token{} = token}} = conn, params) do +    if ControllerHelper.truthy_param?(params["force_login"]) do +      do_authorize(conn, params) +    else +      redirect_uri = +        if is_binary(params["redirect_uri"]) do +          params["redirect_uri"] +        else +          app = Repo.preload(token, :app).app + +          app.redirect_uris +          |> String.split() +          |> Enum.at(0) +        end + +      redirect(conn, external: redirect_uri(conn, redirect_uri)) +    end +  end + +  def authorize(conn, params), do: do_authorize(conn, params) + +  defp do_authorize(conn, params) do      app = Repo.get_by(App, client_id: params["client_id"])      available_scopes = (app && app.scopes) || []      scopes = oauth_scopes(params, nil) || available_scopes @@ -51,13 +73,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do           {:missing_scopes, false} <- {:missing_scopes, scopes == []},           {:auth_active, true} <- {:auth_active, User.auth_active?(user)},           {:ok, auth} <- Authorization.create_authorization(app, user, scopes) do -      redirect_uri = -        if redirect_uri == "." do -          # Special case: Local MastodonFE -          mastodon_api_url(conn, :login) -        else -          redirect_uri -        end +      redirect_uri = redirect_uri(conn, redirect_uri)        cond do          redirect_uri == "urn:ietf:wg:oauth:2.0:oob" -> @@ -221,4 +237,9 @@ defmodule Pleroma.Web.OAuth.OAuthController do        nil      end    end + +  # Special case: Local MastodonFE +  defp redirect_uri(conn, "."), do: mastodon_api_url(conn, :index, []) + +  defp redirect_uri(_conn, redirect_uri), do: redirect_uri  end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 9ccb4e535..8acab304a 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -5,6 +5,11 @@  defmodule Pleroma.Web.Router do    use Pleroma.Web, :router +  pipeline :oauth do +    plug(:fetch_session) +    plug(Pleroma.Plugs.OAuthPlug) +  end +    pipeline :api do      plug(:accepts, ["json"])      plug(:fetch_session) @@ -105,10 +110,6 @@ defmodule Pleroma.Web.Router do      plug(:accepts, ["json", "xml"])    end -  pipeline :oauth do -    plug(:accepts, ["html", "json"]) -  end -    pipeline :pleroma_api do      plug(:accepts, ["html", "json"])    end @@ -200,7 +201,11 @@ defmodule Pleroma.Web.Router do    end    scope "/oauth", Pleroma.Web.OAuth do -    get("/authorize", OAuthController, :authorize) +    scope [] do +      pipe_through(:oauth) +      get("/authorize", OAuthController, :authorize) +    end +      post("/authorize", OAuthController, :create_authorization)      post("/token", OAuthController, :token_exchange)      post("/revoke", OAuthController, :token_revoke)  | 
