logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma

refresh_token.ex (1600B)


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