Guest User

Untitled

a guest
May 1st, 2018
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.49 KB | None | 0 0
  1. class User
  2.  
  3. include Mongoid::Document
  4. include Mongoid::Timestamps
  5. include Mongoid::Document::ProtectedAttributes
  6.  
  7. attr_protected :password_hash, :password_salt
  8.  
  9. attr_accessor :password, :password_confirmation
  10.  
  11. field :username, :type => String
  12. field :email, :type => String
  13. field :password_hash, :type => String
  14. field :password_salt, :type => String
  15. field :remember_token_expires_at, :type => Time
  16. field :remember_token, :type => String
  17.  
  18. before_save :prepare_password
  19.  
  20. validates_presence_of :username
  21. validates_uniqueness_of :username, :message => 'has already been taken'
  22. validates_uniqueness_of :email
  23. validates_format_of :username, :with => /^[-\w\._@]+$/i, :allow_blank => true, :message => "should only contain letters, numbers, or .-_@"
  24. validates_format_of :email, :with => /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i, :message => "should be in an email address format (ex: someone@somewhere.com)"
  25. validate :check_password
  26.  
  27. def check_password
  28. if self.new_record?
  29. errors.add(:base, "Password can't be blank") if self.password.blank?
  30. errors.add(:base, "Password and confirmation does not match") unless self.password == self.password_confirmation
  31. errors.add(:base, "Password must be at least 4 chars long") if self.password.to_s.size.to_i < 4
  32. else
  33. if self.password.blank?
  34. errors.add(:base, "Password can't be blank") if self.password.blank?
  35. else
  36. errors.add(:base, "Password and confirmation does not match") unless self.password == self.password_confirmation
  37. errors.add(:base, "Password must be at least 4 chars long") if self.password.to_s.size.to_i < 4
  38. end
  39. end
  40. end
  41.  
  42. # login can be either username or email address
  43. def self.authenticate(login, pass)
  44. user = first(:conditions => {:username => login}) || first(:conditions => {:email => login})
  45. return user if user && user.matching_password?(pass)
  46. end
  47.  
  48. def matching_password?(pass)
  49. self.password_hash == encrypt_password(pass)
  50. end
  51.  
  52. def remember_token?
  53. (!remember_token.blank?) &&
  54. remember_token_expires_at && (Time.now.utc < remember_token_expires_at.utc)
  55. end
  56.  
  57. # These create and unset the fields required for remembering users between browser closes
  58. def remember_me
  59. remember_me_for 2.weeks
  60. end
  61.  
  62. def remember_me_for(time)
  63. remember_me_until time.from_now.utc
  64. end
  65.  
  66. def remember_me_until(time)
  67. self.remember_token_expires_at = time
  68. self.remember_token = self.class.make_token
  69. save(false)
  70. end
  71.  
  72. # refresh token (keeping same expires_at) if it exists
  73. def refresh_token
  74. if remember_token?
  75. self.remember_token = self.class.make_token
  76. save(false)
  77. end
  78. end
  79.  
  80. #
  81. # Deletes the server-side record of the authentication token. The
  82. # client-side (browser cookie) and server-side (this remember_token) must
  83. # always be deleted together.
  84. #
  85. def forget_me
  86. self.remember_token_expires_at = nil
  87. self.remember_token = nil
  88. save(false)
  89. end
  90.  
  91. private
  92.  
  93. def self.secure_digest(*args)
  94. Digest::SHA1.hexdigest(args.flatten.join('--'))
  95. end
  96.  
  97. def self.make_token
  98. secure_digest(Time.now, (1..10).map{ rand.to_s })
  99. end
  100.  
  101. def prepare_password
  102. unless password.blank?
  103. self.password_salt = self.class.secure_digest([Time.now, rand])
  104. self.password_hash = encrypt_password(password)
  105. end
  106. end
  107.  
  108. def encrypt_password(pass)
  109. self.class.secure_digest([pass, password_salt])
  110. end
  111.  
  112. end
Add Comment
Please, Sign In to add comment