182 lines
5.7 KiB
Ruby
182 lines
5.7 KiB
Ruby
|
require_relative '../../../spec_helper'
|
||
|
require_relative '../../../lib/fake_net_ldap_bind_as'
|
||
|
|
||
|
require 'fake_net_ldap'
|
||
|
|
||
|
describe Carto::Ldap::Configuration do
|
||
|
include_context 'organization with users helper'
|
||
|
|
||
|
before(:all) do
|
||
|
@domain_bases = [ "dc=cartodb" ]
|
||
|
|
||
|
@ldap_admin_username = 'user'
|
||
|
@ldap_admin_cn = "cn=#{@ldap_admin_username},#{@domain_bases[0]}"
|
||
|
@ldap_admin_password = '666'
|
||
|
|
||
|
@user_id_field = 'cn'
|
||
|
end
|
||
|
|
||
|
before(:each) do
|
||
|
FakeNetLdap.register_user(:username => @ldap_admin_cn, :password => @ldap_admin_password)
|
||
|
end
|
||
|
|
||
|
after(:each) do
|
||
|
FakeNetLdap.clear_user_registrations
|
||
|
FakeNetLdap.clear_query_registrations
|
||
|
end
|
||
|
|
||
|
it 'returns right away if empty user' do
|
||
|
ldap = Carto::Ldap::Configuration.new
|
||
|
ldap.authenticate('', 'something').should eq false
|
||
|
end
|
||
|
|
||
|
it 'returns right away if empty password' do
|
||
|
ldap = Carto::Ldap::Configuration.new
|
||
|
ldap.authenticate('some@one.es', '').should eq false
|
||
|
end
|
||
|
|
||
|
it 'tests basic authentication' do
|
||
|
auth_username = 'admin'
|
||
|
auth_cn = "cn=#{auth_username},#{@domain_bases[0]}"
|
||
|
auth_password = '000123456'
|
||
|
|
||
|
other_user_username = 'nobody2'
|
||
|
other_user_cn = "cn=#{other_user_username},#{@domain_bases[0]}"
|
||
|
other_user_password = 'nobodypass'
|
||
|
|
||
|
ldap_configuration = Carto::Ldap::Configuration.create({
|
||
|
organization_id: @organization.id,
|
||
|
host: "0.0.0.0",
|
||
|
port: 389,
|
||
|
domain_bases_list: @domain_bases,
|
||
|
connection_user: @ldap_admin_cn,
|
||
|
connection_password: @ldap_admin_password,
|
||
|
email_field: '.',
|
||
|
user_object_class: '.',
|
||
|
group_object_class: '.',
|
||
|
user_id_field: @user_id_field,
|
||
|
username_field: @user_id_field
|
||
|
})
|
||
|
|
||
|
# This uses ldap_admin credentials
|
||
|
ldap_configuration.test_connection[:success].should eq true
|
||
|
|
||
|
ldap_configuration.connection_user = 'wrong1'
|
||
|
ldap_configuration.test_connection[:success].should eq false
|
||
|
|
||
|
ldap_configuration.reload
|
||
|
ldap_configuration.connection_user = "cn=wrong2,#{@domain_bases[0]}"
|
||
|
ldap_configuration.test_connection[:success].should eq false
|
||
|
|
||
|
ldap_configuration.reload
|
||
|
ldap_configuration.connection_password = 'wrong'
|
||
|
ldap_configuration.test_connection[:success].should eq false
|
||
|
|
||
|
register_ldap_user(auth_cn, auth_username, auth_password)
|
||
|
|
||
|
result = ldap_configuration.authenticate(auth_username, auth_password)
|
||
|
|
||
|
result.should_not eq false
|
||
|
result.class.should eq Carto::Ldap::Entry
|
||
|
result.user_id.should eq auth_username
|
||
|
|
||
|
# Add other user
|
||
|
register_ldap_user(other_user_cn, other_user_username, other_user_password)
|
||
|
|
||
|
result = ldap_configuration.authenticate(auth_username, auth_password)
|
||
|
result.should_not eq false
|
||
|
result.user_id.should eq auth_username
|
||
|
|
||
|
result = ldap_configuration.authenticate(other_user_username, other_user_password)
|
||
|
result.should_not eq false
|
||
|
result.user_id.should eq other_user_username
|
||
|
|
||
|
# Test connection error
|
||
|
Net::LDAP.any_instance.stubs(:bind_as).raises(Net::LDAP::Error.new)
|
||
|
result = ldap_configuration.authenticate(auth_username, auth_password)
|
||
|
result.should be_false
|
||
|
|
||
|
ldap_configuration.delete
|
||
|
end
|
||
|
|
||
|
it 'Checks user search' do
|
||
|
user_a_username = 'user-A'
|
||
|
user_a_cn = "cn=#{user_a_username},#{@domain_bases[0]}"
|
||
|
user_a_password = '000123456'
|
||
|
|
||
|
user_b_username = 'user-B'
|
||
|
user_b_cn = "cn=#{user_b_username},#{@domain_bases[0]}"
|
||
|
user_b_password = '789012'
|
||
|
|
||
|
ldap_configuration = Carto::Ldap::Configuration.create({
|
||
|
organization_id: @organization.id,
|
||
|
host: "0.0.0.0",
|
||
|
port: 389,
|
||
|
domain_bases_list: @domain_bases,
|
||
|
connection_user: @ldap_admin_cn,
|
||
|
connection_password: @ldap_admin_password,
|
||
|
email_field: '.',
|
||
|
user_object_class: 'organizationalRole',
|
||
|
group_object_class: '.',
|
||
|
user_id_field: @user_id_field,
|
||
|
username_field: @user_id_field
|
||
|
})
|
||
|
|
||
|
register_ldap_user(user_a_cn, user_a_username, user_a_password)
|
||
|
register_ldap_user(user_b_cn, user_b_username, user_b_password)
|
||
|
|
||
|
ldap_search_user_entries = [
|
||
|
{ @user_id_field => [user_a_username] },
|
||
|
{ @user_id_field => [user_b_username] }
|
||
|
]
|
||
|
FakeNetLdap.register_query(Net::LDAP::Filter.eq('objectClass', ldap_configuration.user_object_class),
|
||
|
ldap_search_user_entries)
|
||
|
|
||
|
ldap_configuration.users.should_not eq false
|
||
|
ldap_configuration.users.count.should eq 2
|
||
|
search_results = ldap_configuration.users.map { |user_data|
|
||
|
user_data['cn'].first
|
||
|
}
|
||
|
search_results.should eq [ user_a_username, user_b_username ]
|
||
|
|
||
|
ldap_configuration.delete
|
||
|
end
|
||
|
|
||
|
it "Doens't allows to change user_id_field once set" do
|
||
|
# Dumb spec, but to make sure if this gets changed we notice
|
||
|
ldap_configuration = Carto::Ldap::Configuration.create({
|
||
|
organization_id: @organization.id,
|
||
|
host: "0.0.0.0",
|
||
|
port: 389,
|
||
|
domain_bases_list: @domain_bases,
|
||
|
connection_user: @ldap_admin_cn,
|
||
|
connection_password: @ldap_admin_password,
|
||
|
email_field: '.',
|
||
|
user_object_class: 'organizationalRole',
|
||
|
group_object_class: '.',
|
||
|
user_id_field: @user_id_field,
|
||
|
username_field: @user_id_field
|
||
|
})
|
||
|
|
||
|
ldap_configuration.user_id_field = "modified"
|
||
|
ldap_configuration.save
|
||
|
ldap_configuration.reload
|
||
|
ldap_configuration.user_id_field.should eq @user_id_field
|
||
|
|
||
|
ldap_configuration.delete
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def register_ldap_user(cn, username, password)
|
||
|
ldap_entry_data = {
|
||
|
dn: cn,
|
||
|
@user_id_field => [username]
|
||
|
}
|
||
|
# Data to return as an LDAP result, that will be loaded into Carto::Ldap::Entry
|
||
|
FakeNetLdap.register_user(:username => cn, :password => password)
|
||
|
FakeNetLdap.register_query(Net::LDAP::Filter.eq('cn', username), [ldap_entry_data])
|
||
|
end
|
||
|
|
||
|
end
|