cartodb/app/models/carto/ldap/manager.rb
2020-06-15 10:58:47 +08:00

65 lines
1.8 KiB
Ruby

# See http://www.rubydoc.info/gems/net-ldap/0.11
require 'net/ldap'
module Carto
module Ldap
class Manager
# @throws LDAPUserNotPresentAtCartoDBError
def authenticate(username, password)
@last_authentication_result = nil
user = nil
ldap_entry = nil
Carto::Ldap::Configuration.all.each { |ldap|
ldap_entry ||= ldap.authenticate(username, password)
@last_authentication_result = ldap.last_authentication_result
}
if ldap_entry
user = ::User.where({
username: ldap_entry.cartodb_user_id,
organization_id: ldap_entry.configuration.organization_id
}).first
if user.nil?
raise LDAPUserNotPresentAtCartoDBError.new(ldap_entry.cartodb_user_id,
ldap_entry.configuration.organization_id, username, ldap_entry.email)
end
end
user
end
def configuration_present?
Carto::Ldap::Configuration.first != nil
end
def last_authentication_result
@last_authentication_result
end
def self.sanitize_for_cartodb(ldap_value)
ldap_value.to_s.downcase.gsub(/[^a-z0-9\-]/,'')
end
end
class LDAPUserNotPresentAtCartoDBError < StandardError
def initialize(cartodb_username, cartodb_organization_id, ldap_username, ldap_email='')
@ldap_username = ldap_username
@ldap_email = ldap_email
@cartodb_username = cartodb_username
@organization_id = cartodb_organization_id
super("'#{ldap_username}' not found at CARTO (username:'#{cartodb_username}', organization id:'#{cartodb_organization_id}')")
end
attr_reader :ldap_email, :ldap_username, :cartodb_username, :organization_id
end
end
end