/vendor/plugins/restful_authentication/generators/authenticated/templates/model.rb
https://github.com/globetrotter/derdiedas · Ruby · 142 lines · 112 code · 19 blank · 11 comment · 14 complexity · c95f03e3e5bb3890c74f390e39b7bd95 MD5 · raw file
- require 'digest/sha1'
- class <%= class_name %> < ActiveRecord::Base
- # Virtual attribute for the unencrypted password
- attr_accessor :password
- 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
- <% if options[:include_activation] && !options[:stateful] %>before_create :make_activation_code <% end %>
- # prevents a user from submitting a crafted form that bypasses activation
- # anything else you want your user to change should be added here.
- attr_accessible :login, :email, :password, :password_confirmation
- <% if options[:stateful] %>
- acts_as_state_machine :initial => :pending
- state :passive
- state :pending, :enter => :make_activation_code
- state :active, :enter => :do_activate
- state :suspended
- state :deleted, :enter => :do_delete
- event :register do
- transitions :from => :passive, :to => :pending, :guard => Proc.new {|u| !(u.crypted_password.blank? && u.password.blank?) }
- end
-
- event :activate do
- transitions :from => :pending, :to => :active
- end
-
- event :suspend do
- transitions :from => [:passive, :pending, :active], :to => :suspended
- end
-
- event :delete do
- transitions :from => [:passive, :pending, :active, :suspended], :to => :deleted
- end
- event :unsuspend do
- transitions :from => :suspended, :to => :active, :guard => Proc.new {|u| !u.activated_at.blank? }
- transitions :from => :suspended, :to => :pending, :guard => Proc.new {|u| !u.activation_code.blank? }
- transitions :from => :suspended, :to => :passive
- end
- <% elsif options[:include_activation] %>
- # Activates the user in the database.
- def activate
- @activated = true
- self.activated_at = Time.now.utc
- self.activation_code = nil
- save(false)
- end
- def active?
- # the existence of an activation code means they have not activated yet
- activation_code.nil?
- end
- <% end %>
- # Authenticates a user by their login name and unencrypted password. Returns the user or nil.
- def self.authenticate(login, password)
- u = <%
- if options[:stateful] %>find_in_state :first, :active, :conditions => {:login => login}<%
- elsif options[:include_activation] %>find :first, :conditions => ['login = ? and activated_at IS NOT NULL', login]<%
- else %>find_by_login(login)<%
- end %> # 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
- remember_me_for 2.weeks
- end
- def remember_me_for(time)
- remember_me_until time.from_now.utc
- end
- def remember_me_until(time)
- self.remember_token_expires_at = time
- 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
- # Returns true if the user has just been activated.
- def recently_activated?
- @activated
- 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
- <% if options[:include_activation] %>
- def make_activation_code
- <% if options[:stateful] %> self.deleted_at = nil<% end %>
- self.activation_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
- end<% end %>
- <% if options[:stateful] %>
- def do_delete
- self.deleted_at = Time.now.utc
- end
- def do_activate
- @activated = true
- self.activated_at = Time.now.utc
- self.deleted_at = self.activation_code = nil
- end<% end %>
- end