3b265b3392720c276c71ffac5aeb1c4b8fdb8b5d
[anni] / lib / pleroma / web / o_auth / token / strategy / revoke.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.OAuth.Token.Strategy.Revoke do
6   @moduledoc """
7   Functions for dealing with revocation.
8   """
9
10   alias Pleroma.Repo
11   alias Pleroma.Web.OAuth.App
12   alias Pleroma.Web.OAuth.Token
13
14   @doc "Finds and revokes access token for app and by token"
15   @spec revoke(App.t(), map()) :: {:ok, Token.t()} | {:error, :not_found | Ecto.Changeset.t()}
16   def revoke(%App{} = app, %{"token" => token} = _attrs) do
17     with {:ok, token} <- Token.get_by_token(app, token),
18          do: revoke(token)
19   end
20
21   @doc "Revokes access token"
22   @spec revoke(Token.t()) :: {:ok, Token.t()} | {:error, Ecto.Changeset.t()}
23   def revoke(%Token{} = token) do
24     with {:ok, token} <- Repo.delete(token) do
25       Task.Supervisor.start_child(
26         Pleroma.TaskSupervisor,
27         Pleroma.Web.Streamer,
28         :close_streams_by_oauth_token,
29         [token],
30         restart: :transient
31       )
32
33       {:ok, token}
34     else
35       result -> result
36     end
37   end
38 end