1040caf096
Modified-by: Maksim Pechnikov <parallel588@gmail.com>
54 lines
1.4 KiB
Elixir
54 lines
1.4 KiB
Elixir
defmodule Pleroma.Web.OAuth.Token.Strategy.RefreshToken do
|
|
@moduledoc """
|
|
Functions for dealing with refresh token strategy.
|
|
"""
|
|
|
|
alias Pleroma.Config
|
|
alias Pleroma.Repo
|
|
alias Pleroma.Web.OAuth.Token
|
|
alias Pleroma.Web.OAuth.Token.Strategy.Revoke
|
|
|
|
@doc """
|
|
Will grant access token by refresh token.
|
|
"""
|
|
@spec grant(Token.t()) :: {:ok, Token.t()} | {:error, any()}
|
|
def grant(token) do
|
|
access_token = Repo.preload(token, [:user, :app])
|
|
|
|
result =
|
|
Repo.transaction(fn ->
|
|
token_params = %{
|
|
app: access_token.app,
|
|
user: access_token.user,
|
|
scopes: access_token.scopes
|
|
}
|
|
|
|
access_token
|
|
|> revoke_access_token()
|
|
|> create_access_token(token_params)
|
|
end)
|
|
|
|
case result do
|
|
{:ok, {:error, reason}} -> {:error, reason}
|
|
{:ok, {:ok, token}} -> {:ok, token}
|
|
{:error, reason} -> {:error, reason}
|
|
end
|
|
end
|
|
|
|
defp revoke_access_token(token) do
|
|
Revoke.revoke(token)
|
|
end
|
|
|
|
defp create_access_token({:error, error}, _), do: {:error, error}
|
|
|
|
defp create_access_token({:ok, token}, %{app: app, user: user} = token_params) do
|
|
Token.create_token(app, user, add_refresh_token(token_params, token.refresh_token))
|
|
end
|
|
|
|
defp add_refresh_token(params, token) do
|
|
case Config.get([:oauth2, :issue_new_refresh_token], false) do
|
|
true -> Map.put(params, :refresh_token, token)
|
|
false -> params
|
|
end
|
|
end
|
|
end
|