Disconnect streaming sessions when token is revoked
[akkoma] / lib / pleroma / web / o_auth / token / strategy / revoke.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 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