Guest User

Untitled

a guest
Apr 25th, 2018
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.06 KB | None | 0 0
  1. ## users_controller.rb
  2.  
  3. class UsersController < ApplicationController
  4. # Protect these actions behind an admin login
  5. # before_filter :admin_required, :only => [:suspend, :unsuspend, :destroy, :purge]
  6. before_filter :login_required, :only => [:suspend, :unsuspend, :destroy, :purge]
  7. before_filter :find_user, :only => [:show, :suspend, :unsuspend, :destroy, :purge]
  8.  
  9. def index
  10. @users = User.find(:all)
  11. end
  12.  
  13. # render new.rhtml
  14. def new
  15. end
  16.  
  17. def create
  18. cookies.delete :auth_token
  19. # protects against session fixation attacks, wreaks havoc with
  20. # request forgery protection.
  21. # uncomment at your own risk
  22. # reset_session
  23. @user = User.new(params[:user])
  24. @user.register! if @user.valid?
  25. params[:location][:name] = "Default"
  26. #@location = Location.new(params[:location])
  27. @user.default_location = Location.new(params[:location])
  28. if @user.errors.empty?
  29. #self.current_user = @user
  30. #redirect_back_or_default('/')
  31. if @user.default_location.errors.empty?
  32. flash[:notice] = "Thanks for signing up! Please check your email to activate your account before logging in."
  33. redirect_to login_path
  34. else
  35. @user.destroy
  36. @user.errors.add_to_base("blah address")
  37. render :action => 'new'
  38. end
  39. else
  40. @user.errors.add_to_base("There was a problem creating your account.")
  41. render :action => 'new'
  42. end
  43. end
  44.  
  45. def activate
  46. self.current_user = params[:activation_code].blank? ? false : User.find_by_activation_code(params[:activation_code])
  47. if logged_in? && !current_user.active?
  48. current_user.activate!
  49. flash[:notice] = "Signup complete!"
  50. end
  51. redirect_back_or_default('/')
  52. end
  53.  
  54. def show
  55. end
  56.  
  57. def suspend
  58. @user.suspend!
  59. redirect_to users_path
  60. end
  61.  
  62. def unsuspend
  63. @user.unsuspend!
  64. redirect_to users_path
  65. end
  66.  
  67. def destroy
  68. @user.delete!
  69. redirect_to users_path
  70. end
  71.  
  72. def purge
  73. @user.destroy
  74. redirect_to users_path
  75. end
  76.  
  77. protected
  78. def find_user
  79. @user = User.find(params[:id])
  80. end
  81.  
  82. end
  83.  
  84. ## new.html.erb
  85.  
  86. <%= error_messages_for :user,:location, :object => @user.default_location %>
  87. <% form_for :user, :url => users_path do |f| -%>
  88. <% fields_for :user do |u| %>
  89. <p><label for="login">Login</label><br/>
  90. <%= u.text_field :login %></p>
  91.  
  92. <p><label for="email">Email</label><br/>
  93. <%= u.text_field :email %></p>
  94.  
  95. <p><label for="password">Password</label><br/>
  96. <%= u.password_field :password %></p>
  97.  
  98. <p><label for="password_confirmation">Confirm Password</label><br/>
  99. <%= u.password_field :password_confirmation %></p>
  100. <% end %>
  101.  
  102. <% fields_for :location do |l| %>
  103. <p><label for="zipcode">Zipcode</label><br/>
  104. <%= l.text_field :zipcode %></p>
  105. <% end %>
  106. <p><%= submit_tag 'Sign up' %></p>
  107. <% end -%>
  108.  
  109. ## user.rb
  110.  
  111. require 'digest/sha1'
  112. class User < ActiveRecord::Base
  113. has_many :location
  114. has_one :default_location, :foreign_key => :user_id, :class_name => 'Location'
  115.  
  116. # Virtual attribute for the unencrypted password
  117. attr_accessor :password
  118.  
  119. validates_presence_of :login, :email
  120. validates_presence_of :password
  121. validates_presence_of :password_confirmation
  122. validates_length_of :password, :within => 4..40, :if => :password_present?
  123. validates_confirmation_of :password, :if => :password_present?
  124. validates_length_of :login, :within => 3..40, :if => :login_present?
  125. validates_length_of :email, :within => 3..100, :if => :email_present?
  126. validates_uniqueness_of :login, :email, :case_sensitive => false
  127. before_save :encrypt_password
  128.  
  129. # prevents a user from submitting a crafted form that bypasses activation
  130. # anything else you want your user to change should be added here.
  131. attr_accessible :login, :email, :password, :password_confirmation
  132.  
  133. acts_as_state_machine :initial => :pending
  134. state :passive
  135. state :pending, :enter => :make_activation_code
  136. state :active, :enter => :do_activate
  137. state :suspended
  138. state :deleted, :enter => :do_delete
  139.  
  140. event :register do
  141. transitions :from => :passive, :to => :pending, :guard => Proc.new {|u| !(u.crypted_password.blank? && u.password.blank?) }
  142. end
  143.  
  144. event :activate do
  145. transitions :from => :pending, :to => :active
  146. end
  147.  
  148. event :suspend do
  149. transitions :from => [:passive, :pending, :active], :to => :suspended
  150. end
  151.  
  152. event :delete do
  153. transitions :from => [:passive, :pending, :active, :suspended], :to => :deleted
  154. end
  155.  
  156. event :unsuspend do
  157. transitions :from => :suspended, :to => :active, :guard => Proc.new {|u| !u.activated_at.blank? }
  158. transitions :from => :suspended, :to => :pending, :guard => Proc.new {|u| !u.activation_code.blank? }
  159. transitions :from => :suspended, :to => :passive
  160. end
  161.  
  162. # Authenticates a user by their login name and unencrypted password. Returns the user or nil.
  163. def self.authenticate(login, password)
  164. u = find_in_state :first, :active, :conditions => {:login => login} # need to get the salt
  165. u && u.authenticated?(password) ? u : nil
  166. end
  167.  
  168. # Encrypts some data with the salt.
  169. def self.encrypt(password, salt)
  170. Digest::SHA1.hexdigest("--#{salt}--#{password}--")
  171. end
  172.  
  173. # Encrypts the password with the user salt
  174. def encrypt(password)
  175. self.class.encrypt(password, salt)
  176. end
  177.  
  178. def authenticated?(password)
  179. crypted_password == encrypt(password)
  180. end
  181.  
  182. def remember_token?
  183. remember_token_expires_at && Time.now.utc < remember_token_expires_at
  184. end
  185.  
  186. # These create and unset the fields required for remembering users between browser closes
  187. def remember_me
  188. remember_me_for 2.weeks
  189. end
  190.  
  191. def remember_me_for(time)
  192. remember_me_until time.from_now.utc
  193. end
  194.  
  195. def remember_me_until(time)
  196. self.remember_token_expires_at = time
  197. self.remember_token = encrypt("#{email}--#{remember_token_expires_at}")
  198. save(false)
  199. end
  200.  
  201. def forget_me
  202. self.remember_token_expires_at = nil
  203. self.remember_token = nil
  204. save(false)
  205. end
  206.  
  207. def forgot_password
  208. @forgotten_password = true
  209. self.make_password_reset_code
  210. end
  211.  
  212. def reset_password
  213. # First update the password_reset_code before setting the
  214. # reset_password flag to avoid duplicate email notifications.
  215. update_attribute(:password_reset_code, nil)
  216. @reset_password = true
  217. end
  218.  
  219. #used in user_observer
  220. def recently_forgot_password?
  221. @forgotten_password
  222. end
  223.  
  224. def recently_reset_password?
  225. @reset_password
  226. end
  227.  
  228. def self.find_for_forget(email)
  229. find_in_state :first, :active, :conditions => {:email => email}
  230. end
  231.  
  232. # Returns true if the user has just been activated.
  233. def recently_activated?
  234. @activated
  235. end
  236.  
  237. protected
  238. # before filter
  239. def encrypt_password
  240. return if password.blank?
  241. self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{login}--") if new_record?
  242. self.crypted_password = encrypt(password)
  243. end
  244.  
  245. def password_present?
  246. !password.blank?
  247. end
  248.  
  249. def login_present?
  250. !login.blank?
  251. end
  252.  
  253. def email_present?
  254. !email.blank?
  255. end
  256.  
  257. def make_activation_code
  258. self.deleted_at = nil
  259. self.activation_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
  260. end
  261.  
  262. def make_password_reset_code
  263. self.password_reset_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
  264. end
  265.  
  266. def make_email_update_code
  267. self.email_update_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
  268. end
  269.  
  270. def do_delete
  271. self.deleted_at = Time.now.utc
  272. end
  273.  
  274. def do_activate
  275. @activated = true
  276. self.activated_at = Time.now.utc
  277. self.deleted_at = self.activation_code = nil
  278. end
  279. end
  280.  
  281. ## location.rb
  282.  
  283. class Location < ActiveRecord::Base
  284. belongs_to :user
  285.  
  286. #attr_accessor :zipcode, :street_address, :city, :state, :country_code, :full_address
  287. #attr_reader :zipcode, :street_address, :city, :state, :country_code, :full_address
  288.  
  289. acts_as_mappable
  290. before_validation_on_create :geocode_address
  291.  
  292. validates_uniqueness_of :name, :message => "You already have a location with that same name", :scope => "user_id"
  293. validates_presence_of :lat, :lng
  294.  
  295.  
  296.  
  297. private
  298. def geocode_address
  299. address = ""
  300. if !self.zipcode.blank?
  301. if self.zipcode =~ /^[0-9]{5}$/
  302. address = self.zipcode
  303. else
  304. self.errors.add_to_base(:zipcode, "Invalid zipcode")
  305. return
  306. end
  307. else
  308. address = full_address
  309. end
  310. geo=GeoKit::Geocoders::MultiGeocoder.geocode (address)
  311. if !geo.success
  312. self.errors.add_to_base("Could not Geocode the address")
  313. else
  314. self.lat, self.lng = geo.lat,geo.lng
  315. self.name = self.zipcode
  316. self.street_address = geo.street_address
  317. self.city = geo.city
  318. self.state = geo.state
  319. self.country_code = geo.country_code
  320. self.full_address = geo.full_address
  321. end
  322. end
  323. end
Add Comment
Please, Sign In to add comment