X-Git-Url: https://projects.mako.cc/source/selectricity-live/blobdiff_plain/4efa3e9bc47cc649205a399fde51ed7e61bef7f8..8afec3c5b4896fd7665e6527f3acb7c7afac7e47:/app/models/user.rb diff --git a/app/models/user.rb b/app/models/user.rb index 62c5d1d..78266ad 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,9 +1,71 @@ +require 'digest/sha1' class User < ActiveRecord::Base - include LoginEngine::AuthenticatedUser has_many :elections + # Virtual attribute for the unencrypted password + attr_accessor :password + attr_accessor :current_user + + validates_presence_of :login, :email + validates_presence_of :password, :if => :password_required? + validates_presence_of :password_confirmation, :if => :password_required? + validates_length_of :password, :within => 4..40, :if => :password_required? + validates_confirmation_of :password, :if => :password_required? + validates_length_of :login, :within => 3..40 + validates_length_of :email, :within => 3..100 + validates_uniqueness_of :login, :email, :case_sensitive => false + before_save :encrypt_password + def name - [ firstname, lastname].join(" ") + [ firstname, lastname].join(" ") end -end + # Authenticates a user by their login name and unencrypted password. Returns the user or nil. + def self.authenticate(login, password) + u = find_by_login(login) # need to get the salt + u && u.authenticated?(password) ? u : nil + end + + # Encrypts some data with the salt. + def self.encrypt(password, salt) + Digest::SHA1.hexdigest("--#{salt}--#{password}--") + end + + # Encrypts the password with the user salt + def encrypt(password) + self.class.encrypt(password, salt) + end + + def authenticated?(password) + crypted_password == encrypt(password) + end + + def remember_token? + remember_token_expires_at && Time.now.utc < remember_token_expires_at + end + + # These create and unset the fields required for remembering users between browser closes + def remember_me + self.remember_token_expires_at = 2.weeks.from_now.utc + self.remember_token = encrypt("#{email}--#{remember_token_expires_at}") + save(false) + end + + def forget_me + self.remember_token_expires_at = nil + self.remember_token = nil + save(false) + end + + protected + # before filter + def encrypt_password + return if password.blank? + self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{login}--") if new_record? + self.crypted_password = encrypt(password) + end + + def password_required? + crypted_password.blank? || !password.blank? + end +end