65 lines
1.8 KiB
Ruby
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
|