activeldap 4.0.5 → 6.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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")
|