Initial commit
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
require 'cartodb-common'
|
||||
|
||||
module Carto
|
||||
module UserAuthenticator
|
||||
def authenticate(email, password)
|
||||
sanitized_input = email.strip.downcase
|
||||
if candidate = ::User.filter("email = ? OR username = ?", sanitized_input, sanitized_input).first
|
||||
login_attempt(candidate)
|
||||
if valid_password?(candidate, password)
|
||||
reencrypt_password(candidate, password)
|
||||
return candidate
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def valid_password?(candidate, password)
|
||||
Carto::Common::EncryptionService.verify(password: password, secure_password: candidate.crypted_password,
|
||||
secret: Cartodb.config[:password_secret])
|
||||
end
|
||||
|
||||
def login_attempt(user)
|
||||
retry_after = user.password_login_attempt
|
||||
if retry_after != ::User::LOGIN_NOT_RATE_LIMITED
|
||||
throw(:warden, action: :password_locked, retry_after: retry_after)
|
||||
end
|
||||
end
|
||||
|
||||
def reencrypt_password(candidate, password)
|
||||
encrypter = Carto::Common::EncryptionService
|
||||
return if encrypter.argon2?(candidate.crypted_password)
|
||||
|
||||
candidate.crypted_password = encrypter.encrypt(password: password, secret: Cartodb.config[:password_secret])
|
||||
candidate.update_in_central
|
||||
candidate.save
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user