OAuth: Extract view-type functions to a view.
authorlain <lain@soykaf.club>
Mon, 29 Jun 2020 11:39:09 +0000 (13:39 +0200)
committerlain <lain@soykaf.club>
Mon, 29 Jun 2020 11:39:09 +0000 (13:39 +0200)
lib/pleroma/web/oauth/mfa_controller.ex
lib/pleroma/web/oauth/mfa_view.ex
lib/pleroma/web/oauth/oauth_controller.ex
lib/pleroma/web/oauth/oauth_view.ex
lib/pleroma/web/oauth/token/response.ex

index 53e19f82ecbde609f821232a85705d6671826ed6..f102c93e7e5bbfcd3be86f634cee3265c3f761e1 100644 (file)
@@ -13,6 +13,7 @@ defmodule Pleroma.Web.OAuth.MFAController do
   alias Pleroma.Web.Auth.TOTPAuthenticator
   alias Pleroma.Web.OAuth.MFAView, as: View
   alias Pleroma.Web.OAuth.OAuthController
+  alias Pleroma.Web.OAuth.OAuthView
   alias Pleroma.Web.OAuth.Token
 
   plug(:fetch_session when action in [:show, :verify])
@@ -74,7 +75,7 @@ defmodule Pleroma.Web.OAuth.MFAController do
          {:ok, %{user: user, authorization: auth}} <- MFA.Token.validate(mfa_token),
          {:ok, _} <- validates_challenge(user, params),
          {:ok, token} <- Token.exchange_token(app, auth) do
-      json(conn, Token.Response.build(user, token))
+      json(conn, OAuthView.render("token.json", %{user: user, token: token}))
     else
       _error ->
         conn
index 41d5578dc8fa1f06e0351991e6a58241ae811375..5d87db268bab574ef7f6706df481b5c754b1e300 100644 (file)
@@ -5,4 +5,13 @@
 defmodule Pleroma.Web.OAuth.MFAView do
   use Pleroma.Web, :view
   import Phoenix.HTML.Form
+  alias Pleroma.MFA
+
+  def render("mfa_response.json", %{token: token, user: user}) do
+    %{
+      error: "mfa_required",
+      mfa_token: token.token,
+      supported_challenge_types: MFA.supported_methods(user)
+    }
+  end
 end
index c557778ca14d3d8f05c80537e94cedf3221ebd62..3da10493302d6b4d17bcb7c3d733aa5656d5981c 100644 (file)
@@ -6,8 +6,8 @@ defmodule Pleroma.Web.OAuth.OAuthController do
   use Pleroma.Web, :controller
 
   alias Pleroma.Helpers.UriHelper
-  alias Pleroma.Maps
   alias Pleroma.MFA
+  alias Pleroma.Maps
   alias Pleroma.Plugs.RateLimiter
   alias Pleroma.Registration
   alias Pleroma.Repo
@@ -17,6 +17,8 @@ defmodule Pleroma.Web.OAuth.OAuthController do
   alias Pleroma.Web.OAuth.App
   alias Pleroma.Web.OAuth.Authorization
   alias Pleroma.Web.OAuth.MFAController
+  alias Pleroma.Web.OAuth.OAuthView
+  alias Pleroma.Web.OAuth.MFAView
   alias Pleroma.Web.OAuth.Scopes
   alias Pleroma.Web.OAuth.Token
   alias Pleroma.Web.OAuth.Token.Strategy.RefreshToken
@@ -233,9 +235,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do
     with {:ok, app} <- Token.Utils.fetch_app(conn),
          {:ok, %{user: user} = token} <- Token.get_by_refresh_token(app, token),
          {:ok, token} <- RefreshToken.grant(token) do
-      response_attrs = %{created_at: Token.Utils.format_created_at(token)}
-
-      json(conn, Token.Response.build(user, token, response_attrs))
+      json(conn, OAuthView.render("token.json", %{user: user, token: token}))
     else
       _error -> render_invalid_credentials_error(conn)
     end
@@ -247,9 +247,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do
          {:ok, auth} <- Authorization.get_by_token(app, fixed_token),
          %User{} = user <- User.get_cached_by_id(auth.user_id),
          {:ok, token} <- Token.exchange_token(app, auth) do
-      response_attrs = %{created_at: Token.Utils.format_created_at(token)}
-
-      json(conn, Token.Response.build(user, token, response_attrs))
+      json(conn, OAuthView.render("token.json", %{user: user, token: token}))
     else
       error ->
         handle_token_exchange_error(conn, error)
@@ -267,7 +265,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do
          {:ok, auth} <- Authorization.create_authorization(app, user, scopes),
          {:mfa_required, _, _, false} <- {:mfa_required, user, auth, MFA.require?(user)},
          {:ok, token} <- Token.exchange_token(app, auth) do
-      json(conn, Token.Response.build(user, token))
+      json(conn, OAuthView.render("token.json", %{user: user, token: token}))
     else
       error ->
         handle_token_exchange_error(conn, error)
@@ -290,7 +288,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do
     with {:ok, app} <- Token.Utils.fetch_app(conn),
          {:ok, auth} <- Authorization.create_authorization(app, %User{}),
          {:ok, token} <- Token.exchange_token(app, auth) do
-      json(conn, Token.Response.build_for_client_credentials(token))
+      json(conn, OAuthView.render("token.json", %{token: token}))
     else
       _error ->
         handle_token_exchange_error(conn, :invalid_credentails)
@@ -548,7 +546,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do
 
   defp build_and_response_mfa_token(user, auth) do
     with {:ok, token} <- MFA.Token.create_token(user, auth) do
-      Token.Response.build_for_mfa_token(user, token)
+      MFAView.render("mfa_response.json", %{token: token, user: user})
     end
   end
 
index 94ddaf91308e74e6271f8faf97d3cbb724ec9073..f55247ebd75df014224e401924cf05cf886e7193 100644 (file)
@@ -5,4 +5,26 @@
 defmodule Pleroma.Web.OAuth.OAuthView do
   use Pleroma.Web, :view
   import Phoenix.HTML.Form
+
+  alias Pleroma.Web.OAuth.Token.Utils
+
+  def render("token.json", %{token: token} = opts) do
+    response = %{
+      token_type: "Bearer",
+      access_token: token.token,
+      refresh_token: token.refresh_token,
+      expires_in: expires_in(),
+      scope: Enum.join(token.scopes, " "),
+      created_at: Utils.format_created_at(token)
+    }
+
+    if user = opts[:user] do
+      response
+      |> Map.put(:me, user.ap_id)
+    else
+      response
+    end
+  end
+
+  defp expires_in, do: Pleroma.Config.get([:oauth2, :token_expires_in], 600)
 end
index 0e72c31e90ff0bf16d6a71ef9ca75d6408f68952..a12a6865ca10da20126f4dbec44b770608049668 100644 (file)
@@ -3,43 +3,4 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Web.OAuth.Token.Response do
-  @moduledoc false
-
-  alias Pleroma.MFA
-  alias Pleroma.User
-  alias Pleroma.Web.OAuth.Token.Utils
-
-  @doc false
-  def build(%User{} = user, token, opts \\ %{}) do
-    %{
-      token_type: "Bearer",
-      access_token: token.token,
-      refresh_token: token.refresh_token,
-      expires_in: expires_in(),
-      scope: Enum.join(token.scopes, " "),
-      me: user.ap_id
-    }
-    |> Map.merge(opts)
-  end
-
-  def build_for_client_credentials(token) do
-    %{
-      token_type: "Bearer",
-      access_token: token.token,
-      refresh_token: token.refresh_token,
-      created_at: Utils.format_created_at(token),
-      expires_in: expires_in(),
-      scope: Enum.join(token.scopes, " ")
-    }
-  end
-
-  def build_for_mfa_token(user, mfa_token) do
-    %{
-      error: "mfa_required",
-      mfa_token: mfa_token.token,
-      supported_challenge_types: MFA.supported_methods(user)
-    }
-  end
-
-  defp expires_in, do: Pleroma.Config.get([:oauth2, :token_expires_in], 600)
 end