net-ldap 0.16.3 → 0.19.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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +59 -0
  3. data/README.rdoc +10 -3
  4. data/lib/net/ldap/connection.rb +18 -10
  5. data/lib/net/ldap/dataset.rb +0 -2
  6. data/lib/net/ldap/dn.rb +9 -17
  7. data/lib/net/ldap/entry.rb +11 -2
  8. data/lib/net/ldap/error.rb +1 -26
  9. data/lib/net/ldap/password.rb +4 -0
  10. data/lib/net/ldap/version.rb +1 -1
  11. data/lib/net/ldap.rb +28 -3
  12. metadata +17 -93
  13. data/.gitignore +0 -10
  14. data/.rubocop.yml +0 -20
  15. data/.rubocop_todo.yml +0 -723
  16. data/.travis.yml +0 -57
  17. data/CONTRIBUTING.md +0 -54
  18. data/Gemfile +0 -2
  19. data/Rakefile +0 -23
  20. data/net-ldap.gemspec +0 -37
  21. data/script/changelog +0 -47
  22. data/script/ldap-docker +0 -12
  23. data/script/package +0 -7
  24. data/script/release +0 -16
  25. data/test/ber/core_ext/test_array.rb +0 -22
  26. data/test/ber/core_ext/test_string.rb +0 -25
  27. data/test/ber/test_ber.rb +0 -153
  28. data/test/fixtures/ca/docker-ca.pem +0 -18
  29. data/test/fixtures/ldif/06-retcode.ldif +0 -75
  30. data/test/fixtures/ldif/50-seed.ldif +0 -374
  31. data/test/integration/test_add.rb +0 -26
  32. data/test/integration/test_ber.rb +0 -30
  33. data/test/integration/test_bind.rb +0 -221
  34. data/test/integration/test_delete.rb +0 -29
  35. data/test/integration/test_open.rb +0 -87
  36. data/test/integration/test_password_modify.rb +0 -93
  37. data/test/integration/test_return_codes.rb +0 -46
  38. data/test/integration/test_search.rb +0 -77
  39. data/test/support/vm/openldap/.gitignore +0 -1
  40. data/test/test_auth_adapter.rb +0 -15
  41. data/test/test_dn.rb +0 -43
  42. data/test/test_entry.rb +0 -66
  43. data/test/test_filter.rb +0 -223
  44. data/test/test_filter_parser.rb +0 -29
  45. data/test/test_helper.rb +0 -73
  46. data/test/test_ldap.rb +0 -114
  47. data/test/test_ldap_connection.rb +0 -505
  48. data/test/test_ldif.rb +0 -104
  49. data/test/test_password.rb +0 -10
  50. data/test/test_rename.rb +0 -77
  51. data/test/test_search.rb +0 -39
  52. data/test/test_snmp.rb +0 -118
  53. data/test/test_ssl_ber.rb +0 -44
  54. data/test/testdata.ldif +0 -101
  55. data/testserver/ldapserver.rb +0 -200
  56. data/testserver/testdata.ldif +0 -101
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b993fcb063f53718741afa8b8b8a504bdadb9310472e31b7e803fc5f8db8d4a
4
- data.tar.gz: 630c0d112dd4d31a980bca4a112d8ccac064901a513ecfd02c39556f3bbe73f7
3
+ metadata.gz: 1fdcc1a3fefe3fb2bf1dbb91ec9e00734252fdda634ae0e2344b9dd6e6b86cd2
4
+ data.tar.gz: 8526bd506b632e74193c80119280fd4b333731b1e3d75791427a12e62cab775a
5
5
  SHA512:
6
- metadata.gz: 4d3879fe70c419c08f9b9638cd39846092c9dd81dc9bff0a8d0e72462b273fda351afaa6946b0a7d43d6c67c221af8b8988962fed5a5a489096a54f84fe2446e
7
- data.tar.gz: 18c4a8b2a05541800bbbe869f0f4ca498a4e2f46e41ec2cabc9e0506e10e74d569c6664d8c32e6160b1bb1a02eedff329c50f6c02eae9b0c92d63a503d08189b
6
+ metadata.gz: e2f9e53240eeedd964463c6bc719cc86e57e5a66c5a769371e16d97005f9b63933797f33384e0192b6e128cc4fec1de46e3cca2886fce963439d86b4b3c0665f
7
+ data.tar.gz: e4af635dce612600ba48a110ebae1d3c30c00f9c5adcfeba1b6eca1d4d760646674d399cac256f96490bcad6d884146cb891ac14d57f8734556ed7e331baac90
data/History.rdoc CHANGED
@@ -1,3 +1,62 @@
1
+ === Net::LDAP 0.19.0
2
+ * Net::LDAP::DN - Retain trailing spaces in RDN values in DNs #412
3
+ * Add in ability for users to specify LDAP controls when conducting searches #411
4
+ * Document connect_timeout in Constructor Details #415
5
+ * Fix openssl error when using multiple hosts #417
6
+
7
+ === Net::LDAP 0.18.0
8
+ * Fix escaping of # and space in attrs #408
9
+ * Add support to use SNI #406
10
+ * Drop Ruby 2.5 and JRuby 9.2 from CI tests
11
+ * Bump rubocop to 1.48.1
12
+ * Update CI for TruffleRuby 22
13
+
14
+ === Net::LDAP 0.17.1
15
+ * Fixed shebang of bash #385
16
+ * Omit some tests for now until we update our CA cert #386
17
+ * Add Ruby 3.0 support #388
18
+ * Add TruffleRuby 21.0.0 to CI #389
19
+ * Correct a typo in an error message #391
20
+ * Enable bundler caching for travis #390
21
+ * Fix circular require while loading lib/net/ldap/entry.rb and lib/net/ldap/dataset.rb #392
22
+ * Handle nil value in GetbyteForSSLSocket::getbyte #306
23
+
24
+ === Net::LDAP 0.17.0
25
+ * Added private recursive_delete as alternative to DELETE_TREE #268
26
+ * Test suite updates #373 #376 #377
27
+ * Use Base64.strict_encode64 and SSHA256 #303
28
+ * Remove deprecated ConnectionRefusedError #366
29
+ * Added method to get a duplicate of the internal Hash #286
30
+ * remove a circular require #380
31
+ * fix LdapServerAsnSyntax compile #379
32
+ * Implement '==' operator for entries #381
33
+ * fix for undefined method for write exception #383
34
+
35
+ === Net::LDAP 0.16.3
36
+
37
+ * Add Net::LDAP::InvalidDNError #371
38
+ * Use require_relative instead of require #360
39
+ * Address some warnings and fix JRuby test omissions #365
40
+ * Bump rake dev dependency to 12.3 #359
41
+ * Enable rubocop in ci #251
42
+ * Enhance rubocop configuration and test syntax #344
43
+ * CI: Drop rbx-2, uninstallable #364
44
+ * Fix RuboCop warnings #312
45
+ * Fix wrong error class #305
46
+ * CONTRIBUTING.md: Repair link to Issues #309
47
+ * Make the generate() method more idiomatic... #326
48
+ * Make encode_sort_controls() more idiomatic... #327
49
+ * Make the instrument() method more idiomatic... #328
50
+ * Fix uninitialised Net::LDAP::LdapPduError #338
51
+ * README.rdoc: Use SVG build badge #310
52
+ * Update TravisCI config to inclue Ruby 2.7 #346
53
+ * add explicit ** to silence Ruby 2.7 warning #342
54
+ * Support parsing filters with attribute tags #345
55
+ * Bump rubocop development dependency version #336
56
+ * Add link to generated and hosted documentation on rubydoc #319
57
+ * Fix 'uninitialized constant Net::LDAP::PDU::LdapPduError' error #317
58
+ * simplify encoding logic: no more chomping required #362
59
+
1
60
  === Net::LDAP 0.16.2
2
61
 
3
62
  * Net::LDAP#open does not cache bind result {#334}[https://github.com/ruby-ldap/ruby-net-ldap/pull/334]
data/README.rdoc CHANGED
@@ -1,4 +1,6 @@
1
- = Net::LDAP for Ruby {<img src="https://travis-ci.org/ruby-ldap/ruby-net-ldap.svg" />}[https://travis-ci.org/ruby-ldap/ruby-net-ldap]
1
+ = Net::LDAP for Ruby
2
+ {<img src="https://badge.fury.io/rb/net-ldap.svg" alt="Gem Version" />}[https://badge.fury.io/rb/net-ldap]
3
+ {<img src="https://travis-ci.org/ruby-ldap/ruby-net-ldap.svg" />}[https://travis-ci.org/ruby-ldap/ruby-net-ldap]
2
4
 
3
5
  == Description
4
6
 
@@ -21,7 +23,7 @@ the most recent LDAP RFCs (4510–4519, plus portions of 4520–4532).
21
23
 
22
24
  == Synopsis
23
25
 
24
- See {Net::LDAP on rubydoc.info}[https://www.rubydoc.info/gems/net-ldap/Net/LDAP] for documentation and usage samples.
26
+ See {Net::LDAP on rubydoc.info}[https://www.rubydoc.info/github/ruby-ldap/ruby-net-ldap] for documentation and usage samples.
25
27
 
26
28
  == Requirements
27
29
 
@@ -58,16 +60,21 @@ Simply run:
58
60
 
59
61
  script/ldap-docker
60
62
  INTEGRATION=openldap rake test
63
+
64
+ Or, use {Docker Compose}[https://docs.docker.com/compose/]. See docker-compose.yml for available Ruby versions.
65
+
66
+ docker-compose run ci-2.7
61
67
 
62
68
  CAVEAT: you need to add the following line to /etc/hosts
63
69
  127.0.0.1 ldap.example.org
70
+ 127.0.0.1 cert.mismatch.example.org
64
71
 
65
72
  == Release
66
73
 
67
74
  This section is for gem maintainers to cut a new version of the gem.
68
75
 
69
76
  * Check out a new branch `release-VERSION`
70
- * Update lib/net/ldap/version.rb to next version number X.X.X following {semver}(http://semver.org/).
77
+ * Update lib/net/ldap/version.rb to next version number X.X.X following {semver}[http://semver.org/].
71
78
  * Update `History.rdoc`. Get latest changes with `script/changelog`
72
79
  * Open a pull request with these changes for review
73
80
  * After merging, on the master branch, run `script/release`
@@ -30,12 +30,12 @@ class Net::LDAP::Connection #:nodoc:
30
30
  @socket_class = socket_class
31
31
  end
32
32
 
33
- def prepare_socket(server, timeout=nil)
33
+ def prepare_socket(server, timeout=nil, hostname='127.0.0.1')
34
34
  socket = server[:socket]
35
35
  encryption = server[:encryption]
36
36
 
37
37
  @conn = socket
38
- setup_encryption(encryption, timeout) if encryption
38
+ setup_encryption(encryption, timeout, hostname) if encryption
39
39
  end
40
40
 
41
41
  def open_connection(server)
@@ -50,7 +50,7 @@ class Net::LDAP::Connection #:nodoc:
50
50
  errors = []
51
51
  hosts.each do |host, port|
52
52
  begin
53
- prepare_socket(server.merge(socket: @socket_class.new(host, port, socket_opts)), timeout)
53
+ prepare_socket(server.merge(socket: @socket_class.new(host, port, socket_opts)), timeout, host)
54
54
  if encryption
55
55
  if encryption[:tls_options] &&
56
56
  encryption[:tls_options][:verify_mode] &&
@@ -74,7 +74,8 @@ class Net::LDAP::Connection #:nodoc:
74
74
 
75
75
  module GetbyteForSSLSocket
76
76
  def getbyte
77
- getc.ord
77
+ c = getc
78
+ c && c.ord
78
79
  end
79
80
  end
80
81
 
@@ -85,7 +86,7 @@ class Net::LDAP::Connection #:nodoc:
85
86
  end
86
87
  end
87
88
 
88
- def self.wrap_with_ssl(io, tls_options = {}, timeout=nil)
89
+ def self.wrap_with_ssl(io, tls_options = {}, timeout=nil, hostname=nil)
89
90
  raise Net::LDAP::NoOpenSSLError, "OpenSSL is unavailable" unless Net::LDAP::HasOpenSSL
90
91
 
91
92
  ctx = OpenSSL::SSL::SSLContext.new
@@ -95,6 +96,7 @@ class Net::LDAP::Connection #:nodoc:
95
96
  ctx.set_params(tls_options) unless tls_options.empty?
96
97
 
97
98
  conn = OpenSSL::SSL::SSLSocket.new(io, ctx)
99
+ conn.hostname = hostname
98
100
 
99
101
  begin
100
102
  if timeout
@@ -147,11 +149,11 @@ class Net::LDAP::Connection #:nodoc:
147
149
  # communications, as with simple_tls. Thanks for Kouhei Sutou for
148
150
  # generously contributing the :start_tls path.
149
151
  #++
150
- def setup_encryption(args, timeout=nil)
152
+ def setup_encryption(args, timeout=nil, hostname=nil)
151
153
  args[:tls_options] ||= {}
152
154
  case args[:method]
153
155
  when :simple_tls
154
- @conn = self.class.wrap_with_ssl(@conn, args[:tls_options], timeout)
156
+ @conn = self.class.wrap_with_ssl(@conn, args[:tls_options], timeout, hostname)
155
157
  # additional branches requiring server validation and peer certs, etc.
156
158
  # go here.
157
159
  when :start_tls
@@ -169,7 +171,7 @@ class Net::LDAP::Connection #:nodoc:
169
171
 
170
172
  raise Net::LDAP::StartTLSError,
171
173
  "start_tls failed: #{pdu.result_code}" unless pdu.result_code.zero?
172
- @conn = self.class.wrap_with_ssl(@conn, args[:tls_options], timeout)
174
+ @conn = self.class.wrap_with_ssl(@conn, args[:tls_options], timeout, hostname)
173
175
  else
174
176
  raise Net::LDAP::EncMethodUnsupportedError, "unsupported encryption method #{args[:method]}"
175
177
  end
@@ -422,6 +424,7 @@ class Net::LDAP::Connection #:nodoc:
422
424
  # this breaks when calling to_ber. (Can't force binary data to UTF-8)
423
425
  # we have to disable paging (even though server supports it) to get around this...
424
426
 
427
+ user_controls = args.fetch(:controls, [])
425
428
  controls = []
426
429
  controls <<
427
430
  [
@@ -431,7 +434,12 @@ class Net::LDAP::Connection #:nodoc:
431
434
  rfc2696_cookie.map(&:to_ber).to_ber_sequence.to_s.to_ber,
432
435
  ].to_ber_sequence if paged
433
436
  controls << ber_sort if ber_sort
434
- controls = controls.empty? ? nil : controls.to_ber_contextspecific(0)
437
+ if controls.empty? && user_controls.empty?
438
+ controls = nil
439
+ else
440
+ controls += user_controls
441
+ controls = controls.to_ber_contextspecific(0)
442
+ end
435
443
 
436
444
  write(request, controls, message_id)
437
445
 
@@ -690,7 +698,7 @@ class Net::LDAP::Connection #:nodoc:
690
698
  #
691
699
  # Typically a TCPSocket, but can be a OpenSSL::SSL::SSLSocket
692
700
  def socket
693
- return @conn if defined? @conn
701
+ return @conn if defined?(@conn) && !@conn.nil?
694
702
 
695
703
  # First refactoring uses the existing methods open_connection and
696
704
  # prepare_socket to set @conn. Next cleanup would centralize connection
@@ -164,5 +164,3 @@ class Net::LDAP::Dataset < Hash
164
164
  end
165
165
  end
166
166
  end
167
-
168
- require_relative 'entry' unless defined? Net::LDAP::Entry
data/lib/net/ldap/dn.rb CHANGED
@@ -81,7 +81,7 @@ class Net::LDAP::DN
81
81
  value << char
82
82
  when ',' then
83
83
  state = :key
84
- yield key.string.strip, value.string.rstrip
84
+ yield key.string.strip, value.string
85
85
  key = StringIO.new
86
86
  value = StringIO.new;
87
87
  else
@@ -93,7 +93,7 @@ class Net::LDAP::DN
93
93
  when '\\' then state = :value_normal_escape
94
94
  when ',' then
95
95
  state = :key
96
- yield key.string.strip, value.string.rstrip
96
+ yield key.string.strip, value.string
97
97
  key = StringIO.new
98
98
  value = StringIO.new;
99
99
  else value << char
@@ -142,7 +142,7 @@ class Net::LDAP::DN
142
142
  when ' ' then state = :value_end
143
143
  when ',' then
144
144
  state = :key
145
- yield key.string.strip, value.string.rstrip
145
+ yield key.string.strip, value.string
146
146
  key = StringIO.new
147
147
  value = StringIO.new;
148
148
  else raise Net::LDAP::InvalidDNError, "DN badly formed"
@@ -159,7 +159,7 @@ class Net::LDAP::DN
159
159
  when ' ' then state = :value_end
160
160
  when ',' then
161
161
  state = :key
162
- yield key.string.strip, value.string.rstrip
162
+ yield key.string.strip, value.string
163
163
  key = StringIO.new
164
164
  value = StringIO.new;
165
165
  else raise Net::LDAP::InvalidDNError, "DN badly formed"
@@ -172,7 +172,7 @@ class Net::LDAP::DN
172
172
  raise Net::LDAP::InvalidDNError, "DN badly formed" unless
173
173
  [:value, :value_normal, :value_hexstring, :value_end].include? state
174
174
 
175
- yield key.string.strip, value.string.rstrip
175
+ yield key.string.strip, value.string
176
176
  end
177
177
 
178
178
  ##
@@ -192,27 +192,19 @@ class Net::LDAP::DN
192
192
  # http://tools.ietf.org/html/rfc2253 section 2.4 lists these exceptions
193
193
  # for dn values. All of the following must be escaped in any normal string
194
194
  # using a single backslash ('\') as escape.
195
- ESCAPES = {
196
- ',' => ',',
197
- '+' => '+',
198
- '"' => '"',
199
- '\\' => '\\',
200
- '<' => '<',
201
- '>' => '>',
202
- ';' => ';',
203
- }
195
+ ESCAPES = %w[, + " \\ < > ;]
204
196
 
205
- # Compiled character class regexp using the keys from the above hash, and
197
+ # Compiled character class regexp using the values from the above list, and
206
198
  # checking for a space or # at the start, or space at the end, of the
207
199
  # string.
208
200
  ESCAPE_RE = Regexp.new("(^ |^#| $|[" +
209
- ESCAPES.keys.map { |e| Regexp.escape(e) }.join +
201
+ ESCAPES.map { |e| Regexp.escape(e) }.join +
210
202
  "])")
211
203
 
212
204
  ##
213
205
  # Escape a string for use in a DN value
214
206
  def self.escape(string)
215
- string.gsub(ESCAPE_RE) { |char| "\\" + ESCAPES[char] }
207
+ string.gsub(ESCAPE_RE) { |char| "\\" + char }
216
208
  end
217
209
 
218
210
  ##
@@ -133,6 +133,13 @@ class Net::LDAP::Entry
133
133
  @myhash.keys
134
134
  end
135
135
 
136
+ ##
137
+ # Creates a duplicate of the internal Hash containing the attributes
138
+ # of the entry.
139
+ def to_h
140
+ @myhash.dup
141
+ end
142
+
136
143
  ##
137
144
  # Accesses each of the attributes present in the Entry.
138
145
  #
@@ -187,6 +194,8 @@ class Net::LDAP::Entry
187
194
  sym.to_s[-1] == ?=
188
195
  end
189
196
  private :setter?
190
- end # class Entry
191
197
 
192
- require_relative 'dataset' unless defined? Net::LDAP::Dataset
198
+ def ==(other)
199
+ other.instance_of?(self.class) && @myhash == other.to_h
200
+ end
201
+ end # class Entry
@@ -1,38 +1,13 @@
1
1
  class Net::LDAP
2
- class LdapError < StandardError
3
- def message
4
- "Deprecation warning: Net::LDAP::LdapError is no longer used. Use Net::LDAP::Error or rescue one of it's subclasses. \n" + super
5
- end
6
- end
7
-
8
2
  class Error < StandardError; end
9
3
 
10
4
  class AlreadyOpenedError < Error; end
11
5
  class SocketError < Error; end
12
- class ConnectionRefusedError < Error;
13
- def initialize(*args)
14
- warn_deprecation_message
15
- super
16
- end
17
-
18
- def message
19
- warn_deprecation_message
20
- super
21
- end
22
-
23
- private
24
-
25
- def warn_deprecation_message
26
- warn "Deprecation warning: Net::LDAP::ConnectionRefused will be deprecated. Use Errno::ECONNREFUSED instead."
27
- end
28
- end
29
6
  class ConnectionError < Error
30
7
  def self.new(errors)
31
8
  error = errors.first.first
32
9
  if errors.size == 1
33
- if error.kind_of? Errno::ECONNREFUSED
34
- return Net::LDAP::ConnectionRefusedError.new(error.message)
35
- end
10
+ return error if error.is_a? Errno::ECONNREFUSED
36
11
 
37
12
  return Net::LDAP::Error.new(error.message)
38
13
  end
@@ -1,5 +1,6 @@
1
1
  # -*- ruby encoding: utf-8 -*-
2
2
  require 'digest/sha1'
3
+ require 'digest/sha2'
3
4
  require 'digest/md5'
4
5
  require 'base64'
5
6
  require 'securerandom'
@@ -28,6 +29,9 @@ class Net::LDAP::Password
28
29
  when :ssha
29
30
  salt = SecureRandom.random_bytes(16)
30
31
  '{SSHA}' + Base64.strict_encode64(Digest::SHA1.digest(str + salt) + salt)
32
+ when :ssha256
33
+ salt = SecureRandom.random_bytes(16)
34
+ '{SSHA256}' + Base64.strict_encode64(Digest::SHA256.digest(str + salt) + salt)
31
35
  else
32
36
  raise Net::LDAP::HashTypeUnsupportedError, "Unsupported password-hash type (#{type})"
33
37
  end
@@ -1,5 +1,5 @@
1
1
  module Net
2
2
  class LDAP
3
- VERSION = "0.16.3"
3
+ VERSION = "0.19.0"
4
4
  end
5
5
  end
data/lib/net/ldap.rb CHANGED
@@ -412,7 +412,7 @@ class Net::LDAP
412
412
  ResultCodeStrongerAuthRequired => "Stronger Auth Needed",
413
413
  ResultCodeReferral => "Referral",
414
414
  ResultCodeAdminLimitExceeded => "Admin Limit Exceeded",
415
- ResultCodeUnavailableCriticalExtension => "Unavailable crtical extension",
415
+ ResultCodeUnavailableCriticalExtension => "Unavailable critical extension",
416
416
  ResultCodeConfidentialityRequired => "Confidentiality Required",
417
417
  ResultCodeSaslBindInProgress => "saslBindInProgress",
418
418
  ResultCodeNoSuchAttribute => "No Such Attribute",
@@ -480,6 +480,8 @@ class Net::LDAP
480
480
  # server says it supports them. This is a fix for MS Active Directory
481
481
  # * :instrumentation_service => An object responsible for instrumenting
482
482
  # operations, compatible with ActiveSupport::Notifications' public API.
483
+ # * :connect_timeout => The TCP socket timeout (in seconds) to use when
484
+ # connecting to the LDAP server (default 5 seconds).
483
485
  # * :encryption => specifies the encryption to be used in communicating
484
486
  # with the LDAP server. The value must be a Hash containing additional
485
487
  # parameters, which consists of two keys:
@@ -1182,14 +1184,22 @@ class Net::LDAP
1182
1184
  # entries. This method sends an extra control code to tell the LDAP server
1183
1185
  # to do a tree delete. ('1.2.840.113556.1.4.805')
1184
1186
  #
1187
+ # If the LDAP server does not support the DELETE_TREE control code, subordinate
1188
+ # entries are deleted recursively instead.
1189
+ #
1185
1190
  # Returns True or False to indicate whether the delete succeeded. Extended
1186
1191
  # status information is available by calling #get_operation_result.
1187
1192
  #
1188
1193
  # dn = "mail=deleteme@example.com, ou=people, dc=example, dc=com"
1189
1194
  # ldap.delete_tree :dn => dn
1190
1195
  def delete_tree(args)
1191
- delete(args.merge(:control_codes => [[Net::LDAP::LDAPControls::DELETE_TREE, true]]))
1196
+ if search_root_dse[:supportedcontrol].include? Net::LDAP::LDAPControls::DELETE_TREE
1197
+ delete(args.merge(:control_codes => [[Net::LDAP::LDAPControls::DELETE_TREE, true]]))
1198
+ else
1199
+ recursive_delete(args)
1200
+ end
1192
1201
  end
1202
+
1193
1203
  # This method is experimental and subject to change. Return the rootDSE
1194
1204
  # record from the LDAP server as a Net::LDAP::Entry, or an empty Entry if
1195
1205
  # the server doesn't return the record.
@@ -1320,7 +1330,7 @@ class Net::LDAP
1320
1330
  # Force connect to see if there's a connection error
1321
1331
  connection.socket
1322
1332
  connection
1323
- rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT, Net::LDAP::ConnectionRefusedError => e
1333
+ rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT => e
1324
1334
  @result = {
1325
1335
  :resultCode => 52,
1326
1336
  :errorMessage => ResultStrings[ResultCodeUnavailable],
@@ -1340,4 +1350,19 @@ class Net::LDAP
1340
1350
  end
1341
1351
  end
1342
1352
 
1353
+ # Recursively delete a dn and it's subordinate children.
1354
+ # This is useful when a server does not support the DELETE_TREE control code.
1355
+ def recursive_delete(args)
1356
+ raise EmptyDNError unless args.is_a?(Hash) && args.key?(:dn)
1357
+ # Delete Children
1358
+ search(base: args[:dn], scope: Net::LDAP::SearchScope_SingleLevel) do |entry|
1359
+ recursive_delete(dn: entry.dn)
1360
+ end
1361
+ # Delete Self
1362
+ unless delete(dn: args[:dn])
1363
+ raise Net::LDAP::Error, get_operation_result[:error_message].to_s
1364
+ end
1365
+ true
1366
+ end
1367
+
1343
1368
  end # class LDAP
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-ldap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.3
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Francis Cianfrocca
@@ -10,10 +10,10 @@ authors:
10
10
  - Kaspar Schiess
11
11
  - Austin Ziegler
12
12
  - Michael Schaarschmidt
13
- autorequire:
13
+ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2020-08-18 00:00:00.000000000 Z
16
+ date: 2024-01-03 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: flexmock
@@ -49,42 +49,42 @@ dependencies:
49
49
  requirements:
50
50
  - - "~>"
51
51
  - !ruby/object:Gem::Version
52
- version: 0.49.0
52
+ version: '1.48'
53
53
  type: :development
54
54
  prerelease: false
55
55
  version_requirements: !ruby/object:Gem::Requirement
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: 0.49.0
59
+ version: '1.48'
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: test-unit
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
- - - ">="
64
+ - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: '0'
66
+ version: '3.3'
67
67
  type: :development
68
68
  prerelease: false
69
69
  version_requirements: !ruby/object:Gem::Requirement
70
70
  requirements:
71
- - - ">="
71
+ - - "~>"
72
72
  - !ruby/object:Gem::Version
73
- version: '0'
73
+ version: '3.3'
74
74
  - !ruby/object:Gem::Dependency
75
75
  name: byebug
76
76
  requirement: !ruby/object:Gem::Requirement
77
77
  requirements:
78
- - - ">="
78
+ - - "~>"
79
79
  - !ruby/object:Gem::Version
80
- version: '0'
80
+ version: 9.0.6
81
81
  type: :development
82
82
  prerelease: false
83
83
  version_requirements: !ruby/object:Gem::Requirement
84
84
  requirements:
85
- - - ">="
85
+ - - "~>"
86
86
  - !ruby/object:Gem::Version
87
- version: '0'
87
+ version: 9.0.6
88
88
  description: |-
89
89
  Net::LDAP for Ruby (also called net-ldap) implements client access for the
90
90
  Lightweight Directory Access Protocol (LDAP), an IETF standard protocol for
@@ -112,18 +112,11 @@ extra_rdoc_files:
112
112
  - License.rdoc
113
113
  - README.rdoc
114
114
  files:
115
- - ".gitignore"
116
- - ".rubocop.yml"
117
- - ".rubocop_todo.yml"
118
- - ".travis.yml"
119
- - CONTRIBUTING.md
120
115
  - Contributors.rdoc
121
- - Gemfile
122
116
  - Hacking.rdoc
123
117
  - History.rdoc
124
118
  - License.rdoc
125
119
  - README.rdoc
126
- - Rakefile
127
120
  - lib/net-ldap.rb
128
121
  - lib/net/ber.rb
129
122
  - lib/net/ber/ber_parser.rb
@@ -149,48 +142,11 @@ files:
149
142
  - lib/net/ldap/pdu.rb
150
143
  - lib/net/ldap/version.rb
151
144
  - lib/net/snmp.rb
152
- - net-ldap.gemspec
153
- - script/changelog
154
- - script/ldap-docker
155
- - script/package
156
- - script/release
157
- - test/ber/core_ext/test_array.rb
158
- - test/ber/core_ext/test_string.rb
159
- - test/ber/test_ber.rb
160
- - test/fixtures/ca/docker-ca.pem
161
- - test/fixtures/ldif/06-retcode.ldif
162
- - test/fixtures/ldif/50-seed.ldif
163
- - test/integration/test_add.rb
164
- - test/integration/test_ber.rb
165
- - test/integration/test_bind.rb
166
- - test/integration/test_delete.rb
167
- - test/integration/test_open.rb
168
- - test/integration/test_password_modify.rb
169
- - test/integration/test_return_codes.rb
170
- - test/integration/test_search.rb
171
- - test/support/vm/openldap/.gitignore
172
- - test/test_auth_adapter.rb
173
- - test/test_dn.rb
174
- - test/test_entry.rb
175
- - test/test_filter.rb
176
- - test/test_filter_parser.rb
177
- - test/test_helper.rb
178
- - test/test_ldap.rb
179
- - test/test_ldap_connection.rb
180
- - test/test_ldif.rb
181
- - test/test_password.rb
182
- - test/test_rename.rb
183
- - test/test_search.rb
184
- - test/test_snmp.rb
185
- - test/test_ssl_ber.rb
186
- - test/testdata.ldif
187
- - testserver/ldapserver.rb
188
- - testserver/testdata.ldif
189
145
  homepage: http://github.com/ruby-ldap/ruby-net-ldap
190
146
  licenses:
191
147
  - MIT
192
148
  metadata: {}
193
- post_install_message:
149
+ post_install_message:
194
150
  rdoc_options:
195
151
  - "--main"
196
152
  - README.rdoc
@@ -207,42 +163,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
207
163
  - !ruby/object:Gem::Version
208
164
  version: '0'
209
165
  requirements: []
210
- rubygems_version: 3.1.2
211
- signing_key:
166
+ rubygems_version: 3.4.14
167
+ signing_key:
212
168
  specification_version: 4
213
169
  summary: Net::LDAP for Ruby (also called net-ldap) implements client access for the
214
170
  Lightweight Directory Access Protocol (LDAP), an IETF standard protocol for accessing
215
171
  distributed directory services
216
- test_files:
217
- - test/ber/core_ext/test_array.rb
218
- - test/ber/core_ext/test_string.rb
219
- - test/ber/test_ber.rb
220
- - test/fixtures/ca/docker-ca.pem
221
- - test/fixtures/ldif/06-retcode.ldif
222
- - test/fixtures/ldif/50-seed.ldif
223
- - test/integration/test_add.rb
224
- - test/integration/test_ber.rb
225
- - test/integration/test_bind.rb
226
- - test/integration/test_delete.rb
227
- - test/integration/test_open.rb
228
- - test/integration/test_password_modify.rb
229
- - test/integration/test_return_codes.rb
230
- - test/integration/test_search.rb
231
- - test/support/vm/openldap/.gitignore
232
- - test/test_auth_adapter.rb
233
- - test/test_dn.rb
234
- - test/test_entry.rb
235
- - test/test_filter.rb
236
- - test/test_filter_parser.rb
237
- - test/test_helper.rb
238
- - test/test_ldap.rb
239
- - test/test_ldap_connection.rb
240
- - test/test_ldif.rb
241
- - test/test_password.rb
242
- - test/test_rename.rb
243
- - test/test_search.rb
244
- - test/test_snmp.rb
245
- - test/test_ssl_ber.rb
246
- - test/testdata.ldif
247
- - testserver/ldapserver.rb
248
- - testserver/testdata.ldif
172
+ test_files: []
data/.gitignore DELETED
@@ -1,10 +0,0 @@
1
- *~
2
- *.swp
3
- .rvmrc
4
- pkg/
5
- doc/
6
- publish/
7
- Gemfile.lock
8
- .bundle
9
- bin/
10
- .idea
data/.rubocop.yml DELETED
@@ -1,20 +0,0 @@
1
- inherit_from: .rubocop_todo.yml
2
-
3
- AllCops:
4
- Exclude:
5
- - 'pkg/**/*'
6
-
7
- Layout/ExtraSpacing:
8
- Enabled: false
9
-
10
- Lint/AssignmentInCondition:
11
- Enabled: false
12
-
13
- Style/ParallelAssignment:
14
- Enabled: false
15
-
16
- Style/TrailingCommaInLiteral:
17
- EnforcedStyleForMultiline: comma
18
-
19
- Style/TrailingCommaInArguments:
20
- EnforcedStyleForMultiline: comma