PasswordResetToken.ex (1223B)
1 # Pleroma: A lightweight social networking server 2 # Copyright © 2017-2019 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.PasswordResetToken 11 alias Pleroma.Repo 12 alias Pleroma.User 13 14 schema "password_reset_tokens" do 15 belongs_to(:user, User, type: Pleroma.FlakeId) 16 field(:token, :string) 17 field(:used, :boolean, default: false) 18 19 timestamps() 20 end 21 22 def create_token(%User{} = user) do 23 token = :crypto.strong_rand_bytes(32) |> Base.url_encode64() 24 25 token = %PasswordResetToken{ 26 user_id: user.id, 27 used: false, 28 token: token 29 } 30 31 Repo.insert(token) 32 end 33 34 def used_changeset(struct) do 35 struct 36 |> cast(%{}, []) 37 |> put_change(:used, true) 38 end 39 40 def reset_password(token, data) do 41 with %{used: false} = token <- Repo.get_by(PasswordResetToken, %{token: token}), 42 %User{} = user <- User.get_cached_by_id(token.user_id), 43 {:ok, _user} <- User.reset_password(user, data), 44 {:ok, token} <- Repo.update(used_changeset(token)) do 45 {:ok, token} 46 else 47 _e -> {:error, token} 48 end 49 end 50 end