Merge branch 'bugfix/html-scrub-schemes' into 'develop'
[akkoma] / lib / pleroma / web / oauth / token.ex
1 defmodule Pleroma.Web.OAuth.Token do
2 use Ecto.Schema
3
4 import Ecto.Query
5
6 alias Pleroma.{User, Repo}
7 alias Pleroma.Web.OAuth.{Token, App, Authorization}
8
9 schema "oauth_tokens" do
10 field(:token, :string)
11 field(:refresh_token, :string)
12 field(:valid_until, :naive_datetime)
13 belongs_to(:user, Pleroma.User)
14 belongs_to(:app, App)
15
16 timestamps()
17 end
18
19 def exchange_token(app, auth) do
20 with {:ok, auth} <- Authorization.use_token(auth),
21 true <- auth.app_id == app.id do
22 create_token(app, Repo.get(User, auth.user_id))
23 end
24 end
25
26 def create_token(%App{} = app, %User{} = user) do
27 token = :crypto.strong_rand_bytes(32) |> Base.url_encode64()
28 refresh_token = :crypto.strong_rand_bytes(32) |> Base.url_encode64()
29
30 token = %Token{
31 token: token,
32 refresh_token: refresh_token,
33 user_id: user.id,
34 app_id: app.id,
35 valid_until: NaiveDateTime.add(NaiveDateTime.utc_now(), 60 * 10)
36 }
37
38 Repo.insert(token)
39 end
40
41 def delete_user_tokens(%User{id: user_id}) do
42 from(
43 t in Pleroma.Web.OAuth.Token,
44 where: t.user_id == ^user_id
45 )
46 |> Repo.delete_all()
47 end
48 end