user.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:5k
源码类别:

Ajax

开发平台:

Others

  1. require 'digest/sha1'
  2. class User < ActiveRecord::Base
  3.   belongs_to :profile
  4.   belongs_to :text_filter
  5.   has_many :notifications, :foreign_key => 'notify_user_id'
  6.   has_many :notify_contents, :through => :notifications,
  7.     :source => 'notify_content',
  8.     :uniq => true
  9.   has_many :articles, :order => 'created_at DESC' do
  10.     def published
  11.       find_published(:all, :order => 'created_at DESC')
  12.     end
  13.   end
  14.   has_many :published_articles,
  15.     :class_name => 'Article',
  16.     :conditions => { :published => true },
  17.     :order      => "published_at DESC"
  18.   # echo "typo" | sha1sum -
  19.   @@salt = '20ac4d290c2293702c64b3b287ae5ea79b26a5c1'
  20.   cattr_accessor :salt
  21.   attr_accessor :last_venue
  22.   def self.authenticate(login, pass)
  23.     find(:first,
  24.          :conditions => ["login = ? AND password = ? AND state = ?", login, sha1(pass), 'active'])
  25.   end
  26.   
  27.   def update_connection_time
  28.     self.last_venue = last_connection
  29.     self.last_connection = Time.now
  30.     self.save
  31.   end
  32.   # These create and unset the fields required for remembering users between browser closes
  33.   def remember_me
  34.     remember_me_for 2.weeks
  35.   end
  36.   def remember_me_for(time)
  37.     remember_me_until time.from_now.utc
  38.   end
  39.   def remember_me_until(time)
  40.     self.remember_token_expires_at = time
  41.     self.remember_token            = Digest::SHA1.hexdigest("#{email}--#{remember_token_expires_at}")
  42.     save(false)
  43.   end
  44.   def forget_me
  45.     self.remember_token_expires_at = nil
  46.     self.remember_token            = nil
  47.     save(false)
  48.   end
  49.   def permalink_url(anchor=nil, only_path=true)
  50.     blog = Blog.default # remove me...
  51.     blog.url_for(
  52.       :controller => 'users',
  53.       :action => 'show',
  54.       :id => permalink
  55.     )
  56.   end
  57.   
  58.   def self.authenticate?(login, pass)
  59.     user = self.authenticate(login, pass)
  60.     return false if user.nil?
  61.     return true if user.login == login
  62.     false
  63.   end
  64.   def self.find_by_permalink(permalink)
  65.     returning(self.find_by_login(permalink)) do |user|
  66.       raise ActiveRecord::RecordNotFound unless user
  67.     end
  68.   end
  69.   # The current project_modules
  70.   def project_modules
  71.     profile.modules.collect { |m| AccessControl.project_module(profile.label, m) }.uniq.compact rescue []
  72.   end
  73.   
  74.   # Generate Methods takes from AccessControl rules
  75.   # Example:
  76.   #
  77.   #   def publisher?
  78.   #     profile.label == :publisher
  79.   #   end
  80.   AccessControl.roles.each { |r| define_method("#{r.to_s.downcase.to_sym}?") { profile.label.to_s.downcase.to_sym == r.to_s.downcase.to_sym } }
  81.   # Let's be lazy, no need to fetch the counters, rails will handle it.
  82.   def self.find_all_with_article_counters(ignored_arg)
  83.     find(:all)
  84.   end
  85.   def self.to_prefix
  86.     'author'
  87.   end
  88.   def password=(newpass)
  89.     @password = newpass
  90.   end
  91.   def password(cleartext = nil)
  92.     if cleartext
  93.       @password.to_s
  94.     else
  95.       @password || read_attribute("password")
  96.     end
  97.   end
  98.   def article_counter
  99.     articles.size
  100.   end
  101.   def display_name
  102.     name
  103.   end
  104.   def permalink
  105.     login
  106.   end
  107.   def to_param
  108.     permalink
  109.   end
  110.   def admin?
  111.     profile.label == Profile::ADMIN
  112.   end
  113.   protected
  114.   # Apply SHA1 encryption to the supplied password.
  115.   # We will additionally surround the password with a salt
  116.   # for additional security.
  117.   def self.sha1(pass)
  118.     Digest::SHA1.hexdigest("#{salt}--#{pass}--")
  119.   end
  120.   before_create :crypt_password
  121.   # Before saving the record to database we will crypt the password
  122.   # using SHA1.
  123.   # We never store the actual password in the DB.
  124.   # But before the encryption, we send an email to user for he can remind his
  125.   # password
  126.   def crypt_password
  127.     send_create_notification
  128.     write_attribute "password", self.class.sha1(password(true))
  129.     @password = nil
  130.   end
  131.   before_update :crypt_unless_empty
  132.   # If the record is updated we will check if the password is empty.
  133.   # If its empty we assume that the user didn't want to change his
  134.   # password and just reset it to the old value.
  135.   def crypt_unless_empty
  136.     if password(true).empty?
  137.       user = self.class.find(self.id)
  138.       write_attribute "password", user.password
  139.     else
  140.       send_create_notification
  141.       write_attribute "password", self.class.sha1(password(true))
  142.       @password = nil
  143.     end
  144.   end
  145.   before_validation :set_default_profile
  146.   def set_default_profile
  147.     if User.count.zero?
  148.       self.profile ||= Profile.find_by_label('admin')
  149.     else
  150.       self.profile ||= Profile.find_by_label('contributor')
  151.     end
  152.   end
  153.   validates_uniqueness_of :login, :on => :create
  154.   validates_length_of :password, :within => 5..40, :if => Proc.new { |user|
  155.     user.read_attribute('password').nil? or user.password.to_s.length > 0
  156.   }
  157.   validates_presence_of :login
  158.   validates_presence_of :email
  159.   validates_confirmation_of :password
  160.   validates_length_of :login, :within => 3..40
  161.   private
  162.   # Send a mail of creation user to the user create
  163.   def send_create_notification
  164.     begin
  165.       email_notification = NotificationMailer.create_notif_user(self)
  166.       EmailNotify.send_message(self,email_notification)
  167.     rescue => err
  168.       logger.error "Unable to send notification of create user email: #{err.inspect}"
  169.     end
  170.   end
  171. end