Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #### View ####
- <%= error_messages_for :user %>
- <% form_for :user, :url => users_path do |f| -%>
- <p><label for="login">Login</label><br/>
- <%= f.text_field :login %></p>
- <p><label for="email">Email</label><br/>
- <%= f.text_field :email %></p>
- <p><label for="password">Password</label><br/>
- <%= f.password_field :password %></p>
- <p><label for="password_confirmation">Confirm Password</label><br/>
- <%= f.password_field :password_confirmation %></p>
- <p><label for="first_name">First Name</label><br />
- <%= f.text_field :first_name %></p>
- <p><label for="last_name">Last Name</label><br />
- <%= f.text_field :last_name %></p>
- <p><label for="address_one">Address</label><br />
- <%= f.text_field :address_one %></p>
- <p><label for="city">City</label><br />
- <%= f.text_field :city %></p>
- <p><label for="state">State</label><br />
- <%= f.text_field :state %></p>
- <p><label for="zip_code">Zip Code</label><br />
- <%= f.text_field :zip_code %></p>
- <p><label for="tel_num">Primary Telephone Number</label><br />
- <%= f.text_field :tel_num %></p>
- <p><label for="alt_tel_num">Secondary Phone Number</label><br />
- <%= f.text_field :alt_tel_num %></p>
- <p><label for="fax_num">Fax Number</label><br />
- <%= f.text_field :fax_num %></p>
- <p><label for="title">Title</label><br />
- <%= f.text_field :title %>
- <p><label for="company_name">Company Name</label><br />
- <%= f.text_field :company_name %></p>
- <p><label for="website_address">Website URL</label><br />
- <%= f.text_field :website_address %></p>
- <br />
- <p><%= submit_tag 'Sign up' %></p>
- <% end -%>
- #### Model ####
- require 'digest/sha1'
- class User < ActiveRecord::Base
- # Virtual attribute for the unencrypted password
- attr_accessor :password
- validates_presence_of :login
- validates_presence_of :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
- validates_format_of :email, :with => /(^([^@\s]+)@((?:[-_a-z0-9]+\.)+[a-z]{2,})$)|(^$)/i
- has_many :permissions
- has_many :roles, :through => :permissions
- before_save :encrypt_password
- before_create :make_activation_code
- before_create :set_sponsor_code
- # 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, :first_name, :last_name, :sponsor_code, :company_name, :title, :website_address, :address_one, :address_two, :city, :state, :zip_code, :tel_num, :alt_tel_num, :fax_num
- class ActivationCodeNotFound < StandardError; end
- class AlreadyActivated < StandardError
- attr_reader :user, :message;
- def initialize(user, message=nil)
- @message, @user = message, user
- end
- end
- # Finds the user with the corresponding activation code, activates their account and returns the user.
- #
- # Raises:
- # +User::ActivationCodeNotFound+ if there is no user with the corresponding activation code
- # +User::AlreadyActivated+ if the user with the corresponding activation code has already activated their account
- def self.find_and_activate!(activation_code)
- raise ArgumentError if activation_code.nil?
- user = find_by_activation_code(activation_code)
- raise ActivationCodeNotFound if !user
- raise AlreadyActivated.new(user) if user.active?
- user.send(:activate!)
- user
- end
- def active?
- # the presence of an activation date means they have activated
- !activated_at.nil?
- end
- # Returns true if the user has just been activated.
- def pending?
- @activated
- end
- # Authenticates a user by their login name and unencrypted password. Returns the user or nil.
- # Updated 2/20/08
- def self.authenticate(login, password)
- u = find :first, :conditions => ['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
- 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
- def forgot_password
- @forgotten_password = true
- self.make_password_reset_code
- end
- def reset_password
- # First update the password_reset_code before setting the
- # reset_password flag to avoid duplicate email notifications.
- update_attribute(:password_reset_code, nil)
- @reset_password = true
- end
- # used in user_observer
- def recently_forgot_password?
- @forgotten_password
- end
- def recently_reset_password?
- @reset_password
- end
- def self.find_for_forget(email)
- find :first, :conditions => ['email = ? and activated_at IS NOT NULL', email]
- end
- def has_role?(rolename)
- self.roles.find_by_rolename(rolename) ? true : 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
- def make_activation_code
- self.activation_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
- end
- def make_password_reset_code
- self.password_reset_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
- end
- private
- def activate!
- @activated = true
- self.update_attribute(:activated_at, Time.now.utc)
- end
- def set_sponsor_code
- self.sponsor_code = generate_sponsor_code until sponsor_code_is_unique?
- end
- def self.generate_sponsor_code
- serial = User.id + 1
- letters = "ABCDEFGHJKLMNPQRSTUVWXYZ"
- randstr = ""
- 3.times { randstr = "#{randstr}#{letters[letters.length * rand].chr}" }
- write_attribute :sponsor_code, "#{serial}#{randstr}"
- end
- def sponsor_code_is_unique?
- self.class.count(:conditions => {:sponsor_code => self.sponsor_code}) == 0
- end
- end
- #### Controller ####
- class UsersController < ApplicationController
- layout 'accountsportal'
- before_filter :not_logged_in_required, :only => [:new, :create]
- before_filter :login_required, :only => [:show, :edit, :update]
- before_filter :check_administrator_role, :only => [:index, :destroy, :enable]
- def index
- @users = User.find(:all)
- end
- #This show action only allows users to view their own profile
- def show
- @user = current_user
- end
- # render new.rhtml
- def new
- @user = User.new
- render :layout => 'signup'
- end
- def create
- cookies.delete :auth_token
- @user = User.new(params[:user])
- @user.save!
- #Uncomment to have the user logged in after creating an account - Not Recommended
- #self.current_user = @user
- flash[:notice] = "Thanks for signing up! Please check your email to activate your account before logging in."
- redirect_to login_path
- rescue ActiveRecord::RecordInvalid
- flash[:error] = "There was a problem creating your account."
- render :action => 'new'
- end
- def edit
- @user = current_user
- end
- def update
- @user = User.find(current_user)
- if @user.update_attributes(params[:user])
- flash[:notice] = "User updated"
- redirect_to :action => 'show', :id => current_user
- else
- render :action => 'edit'
- end
- end
- def destroy
- @user = User.find(params[:id])
- if @user.update_attribute(:enabled, false)
- flash[:notice] = "User disabled"
- else
- flash[:error] = "There was a problem disabling this user."
- end
- redirect_to :action => 'index'
- end
- def enable
- @user = User.find(params[:id])
- if @user.update_attribute(:enabled, true)
- flash[:notice] = "User enabled"
- else
- flash[:error] = "There was a problem enabling this user."
- end
- redirect_to :action => 'index'
- end
- def validate_sponsor_code
- if User.find_by_sponsor_code params[:id]
- redirect_to(signup_path) and return
- else
- flash[:error] = "We're Sorry, but the Sponsor Code you entered was invalid."
- end
- redirect_to(root_path) and return
- end
- end
Add Comment
Please, Sign In to add comment