activeldap 4.0.1 → 4.0.2

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b4ef32fb85ed5c2137308ba532b8f99650160a13
4
+ data.tar.gz: 7f8dcf79cc1f7a9429b4ed2806c4128054780ec3
5
+ SHA512:
6
+ metadata.gz: e8210af85a2630ad646f7384290ce3b2d87652564c043e3f899083758c003daffc39c5fa3df5f92d3cb312e670736dfa0a6bcef51583a82658f83dd376d80bf5
7
+ data.tar.gz: f43645ddd1c12fd63ee4b898b9eb3175d21bbfc84d4d96077f29f4edb40141ef16dc6650556bfe930f1d44aa0502a70575a253dd7c0ec70199cbc370bc44821b
data/Gemfile CHANGED
@@ -6,7 +6,7 @@ gemspec
6
6
 
7
7
  group :test do
8
8
  gem "net-ldap"
9
- platforms :mri_18, :mri_19 do
9
+ platforms :mri do
10
10
  gem "ruby-ldap"
11
11
  end
12
12
  platforms :jruby do
@@ -45,7 +45,8 @@ h2. Notes
45
45
 
46
46
  h2. Rails
47
47
 
48
- See "Rails":doc/text/rails.textile page for Rails integration.
48
+ See "Rails":file.rails.html ("doc/text/rails.textile":doc/text/rails.textile
49
+ in the repository and on GitHub) page for Rails integration.
49
50
 
50
51
  h2. Licence
51
52
 
@@ -1,5 +1,41 @@
1
1
  h1. News
2
2
 
3
+ h2(#4-0-2). 4.0.2: 2014-01-04
4
+
5
+ h3. Improvements
6
+
7
+ * Supported sub-tree moving by all adapters.
8
+ * Used YARD style link in documentation. [Reported by Fraser McCrossan]
9
+ * Supported Object-Security-Descriptor (OID: 1.2.840.113556.1.4.907)
10
+ [GitHub:#66] [Reported by Nowhere Man]
11
+ * Made JEPG syntax binary.
12
+ * Supported binary encoding for values in a container.
13
+ [GitHub:#66] [Reported by Nowhere Man]
14
+ * Added documentation about @:filter@ option of {ActiveLdap::Base.find}
15
+ into tutorial.
16
+ [GitHub:#72] [Patch by Fernando Martinez]
17
+ * Migrated to gettext gem from gettext_i18n_rails gem because ActiveLdap
18
+ dosen't use any gettext_i18n_rails gem features..
19
+ [activeldap-discuss] [Reported by Christian Nennemann]
20
+ * Supported retry on timeout on JNDI adapter.
21
+ [GitHub:#77] [Patch by Ryosuke Yamazaki]
22
+
23
+ h3. Fixes
24
+
25
+ * Removed needless newlines generated by @pack("m")@.
26
+ [GitHub:#75] [GitHub:#76] [Patch by Ryosuke Yamazaki]
27
+ * Fixed a bug that @after_initialize@ isn't run.
28
+ [GitHub:#79] [Patch by Nobutaka OSHIRO]
29
+
30
+ h3. Thanks
31
+
32
+ * Fraser McCrossan
33
+ * Nowhere Man
34
+ * Fernando Martinez
35
+ * Christian Nennemann
36
+ * Ryosuke Yamazaki
37
+ * Nobutaka OSHIRO
38
+
3
39
  h2(#4-0-1). 4.0.1: 2013-08-29
4
40
 
5
41
  h3. Improvements
@@ -49,6 +85,7 @@ h3. Improvements
49
85
  [Patch by superscott]
50
86
  * [GitHub:#63] Handled Errno::ECONNRESET as connection in
51
87
  net-ldap adapter [Patch by mpoornima]
88
+
52
89
  h3. Fixes
53
90
 
54
91
  * [GitHub:#44] Fixed a typo in document.
@@ -403,6 +403,30 @@ If :attribute is unspecified, it defaults to the dn_attribute.
403
403
  It is also possible to override :attribute and :value by specifying :filter. This
404
404
  argument allows the direct specification of a LDAP filter to retrieve objects by.
405
405
 
406
+ h5. Using the :filter option
407
+
408
+ The filter option lets you pass in an LDAP query string.
409
+ For example retrieving all groups with cn which starts with @'dev'@ and has @guid@ == 1:
410
+
411
+ <pre>
412
+ irb> Group.find(:all, :filter => '(&(cn=dev*)(guid=1))').collect {|group| group.cn}
413
+ => ["develop"]
414
+ </pre>
415
+
416
+ It also allows a hash like sintax (sparing you the need to write the query by hand ):
417
+
418
+ <pre>
419
+ irb> Group.find(:all, :filter => {:cn => 'dev*', :guid => 1 }).collect {|group| group.cn}
420
+ => ["develop", "developers", "sys", "sysadmin"]
421
+ </pre>
422
+
423
+ You can build complex queries combining the hash syntax with arrays and @:or@ and @:and@ operators retrieving all users whose name contains 'john' or cn ends with 'smith' or contains 'liz'
424
+
425
+ <pre>
426
+ irb> User.find(:all, filter: [:or, [:or, { :cn => '*smith', :name => '*john*'} ], { cn: '*liz*' }]).collect(&:cn)
427
+ => ['john.smith', 'jane.smith', 'john tha ripper', 'liz.taylor', ...]
428
+ </pre>
429
+
406
430
  h4. .search
407
431
 
408
432
  .search is a class method that is accessible from any subclass of Base, and Base.
@@ -317,7 +317,8 @@ module ActiveLdap
317
317
  do_in_timeout(@timeout, &block)
318
318
  rescue Timeout::Error => e
319
319
  @logger.error {_('Requested action timed out.')}
320
- if @retry_on_timeout and retry_limit < 0 and n_retries <= retry_limit
320
+ if @retry_on_timeout and (retry_limit < 0 or n_retries <= retry_limit)
321
+ n_retries += 1
321
322
  if connecting?
322
323
  retry
323
324
  elsif try_reconnect
@@ -23,7 +23,7 @@ module ActiveLdap
23
23
  uri = construct_uri(host, port, method == :ssl)
24
24
  with_start_tls = method == :start_tls
25
25
  info = {:uri => uri, :with_start_tls => with_start_tls}
26
- [log("connect", info) {JndiConnection.new(host, port, method)},
26
+ [log("connect", info) {JndiConnection.new(host, port, method, @timeout)},
27
27
  uri, with_start_tls]
28
28
  end
29
29
  end
@@ -93,7 +93,9 @@ module ActiveLdap
93
93
  def execute(method, info=nil, *args, &block)
94
94
  name = (info || {}).delete(:name) || method
95
95
  log(name, info) {@connection.send(method, *args, &block)}
96
- rescue JndiConnection::CommunicationException => e
96
+ rescue JndiConnection::CommunicationException, JndiConnection::ServiceUnavailableException => e
97
+ disconnect! if connecting?
98
+
97
99
  raise ActiveLdap::ConnectionError.new(e.getMessage())
98
100
  rescue JndiConnection::NamingException
99
101
  if /\[LDAP: error code (\d+) - ([^\]]+)\]/ =~ $!.to_s
@@ -101,7 +103,12 @@ module ActiveLdap
101
103
  klass = LdapError::ERRORS[Integer($1)]
102
104
  klass ||= ActiveLdap::LdapError
103
105
  raise klass, message
106
+ elsif /LDAP response read timed out/ =~ $!.to_s
107
+ disconnect! if connecting?
108
+
109
+ raise Timeout::Error.new($!.to_s)
104
110
  end
111
+
105
112
  raise
106
113
  end
107
114
 
@@ -27,6 +27,7 @@ module ActiveLdap
27
27
  Control = ldap.Control
28
28
 
29
29
  CommunicationException = naming.CommunicationException
30
+ ServiceUnavailableException = naming.ServiceUnavailableException
30
31
  NamingException = naming.NamingException
31
32
  NameNotFoundException = naming.NameNotFoundException
32
33
 
@@ -72,10 +73,11 @@ module ActiveLdap
72
73
  end
73
74
  end
74
75
 
75
- def initialize(host, port, method)
76
+ def initialize(host, port, method, timeout)
76
77
  @host = host
77
78
  @port = port
78
79
  @method = method
80
+ @timeout = timeout
79
81
  @context = nil
80
82
  @tls = nil
81
83
  end
@@ -158,6 +160,8 @@ module ActiveLdap
158
160
  environment = {
159
161
  Context::INITIAL_CONTEXT_FACTORY => "com.sun.jndi.ldap.LdapCtxFactory",
160
162
  Context::PROVIDER_URL => ldap_uri,
163
+ 'com.sun.jndi.ldap.connect.timeout' => (@timeout * 1000).to_i.to_s,
164
+ 'com.sun.jndi.ldap.read.timeout' => (@timeout * 1000).to_i.to_s,
161
165
  }
162
166
  environment = HashTable.new(environment)
163
167
  context = InitialLdapContext.new(environment, nil)
@@ -689,6 +689,7 @@ module ActiveLdap
689
689
  raise ArgumentError, format % attributes.inspect
690
690
  end
691
691
  yield self if block_given?
692
+ run_callbacks :initialize unless _initialize_callbacks.empty?
692
693
  end
693
694
 
694
695
  # Returns true if the +comparison_object+ is the same object, or is of
@@ -42,10 +42,6 @@ module ActiveLdap
42
42
  end
43
43
  end
44
44
 
45
- def initialize(*) #:nodoc:
46
- run_callbacks(:initialize) { super }
47
- end
48
-
49
45
  def destroy #:nodoc:
50
46
  run_callbacks(:destroy) { super }
51
47
  end
@@ -70,7 +70,7 @@ module ActiveLdap
70
70
  if old_dn_base == new_dn_base
71
71
  new_superior = nil
72
72
  else
73
- new_superior = new_dn_base
73
+ new_superior = new_dn_base.to_s
74
74
  end
75
75
  modify_rdn_entry(@original_dn,
76
76
  "#{dn_attribute}=#{DN.escape_value(new_dn_value)}",
@@ -424,6 +424,26 @@ module ActiveLdap
424
424
  @binary
425
425
  end
426
426
 
427
+ # Sets binary encoding to value if the given attribute's syntax
428
+ # is binary syntax. Does nothing otherwise.
429
+ # @return [void]
430
+ def apply_encoding(value)
431
+ return unless binary?
432
+ case value
433
+ when Hash
434
+ value.each_value do |sub_value|
435
+ apply_encoding(sub_value)
436
+ end
437
+ when Array
438
+ value.each do |sub_value|
439
+ apply_encoding(sub_value)
440
+ end
441
+ else
442
+ return unless value.respond_to?(:force_encoding)
443
+ value.force_encoding("ASCII-8BIT")
444
+ end
445
+ end
446
+
427
447
  # binary_required?
428
448
  #
429
449
  # Returns true if the value MUST be transferred in binary
@@ -278,6 +278,10 @@ module ActiveLdap
278
278
  class JPEG < Base
279
279
  SYNTAXES["1.3.6.1.4.1.1466.115.121.1.28"] = self
280
280
 
281
+ def binary?
282
+ true
283
+ end
284
+
281
285
  private
282
286
  def validate_normalized_value(value, original_value)
283
287
  if value.unpack("n")[0] == 0xffd8
@@ -429,6 +433,17 @@ module ActiveLdap
429
433
  super
430
434
  end
431
435
  end
436
+
437
+ class ObjectSecurityDescriptor < OctetString
438
+ # @see http://tools.ietf.org/html/draft-armijo-ldap-syntax-00
439
+ # Object-Security-Descriptor: 1.2.840.113556.1.4.907
440
+ #
441
+ # Encoded as an Octet-String (OID 1.3.6.1.4.1.1466.115.121.1.40)
442
+ #
443
+ # @see http://msdn.microsoft.com/en-us/library/cc223229.aspx
444
+ # String(NT-Sec-Desc) 1.2.840.113556.1.4.907
445
+ SYNTAXES["1.2.840.113556.1.4.907"] = self
446
+ end
432
447
  end
433
448
  end
434
449
  end
@@ -54,7 +54,7 @@ module ActiveLdap
54
54
  end
55
55
  salt ||= Salt.generate(4)
56
56
  md5_hash_with_salt = "#{Digest::MD5.digest(password + salt)}#{salt}"
57
- "{SMD5}#{[md5_hash_with_salt].pack('m').chomp}"
57
+ "{SMD5}#{[md5_hash_with_salt].pack('m').gsub("\n", '')}"
58
58
  end
59
59
 
60
60
  def extract_salt_for_smd5(smd5ed_password)
@@ -71,7 +71,7 @@ module ActiveLdap
71
71
  end
72
72
  salt ||= Salt.generate(4)
73
73
  sha1_hash_with_salt = "#{Digest::SHA1.digest(password + salt)}#{salt}"
74
- "{SSHA}#{[sha1_hash_with_salt].pack('m').chomp}"
74
+ "{SSHA}#{[sha1_hash_with_salt].pack('m').gsub("\n", '')}"
75
75
  end
76
76
 
77
77
  def extract_salt_for_ssha(sshaed_password)
@@ -172,9 +172,7 @@ module ActiveLdap
172
172
  entry_attribute.schemata.each do |name, attribute|
173
173
  value = self[name]
174
174
  # Is it really proper location for setting encoding?
175
- if attribute.binary? and value.respond_to?(:force_encoding)
176
- value.force_encoding("ASCII-8BIT")
177
- end
175
+ attribute.apply_encoding(value)
178
176
  next if self.class.blank_value?(value)
179
177
  validate_ldap_value(attribute, name, value)
180
178
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveLdap
2
- VERSION = "4.0.1"
2
+ VERSION = "4.0.2"
3
3
  end
@@ -90,22 +90,15 @@ class TestBase < Test::Unit::TestCase
90
90
  make_ou("sub,ou=users")
91
91
  make_temporary_user(:simple => true) do |user,|
92
92
  user.id = "user2,ou=sub,#{@user_class.base}"
93
- case user.connection.class.to_s.demodulize
94
- when "Jndi"
95
- assert_true(user.save)
93
+ assert_true(user.save)
96
94
 
97
- found_user = nil
98
- assert_nothing_raised do
99
- found_user = @user_class.find("user2")
100
- end
101
- base = @user_class.base
102
- assert_equal("#{@user_class.dn_attribute}=user2,ou=sub,#{base}",
103
- found_user.dn.to_s)
104
- else
105
- assert_raise(ActiveLdap::NotImplemented) do
106
- user.save
107
- end
95
+ found_user = nil
96
+ assert_nothing_raised do
97
+ found_user = @user_class.find("user2")
108
98
  end
99
+ base = @user_class.base
100
+ assert_equal("#{@user_class.dn_attribute}=user2,ou=sub,#{base}",
101
+ found_user.dn.to_s)
109
102
  end
110
103
  end
111
104
 
@@ -4,9 +4,21 @@ class TestCallback < Test::Unit::TestCase
4
4
  include AlTestUtils
5
5
 
6
6
  priority :must
7
+ def test_new
8
+ initialized_entries = []
9
+ @group_class.instance_variable_set("@initialized_entries",
10
+ initialized_entries)
11
+ @group_class.module_eval do
12
+ after_initialize "self.class.instance_variable_get('@initialized_entries') << self"
13
+ end
14
+ assert_equal([], initialized_entries)
15
+ new_group = @group_class.new(:cn => "new-cn")
16
+ assert_equal([new_group.cn].sort,
17
+ initialized_entries.collect {|g| g.cn}.sort)
18
+ end
7
19
 
8
20
  priority :normal
9
- def test_callback_after_find_and_after_initialize
21
+ def test_find
10
22
  make_temporary_group do |group|
11
23
  found_entries = []
12
24
  initialized_entries = []
@@ -556,4 +556,77 @@ class TestSchema < Test::Unit::TestCase
556
556
  attribute_hash[:syntax] = syntax.id if syntax
557
557
  assert_equal(expected, attribute_hash)
558
558
  end
559
+
560
+ class TestAttribute < self
561
+ class TestApplyEncoding < self
562
+ class TestNotBinary < self
563
+ def setup
564
+ super
565
+ uid_schema =
566
+ "( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) " +
567
+ "DESC 'RFC1274: user identifier' EQUALITY caseIgnoreMatch " +
568
+ "SUBSTR caseIgnoreSubstringsMatch " +
569
+ "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )"
570
+ entries = {
571
+ "attributeTypes" => [uid_schema],
572
+ }
573
+ schema = ActiveLdap::Schema.new(entries)
574
+ @attribute = schema.attribute("uid")
575
+ end
576
+
577
+ def test_do_nothing
578
+ value = ""
579
+ value.force_encoding("UTF-8")
580
+ @attribute.apply_encoding(value)
581
+ assert_equal(Encoding::UTF_8, value.encoding)
582
+ end
583
+ end
584
+
585
+ class TestBinary < self
586
+ def setup
587
+ super
588
+ jpeg_schema =
589
+ "( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' " +
590
+ "X-NOT-HUMAN-READABLE 'TRUE' )"
591
+ jpeg_photo_schema =
592
+ "( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' " +
593
+ "DESC 'RFC2798: a JPEG image' SYNTAX " +
594
+ "1.3.6.1.4.1.1466.115.121.1.28 )"
595
+ entries = {
596
+ "attributeTypes" => [jpeg_photo_schema],
597
+ "ldapSyntaxes" => [jpeg_schema],
598
+ }
599
+ schema = ActiveLdap::Schema.new(entries)
600
+ @attribute = schema.attribute("jpegPhoto")
601
+ end
602
+
603
+ def test_string
604
+ value = ""
605
+ value.force_encoding("UTF-8")
606
+ @attribute.apply_encoding(value)
607
+ assert_equal(Encoding::ASCII_8BIT, value.encoding)
608
+ end
609
+
610
+ def test_array
611
+ values = [""]
612
+ values.each do |value|
613
+ value.force_encoding("UTF-8")
614
+ end
615
+ @attribute.apply_encoding(values)
616
+ assert_equal([Encoding::ASCII_8BIT],
617
+ values.collect(&:encoding))
618
+ end
619
+
620
+ def test_hash
621
+ values = {:binary => ""}
622
+ values.each_value do |value|
623
+ value.force_encoding("UTF-8")
624
+ end
625
+ @attribute.apply_encoding(values)
626
+ assert_equal([Encoding::ASCII_8BIT],
627
+ values.each_value.collect(&:encoding))
628
+ end
629
+ end
630
+ end
631
+ end
559
632
  end
@@ -10,9 +10,11 @@ class TestUserPassword < Test::Unit::TestCase
10
10
  "{MD5}DRB9CfW75Ayt495ccenptw==" => 'letmein', #MD5
11
11
  "{SMD5}8L2iXJuazftLVHrAf7ptPFQIDaw=" => 'letmein', #SMD5 as generated by slappasswd (4 bytes of salt)
12
12
  "{SMD5}kXibTNG+O98gaQtkugYcmSTiE+M2Z5TA" => 'letmein', #SMD5 as generated by Apache Directory Studio (8 bytes of salt)
13
+ "{SMD5}4PkkYH5qI6ydk/9pwvZD3DYwYzVlMzVlLTBkZDEtNGJhMi05NjI5LWRlODgyMDhiMWZmYQ==" => 'letmein', #SMD5 generated with 36 bytes of salt
13
14
  "{SHA}t6h1/B6iKLkGEEG3zsS9PFKrPOM=" => 'letmein', #SHA
14
15
  "{SSHA}YA87hc9/L/cCGR1HValcJb7a8AYxZXY4" => 'wibble', # SSHA as generated by slappasswd (4 bytes of salt)
15
16
  "{SSHA}6J6Ios3l1panY9sm0+g9l3/jFz2kwOPrVA4+OA==" => 'letmein', # SSHA as generated by Apache Directory Studio (8 bytes of salt)
17
+ "{SSHA}f/j1unqoJg1C1zjw8tvxSp4xpow2MGM1ZTM1ZS0wZGQxLTRiYTItOTYyOS1kZTg4MjA4YjFmZmE=" => 'letmein', #SSHA generated with 36 bytes of salt
16
18
  "letmein" => 'letmein', #Cleartext password
17
19
  }.each do |hash, plain|
18
20
  assert_send([ActiveLdap::UserPassword, :valid?,
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activeldap
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.1
5
- prerelease:
4
+ version: 4.0.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Will Drewry
@@ -10,12 +9,11 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-08-29 00:00:00.000000000 Z
12
+ date: 2014-01-04 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: activemodel
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
18
  - - ~>
21
19
  - !ruby/object:Gem::Version
@@ -23,7 +21,6 @@ dependencies:
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
25
  - - ~>
29
26
  - !ruby/object:Gem::Version
@@ -31,167 +28,149 @@ dependencies:
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: locale
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
- - - ! '>='
32
+ - - '>='
37
33
  - !ruby/object:Gem::Version
38
34
  version: '0'
39
35
  type: :runtime
40
36
  prerelease: false
41
37
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
38
  requirements:
44
- - - ! '>='
39
+ - - '>='
45
40
  - !ruby/object:Gem::Version
46
41
  version: '0'
47
42
  - !ruby/object:Gem::Dependency
48
43
  name: gettext
49
44
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
45
  requirements:
52
- - - ! '>='
46
+ - - '>='
53
47
  - !ruby/object:Gem::Version
54
48
  version: '0'
55
49
  type: :runtime
56
50
  prerelease: false
57
51
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
52
  requirements:
60
- - - ! '>='
53
+ - - '>='
61
54
  - !ruby/object:Gem::Version
62
55
  version: '0'
63
56
  - !ruby/object:Gem::Dependency
64
57
  name: gettext_i18n_rails
65
58
  requirement: !ruby/object:Gem::Requirement
66
- none: false
67
59
  requirements:
68
- - - ! '>='
60
+ - - '>='
69
61
  - !ruby/object:Gem::Version
70
62
  version: '0'
71
63
  type: :runtime
72
64
  prerelease: false
73
65
  version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
66
  requirements:
76
- - - ! '>='
67
+ - - '>='
77
68
  - !ruby/object:Gem::Version
78
69
  version: '0'
79
70
  - !ruby/object:Gem::Dependency
80
71
  name: bundler
81
72
  requirement: !ruby/object:Gem::Requirement
82
- none: false
83
73
  requirements:
84
- - - ! '>='
74
+ - - '>='
85
75
  - !ruby/object:Gem::Version
86
76
  version: '0'
87
77
  type: :development
88
78
  prerelease: false
89
79
  version_requirements: !ruby/object:Gem::Requirement
90
- none: false
91
80
  requirements:
92
- - - ! '>='
81
+ - - '>='
93
82
  - !ruby/object:Gem::Version
94
83
  version: '0'
95
84
  - !ruby/object:Gem::Dependency
96
85
  name: rake
97
86
  requirement: !ruby/object:Gem::Requirement
98
- none: false
99
87
  requirements:
100
- - - ! '>='
88
+ - - '>='
101
89
  - !ruby/object:Gem::Version
102
90
  version: '0'
103
91
  type: :development
104
92
  prerelease: false
105
93
  version_requirements: !ruby/object:Gem::Requirement
106
- none: false
107
94
  requirements:
108
- - - ! '>='
95
+ - - '>='
109
96
  - !ruby/object:Gem::Version
110
97
  version: '0'
111
98
  - !ruby/object:Gem::Dependency
112
99
  name: test-unit
113
100
  requirement: !ruby/object:Gem::Requirement
114
- none: false
115
101
  requirements:
116
- - - ! '>='
102
+ - - '>='
117
103
  - !ruby/object:Gem::Version
118
104
  version: '0'
119
105
  type: :development
120
106
  prerelease: false
121
107
  version_requirements: !ruby/object:Gem::Requirement
122
- none: false
123
108
  requirements:
124
- - - ! '>='
109
+ - - '>='
125
110
  - !ruby/object:Gem::Version
126
111
  version: '0'
127
112
  - !ruby/object:Gem::Dependency
128
113
  name: test-unit-notify
129
114
  requirement: !ruby/object:Gem::Requirement
130
- none: false
131
115
  requirements:
132
- - - ! '>='
116
+ - - '>='
133
117
  - !ruby/object:Gem::Version
134
118
  version: '0'
135
119
  type: :development
136
120
  prerelease: false
137
121
  version_requirements: !ruby/object:Gem::Requirement
138
- none: false
139
122
  requirements:
140
- - - ! '>='
123
+ - - '>='
141
124
  - !ruby/object:Gem::Version
142
125
  version: '0'
143
126
  - !ruby/object:Gem::Dependency
144
127
  name: yard
145
128
  requirement: !ruby/object:Gem::Requirement
146
- none: false
147
129
  requirements:
148
- - - ! '>='
130
+ - - '>='
149
131
  - !ruby/object:Gem::Version
150
132
  version: '0'
151
133
  type: :development
152
134
  prerelease: false
153
135
  version_requirements: !ruby/object:Gem::Requirement
154
- none: false
155
136
  requirements:
156
- - - ! '>='
137
+ - - '>='
157
138
  - !ruby/object:Gem::Version
158
139
  version: '0'
159
140
  - !ruby/object:Gem::Dependency
160
141
  name: RedCloth
161
142
  requirement: !ruby/object:Gem::Requirement
162
- none: false
163
143
  requirements:
164
- - - ! '>='
144
+ - - '>='
165
145
  - !ruby/object:Gem::Version
166
146
  version: '0'
167
147
  type: :development
168
148
  prerelease: false
169
149
  version_requirements: !ruby/object:Gem::Requirement
170
- none: false
171
150
  requirements:
172
- - - ! '>='
151
+ - - '>='
173
152
  - !ruby/object:Gem::Version
174
153
  version: '0'
175
154
  - !ruby/object:Gem::Dependency
176
155
  name: packnga
177
156
  requirement: !ruby/object:Gem::Requirement
178
- none: false
179
157
  requirements:
180
- - - ! '>='
158
+ - - '>='
181
159
  - !ruby/object:Gem::Version
182
160
  version: '0'
183
161
  type: :development
184
162
  prerelease: false
185
163
  version_requirements: !ruby/object:Gem::Requirement
186
- none: false
187
164
  requirements:
188
- - - ! '>='
165
+ - - '>='
189
166
  - !ruby/object:Gem::Version
190
167
  version: '0'
191
- description: ! " 'ActiveLdap' is a ruby library which provides a clean\n objected
192
- oriented interface to the Ruby/LDAP library. It was inspired\n by ActiveRecord.
193
- This is not nearly as clean or as flexible as\n ActiveRecord, but it is still
194
- trivial to define new objects and manipulate\n them with minimal difficulty.\n"
168
+ description: |2
169
+ 'ActiveLdap' is a ruby library which provides a clean
170
+ objected oriented interface to the Ruby/LDAP library. It was inspired
171
+ by ActiveRecord. This is not nearly as clean or as flexible as
172
+ ActiveRecord, but it is still trivial to define new objects and manipulate
173
+ them with minimal difficulty.
195
174
  email:
196
175
  - redpig@dataspill.org
197
176
  - kou@cozmixng.org
@@ -347,34 +326,28 @@ files:
347
326
  - test/test_validation.rb
348
327
  homepage: http://ruby-activeldap.rubyforge.org/
349
328
  licenses:
350
- - Ruby's or GPLv2 or later
329
+ - Ruby's
330
+ - GPLv2 or later
331
+ metadata: {}
351
332
  post_install_message:
352
333
  rdoc_options: []
353
334
  require_paths:
354
335
  - lib
355
336
  required_ruby_version: !ruby/object:Gem::Requirement
356
- none: false
357
337
  requirements:
358
- - - ! '>='
338
+ - - '>='
359
339
  - !ruby/object:Gem::Version
360
340
  version: '0'
361
- segments:
362
- - 0
363
- hash: -4556557570349939659
364
341
  required_rubygems_version: !ruby/object:Gem::Requirement
365
- none: false
366
342
  requirements:
367
- - - ! '>='
343
+ - - '>='
368
344
  - !ruby/object:Gem::Version
369
345
  version: '0'
370
- segments:
371
- - 0
372
- hash: -4556557570349939659
373
346
  requirements: []
374
347
  rubyforge_project: ruby-activeldap
375
- rubygems_version: 1.8.23
348
+ rubygems_version: 2.0.14
376
349
  signing_key:
377
- specification_version: 3
350
+ specification_version: 4
378
351
  summary: ActiveLdap is a object-oriented API to LDAP
379
352
  test_files:
380
353
  - test/add-phonetic-attribute-options-to-slapd.ldif