app/models/credentials/password.rb in authpwn_rails-0.12.0 vs app/models/credentials/password.rb in authpwn_rails-0.12.1
- old
+ new
@@ -1,38 +1,46 @@
# :namespace
module Credentials
-
+
# Associates a password with the user account.
class Password < ::Credential
# Virtual attribute: the user's password.
attr_accessor :password
validates :password, :presence => { :on => :create },
:confirmation => { :allow_nil => true }
# Virtual attribute: confirmation for the user's password.
attr_accessor :password_confirmation
- # A user can have a single password
+ # A user can have a single password.
validates :user_id, :uniqueness => true
+ # Passwords can expire, if users don't change them often enough.
+ include Authpwn::Expires
+ # Passwords don't expire by default, because it is non-trivial to get e-mail
+ # delivery working in Rails, which is necessary for recovering from expired
+ # passwords.
+ self.expires_after = nil
+
# Compares a plain-text password against the password hash in this credential.
#
# Returns +true+ for a match, +false+ otherwise.
def check_password(password)
return false unless key
key == self.class.hash_password(password, key.split('|', 2).first)
end
-
+
# Compares a plain-text password against the password hash in this credential.
#
# Returns the authenticated User instance, or a symbol indicating the reason
# why the (potentially valid) password was rejected.
def authenticate(password)
+ return :expired if expired?
return :invalid unless check_password(password)
user.auth_bounce_reason(self) || user
end
-
+
# Password virtual attribute.
def password=(new_password)
@password = new_password
salt = self.class.random_salt
self.key = new_password && self.class.hash_password(new_password, salt)
@@ -48,25 +56,25 @@
# Returns the authenticated User instance, or a symbol indicating the reason
# why the (potentially valid) credential was rejected.
def self.authenticate_email(email, password)
user = Credentials::Email.authenticate email
return user if user.is_a? Symbol
-
+
credential = user.credentials.find { |c| c.kind_of? Credentials::Password }
credential ? credential.authenticate(password) : :invalid
end
# Computes a password hash from a raw password and a salt.
def self.hash_password(password, salt)
salt + '|' + Digest::SHA2.hexdigest(password + salt)
end
-
+
# Generates a random salt value.
def self.random_salt
[(0...12).map { |i| 1 + rand(255) }.pack('C*')].pack('m').strip
end
-
+
# Forms can only change the plain-text password fields.
- attr_accessible :password, :password_confirmation
+ attr_accessible :password, :password_confirmation
end # class Credentials::Password
end # namespace Credentials