38 lines
1.2 KiB
Ruby
38 lines
1.2 KiB
Ruby
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
|