activeldap 4.0.1 → 4.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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