ruby-activeldap 0.7.4 → 0.8.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.
Files changed (74) hide show
  1. data/CHANGES +375 -0
  2. data/COPYING +340 -0
  3. data/LICENSE +58 -0
  4. data/Manifest.txt +33 -0
  5. data/README +63 -0
  6. data/Rakefile +37 -0
  7. data/TODO +31 -0
  8. data/benchmark/bench-al.rb +152 -0
  9. data/lib/{activeldap.rb → active_ldap.rb} +280 -263
  10. data/lib/active_ldap/adaptor/base.rb +29 -0
  11. data/lib/active_ldap/adaptor/ldap.rb +466 -0
  12. data/lib/active_ldap/association/belongs_to.rb +38 -0
  13. data/lib/active_ldap/association/belongs_to_many.rb +40 -0
  14. data/lib/active_ldap/association/collection.rb +80 -0
  15. data/lib/active_ldap/association/has_many.rb +48 -0
  16. data/lib/active_ldap/association/has_many_wrap.rb +56 -0
  17. data/lib/active_ldap/association/proxy.rb +89 -0
  18. data/lib/active_ldap/associations.rb +162 -0
  19. data/lib/active_ldap/attributes.rb +199 -0
  20. data/lib/active_ldap/base.rb +1343 -0
  21. data/lib/active_ldap/callbacks.rb +19 -0
  22. data/lib/active_ldap/command.rb +46 -0
  23. data/lib/active_ldap/configuration.rb +96 -0
  24. data/lib/active_ldap/connection.rb +137 -0
  25. data/lib/{activeldap → active_ldap}/ldap.rb +1 -1
  26. data/lib/active_ldap/object_class.rb +70 -0
  27. data/lib/active_ldap/schema.rb +258 -0
  28. data/lib/{activeldap → active_ldap}/timeout.rb +0 -0
  29. data/lib/{activeldap → active_ldap}/timeout_stub.rb +0 -0
  30. data/lib/active_ldap/user_password.rb +92 -0
  31. data/lib/active_ldap/validations.rb +78 -0
  32. data/rails/plugin/active_ldap/README +54 -0
  33. data/rails/plugin/active_ldap/init.rb +6 -0
  34. data/test/TODO +2 -0
  35. data/test/al-test-utils.rb +337 -0
  36. data/test/command.rb +62 -0
  37. data/test/config.yaml +8 -0
  38. data/test/config.yaml.sample +6 -0
  39. data/test/run-test.rb +17 -0
  40. data/test/test-unit-ext.rb +2 -0
  41. data/test/test_associations.rb +334 -0
  42. data/test/test_attributes.rb +71 -0
  43. data/test/test_base.rb +345 -0
  44. data/test/test_base_per_instance.rb +32 -0
  45. data/test/test_bind.rb +53 -0
  46. data/test/test_callback.rb +35 -0
  47. data/test/test_connection.rb +38 -0
  48. data/test/test_connection_per_class.rb +50 -0
  49. data/test/test_find.rb +36 -0
  50. data/test/test_groupadd.rb +50 -0
  51. data/test/test_groupdel.rb +46 -0
  52. data/test/test_groupls.rb +107 -0
  53. data/test/test_groupmod.rb +51 -0
  54. data/test/test_lpasswd.rb +75 -0
  55. data/test/test_object_class.rb +32 -0
  56. data/test/test_reflection.rb +173 -0
  57. data/test/test_schema.rb +166 -0
  58. data/test/test_user.rb +209 -0
  59. data/test/test_user_password.rb +93 -0
  60. data/test/test_useradd-binary.rb +59 -0
  61. data/test/test_useradd.rb +55 -0
  62. data/test/test_userdel.rb +48 -0
  63. data/test/test_userls.rb +86 -0
  64. data/test/test_usermod-binary-add-time.rb +62 -0
  65. data/test/test_usermod-binary-add.rb +61 -0
  66. data/test/test_usermod-binary-del.rb +64 -0
  67. data/test/test_usermod-lang-add.rb +57 -0
  68. data/test/test_usermod.rb +56 -0
  69. data/test/test_validation.rb +38 -0
  70. metadata +94 -21
  71. data/lib/activeldap/associations.rb +0 -170
  72. data/lib/activeldap/base.rb +0 -1456
  73. data/lib/activeldap/configuration.rb +0 -59
  74. data/lib/activeldap/schema2.rb +0 -217
data/test/test_base.rb ADDED
@@ -0,0 +1,345 @@
1
+ require 'al-test-utils'
2
+
3
+ class TestBase < Test::Unit::TestCase
4
+ include AlTestUtils
5
+
6
+ priority :must
7
+ def test_create_multiple
8
+ ensure_delete_user("temp-user1") do |uid1,|
9
+ ensure_delete_user("temp-user2") do |uid2,|
10
+ attributes = {
11
+ :uid => uid2,
12
+ :sn => uid2,
13
+ :cn => uid2,
14
+ :uid_number => "1000",
15
+ :gid_number => "1000",
16
+ :home_directory => "/home/#{uid2}",
17
+ }
18
+
19
+ user1, user2 = @user_class.create([{:uid => uid1}, attributes])
20
+ assert(!user1.errors.empty?)
21
+ assert(!@user_class.exists?(uid1))
22
+
23
+ assert_equal([], user2.errors.to_a)
24
+ assert(@user_class.exists?(uid2))
25
+ attributes.each do |key, value|
26
+ assert_equal(value, user2[key])
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ def test_create
33
+ ensure_delete_user("temp-user") do |uid,|
34
+ user = @user_class.create(:uid => uid)
35
+ assert(!user.errors.empty?)
36
+ assert(!@user_class.exists?(uid))
37
+
38
+ attributes = {
39
+ :uid => uid,
40
+ :sn => uid,
41
+ :cn => uid,
42
+ :uid_number => "1000",
43
+ :gid_number => "1000",
44
+ :home_directory => "/home/#{uid}",
45
+ }
46
+ user = @user_class.create(attributes)
47
+ assert_equal([], user.errors.to_a)
48
+ assert(@user_class.exists?(uid))
49
+ attributes.each do |key, value|
50
+ assert_equal(value, user[key])
51
+ end
52
+ end
53
+ end
54
+
55
+ priority :normal
56
+ def test_reload_of_not_exists_entry
57
+ make_temporary_user do |user,|
58
+ assert_nothing_raised do
59
+ user.reload
60
+ end
61
+
62
+ user.destroy
63
+
64
+ assert_raises(ActiveLdap::EntryNotFound) do
65
+ user.reload
66
+ end
67
+ end
68
+ end
69
+
70
+ def test_reload_and_new_entry
71
+ make_temporary_user do |user1,|
72
+ user2 = @user_class.new(user1.uid)
73
+ assert_equal(user1.attributes["uid"], user2.attributes["uid"])
74
+ assert_not_equal(user1.attributes["objectClass"],
75
+ @user_class.required_classes)
76
+ assert_equal(@user_class.required_classes,
77
+ user2.attributes["objectClass"])
78
+ assert_not_equal(user1.attributes["objectClass"],
79
+ user2.attributes["objectClass"])
80
+ assert(user2.exists?)
81
+ assert(user2.new_entry?)
82
+
83
+ user2.reload
84
+ assert(user2.exists?)
85
+ assert(!user2.new_entry?)
86
+ assert_equal(user1.attributes, user2.attributes)
87
+ end
88
+ end
89
+
90
+ def test_exists_for_instance
91
+ make_temporary_user do |user,|
92
+ assert(user.exists?)
93
+ assert(!user.new_entry?)
94
+
95
+ new_user = @user_class.new(user.uid)
96
+ assert(new_user.exists?)
97
+ assert(new_user.new_entry?)
98
+
99
+ user.destroy
100
+ assert(!user.exists?)
101
+ assert(user.new_entry?)
102
+
103
+ assert(!new_user.exists?)
104
+ assert(new_user.new_entry?)
105
+ end
106
+ end
107
+
108
+ def test_exists_without_required_object_class
109
+ make_temporary_user do |user,|
110
+ @user_class.required_classes -= ["posixAccount"]
111
+ user.remove_class("posixAccount")
112
+ assert(user.save)
113
+
114
+ assert(@user_class.exists?(user.dn))
115
+ @user_class.required_classes += ["posixAccount"]
116
+ assert(@user_class.exists?(user.dn))
117
+ assert_raises(ActiveLdap::RequiredObjectClassMissed) do
118
+ @user_class.find(user.dn)
119
+ end
120
+ end
121
+ end
122
+
123
+ def test_reload
124
+ make_temporary_user do |user1,|
125
+ user2 = @user_class.find(user1.uid)
126
+ assert_equal(user1.attributes, user2.attributes)
127
+
128
+ user1.cn = "new #{user1.cn}"
129
+ assert_not_equal(user1.attributes, user2.attributes)
130
+ assert_equal(user1.attributes.reject {|k, v| k == "cn"},
131
+ user2.attributes.reject {|k, v| k == "cn"})
132
+
133
+ user2.reload
134
+ assert_not_equal(user1.attributes, user2.attributes)
135
+ assert_equal(user1.attributes.reject {|k, v| k == "cn"},
136
+ user2.attributes.reject {|k, v| k == "cn"})
137
+
138
+ assert(user1.save)
139
+ assert_not_equal(user1.attributes, user2.attributes)
140
+ assert_equal(user1.attributes.reject {|k, v| k == "cn"},
141
+ user2.attributes.reject {|k, v| k == "cn"})
142
+
143
+ user2.reload
144
+ assert_equal(user1.attributes, user2.attributes)
145
+ end
146
+ end
147
+
148
+ def test_delete
149
+ make_temporary_user do |user1,|
150
+ make_temporary_user do |user2,|
151
+ make_temporary_user do |user3,|
152
+ assert(@user_class.exists?(user1.uid))
153
+ @user_class.delete(user1.dn)
154
+ assert(!@user_class.exists?(user1.uid))
155
+
156
+ assert(@user_class.exists?(user2.dn))
157
+ @user_class.delete(user2.uid)
158
+ assert(!@user_class.exists?(user2.dn))
159
+
160
+ assert(@user_class.exists?(user3.dn))
161
+ @user_class.delete("uid=#{user3.uid}")
162
+ assert(!@user_class.exists?(user3.dn))
163
+ end
164
+ end
165
+ end
166
+
167
+ make_temporary_user do |user1,|
168
+ make_temporary_user do |user2,|
169
+ make_temporary_user do |user3,|
170
+ assert(@user_class.exists?(user1.uid))
171
+ assert(@user_class.exists?(user2.uid))
172
+ assert(@user_class.exists?(user3.uid))
173
+ @user_class.delete([user1.dn, user2.uid, "uid=#{user3.uid}"])
174
+ assert(!@user_class.exists?(user1.uid))
175
+ assert(!@user_class.exists?(user2.uid))
176
+ assert(!@user_class.exists?(user3.uid))
177
+ end
178
+ end
179
+ end
180
+ end
181
+
182
+ def test_inherit_base
183
+ sub_user_class = Class.new(@user_class)
184
+ sub_user_class.ldap_mapping :prefix => "ou=Sub"
185
+ assert_equal("ou=Sub,#{@user_class.base}", sub_user_class.base)
186
+ sub_user_class.send(:include, Module.new)
187
+ assert_equal("ou=Sub,#{@user_class.base}", sub_user_class.base)
188
+
189
+ sub_sub_user_class = Class.new(sub_user_class)
190
+ sub_sub_user_class.ldap_mapping :prefix => "ou=SubSub"
191
+ assert_equal("ou=SubSub,#{sub_user_class.base}", sub_sub_user_class.base)
192
+ sub_sub_user_class.send(:include, Module.new)
193
+ assert_equal("ou=SubSub,#{sub_user_class.base}", sub_sub_user_class.base)
194
+ end
195
+
196
+ def test_compare
197
+ make_temporary_user do |user1,|
198
+ make_temporary_user do |user2,|
199
+ make_temporary_user do |user3,|
200
+ make_temporary_user do |user4,|
201
+ actual = ([user1, user2, user3] & [user1, user4])
202
+ assert_equal([user1].collect {|user| user.id},
203
+ actual.collect {|user| user.id})
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end
209
+
210
+ def test_ldap_mapping_validation
211
+ ou_class = Class.new(ActiveLdap::Base)
212
+ assert_raises(ArgumentError) do
213
+ ou_class.ldap_mapping :dnattr => "ou"
214
+ end
215
+
216
+ assert_nothing_raised do
217
+ ou_class.ldap_mapping :dn_attribute => "ou",
218
+ :prefix => "",
219
+ :classes => ["top", "organizationalUnit"]
220
+ end
221
+ end
222
+
223
+ def test_to_xml
224
+ ou = ou_class.new("Sample")
225
+ assert_equal(<<-EOX, ou.to_xml(:root => "ou"))
226
+ <ou>
227
+ <dn>#{ou.dn}</dn>
228
+ <objectClass>organizationalUnit</objectClass>
229
+ <objectClass>top</objectClass>
230
+ <ou>Sample</ou>
231
+ </ou>
232
+ EOX
233
+
234
+ assert_equal(<<-EOX, ou.to_xml)
235
+ <>
236
+ <dn>#{ou.dn}</dn>
237
+ <objectClass>organizationalUnit</objectClass>
238
+ <objectClass>top</objectClass>
239
+ <ou>Sample</ou>
240
+ </>
241
+ EOX
242
+
243
+ make_temporary_user do |user, password|
244
+ assert_equal(<<-EOX, user.to_xml(:root => "user"))
245
+ <user>
246
+ <dn>#{user.dn}</dn>
247
+ <cn>#{user.cn}</cn>
248
+ <gidNumber>#{user.gid_number}</gidNumber>
249
+ <homeDirectory>#{user.home_directory}</homeDirectory>
250
+ <jpegPhoto>#{jpeg_photo}</jpegPhoto>
251
+ <objectClass>inetOrgPerson</objectClass>
252
+ <objectClass>organizationalPerson</objectClass>
253
+ <objectClass>person</objectClass>
254
+ <objectClass>posixAccount</objectClass>
255
+ <objectClass>shadowAccount</objectClass>
256
+ <sn>#{user.sn}</sn>
257
+ <uid>#{user.uid}</uid>
258
+ <uidNumber>#{user.uid_number}</uidNumber>
259
+ <userCertificate binary="true">#{certificate}</userCertificate>
260
+ <userPassword>#{user.user_password}</userPassword>
261
+ </user>
262
+ EOX
263
+ end
264
+ end
265
+
266
+ def test_save
267
+ make_temporary_user do |user, password|
268
+ user.sn = nil
269
+ assert(!user.save)
270
+ assert_raises(ActiveLdap::EntryInvalid) do
271
+ user.save!
272
+ end
273
+
274
+ user.sn = "Surname"
275
+ assert(user.save)
276
+ user.sn = "Surname2"
277
+ assert_nothing_raised {user.save!}
278
+ end
279
+ end
280
+
281
+ def test_have_attribute?
282
+ make_temporary_user do |user, password|
283
+ assert(user.have_attribute?(:cn))
284
+ assert(user.have_attribute?(:commonName))
285
+ assert(user.have_attribute?(:common_name))
286
+ assert(!user.have_attribute?(:commonname))
287
+ assert(!user.have_attribute?(:COMMONNAME))
288
+
289
+ assert(!user.have_attribute?(:unknown_attribute))
290
+ end
291
+ end
292
+
293
+ def test_attribute_present?
294
+ make_temporary_user do |user, password|
295
+ assert(user.attribute_present?(:sn))
296
+ user.sn = nil
297
+ assert(!user.attribute_present?(:sn))
298
+ user.sn = "Surname"
299
+ assert(user.attribute_present?(:sn))
300
+ user.sn = [nil]
301
+ assert(!user.attribute_present?(:sn))
302
+ end
303
+ end
304
+
305
+ def test_update_all
306
+ make_temporary_user do |user, password|
307
+ make_temporary_user do |user2, password|
308
+ user2_cn = user2.cn
309
+ new_cn = "New #{user.cn}"
310
+ @user_class.update_all({:cn => new_cn}, user.uid)
311
+ assert_equal(new_cn, @user_class.find(user.uid).cn)
312
+ assert_equal(user2_cn, @user_class.find(user2.uid).cn)
313
+
314
+ new_sn = "New SN"
315
+ @user_class.update_all({:sn => [new_sn]})
316
+ assert_equal(new_sn, @user_class.find(user.uid).sn)
317
+ assert_equal(new_sn, @user_class.find(user2.uid).sn)
318
+
319
+ new_sn2 = "New SN2"
320
+ @user_class.update_all({:sn => [new_sn2]}, user2.uid)
321
+ assert_equal(new_sn, @user_class.find(user.uid).sn)
322
+ assert_equal(new_sn2, @user_class.find(user2.uid).sn)
323
+ end
324
+ end
325
+ end
326
+
327
+ def test_update
328
+ make_temporary_user do |user, password|
329
+ new_cn = "New #{user.cn}"
330
+ new_user = @user_class.update(user.dn, {:cn => new_cn})
331
+ assert_equal(new_cn, new_user.cn)
332
+
333
+ make_temporary_user do |user2, password|
334
+ new_sns = ["New SN1", "New SN2"]
335
+ new_cn2 = "New #{user2.cn}"
336
+ new_user, new_user2 = @user_class.update([user.dn, user2.dn],
337
+ [{:sn => new_sns[0]},
338
+ {:sn => new_sns[1],
339
+ :cn => new_cn2}])
340
+ assert_equal(new_sns, [new_user.sn, new_user2.sn])
341
+ assert_equal(new_cn2, new_user2.cn)
342
+ end
343
+ end
344
+ end
345
+ end
@@ -0,0 +1,32 @@
1
+ require 'al-test-utils'
2
+
3
+ class TestBasePerInstance < Test::Unit::TestCase
4
+ include AlTestUtils
5
+
6
+ priority :must
7
+ def test_exists?
8
+ ou_class("ou=Users").new("Sub").save
9
+ make_temporary_user(:uid => "test-user,ou=Sub") do |user, password|
10
+ assert(@user_class.exists?(user.uid))
11
+ assert(@user_class.exists?("uid=#{user.uid}"))
12
+ assert(@user_class.exists?(user.dn))
13
+
14
+ assert(@user_class.exists?("test-user,ou=Sub"))
15
+ assert(@user_class.exists?("uid=test-user,ou=Sub"))
16
+ end
17
+ end
18
+
19
+ priority :normal
20
+ def test_add
21
+ ou_class("ou=Users").new("Sub").save
22
+ make_temporary_user(:uid => "test-user,ou=Sub") do |user, password|
23
+ assert_equal("uid=test-user,ou=Sub,#{@user_class.base}", user.dn)
24
+ assert_equal("test-user", user.uid)
25
+ end
26
+
27
+ make_temporary_user(:uid => "uid=test-user,ou=Sub") do |user, password|
28
+ assert_equal("uid=test-user,ou=Sub,#{@user_class.base}", user.dn)
29
+ assert_equal("test-user", user.uid)
30
+ end
31
+ end
32
+ end
data/test/test_bind.rb ADDED
@@ -0,0 +1,53 @@
1
+ require 'al-test-utils'
2
+
3
+ class TestBind < Test::Unit::TestCase
4
+ include AlTestUtils::Config
5
+
6
+ def setup
7
+ super
8
+ end
9
+
10
+ def teardown
11
+ ActiveLdap::Base.clear_active_connections!
12
+ super
13
+ end
14
+
15
+ def test_anonymous
16
+ assert(!ActiveLdap::Base.connected?)
17
+ assert_nothing_raised do
18
+ config = ActiveLdap::Base.configurations[LDAP_ENV].symbolize_keys
19
+ config.delete(:bind_dn)
20
+ config[:allow_anonymous] = true
21
+ ActiveLdap::Base.establish_connection(config)
22
+ end
23
+ assert(ActiveLdap::Base.connected?,
24
+ "Checking is the connection was established.")
25
+ end
26
+
27
+ def test_bind
28
+ assert(!ActiveLdap::Base.connected?)
29
+ config = ActiveLdap::Base.configurations[LDAP_ENV].symbolize_keys
30
+ if config[:bind_dn].nil?
31
+ puts "pass this test for no user configuration"
32
+ return
33
+ end
34
+ assert_nothing_raised do
35
+ config[:allow_anonymous] = false
36
+ ActiveLdap::Base.establish_connection(config)
37
+ end
38
+ assert(ActiveLdap::Base.connected?,
39
+ "Checking is the connection was established.")
40
+ assert(ActiveLdap::Base.connection.bound?)
41
+ end
42
+
43
+ def test_failed_bind
44
+ assert(!ActiveLdap::Base.connected?)
45
+ assert_raises(ActiveLdap::AuthenticationError) do
46
+ config = ActiveLdap::Base.configurations[LDAP_ENV].symbolize_keys
47
+ config.delete(:bind_dn)
48
+ config[:allow_anonymous] = false
49
+ ActiveLdap::Base.establish_connection(config)
50
+ end
51
+ assert(!ActiveLdap::Base.connection.bound?)
52
+ end
53
+ end
@@ -0,0 +1,35 @@
1
+ require 'al-test-utils'
2
+
3
+ class TestCallback < Test::Unit::TestCase
4
+ include AlTestUtils
5
+
6
+ priority :must
7
+ def test_callback_after_find_and_after_initialize
8
+ make_temporary_group do |group|
9
+ found_entries = []
10
+ initialized_entries = []
11
+ @group_class.instance_variable_set("@found_entries", found_entries)
12
+ @group_class.instance_variable_set("@initialized_entries",
13
+ initialized_entries)
14
+ @group_class.module_eval do
15
+ define_method(:after_find) do
16
+ self.class.instance_variable_get("@found_entries") << self
17
+ end
18
+ define_method(:after_initialize) do
19
+ self.class.instance_variable_get("@initialized_entries") << self
20
+ end
21
+ end
22
+
23
+ assert_equal([], found_entries)
24
+ assert_equal([], initialized_entries)
25
+
26
+ found_group = @group_class.find(group.dn)
27
+
28
+ assert_equal([found_group.cn].sort, found_entries.collect {|g| g.cn}.sort)
29
+ assert_equal([found_group.cn].sort,
30
+ initialized_entries.collect {|g| g.cn}.sort)
31
+ end
32
+ end
33
+
34
+ priority :normal
35
+ end