57e3b7ef03c8b4bd8051e671eef22b313b3eeca0
[akkoma] / lib / pleroma / PasswordResetToken.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.PasswordResetToken do
6 use Ecto.Schema
7
8 import Ecto.Changeset
9
10 alias Pleroma.{User, PasswordResetToken, Repo}
11
12 schema "password_reset_tokens" do
13 belongs_to(:user, User)
14 field(:token, :string)
15 field(:used, :boolean, default: false)
16
17 timestamps()
18 end
19
20 def create_token(%User{} = user) do
21 token = :crypto.strong_rand_bytes(32) |> Base.url_encode64()
22
23 token = %PasswordResetToken{
24 user_id: user.id,
25 used: false,
26 token: token
27 }
28
29 Repo.insert(token)
30 end
31
32 def used_changeset(struct) do
33 struct
34 |> cast(%{}, [])
35 |> put_change(:used, true)
36 end
37
38 def reset_password(token, data) do
39 with %{used: false} = token <- Repo.get_by(PasswordResetToken, %{token: token}),
40 %User{} = user <- Repo.get(User, token.user_id),
41 {:ok, _user} <- User.reset_password(user, data),
42 {:ok, token} <- Repo.update(used_changeset(token)) do
43 {:ok, token}
44 else
45 _e -> {:error, token}
46 end
47 end
48 end