activeldap 4.0.5 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.yardopts +3 -1
- data/doc/text/development.md +26 -0
- data/doc/text/{news.textile → news.md} +451 -241
- data/doc/text/{rails.textile → rails.md} +44 -33
- data/doc/text/{tutorial.textile → tutorial.md} +177 -185
- data/lib/active_ldap/adapter/base.rb +40 -17
- data/lib/active_ldap/adapter/jndi.rb +21 -9
- data/lib/active_ldap/adapter/jndi_connection.rb +83 -20
- data/lib/active_ldap/adapter/ldap.rb +50 -28
- data/lib/active_ldap/adapter/ldap_ext.rb +32 -13
- data/lib/active_ldap/adapter/net_ldap.rb +26 -24
- data/lib/active_ldap/associations.rb +5 -5
- data/lib/active_ldap/attribute_methods/before_type_cast.rb +1 -1
- data/lib/active_ldap/attribute_methods/dirty.rb +4 -7
- data/lib/active_ldap/attribute_methods/query.rb +1 -1
- data/lib/active_ldap/attribute_methods/read.rb +5 -1
- data/lib/active_ldap/attribute_methods/write.rb +1 -1
- data/lib/active_ldap/attribute_methods.rb +1 -2
- data/lib/active_ldap/base.rb +61 -14
- data/lib/active_ldap/callbacks.rb +7 -8
- data/lib/active_ldap/configuration.rb +27 -3
- data/lib/active_ldap/connection.rb +4 -22
- data/lib/active_ldap/distinguished_name.rb +1 -1
- data/lib/active_ldap/human_readable.rb +5 -4
- data/lib/active_ldap/operations.rb +24 -4
- data/lib/active_ldap/persistence.rb +3 -2
- data/lib/active_ldap/populate.rb +5 -3
- data/lib/active_ldap/railties/controller_runtime.rb +1 -2
- data/lib/active_ldap/schema/syntaxes.rb +8 -4
- data/lib/active_ldap/validations.rb +12 -4
- data/lib/active_ldap/version.rb +1 -1
- data/lib/active_ldap.rb +0 -7
- data/po/en/active-ldap.po +2 -2
- data/po/ja/active-ldap.po +3 -3
- data/test/add-phonetic-attribute-options-to-slapd.ldif +3 -3
- data/test/al-test-utils.rb +125 -38
- data/test/command.rb +13 -16
- data/test/enable-dynamic-groups.ldif +22 -0
- data/test/enable-start-tls.ldif +27 -0
- data/test/run-test.rb +0 -4
- data/test/test_base.rb +223 -22
- data/test/test_base_per_instance.rb +33 -1
- data/test/test_callback.rb +10 -8
- data/test/test_connection.rb +4 -0
- data/test/test_connection_per_class.rb +34 -0
- data/test/test_dn.rb +7 -0
- data/test/test_entry.rb +1 -0
- data/test/test_find.rb +14 -3
- data/test/test_supported_control.rb +1 -1
- data/test/test_syntax.rb +5 -0
- data/test/test_validation.rb +28 -15
- metadata +23 -24
- data/README.textile +0 -141
- data/doc/text/development.textile +0 -54
- data/lib/active_ldap/timeout.rb +0 -75
- data/lib/active_ldap/timeout_stub.rb +0 -17
data/test/test_base.rb
CHANGED
@@ -5,7 +5,52 @@ require 'al-test-utils'
|
|
5
5
|
class TestBase < Test::Unit::TestCase
|
6
6
|
include AlTestUtils
|
7
7
|
|
8
|
+
sub_test_case("follow_referrals") do
|
9
|
+
def test_default
|
10
|
+
make_temporary_user do |user1,|
|
11
|
+
make_temporary_user do |user2,|
|
12
|
+
member_url = ["ldap:///#{user1.base.to_s}??one?(objectClass=person)"]
|
13
|
+
make_temporary_group_of_urls(member_url: member_url) do |group_of_urls|
|
14
|
+
assert_equal([user1.dn, user2.dn],
|
15
|
+
group_of_urls.attributes["member"])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_connection_false
|
22
|
+
omit_unless_jruby
|
23
|
+
@group_of_urls_class.setup_connection(
|
24
|
+
current_configuration.merge(follow_referrals: false)
|
25
|
+
)
|
26
|
+
make_temporary_user do |user1,|
|
27
|
+
make_temporary_user do |user2,|
|
28
|
+
member_url = ["ldap:///#{user1.base.to_s}??one?(objectClass=person)"]
|
29
|
+
make_temporary_group_of_urls(member_url: member_url) do |group_of_urls|
|
30
|
+
assert_nil(group_of_urls.attributes["member"])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_connect_false
|
37
|
+
omit_unless_jruby
|
38
|
+
connection = @group_of_urls_class.connection
|
39
|
+
connection.disconnect!
|
40
|
+
connection.connect(follow_referrals: false)
|
41
|
+
make_temporary_user do |user1,|
|
42
|
+
make_temporary_user do |user2,|
|
43
|
+
member_url = ["ldap:///#{user1.base.to_s}??one?(objectClass=person)"]
|
44
|
+
make_temporary_group_of_urls(member_url: member_url) do |group_of_urls|
|
45
|
+
assert_nil(group_of_urls.attributes["member"])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
8
52
|
priority :must
|
53
|
+
priority :normal
|
9
54
|
def test_search_colon_value
|
10
55
|
make_temporary_group(:cn => "temp:group") do |group|
|
11
56
|
assert_equal("temp:group", group.cn)
|
@@ -13,7 +58,6 @@ class TestBase < Test::Unit::TestCase
|
|
13
58
|
end
|
14
59
|
end
|
15
60
|
|
16
|
-
priority :normal
|
17
61
|
def test_lower_case_object_class
|
18
62
|
fixture_file = fixture("lower_case_object_class_schema.rb")
|
19
63
|
schema_entries = eval(File.read(fixture_file))
|
@@ -122,9 +166,9 @@ class TestBase < Test::Unit::TestCase
|
|
122
166
|
|
123
167
|
def test_operational_attributes
|
124
168
|
make_temporary_group do |group|
|
125
|
-
|
169
|
+
_dn, attributes = @group_class.search(:attributes => ["*"])[0]
|
126
170
|
normal_attributes = attributes.keys
|
127
|
-
|
171
|
+
_dn, attributes = @group_class.search(:attributes => ["*", "+"])[0]
|
128
172
|
operational_attributes = attributes.keys - normal_attributes
|
129
173
|
operational_attribute = operational_attributes[0]
|
130
174
|
|
@@ -150,13 +194,13 @@ class TestBase < Test::Unit::TestCase
|
|
150
194
|
_ou_class.create("root2")
|
151
195
|
assert_equal(["base",
|
152
196
|
"root1", "child1", "child2", "domain", "child3",
|
153
|
-
"root2"],
|
154
|
-
_entry_class.find(:all).collect(&:id))
|
197
|
+
"root2"].sort,
|
198
|
+
_entry_class.find(:all).collect(&:id).sort)
|
155
199
|
assert_raise(ActiveLdap::DeleteError) do
|
156
200
|
root1.destroy_all
|
157
201
|
end
|
158
|
-
assert_equal(["base", "root1", "domain", "root2"],
|
159
|
-
_entry_class.find(:all).collect(&:id))
|
202
|
+
assert_equal(["base", "root1", "domain", "root2"].sort,
|
203
|
+
_entry_class.find(:all).collect(&:id).sort)
|
160
204
|
end
|
161
205
|
|
162
206
|
def test_delete_mixed_tree_by_instance
|
@@ -173,13 +217,13 @@ class TestBase < Test::Unit::TestCase
|
|
173
217
|
_ou_class.create("root2")
|
174
218
|
assert_equal(["base",
|
175
219
|
"root1", "child1", "child2", "domain", "child3",
|
176
|
-
"root2"],
|
177
|
-
_entry_class.find(:all).collect(&:id))
|
220
|
+
"root2"].sort,
|
221
|
+
_entry_class.find(:all).collect(&:id).sort)
|
178
222
|
assert_raise(ActiveLdap::DeleteError) do
|
179
223
|
root1.delete_all
|
180
224
|
end
|
181
|
-
assert_equal(["base", "root1", "domain", "root2"],
|
182
|
-
_entry_class.find(:all).collect(&:id))
|
225
|
+
assert_equal(["base", "root1", "domain", "root2"].sort,
|
226
|
+
_entry_class.find(:all).collect(&:id).sort)
|
183
227
|
end
|
184
228
|
|
185
229
|
def test_delete_tree
|
@@ -189,8 +233,8 @@ class TestBase < Test::Unit::TestCase
|
|
189
233
|
_ou_class.create(:ou => "child1", :parent => root1)
|
190
234
|
_ou_class.create(:ou => "child2", :parent => root1)
|
191
235
|
_ou_class.create("root2")
|
192
|
-
assert_equal(["base", "root1", "child1", "child2", "root2"],
|
193
|
-
_ou_class.find(:all).collect(&:ou))
|
236
|
+
assert_equal(["base", "root1", "child1", "child2", "root2"].sort,
|
237
|
+
_ou_class.find(:all).collect(&:ou).sort)
|
194
238
|
_ou_class.delete_all(:base => root1.dn)
|
195
239
|
assert_equal(["base", "root2"],
|
196
240
|
_ou_class.find(:all).collect(&:ou))
|
@@ -217,11 +261,11 @@ class TestBase < Test::Unit::TestCase
|
|
217
261
|
:classes => ["top"]
|
218
262
|
entry_class.dn_attribute = nil
|
219
263
|
assert_equal(["base", "root1", "child1", "domain1", "grandchild1",
|
220
|
-
"child2", "domain2", "root2"],
|
221
|
-
entry_class.find(:all).collect(&:id))
|
264
|
+
"child2", "domain2", "root2"].sort,
|
265
|
+
entry_class.find(:all).collect(&:id).sort)
|
222
266
|
entry_class.delete_all(nil, :base => child2.dn)
|
223
|
-
assert_equal(["base", "root1", "child1", "domain1", "grandchild1", "root2"],
|
224
|
-
entry_class.find(:all).collect(&:id))
|
267
|
+
assert_equal(["base", "root1", "child1", "domain1", "grandchild1", "root2"].sort,
|
268
|
+
entry_class.find(:all).collect(&:id).sort)
|
225
269
|
end
|
226
270
|
|
227
271
|
def test_first
|
@@ -252,6 +296,94 @@ class TestBase < Test::Unit::TestCase
|
|
252
296
|
end
|
253
297
|
end
|
254
298
|
|
299
|
+
def test_set_single_valued_attribute_uses_replace
|
300
|
+
make_temporary_user(:simple => true) do |user,|
|
301
|
+
assert_not_nil(user.homeDirectory)
|
302
|
+
assert_not_equal("/home/foo", user.homeDirectory)
|
303
|
+
|
304
|
+
user.homeDirectory = "/home/foo"
|
305
|
+
assert_equal({
|
306
|
+
:modified => true,
|
307
|
+
:entries => [
|
308
|
+
[
|
309
|
+
:replace,
|
310
|
+
"homeDirectory",
|
311
|
+
{"homeDirectory" => ["/home/foo"]},
|
312
|
+
]
|
313
|
+
]
|
314
|
+
},
|
315
|
+
detect_modify(user) {user.save})
|
316
|
+
assert_equal("/home/foo", user.homeDirectory)
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
def test_set_attribute_uses_add_for_completely_new_value
|
321
|
+
make_temporary_user(:simple => true) do |user,|
|
322
|
+
assert_nil(user.description)
|
323
|
+
|
324
|
+
user.description = "x"
|
325
|
+
assert_equal({
|
326
|
+
:modified => true,
|
327
|
+
:entries => [
|
328
|
+
[:add, "description", {"description" => ["x"]}],
|
329
|
+
],
|
330
|
+
},
|
331
|
+
detect_modify(user) {user.save})
|
332
|
+
assert_equal("x", user.description)
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
def test_set_attribute_uses_add_for_added_value
|
337
|
+
make_temporary_user(:simple => true) do |user,|
|
338
|
+
user.description = ["a", "b"]
|
339
|
+
assert(user.save)
|
340
|
+
|
341
|
+
user.description = ["a", "b", "c"]
|
342
|
+
assert_equal({
|
343
|
+
:modified => true,
|
344
|
+
:entries => [
|
345
|
+
[:add, "description", {"description" => ["c"]}],
|
346
|
+
],
|
347
|
+
},
|
348
|
+
capture = detect_modify(user) {user.save})
|
349
|
+
assert_equal(["a", "b", "c"], user.description)
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
def test_set_attribute_uses_delete_for_deleted_value
|
354
|
+
make_temporary_user(:simple => true) do |user,|
|
355
|
+
user.description = ["a", "b", "c"]
|
356
|
+
assert(user.save)
|
357
|
+
|
358
|
+
user.description = ["a", "c"]
|
359
|
+
assert_equal({
|
360
|
+
:modified => true,
|
361
|
+
:entries => [
|
362
|
+
[:delete, "description", {"description" => ["b"]}],
|
363
|
+
],
|
364
|
+
},
|
365
|
+
detect_modify(user) {user.save})
|
366
|
+
assert_equal(["a", "c"], user.description)
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
def test_set_attribute_uses_delete_for_unset_value
|
371
|
+
make_temporary_user(:simple => true) do |user,|
|
372
|
+
user.description = "x"
|
373
|
+
assert(user.save)
|
374
|
+
|
375
|
+
user.description = nil
|
376
|
+
assert_equal({
|
377
|
+
:modified => true,
|
378
|
+
:entries => [
|
379
|
+
[:delete, "description", {"description" => ["x"]}],
|
380
|
+
],
|
381
|
+
},
|
382
|
+
detect_modify(user) {user.save})
|
383
|
+
assert_nil(user.description)
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
255
387
|
def test_set_attributes_with_a_blank_value_in_values
|
256
388
|
make_temporary_user(:simple => true) do |user,|
|
257
389
|
user.attributes = {"description" => ["a", "b", ""]}
|
@@ -295,6 +427,19 @@ class TestBase < Test::Unit::TestCase
|
|
295
427
|
end
|
296
428
|
end
|
297
429
|
|
430
|
+
def test_set_dn_with_unnormalized_dn_attribute_with_forward_slash
|
431
|
+
make_temporary_user do |user,|
|
432
|
+
new_dn = "uid=temp/user1,#{user.class.base}"
|
433
|
+
assert_not_equal(user.dn.to_s, new_dn)
|
434
|
+
|
435
|
+
user.uid = 'temp/user1'
|
436
|
+
assert_equal(user.dn.to_s, new_dn)
|
437
|
+
|
438
|
+
assert_true(user.save!)
|
439
|
+
assert_true(user.class.find(user.uid).update_attributes!(gidNumber: 100069))
|
440
|
+
end
|
441
|
+
end
|
442
|
+
|
298
443
|
def test_destroy_with_empty_base_and_prefix_of_class
|
299
444
|
make_temporary_user do |user,|
|
300
445
|
base = user.class.base
|
@@ -354,14 +499,25 @@ class TestBase < Test::Unit::TestCase
|
|
354
499
|
|
355
500
|
def test_save_with_changes
|
356
501
|
make_temporary_user do |user, password|
|
502
|
+
cn = user.cn
|
357
503
|
user.cn += "!!!"
|
358
|
-
|
504
|
+
assert_equal({
|
505
|
+
:modified => true,
|
506
|
+
:entries => [
|
507
|
+
[:replace, "cn", {"cn" => ["#{cn}!!!"]}],
|
508
|
+
],
|
509
|
+
},
|
510
|
+
detect_modify(user) {user.save})
|
359
511
|
end
|
360
512
|
end
|
361
513
|
|
362
514
|
def test_save_without_changes
|
363
515
|
make_temporary_user do |user, password|
|
364
|
-
|
516
|
+
assert_equal({
|
517
|
+
:modified => false,
|
518
|
+
:entries => [],
|
519
|
+
},
|
520
|
+
detect_modify(user) {user.save})
|
365
521
|
end
|
366
522
|
end
|
367
523
|
|
@@ -663,6 +819,43 @@ class TestBase < Test::Unit::TestCase
|
|
663
819
|
end
|
664
820
|
end
|
665
821
|
|
822
|
+
class TestInstantiate < self
|
823
|
+
class Person < ActiveLdap::Base
|
824
|
+
ldap_mapping dn_attribute: "cn",
|
825
|
+
prefix: "ou=People",
|
826
|
+
scope: :one,
|
827
|
+
classes: ["top", "person"]
|
828
|
+
end
|
829
|
+
|
830
|
+
class OrganizationalPerson < Person
|
831
|
+
ldap_mapping dn_attribute: "cn",
|
832
|
+
prefix: "",
|
833
|
+
classes: ["top", "person", "organizationalPerson"]
|
834
|
+
end
|
835
|
+
|
836
|
+
class ResidentialPerson < Person
|
837
|
+
ldap_mapping dn_attribute: "cn",
|
838
|
+
prefix: "",
|
839
|
+
classes: ["top", "person", "residentialPerson"]
|
840
|
+
end
|
841
|
+
|
842
|
+
def test_sub_class
|
843
|
+
make_ou("People")
|
844
|
+
residential_person = ResidentialPerson.new(cn: "John Doe",
|
845
|
+
sn: "Doe",
|
846
|
+
street: "123 Main Street",
|
847
|
+
l: "Anytown")
|
848
|
+
residential_person.save!
|
849
|
+
organizational_person = OrganizationalPerson.new(cn: "Jane Smith",
|
850
|
+
sn: "Smith",
|
851
|
+
title: "General Manager")
|
852
|
+
organizational_person.save!
|
853
|
+
people = Person.all
|
854
|
+
assert_equal([ResidentialPerson, OrganizationalPerson],
|
855
|
+
people.collect(&:class))
|
856
|
+
end
|
857
|
+
end
|
858
|
+
|
666
859
|
def test_reload_of_not_exists_entry
|
667
860
|
make_temporary_user do |user,|
|
668
861
|
assert_nothing_raised do
|
@@ -809,7 +1002,8 @@ class TestBase < Test::Unit::TestCase
|
|
809
1002
|
ou_class.ldap_mapping(:dn_attribute => :ou,
|
810
1003
|
:prefix => "",
|
811
1004
|
:classes => ["top", "organizationalUnit"])
|
812
|
-
assert_equal(["ou=
|
1005
|
+
assert_equal(["ou=GroupOfURLsSet,#{current_configuration['base']}",
|
1006
|
+
"ou=Groups,#{current_configuration['base']}",
|
813
1007
|
"ou=Users,#{current_configuration['base']}"],
|
814
1008
|
ou_class.find(:all).collect(&:dn).collect(&:to_s).sort)
|
815
1009
|
end
|
@@ -1151,23 +1345,30 @@ EOX
|
|
1151
1345
|
|
1152
1346
|
private
|
1153
1347
|
def detect_modify(object)
|
1154
|
-
modify_called =
|
1348
|
+
modify_called = nil
|
1349
|
+
entries = nil
|
1155
1350
|
singleton_class = class << object; self; end
|
1156
1351
|
singleton_class.send(:define_method, :modify_entry) do |*args|
|
1157
1352
|
dn, attributes, options = args
|
1158
1353
|
options ||= {}
|
1159
1354
|
modify_detector = Object.new
|
1160
1355
|
modify_detector.instance_variable_set("@called", false)
|
1356
|
+
modify_detector.instance_variable_set("@entries", [])
|
1161
1357
|
def modify_detector.modify(dn, entries, options)
|
1162
1358
|
@called = true
|
1359
|
+
@entries = entries
|
1163
1360
|
end
|
1164
1361
|
options[:connection] = modify_detector
|
1165
1362
|
result = super(dn, attributes, options)
|
1166
1363
|
modify_called = modify_detector.instance_variable_get("@called")
|
1364
|
+
entries = modify_detector.instance_variable_get("@entries")
|
1167
1365
|
result
|
1168
1366
|
end
|
1169
1367
|
yield
|
1170
|
-
|
1368
|
+
{
|
1369
|
+
:modified => modify_called,
|
1370
|
+
:entries => entries,
|
1371
|
+
}
|
1171
1372
|
end
|
1172
1373
|
|
1173
1374
|
def assert_to_ldif(entry)
|
@@ -9,13 +9,45 @@ class TestBasePerInstance < Test::Unit::TestCase
|
|
9
9
|
end
|
10
10
|
|
11
11
|
priority :must
|
12
|
+
def test_dn_with_sub_base_first
|
13
|
+
sub_user = @user_class.new(dn: "uid=user1,ou=Sub,#{@user_class.base}",
|
14
|
+
uid: "user1")
|
15
|
+
# Order is important. #base should be called before #dn.
|
16
|
+
base = sub_user.base.to_s
|
17
|
+
dn = sub_user.dn.to_s
|
18
|
+
assert_equal([
|
19
|
+
"ou=Sub,#{@user_class.base}",
|
20
|
+
"uid=user1,ou=Sub,#{@user_class.base}",
|
21
|
+
],
|
22
|
+
[
|
23
|
+
base,
|
24
|
+
dn,
|
25
|
+
])
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_dn_with_sub_base_last
|
29
|
+
sub_user = @user_class.new(uid: "user1",
|
30
|
+
dn: "uid=user1,ou=Sub,#{@user_class.base}")
|
31
|
+
# Order is important. #base should be called before #dn.
|
32
|
+
base = sub_user.base.to_s
|
33
|
+
dn = sub_user.dn.to_s
|
34
|
+
assert_equal([
|
35
|
+
"ou=Sub,#{@user_class.base}",
|
36
|
+
"uid=user1,ou=Sub,#{@user_class.base}",
|
37
|
+
],
|
38
|
+
[
|
39
|
+
base,
|
40
|
+
dn,
|
41
|
+
])
|
42
|
+
end
|
43
|
+
|
44
|
+
priority :normal
|
12
45
|
def test_set_base
|
13
46
|
guest = @user_class.new("guest")
|
14
47
|
guest.base = "ou=Sub"
|
15
48
|
assert_equal("uid=guest,ou=Sub,#{@user_class.base}", guest.dn)
|
16
49
|
end
|
17
50
|
|
18
|
-
priority :normal
|
19
51
|
def test_dn_is_base
|
20
52
|
entry_class = Class.new(ActiveLdap::Base)
|
21
53
|
entry_class.ldap_mapping :prefix => "",
|
data/test/test_callback.rb
CHANGED
@@ -6,10 +6,10 @@ class TestCallback < Test::Unit::TestCase
|
|
6
6
|
priority :must
|
7
7
|
def test_new
|
8
8
|
initialized_entries = []
|
9
|
-
@group_class.instance_variable_set("@initialized_entries",
|
10
|
-
initialized_entries)
|
11
9
|
@group_class.module_eval do
|
12
|
-
after_initialize
|
10
|
+
after_initialize do
|
11
|
+
initialized_entries << self
|
12
|
+
end
|
13
13
|
end
|
14
14
|
assert_equal([], initialized_entries)
|
15
15
|
new_group = @group_class.new(:cn => "new-cn")
|
@@ -22,12 +22,14 @@ class TestCallback < Test::Unit::TestCase
|
|
22
22
|
make_temporary_group do |group|
|
23
23
|
found_entries = []
|
24
24
|
initialized_entries = []
|
25
|
-
@group_class.instance_variable_set("@found_entries", found_entries)
|
26
|
-
@group_class.instance_variable_set("@initialized_entries",
|
27
|
-
initialized_entries)
|
28
25
|
@group_class.module_eval do
|
29
|
-
|
30
|
-
|
26
|
+
prepend ActiveLdap::Callbacks::CallbackedInstantiatable
|
27
|
+
after_find do
|
28
|
+
found_entries << self
|
29
|
+
end
|
30
|
+
after_initialize do
|
31
|
+
initialized_entries << self
|
32
|
+
end
|
31
33
|
end
|
32
34
|
|
33
35
|
assert_equal([], found_entries)
|
data/test/test_connection.rb
CHANGED
@@ -3,6 +3,7 @@ require 'al-test-utils'
|
|
3
3
|
class TestConnection < Test::Unit::TestCase
|
4
4
|
include AlTestUtils::Config
|
5
5
|
include AlTestUtils::MockLogger
|
6
|
+
include AlTestUtils::Omittable
|
6
7
|
|
7
8
|
def setup
|
8
9
|
super
|
@@ -23,6 +24,9 @@ class TestConnection < Test::Unit::TestCase
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def test_retry_limit_0_with_nonexistent_host_with_timeout
|
27
|
+
omit_if_ldap("this test will take a long time...")
|
28
|
+
omit_if_jruby("JNI adapter returns connection error immediately. " +
|
29
|
+
"So timeout isn't invoked.")
|
26
30
|
config = current_configuration.merge("host" => "192.168.29.29",
|
27
31
|
"retry_limit" => 0,
|
28
32
|
"timeout" => 1)
|
@@ -57,6 +57,40 @@ class TestConnectionPerClass < Test::Unit::TestCase
|
|
57
57
|
assert_equal([sub2_base], sub2_class.find(:all).collect(&:dn))
|
58
58
|
end
|
59
59
|
|
60
|
+
def test_multi_same_setup_connections
|
61
|
+
make_ou("Sub")
|
62
|
+
sub_class1 = ou_class("ou=Sub")
|
63
|
+
sub_class2 = ou_class("ou=Sub")
|
64
|
+
|
65
|
+
configuration = current_configuration.symbolize_keys
|
66
|
+
configuration[:scope] = :base
|
67
|
+
current_base = configuration[:base]
|
68
|
+
sub_configuration = configuration.dup
|
69
|
+
sub_base = "ou=Sub,#{current_base}"
|
70
|
+
sub_configuration[:base] = sub_base
|
71
|
+
|
72
|
+
sub_class1.setup_connection(sub_configuration)
|
73
|
+
sub_class2.setup_connection(sub_configuration)
|
74
|
+
|
75
|
+
sub_configuration1 = sub_class1.configuration
|
76
|
+
sub_configuration2 = sub_class2.configuration
|
77
|
+
|
78
|
+
assert_not_nil(sub_configuration1)
|
79
|
+
assert_not_nil(sub_configuration2)
|
80
|
+
|
81
|
+
sub_class1.setup_connection(sub_configuration.dup)
|
82
|
+
sub_class1.prefix = nil
|
83
|
+
|
84
|
+
assert_equal([
|
85
|
+
sub_configuration1,
|
86
|
+
sub_configuration2,
|
87
|
+
],
|
88
|
+
[
|
89
|
+
sub_class1.configuration,
|
90
|
+
sub_class2.configuration,
|
91
|
+
])
|
92
|
+
end
|
93
|
+
|
60
94
|
def test_bind
|
61
95
|
non_anon_class = ou_class("ou=NonAnonymous")
|
62
96
|
anon_class = ou_class("ou=Anonymous")
|
data/test/test_dn.rb
CHANGED
@@ -72,6 +72,13 @@ class TestDN < Test::Unit::TestCase
|
|
72
72
|
"dc = \" l o c a l \" , dc = \"+n,\\\"e\\\";t\"")
|
73
73
|
end
|
74
74
|
|
75
|
+
def test_parse_dn_with_spaces_in_attribute_value
|
76
|
+
assert_dn([["o", "xxx "], ["dc", "local"]], "o=xxx\\ ,dc=local")
|
77
|
+
assert_dn([["o", " xxx"], ["dc", "local"]], "o=\\ xxx,dc=local")
|
78
|
+
assert_dn([["o", "xxx yyy"], ["dc", "local"]], "o=xxx\\ yyy,dc=local")
|
79
|
+
assert_dn([["o", " xxx "], ["dc", "local"]], "o=\\ xxx\\ ,dc=local")
|
80
|
+
end
|
81
|
+
|
75
82
|
def test_parse_dn_in_rfc2253
|
76
83
|
assert_dn([
|
77
84
|
{"cn" => "Steve Kille"},
|
data/test/test_entry.rb
CHANGED
@@ -11,6 +11,7 @@ class TestEntry < Test::Unit::TestCase
|
|
11
11
|
all_entries = [ActiveLdap::Base.base]
|
12
12
|
all_entries += [user.dn, user.base]
|
13
13
|
all_entries += [group.dn, group.base]
|
14
|
+
all_entries += [@group_of_urls_class.base]
|
14
15
|
assert_equal(all_entries.sort,
|
15
16
|
ActiveLdap::Entry.all.collect(&:dn).sort)
|
16
17
|
end
|
data/test/test_find.rb
CHANGED
@@ -3,7 +3,18 @@ require 'al-test-utils'
|
|
3
3
|
class TestFind < Test::Unit::TestCase
|
4
4
|
include AlTestUtils
|
5
5
|
|
6
|
-
|
6
|
+
def test_find_paged
|
7
|
+
page_size = 126
|
8
|
+
n_users = page_size + 1
|
9
|
+
uids = n_users.times.collect do
|
10
|
+
user, _password = make_temporary_user
|
11
|
+
user.uid
|
12
|
+
end
|
13
|
+
users = @user_class.find(:all, page_size: page_size)
|
14
|
+
assert_equal(uids.sort,
|
15
|
+
users.collect(&:uid).sort)
|
16
|
+
end
|
17
|
+
|
7
18
|
def test_find_with_dn
|
8
19
|
make_temporary_user do |user,|
|
9
20
|
assert_equal(user.dn, @user_class.find(user.dn).dn)
|
@@ -11,7 +22,6 @@ class TestFind < Test::Unit::TestCase
|
|
11
22
|
end
|
12
23
|
end
|
13
24
|
|
14
|
-
priority :normal
|
15
25
|
def test_find_with_special_value_prefix
|
16
26
|
# \2C == ','
|
17
27
|
make_ou("a\\2Cb,ou=Users")
|
@@ -63,7 +73,8 @@ class TestFind < Test::Unit::TestCase
|
|
63
73
|
|
64
74
|
def test_find_operational_attributes
|
65
75
|
make_temporary_user do |user, password|
|
66
|
-
found_user = @user_class.find(user.uid,
|
76
|
+
found_user = @user_class.find(user.uid,
|
77
|
+
:include_operational_attributes => true)
|
67
78
|
assert_equal(Time.now.utc.iso8601,
|
68
79
|
found_user.modify_timestamp.utc.iso8601)
|
69
80
|
end
|
data/test/test_syntax.rb
CHANGED
@@ -117,6 +117,11 @@ class TestSyntax < Test::Unit::TestCase
|
|
117
117
|
"19941216103212.345+0900")
|
118
118
|
end
|
119
119
|
|
120
|
+
def test_timezone_difference_with_minutes
|
121
|
+
assert_type_cast(Time.parse("2019-02-13 15:54:23 +0530"),
|
122
|
+
"20190213155423+0530")
|
123
|
+
end
|
124
|
+
|
120
125
|
def test_year_month_day_hour_minute
|
121
126
|
assert_type_cast(Time.parse("2008/01/07 03:46:00"),
|
122
127
|
"200801070346")
|