net-ldap 0.16.2 → 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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +59 -0
  3. data/README.rdoc +10 -3
  4. data/lib/net/ber/core_ext.rb +6 -6
  5. data/lib/net/ber.rb +2 -2
  6. data/lib/net/ldap/auth_adapter/gss_spnego.rb +2 -2
  7. data/lib/net/ldap/auth_adapter/sasl.rb +1 -1
  8. data/lib/net/ldap/auth_adapter/simple.rb +1 -1
  9. data/lib/net/ldap/connection.rb +22 -14
  10. data/lib/net/ldap/dataset.rb +1 -3
  11. data/lib/net/ldap/dn.rb +19 -27
  12. data/lib/net/ldap/entry.rb +11 -2
  13. data/lib/net/ldap/error.rb +2 -26
  14. data/lib/net/ldap/filter.rb +3 -3
  15. data/lib/net/ldap/instrumentation.rb +2 -2
  16. data/lib/net/ldap/password.rb +7 -5
  17. data/lib/net/ldap/pdu.rb +1 -1
  18. data/lib/net/ldap/version.rb +1 -1
  19. data/lib/net/ldap.rb +41 -16
  20. data/lib/net/snmp.rb +1 -1
  21. data/lib/net-ldap.rb +1 -1
  22. metadata +16 -92
  23. data/.gitignore +0 -10
  24. data/.rubocop.yml +0 -20
  25. data/.rubocop_todo.yml +0 -753
  26. data/.travis.yml +0 -55
  27. data/CONTRIBUTING.md +0 -54
  28. data/Gemfile +0 -2
  29. data/Rakefile +0 -23
  30. data/net-ldap.gemspec +0 -37
  31. data/script/changelog +0 -47
  32. data/script/ldap-docker +0 -12
  33. data/script/package +0 -7
  34. data/script/release +0 -16
  35. data/test/ber/core_ext/test_array.rb +0 -22
  36. data/test/ber/core_ext/test_string.rb +0 -25
  37. data/test/ber/test_ber.rb +0 -153
  38. data/test/fixtures/ca/docker-ca.pem +0 -18
  39. data/test/fixtures/ldif/06-retcode.ldif +0 -75
  40. data/test/fixtures/ldif/50-seed.ldif +0 -374
  41. data/test/integration/test_add.rb +0 -26
  42. data/test/integration/test_ber.rb +0 -30
  43. data/test/integration/test_bind.rb +0 -222
  44. data/test/integration/test_delete.rb +0 -29
  45. data/test/integration/test_open.rb +0 -87
  46. data/test/integration/test_password_modify.rb +0 -93
  47. data/test/integration/test_return_codes.rb +0 -46
  48. data/test/integration/test_search.rb +0 -77
  49. data/test/support/vm/openldap/.gitignore +0 -1
  50. data/test/test_auth_adapter.rb +0 -15
  51. data/test/test_dn.rb +0 -44
  52. data/test/test_entry.rb +0 -65
  53. data/test/test_filter.rb +0 -223
  54. data/test/test_filter_parser.rb +0 -24
  55. data/test/test_helper.rb +0 -73
  56. data/test/test_ldap.rb +0 -114
  57. data/test/test_ldap_connection.rb +0 -491
  58. data/test/test_ldif.rb +0 -104
  59. data/test/test_password.rb +0 -10
  60. data/test/test_rename.rb +0 -77
  61. data/test/test_search.rb +0 -39
  62. data/test/test_snmp.rb +0 -119
  63. data/test/test_ssl_ber.rb +0 -40
  64. data/test/testdata.ldif +0 -101
  65. data/testserver/ldapserver.rb +0 -209
  66. data/testserver/testdata.ldif +0 -101
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bb65f1bdb6d23c483e83e52762a8873b1a872a798e229320243262a1328cc8d8
4
- data.tar.gz: 18ab54a1cea6eae374327f6933be93d7b4db83081c65db1f38a0c2600e044b34
3
+ metadata.gz: 1fdcc1a3fefe3fb2bf1dbb91ec9e00734252fdda634ae0e2344b9dd6e6b86cd2
4
+ data.tar.gz: 8526bd506b632e74193c80119280fd4b333731b1e3d75791427a12e62cab775a
5
5
  SHA512:
6
- metadata.gz: 0d6a96984d362d97954e112a4ebea4b594429a9e26781be7b34f7247f134401a99733d84d84b71aee193d169f1f8ea7fe0ce7b3264c8891d7bfe610198dfae01
7
- data.tar.gz: 36feb9633daaf4c19a347c039d5abad063fb19f1a3dbb52320f2d8cc2ec56b86137f5f79e5700ba8dc364f1450be56bbcc5aca552e4f642a31f9c149451dfa88
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.png" />}[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 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`
@@ -1,5 +1,5 @@
1
1
  # -*- ruby encoding: utf-8 -*-
2
- require 'net/ber/ber_parser'
2
+ require_relative 'ber_parser'
3
3
  # :stopdoc:
4
4
  class IO
5
5
  include Net::BER::BERParser
@@ -19,35 +19,35 @@ end
19
19
  module Net::BER::Extensions # :nodoc:
20
20
  end
21
21
 
22
- require 'net/ber/core_ext/string'
22
+ require_relative 'core_ext/string'
23
23
  # :stopdoc:
24
24
  class String
25
25
  include Net::BER::BERParser
26
26
  include Net::BER::Extensions::String
27
27
  end
28
28
 
29
- require 'net/ber/core_ext/array'
29
+ require_relative 'core_ext/array'
30
30
  # :stopdoc:
31
31
  class Array
32
32
  include Net::BER::Extensions::Array
33
33
  end
34
34
  # :startdoc:
35
35
 
36
- require 'net/ber/core_ext/integer'
36
+ require_relative 'core_ext/integer'
37
37
  # :stopdoc:
38
38
  class Integer
39
39
  include Net::BER::Extensions::Integer
40
40
  end
41
41
  # :startdoc:
42
42
 
43
- require 'net/ber/core_ext/true_class'
43
+ require_relative 'core_ext/true_class'
44
44
  # :stopdoc:
45
45
  class TrueClass
46
46
  include Net::BER::Extensions::TrueClass
47
47
  end
48
48
  # :startdoc:
49
49
 
50
- require 'net/ber/core_ext/false_class'
50
+ require_relative 'core_ext/false_class'
51
51
  # :stopdoc:
52
52
  class FalseClass
53
53
  include Net::BER::Extensions::FalseClass
data/lib/net/ber.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # -*- ruby encoding: utf-8 -*-
2
- require 'net/ldap/version'
2
+ require_relative 'ldap/version'
3
3
 
4
4
  module Net # :nodoc:
5
5
  ##
@@ -349,4 +349,4 @@ module Net::BER
349
349
  Null = Net::BER::BerIdentifiedNull.new
350
350
  end
351
351
 
352
- require 'net/ber/core_ext'
352
+ require_relative 'ber/core_ext'
@@ -1,5 +1,5 @@
1
- require 'net/ldap/auth_adapter'
2
- require 'net/ldap/auth_adapter/sasl'
1
+ require_relative '../auth_adapter'
2
+ require_relative 'sasl'
3
3
 
4
4
  module Net
5
5
  class LDAP
@@ -1,4 +1,4 @@
1
- require 'net/ldap/auth_adapter'
1
+ require_relative '../auth_adapter'
2
2
 
3
3
  module Net
4
4
  class LDAP
@@ -1,4 +1,4 @@
1
- require 'net/ldap/auth_adapter'
1
+ require_relative '../auth_adapter'
2
2
 
3
3
  module Net
4
4
  class LDAP
@@ -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
@@ -181,7 +183,7 @@ class Net::LDAP::Connection #:nodoc:
181
183
  # have to call it, but perhaps it will come in handy someday.
182
184
  #++
183
185
  def close
184
- return if @conn.nil?
186
+ return if !defined?(@conn) || @conn.nil?
185
187
  @conn.close
186
188
  @conn = nil
187
189
  end
@@ -300,7 +302,7 @@ class Net::LDAP::Connection #:nodoc:
300
302
  control[2] = (control[2] == true).to_ber
301
303
  control.to_ber_sequence
302
304
  end
303
- sort_control = [
305
+ [
304
306
  Net::LDAP::LDAPControls::SORT_REQUEST.to_ber,
305
307
  false.to_ber,
306
308
  sort_control_values.to_ber_sequence.to_s.to_ber,
@@ -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
 
@@ -610,7 +618,7 @@ class Net::LDAP::Connection #:nodoc:
610
618
  pdu = queued_read(message_id)
611
619
 
612
620
  if !pdu || pdu.app_tag != Net::LDAP::PDU::ExtendedResponse
613
- raise Net::LDAP::ResponseMissingError, "response missing or invalid"
621
+ raise Net::LDAP::ResponseMissingOrInvalidError, "response missing or invalid"
614
622
  end
615
623
 
616
624
  pdu
@@ -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
@@ -710,7 +718,7 @@ class Net::LDAP::Connection #:nodoc:
710
718
  # Wrap around Socket.tcp to normalize with other Socket initializers
711
719
  class DefaultSocket
712
720
  def self.new(host, port, socket_opts = {})
713
- Socket.tcp(host, port, socket_opts)
721
+ Socket.tcp(host, port, **socket_opts)
714
722
  end
715
723
  end
716
724
  end # class Connection
@@ -103,7 +103,7 @@ class Net::LDAP::Dataset < Hash
103
103
  # with the conversion of
104
104
  def from_entry(entry)
105
105
  dataset = Net::LDAP::Dataset.new
106
- hash = { }
106
+ hash = {}
107
107
  entry.each_attribute do |attribute, value|
108
108
  next if attribute == :dn
109
109
  hash[attribute] = value
@@ -164,5 +164,3 @@ class Net::LDAP::Dataset < Hash
164
164
  end
165
165
  end
166
166
  end
167
-
168
- require 'net/ldap/entry' unless defined? Net::LDAP::Entry
data/lib/net/ldap/dn.rb CHANGED
@@ -57,19 +57,19 @@ class Net::LDAP::DN
57
57
  state = :key_oid
58
58
  key << char
59
59
  when ' ' then state = :key
60
- else raise "DN badly formed"
60
+ else raise Net::LDAP::InvalidDNError, "DN badly formed"
61
61
  end
62
62
  when :key_normal then
63
63
  case char
64
64
  when '=' then state = :value
65
65
  when 'a'..'z', 'A'..'Z', '0'..'9', '-', ' ' then key << char
66
- else raise "DN badly formed"
66
+ else raise Net::LDAP::InvalidDNError, "DN badly formed"
67
67
  end
68
68
  when :key_oid then
69
69
  case char
70
70
  when '=' then state = :value
71
71
  when '0'..'9', '.', ' ' then key << char
72
- else raise "DN badly formed"
72
+ else raise Net::LDAP::InvalidDNError, "DN badly formed"
73
73
  end
74
74
  when :value then
75
75
  case char
@@ -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
@@ -110,7 +110,7 @@ class Net::LDAP::DN
110
110
  when '0'..'9', 'a'..'f', 'A'..'F' then
111
111
  state = :value_normal
112
112
  value << "#{hex_buffer}#{char}".to_i(16).chr
113
- else raise "DN badly formed"
113
+ else raise Net::LDAP::InvalidDNError, "DN badly formed"
114
114
  end
115
115
  when :value_quoted then
116
116
  case char
@@ -132,7 +132,7 @@ class Net::LDAP::DN
132
132
  when '0'..'9', 'a'..'f', 'A'..'F' then
133
133
  state = :value_quoted
134
134
  value << "#{hex_buffer}#{char}".to_i(16).chr
135
- else raise "DN badly formed"
135
+ else raise Net::LDAP::InvalidDNError, "DN badly formed"
136
136
  end
137
137
  when :value_hexstring then
138
138
  case char
@@ -142,37 +142,37 @@ 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
- else raise "DN badly formed"
148
+ else raise Net::LDAP::InvalidDNError, "DN badly formed"
149
149
  end
150
150
  when :value_hexstring_hex then
151
151
  case char
152
152
  when '0'..'9', 'a'..'f', 'A'..'F' then
153
153
  state = :value_hexstring
154
154
  value << char
155
- else raise "DN badly formed"
155
+ else raise Net::LDAP::InvalidDNError, "DN badly formed"
156
156
  end
157
157
  when :value_end then
158
158
  case char
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
- else raise "DN badly formed"
165
+ else raise Net::LDAP::InvalidDNError, "DN badly formed"
166
166
  end
167
- else raise "Fell out of state machine"
167
+ else raise Net::LDAP::InvalidDNError, "Fell out of state machine"
168
168
  end
169
169
  end
170
170
 
171
171
  # Last pair
172
- raise "DN badly formed" unless
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 'net/ldap/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
@@ -60,6 +35,7 @@ class Net::LDAP
60
35
  class ResponseTypeInvalidError < Error; end
61
36
  class ResponseMissingOrInvalidError < Error; end
62
37
  class EmptyDNError < Error; end
38
+ class InvalidDNError < Error; end
63
39
  class HashTypeUnsupportedError < Error; end
64
40
  class OperatorError < Error; end
65
41
  class SubstringFilterError < Error; end
@@ -490,7 +490,7 @@ class Net::LDAP::Filter
490
490
  when :eq
491
491
  if @right == "*" # presence test
492
492
  @left.to_s.to_ber_contextspecific(7)
493
- elsif @right =~ /[*]/ # substring
493
+ elsif @right.to_s =~ /[*]/ # substring
494
494
  # Parsing substrings is a little tricky. We use String#split to
495
495
  # break a string into substrings delimited by the * (star)
496
496
  # character. But we also need to know whether there is a star at the
@@ -646,7 +646,7 @@ class Net::LDAP::Filter
646
646
  ##
647
647
  # Converts escaped characters (e.g., "\\28") to unescaped characters
648
648
  # @note slawson20170317: Don't attempt to unescape 16 byte binary data which we assume are objectGUIDs
649
- # The binary form of 5936AE79-664F-44EA-BCCB-5C39399514C6 triggers a BINARY -> UTF-8 conversion error
649
+ # The binary form of 5936AE79-664F-44EA-BCCB-5C39399514C6 triggers a BINARY -> UTF-8 conversion error
650
650
  def unescape(right)
651
651
  right = right.to_s
652
652
  if right.length == 16 && right.encoding == Encoding::BINARY
@@ -755,7 +755,7 @@ class Net::LDAP::Filter
755
755
  # This parses a given expression inside of parentheses.
756
756
  def parse_filter_branch(scanner)
757
757
  scanner.scan(/\s*/)
758
- if token = scanner.scan(/[-\w:.]*[\w]/)
758
+ if token = scanner.scan(/[-\w:.;]*[\w]/)
759
759
  scanner.scan(/\s*/)
760
760
  if op = scanner.scan(/<=|>=|!=|:=|=/)
761
761
  scanner.scan(/\s*/)
@@ -12,8 +12,8 @@ module Net::LDAP::Instrumentation
12
12
  def instrument(event, payload = {})
13
13
  payload = (payload || {}).dup
14
14
  if instrumentation_service
15
- instrumentation_service.instrument(event, payload) do |payload|
16
- payload[:result] = yield(payload) if block_given?
15
+ instrumentation_service.instrument(event, payload) do |instr_payload|
16
+ instr_payload[:result] = yield(instr_payload) if block_given?
17
17
  end
18
18
  else
19
19
  yield(payload) if block_given?
@@ -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'
@@ -19,20 +20,21 @@ class Net::LDAP::Password
19
20
  # * Should we provide sha1 as a synonym for sha1? I vote no because then
20
21
  # should you also provide ssha1 for symmetry?
21
22
  #
22
- attribute_value = ""
23
23
  def generate(type, str)
24
24
  case type
25
25
  when :md5
26
- attribute_value = '{MD5}' + Base64.encode64(Digest::MD5.digest(str)).chomp!
26
+ '{MD5}' + Base64.strict_encode64(Digest::MD5.digest(str))
27
27
  when :sha
28
- attribute_value = '{SHA}' + Base64.encode64(Digest::SHA1.digest(str)).chomp!
28
+ '{SHA}' + Base64.strict_encode64(Digest::SHA1.digest(str))
29
29
  when :ssha
30
30
  salt = SecureRandom.random_bytes(16)
31
- attribute_value = '{SSHA}' + Base64.encode64(Digest::SHA1.digest(str + salt) + salt).chomp!
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)
32
35
  else
33
36
  raise Net::LDAP::HashTypeUnsupportedError, "Unsupported password-hash type (#{type})"
34
37
  end
35
- return attribute_value
36
38
  end
37
39
  end
38
40
  end
data/lib/net/ldap/pdu.rb CHANGED
@@ -123,7 +123,7 @@ class Net::LDAP::PDU
123
123
  when ExtendedResponse
124
124
  parse_extended_response(ber_object[1])
125
125
  else
126
- raise LdapPduError.new("unknown pdu-type: #{@app_tag}")
126
+ raise Error.new("unknown pdu-type: #{@app_tag}")
127
127
  end
128
128
 
129
129
  parse_controls(ber_object[2]) if ber_object[2]
@@ -1,5 +1,5 @@
1
1
  module Net
2
2
  class LDAP
3
- VERSION = "0.16.2"
3
+ VERSION = "0.19.0"
4
4
  end
5
5
  end