class ActiveModel::PasswordReset

Constants

EXPIRATION_TIME
VERSION

Attributes

email[R]
user[W]

Public Class Methods

find(token) click to toggle source
# File lib/active_model/password_reset.rb, line 35
def self.find(token)
  email, digest, expires_at = verify_token(token)
  raise TokenExpired if Time.now.to_i > expires_at.to_i
  new(email: email).tap do |password_reset|
    raise EmailInvalid if password_reset.invalid?
    raise PasswordChanged if password_reset.send(:digest) != digest
  end
end

Private Class Methods

generate_token(*args) click to toggle source
# File lib/active_model/password_reset.rb, line 50
def self.generate_token(*args)
  Base64.urlsafe_encode64(message_verifier.generate(*args))
end
message_verifier() click to toggle source
# File lib/active_model/password_reset.rb, line 46
def self.message_verifier
  Rails.application.message_verifier("password reset salt")
end
verify_token(string) click to toggle source
# File lib/active_model/password_reset.rb, line 54
def self.verify_token(string)
  message_verifier.verify(Base64.urlsafe_decode64(string))
rescue ActiveSupport::MessageVerifier::InvalidSignature, ArgumentError
  raise TokenInvalid
end

Public Instance Methods

email=(email) click to toggle source
# File lib/active_model/password_reset.rb, line 18
def email=(email)
  remove_instance_variable(:@user) if defined?(@user)
  @email = email
end
token() click to toggle source
# File lib/active_model/password_reset.rb, line 28
def token
  email = user.email
  digest = Digest::MD5.digest(user.password_digest)
  expires_at = Time.now.to_i + EXPIRATION_TIME
  self.class.generate_token([email, digest, expires_at])
end
user() click to toggle source
# File lib/active_model/password_reset.rb, line 23
def user
  return @user if defined?(@user)
  @user = User.find_by(email: email)
end

Private Instance Methods

digest() click to toggle source
# File lib/active_model/password_reset.rb, line 60
def digest
  Digest::MD5.digest(user.password_digest)
end
existence() click to toggle source
# File lib/active_model/password_reset.rb, line 64
def existence
  errors.add(:email, :invalid) if user.blank?
end