Guest User

Untitled

a guest
Oct 9th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.64 KB | None | 0 0
  1. class User
  2. include Dynamoid::Document
  3.  
  4. attr_reader :password
  5. attr_accessor :password_confirmation
  6.  
  7. field :username
  8. field :email_address
  9. field :password_hash
  10.  
  11. field :first_name
  12. field :last_name
  13.  
  14. field :time_zone_utc_offset_minutes, :integer, :default => 0
  15.  
  16. field :active, :integer, :default => 0
  17. field :is_superuser, :integer, :default => 0
  18.  
  19. field :can_manage_members, :integer, :default => 0
  20. field :can_manage_users, :integer, :default => 0
  21.  
  22. before_validation :normalize_case
  23. before_save :validate_email_address
  24.  
  25. # validates_uniqueness_of :username, :email_address
  26. validates_presence_of :first_name, :last_name, :username, :email_address
  27. validates_presence_of :password, :on => :create
  28. validates_confirmation_of :password, :on => :save
  29.  
  30. def self.list
  31. where(:active => 1).order([ :last_name, :first_name ])
  32. end
  33.  
  34. def password=(val)
  35. @password = val
  36. self.password_hash = self.class.hash_password(val) unless val.blank?
  37. end
  38.  
  39. def validate_email_address
  40. self.class.valid_email_address?(self.email_address)
  41. end
  42.  
  43. def normalize_case
  44. self.email_address = self.email_address.downcase rescue nil
  45. end
  46.  
  47.  
  48. def self.salt_length ; 16 ; end
  49. def self.salt_chars ; (('a'..'f').to_a).concat(('0'..'9').to_a) ; end
  50.  
  51. def self.hash_password(val, salt = '')
  52. require 'digest/sha1'
  53.  
  54. # create the salt if we need to
  55. if salt.length != salt_length
  56. salt = ''
  57. salt_length.times do
  58. salt << salt_chars[rand(salt_chars.length)]
  59. end
  60. end
  61.  
  62. # now, let the hashing begin
  63. digest = Digest::SHA1.new
  64. digest << salt << val.strip
  65. salt << digest.hexdigest
  66. end
  67.  
  68. # returns a User or an error code string
  69. def self.authenticate(username, password)
  70. test = where(:username => username).first || where(:email_address => username).first
  71. return 'not found' unless test
  72. test.reload
  73. return 'not active' unless test.active == 1 && test.password_hash
  74.  
  75. if test.password_hash == hash_password(password, test.password_hash[0,salt_length])
  76. test
  77. else
  78. 'invalid password'
  79. end
  80. end
  81.  
  82. # Determines whether the input string is a valid email address per RFC specification
  83. def self.valid_email_address?(addr, perform_mx_lookup = false)
  84. valid = !(addr.to_s =~ /\A([\w\d]+(?:[\w\d\!\#\$\%\&\*\+\-\/\=\?\^\`\{\|\}\~\.]*[\w\d]+)*)@((?:[\w\d]+\.)+[\w]{2,})\z/).nil?
  85. user, host = $1, $2
  86.  
  87. if perform_mx_lookup
  88. begin
  89. require 'net/dns/resolver'
  90. res = Net::DNS::Resolver.new
  91. valid = valid && res.mx(host).size > 0
  92. rescue Exception => e
  93. puts e.to_s
  94. end
  95. end
  96.  
  97. valid
  98. end
  99.  
  100. end
Add Comment
Please, Sign In to add comment