activeldap 5.2.3 → 6.0.3

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.
@@ -1,6 +1,6 @@
1
1
  # Your LDAP server needs to support StartTLS when you test StartTLS related
2
2
  # feature. This is a LDIF file for OpenLDAP to do the configuration.
3
- # You can use this file by the following command linne on Debian GNU/Linux
3
+ # You can use this file by the following command line on Debian GNU/Linux
4
4
  # or Ubuntu:
5
5
  #
6
6
  # % sudo usermod -a -G ssl-cert openldap
@@ -2,8 +2,6 @@
2
2
 
3
3
  $VERBOSE = true
4
4
 
5
- $KCODE = 'u' if RUBY_VERSION < "1.9"
6
-
7
5
  base_dir = File.expand_path(File.dirname(__FILE__))
8
6
  top_dir = File.expand_path(File.join(base_dir, ".."))
9
7
  lib_dir = File.join(top_dir, "lib")
@@ -11,11 +9,9 @@ test_dir = File.join(top_dir, "test")
11
9
  $LOAD_PATH.unshift(lib_dir)
12
10
  $LOAD_PATH.unshift(test_dir)
13
11
 
14
- require "rubygems"
15
12
  require "bundler/setup"
16
13
 
17
14
  require "test/unit"
18
- require "test/unit/notify"
19
15
  Test::Unit::Priority.enable
20
16
 
21
17
  Dir.glob(File.join(test_dir, "**", "test_*.rb")) do |test_file|
@@ -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
- dn, attributes = @group_class.search(:attributes => ["*"])[0]
169
+ _dn, attributes = @group_class.search(:attributes => ["*"])[0]
126
170
  normal_attributes = attributes.keys
127
- dn, attributes = @group_class.search(:attributes => ["*", "+"])[0]
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
@@ -383,6 +427,19 @@ class TestBase < Test::Unit::TestCase
383
427
  end
384
428
  end
385
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
+
386
443
  def test_destroy_with_empty_base_and_prefix_of_class
387
444
  make_temporary_user do |user,|
388
445
  base = user.class.base
@@ -945,7 +1002,8 @@ class TestBase < Test::Unit::TestCase
945
1002
  ou_class.ldap_mapping(:dn_attribute => :ou,
946
1003
  :prefix => "",
947
1004
  :classes => ["top", "organizationalUnit"])
948
- assert_equal(["ou=Groups,#{current_configuration['base']}",
1005
+ assert_equal(["ou=GroupOfURLsSet,#{current_configuration['base']}",
1006
+ "ou=Groups,#{current_configuration['base']}",
949
1007
  "ou=Users,#{current_configuration['base']}"],
950
1008
  ou_class.find(:all).collect(&:dn).collect(&:to_s).sort)
951
1009
  end
@@ -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 => "",
@@ -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)
@@ -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
@@ -3,7 +3,18 @@ require 'al-test-utils'
3
3
  class TestFind < Test::Unit::TestCase
4
4
  include AlTestUtils
5
5
 
6
- priority :must
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")
@@ -17,7 +17,7 @@ class TestSupportedControl < Test::Unit::TestCase
17
17
  end
18
18
 
19
19
  def test_false
20
- assert_true(paged_results?(ActiveLdap::LdapControls::PAGED_RESULTS))
20
+ assert_false(paged_results?(ActiveLdap::LdapControls::ASSERTION))
21
21
  end
22
22
  end
23
23
  end
@@ -37,6 +37,15 @@ class TestValidation < Test::Unit::TestCase
37
37
  priority :must
38
38
 
39
39
  priority :normal
40
+ def test_validate_false
41
+ make_temporary_user(:simple => true) do |user,|
42
+ user.sn = nil
43
+ assert_raise(ActiveLdap::RequiredAttributeMissed) do
44
+ user.save(validate: false)
45
+ end
46
+ end
47
+ end
48
+
40
49
  def test_octet_string
41
50
  make_temporary_user(:simple => true) do |user,|
42
51
  utf8_encoded_binary_value = "\xff".force_encoding("UTF-8")
@@ -52,8 +61,8 @@ class TestValidation < Test::Unit::TestCase
52
61
  user1.id = user2.id
53
62
  assert_false(user1.save)
54
63
 
55
- format = la_('distinguishedName').humanize
56
- format << ' ' << _("is duplicated: %s")
64
+ format = human_attribute_name("distinguishedName")
65
+ format << " " << _("is duplicated: %s")
57
66
  assert_equal([format % [user2.dn.to_s]],
58
67
  user1.errors.full_messages)
59
68
  end
@@ -66,8 +75,8 @@ class TestValidation < Test::Unit::TestCase
66
75
  user.jpeg_photo = "XXX"
67
76
  assert_not_predicate(user, :save)
68
77
 
69
- format = la_('jpegPhoto').humanize
70
- format << ' ' << _("has invalid format: %s: required syntax: %s: %s")
78
+ format = human_attribute_name('jpegPhoto')
79
+ format << " " << _("has invalid format: %s: required syntax: %s: %s")
71
80
  arguments = [_("<binary-value>"),
72
81
  lsd_("1.3.6.1.4.1.1466.115.121.1.28"),
73
82
  _("invalid JPEG format")]
@@ -112,8 +121,8 @@ class TestValidation < Test::Unit::TestCase
112
121
  reason = _("attribute value is missing")
113
122
  invalid_format = _("%s is invalid distinguished name (DN): %s")
114
123
  invalid_message = invalid_format % ["uid==,#{user.class.base}", reason]
115
- format = la_('distinguishedName').humanize
116
- format << ' ' << _("is invalid: %s")
124
+ format = human_attribute_name("distinguishedName")
125
+ format << " " << _("is invalid: %s")
117
126
  message = format % invalid_message
118
127
  assert_equal([message],
119
128
  user.errors.full_messages.find_all {|m| /DN/ =~ m})
@@ -126,8 +135,8 @@ class TestValidation < Test::Unit::TestCase
126
135
  reason = _("attribute value is missing")
127
136
  invalid_format = _("%s is invalid distinguished name (DN): %s")
128
137
  invalid_message = invalid_format % ["uid==,#{user.class.base}", reason]
129
- format = la_('distinguishedName').humanize
130
- format << ' ' << _("is invalid: %s")
138
+ format = human_attribute_name("distinguishedName")
139
+ format << " " << _("is invalid: %s")
131
140
  message = format % invalid_message
132
141
  assert_equal([message], user.errors.full_messages)
133
142
  end
@@ -138,8 +147,8 @@ class TestValidation < Test::Unit::TestCase
138
147
  assert(user.valid?)
139
148
  user.uid_number = ""
140
149
  assert(!user.valid?)
141
- format = la_('uidNumber').humanize
142
- format << ' ' << _("is required attribute by objectClass '%s'")
150
+ format = human_attribute_name("uidNumber")
151
+ format << " " << _("is required attribute by objectClass '%s'")
143
152
  blank_message = format % loc_("posixAccount")
144
153
  assert_equal([blank_message], user.errors.full_messages)
145
154
  end
@@ -150,8 +159,8 @@ class TestValidation < Test::Unit::TestCase
150
159
  assert(user.save)
151
160
  user.class.excluded_classes = ['person']
152
161
  assert(!user.save)
153
- format = la_("objectClass").humanize
154
- format << ' ' << n_("has excluded value: %s",
162
+ format = human_attribute_name("objectClass")
163
+ format << " " << n_("has excluded value: %s",
155
164
  "has excluded values: %s",
156
165
  1)
157
166
  message = format % loc_("person")
@@ -222,8 +231,8 @@ class TestValidation < Test::Unit::TestCase
222
231
  assert(ou_class.new("YYY").save)
223
232
  ou = ou_class.new("YYY")
224
233
  assert(!ou.save)
225
- format = la_("distinguishedName").humanize
226
- format << ' ' << _("is duplicated: %s")
234
+ format = human_attribute_name("distinguishedName")
235
+ format << " " << _("is duplicated: %s")
227
236
  message = format % ou.dn
228
237
  assert_equal([message], ou.errors.full_messages)
229
238
  end
@@ -259,12 +268,16 @@ class TestValidation < Test::Unit::TestCase
259
268
  end
260
269
 
261
270
  private
271
+ def human_attribute_name(name)
272
+ la_(name).dup
273
+ end
274
+
262
275
  def assert_invalid_value(name, formatted_value, syntax, reason, model, option)
263
276
  syntax_description = lsd_(syntax)
264
277
  assert_not_nil(syntax_description)
265
278
  params = [formatted_value, syntax_description, reason]
266
279
  params.unshift(option) if option
267
- localized_name = la_(name).humanize
280
+ localized_name = human_attribute_name(name)
268
281
  format = localized_name << ' '
269
282
  if option
270
283
  format << _("(%s) has invalid format: %s: required syntax: %s: %s")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activeldap
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.3
4
+ version: 6.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Will Drewry
@@ -9,22 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-02-15 00:00:00.000000000 Z
12
+ date: 2020-08-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ">"
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: 4.0.0
20
+ version: '5.2'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ">"
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: 4.0.0
27
+ version: '5.2'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: locale
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -96,7 +96,7 @@ dependencies:
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  - !ruby/object:Gem::Dependency
99
- name: rake
99
+ name: kramdown
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
102
  - - ">="
@@ -110,21 +110,7 @@ dependencies:
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
112
  - !ruby/object:Gem::Dependency
113
- name: test-unit
114
- requirement: !ruby/object:Gem::Requirement
115
- requirements:
116
- - - ">="
117
- - !ruby/object:Gem::Version
118
- version: '0'
119
- type: :development
120
- prerelease: false
121
- version_requirements: !ruby/object:Gem::Requirement
122
- requirements:
123
- - - ">="
124
- - !ruby/object:Gem::Version
125
- version: '0'
126
- - !ruby/object:Gem::Dependency
127
- name: test-unit-notify
113
+ name: packnga
128
114
  requirement: !ruby/object:Gem::Requirement
129
115
  requirements:
130
116
  - - ">="
@@ -138,7 +124,7 @@ dependencies:
138
124
  - !ruby/object:Gem::Version
139
125
  version: '0'
140
126
  - !ruby/object:Gem::Dependency
141
- name: yard
127
+ name: rake
142
128
  requirement: !ruby/object:Gem::Requirement
143
129
  requirements:
144
130
  - - ">="
@@ -152,7 +138,7 @@ dependencies:
152
138
  - !ruby/object:Gem::Version
153
139
  version: '0'
154
140
  - !ruby/object:Gem::Dependency
155
- name: RedCloth
141
+ name: test-unit
156
142
  requirement: !ruby/object:Gem::Requirement
157
143
  requirements:
158
144
  - - ">="
@@ -166,7 +152,7 @@ dependencies:
166
152
  - !ruby/object:Gem::Version
167
153
  version: '0'
168
154
  - !ruby/object:Gem::Dependency
169
- name: packnga
155
+ name: yard
170
156
  requirement: !ruby/object:Gem::Requirement
171
157
  requirements:
172
158
  - - ">="
@@ -196,16 +182,15 @@ files:
196
182
  - COPYING
197
183
  - Gemfile
198
184
  - LICENSE
199
- - README.textile
200
185
  - TODO
201
186
  - benchmark/README.md
202
187
  - benchmark/bench-backend.rb
203
188
  - benchmark/bench-instantiate.rb
204
189
  - benchmark/config.yaml.sample
205
- - doc/text/development.textile
206
- - doc/text/news.textile
207
- - doc/text/rails.textile
208
- - doc/text/tutorial.textile
190
+ - doc/text/development.md
191
+ - doc/text/news.md
192
+ - doc/text/rails.md
193
+ - doc/text/tutorial.md
209
194
  - examples/config.yaml.example
210
195
  - examples/example.der
211
196
  - examples/example.jpg
@@ -294,6 +279,7 @@ files:
294
279
  - test/al-test-utils.rb
295
280
  - test/command.rb
296
281
  - test/config.yaml.sample
282
+ - test/enable-dynamic-groups.ldif
297
283
  - test/enable-start-tls.ldif
298
284
  - test/fixtures/lower_case_object_class_schema.rb
299
285
  - test/run-test.rb
@@ -359,8 +345,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
359
345
  - !ruby/object:Gem::Version
360
346
  version: '0'
361
347
  requirements: []
362
- rubyforge_project: ruby-activeldap
363
- rubygems_version: 2.7.6
348
+ rubygems_version: 3.2.0.rc.1
364
349
  signing_key:
365
350
  specification_version: 4
366
351
  summary: ActiveLdap is a object-oriented API to LDAP
@@ -369,6 +354,7 @@ test_files:
369
354
  - test/al-test-utils.rb
370
355
  - test/command.rb
371
356
  - test/config.yaml.sample
357
+ - test/enable-dynamic-groups.ldif
372
358
  - test/enable-start-tls.ldif
373
359
  - test/fixtures/lower_case_object_class_schema.rb
374
360
  - test/run-test.rb