merge develop
[akkoma] / lib / pleroma / web / oauth / token / strategy / refresh_token.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.OAuth.Token.Strategy.RefreshToken do
6 @moduledoc """
7 Functions for dealing with refresh token strategy.
8 """
9
10 alias Pleroma.Config
11 alias Pleroma.Repo
12 alias Pleroma.Web.OAuth.Token
13 alias Pleroma.Web.OAuth.Token.Strategy.Revoke
14
15 @doc """
16 Will grant access token by refresh token.
17 """
18 @spec grant(Token.t()) :: {:ok, Token.t()} | {:error, any()}
19 def grant(token) do
20 access_token = Repo.preload(token, [:user, :app])
21
22 result =
23 Repo.transaction(fn ->
24 token_params = %{
25 app: access_token.app,
26 user: access_token.user,
27 scopes: access_token.scopes
28 }
29
30 access_token
31 |> revoke_access_token()
32 |> create_access_token(token_params)
33 end)
34
35 case result do
36 {:ok, {:error, reason}} -> {:error, reason}
37 {:ok, {:ok, token}} -> {:ok, token}
38 {:error, reason} -> {:error, reason}
39 end
40 end
41
42 defp revoke_access_token(token) do
43 Revoke.revoke(token)
44 end
45
46 defp create_access_token({:error, error}, _), do: {:error, error}
47
48 defp create_access_token({:ok, token}, %{app: app, user: user} = token_params) do
49 Token.create_token(app, user, add_refresh_token(token_params, token.refresh_token))
50 end
51
52 defp add_refresh_token(params, token) do
53 case Config.get([:oauth2, :issue_new_refresh_token], false) do
54 true -> Map.put(params, :refresh_token, token)
55 false -> params
56 end
57 end
58 end