net-ldap 0.3.1 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/Contributors.rdoc +4 -0
  3. data/Hacking.rdoc +3 -8
  4. data/History.rdoc +181 -0
  5. data/README.rdoc +44 -12
  6. data/lib/net-ldap.rb +1 -1
  7. data/lib/net/ber.rb +41 -7
  8. data/lib/net/ber/ber_parser.rb +21 -7
  9. data/lib/net/ber/core_ext.rb +11 -18
  10. data/lib/net/ber/core_ext/array.rb +14 -0
  11. data/lib/net/ber/core_ext/integer.rb +74 -0
  12. data/lib/net/ber/core_ext/string.rb +24 -4
  13. data/lib/net/ber/core_ext/true_class.rb +2 -3
  14. data/lib/net/ldap.rb +441 -639
  15. data/lib/net/ldap/auth_adapter.rb +29 -0
  16. data/lib/net/ldap/auth_adapter/gss_spnego.rb +41 -0
  17. data/lib/net/ldap/auth_adapter/sasl.rb +62 -0
  18. data/lib/net/ldap/auth_adapter/simple.rb +34 -0
  19. data/lib/net/ldap/connection.rb +716 -0
  20. data/lib/net/ldap/dataset.rb +23 -9
  21. data/lib/net/ldap/dn.rb +13 -14
  22. data/lib/net/ldap/entry.rb +27 -9
  23. data/lib/net/ldap/error.rb +49 -0
  24. data/lib/net/ldap/filter.rb +58 -32
  25. data/lib/net/ldap/instrumentation.rb +23 -0
  26. data/lib/net/ldap/password.rb +23 -14
  27. data/lib/net/ldap/pdu.rb +70 -6
  28. data/lib/net/ldap/version.rb +5 -0
  29. data/lib/net/snmp.rb +237 -241
  30. metadata +71 -116
  31. data/.autotest +0 -11
  32. data/.gemtest +0 -0
  33. data/.rspec +0 -2
  34. data/Manifest.txt +0 -49
  35. data/Rakefile +0 -74
  36. data/autotest/discover.rb +0 -1
  37. data/lib/net/ber/core_ext/bignum.rb +0 -22
  38. data/lib/net/ber/core_ext/fixnum.rb +0 -66
  39. data/net-ldap.gemspec +0 -58
  40. data/spec/integration/ssl_ber_spec.rb +0 -36
  41. data/spec/spec.opts +0 -2
  42. data/spec/spec_helper.rb +0 -5
  43. data/spec/unit/ber/ber_spec.rb +0 -109
  44. data/spec/unit/ber/core_ext/string_spec.rb +0 -51
  45. data/spec/unit/ldap/dn_spec.rb +0 -80
  46. data/spec/unit/ldap/entry_spec.rb +0 -51
  47. data/spec/unit/ldap/filter_spec.rb +0 -84
  48. data/spec/unit/ldap_spec.rb +0 -48
  49. data/test/common.rb +0 -3
  50. data/test/test_entry.rb +0 -59
  51. data/test/test_filter.rb +0 -122
  52. data/test/test_ldap_connection.rb +0 -24
  53. data/test/test_ldif.rb +0 -79
  54. data/test/test_password.rb +0 -17
  55. data/test/test_rename.rb +0 -77
  56. data/test/test_snmp.rb +0 -114
  57. data/test/testdata.ldif +0 -101
  58. data/testserver/ldapserver.rb +0 -210
  59. data/testserver/testdata.ldif +0 -101
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 02707fcb56d13184b4bbcc16c1555a0d417efb7e20c216a97ee8f28c9553ea84
4
+ data.tar.gz: 26a82f5021146fe6ec84d83e41722364964e155eb898102e3a8618facc020d9a
5
+ SHA512:
6
+ metadata.gz: d19e1bc7cdcaceff6263f2bca2e9326ef441e301ab74556c42313e01704800abb59231f760abec64a8f2d1e313c18324b97c57a64d2b2ee24943be9e4bd2c428
7
+ data.tar.gz: fa69d36265e7b11b7c83cf812caca680e30af3a0be31c145d70396835081fc06f6a2bf43262ec08f4d6fab1094823dc70de069441229a991f3c5b2eadeb7c4e5
data/Contributors.rdoc CHANGED
@@ -19,3 +19,7 @@ Contributions since:
19
19
  * Derek Harmel (derekharmel)
20
20
  * Erik Hetzner (egh)
21
21
  * nowhereman
22
+ * David J. Lee (DavidJLee)
23
+ * Cody Cutrer (ccutrer)
24
+ * WoodsBagotAndreMarquesLee
25
+ * Rufus Post (mynameisrufus)
data/Hacking.rdoc CHANGED
@@ -25,7 +25,7 @@ patches being accepted, we recommend that you follow the guidelines below:
25
25
 
26
26
  == Documentation
27
27
 
28
- * Documentation: {net-ldap}[http://net-ldap.rubyforge.org/]
28
+ * Documentation: {net-ldap}[http://rubydoc.info/gems/net-ldap]
29
29
 
30
30
  It is very important that, if you add new methods or objects, your code is
31
31
  well-documented. The purpose of the changes should be clearly described so that
@@ -40,8 +40,8 @@ modification to +Contributors.rdoc+ to add yourself.
40
40
 
41
41
  == Tests
42
42
 
43
- The Net::LDAP team uses RSpec for unit testing; all changes must have rspec
44
- tests for any new or changed features.
43
+ The Net::LDAP team uses [Minitest](http://docs.seattlerb.org/minitest/) for unit
44
+ testing; all changes must have tests for any new or changed features.
45
45
 
46
46
  Your changes should have been tested against at least one real LDAP server; the
47
47
  current tests are not sufficient to find all possible bugs. It's unlikely that
@@ -55,14 +55,9 @@ us with a sample LDIF data file for importing into LDAP servers for testing.
55
55
  Net::LDAP uses several libraries during development, all of which can be
56
56
  installed using RubyGems.
57
57
 
58
- * *hoe*
59
- * *hoe-git*
60
- * *metaid*
61
- * *rspec*
62
58
  * *flexmock*
63
59
 
64
60
  == Participation
65
61
 
66
- * RubyForge: {net-ldap}[http://rubyforge.org/projects/net-ldap]
67
62
  * GitHub: {ruby-ldap/ruby-net-ldap}[https://github.com/ruby-ldap/ruby-net-ldap/]
68
63
  * Group: {ruby-ldap}[http://groups.google.com/group/ruby-ldap]
data/History.rdoc CHANGED
@@ -1,3 +1,184 @@
1
+ === Net::LDAP 0.17.0
2
+ * Added private recursive_delete as alternative to DELETE_TREE #268
3
+ * Test suite updates #373 #376 #377
4
+ * Use Base64.strict_encode64 and SSHA256 #303
5
+ * Remove deprecated ConnectionRefusedError #366
6
+ * Added method to get a duplicate of the internal Hash #286
7
+ * remove a circular require #380
8
+ * fix LdapServerAsnSyntax compile #379
9
+ * Implement '==' operator for entries #381
10
+ * fix for undefined method for write exception #383
11
+
12
+ === Net::LDAP 0.16.3
13
+
14
+ * Add Net::LDAP::InvalidDNError #371
15
+ * Use require_relative instead of require #360
16
+ * Address some warnings and fix JRuby test omissions #365
17
+ * Bump rake dev dependency to 12.3 #359
18
+ * Enable rubocop in ci #251
19
+ * Enhance rubocop configuration and test syntax #344
20
+ * CI: Drop rbx-2, uninstallable #364
21
+ * Fix RuboCop warnings #312
22
+ * Fix wrong error class #305
23
+ * CONTRIBUTING.md: Repair link to Issues #309
24
+ * Make the generate() method more idiomatic... #326
25
+ * Make encode_sort_controls() more idiomatic... #327
26
+ * Make the instrument() method more idiomatic... #328
27
+ * Fix uninitialised Net::LDAP::LdapPduError #338
28
+ * README.rdoc: Use SVG build badge #310
29
+ * Update TravisCI config to inclue Ruby 2.7 #346
30
+ * add explicit ** to silence Ruby 2.7 warning #342
31
+ * Support parsing filters with attribute tags #345
32
+ * Bump rubocop development dependency version #336
33
+ * Add link to generated and hosted documentation on rubydoc #319
34
+ * Fix 'uninitialized constant Net::LDAP::PDU::LdapPduError' error #317
35
+ * simplify encoding logic: no more chomping required #362
36
+
37
+ === Net::LDAP 0.16.2
38
+
39
+ * Net::LDAP#open does not cache bind result {#334}[https://github.com/ruby-ldap/ruby-net-ldap/pull/334]
40
+ * Fix CI build {#333}[https://github.com/ruby-ldap/ruby-net-ldap/pull/333]
41
+ * Fix to "undefined method 'result_code'" {#308}[https://github.com/ruby-ldap/ruby-net-ldap/pull/308]
42
+ * Fixed Exception: incompatible character encodings: ASCII-8BIT and UTF-8 in filter.rb {#285}[https://github.com/ruby-ldap/ruby-net-ldap/pull/285]
43
+
44
+ === Net::LDAP 0.16.1
45
+
46
+ * Send DN and newPassword with password_modify request {#271}[https://github.com/ruby-ldap/ruby-net-ldap/pull/271]
47
+
48
+ === Net::LDAP 0.16.0
49
+
50
+ * Sasl fix {#281}[https://github.com/ruby-ldap/ruby-net-ldap/pull/281]
51
+ * enable TLS hostname validation {#279}[https://github.com/ruby-ldap/ruby-net-ldap/pull/279]
52
+ * update rubocop to 0.42.0 {#278}[https://github.com/ruby-ldap/ruby-net-ldap/pull/278]
53
+
54
+ === Net::LDAP 0.15.0
55
+
56
+ * Respect connect_timeout when establishing SSL connections {#273}[https://github.com/ruby-ldap/ruby-net-ldap/pull/273]
57
+
58
+ === Net::LDAP 0.14.0
59
+
60
+ * Normalize the encryption parameter passed to the LDAP constructor {#264}[https://github.com/ruby-ldap/ruby-net-ldap/pull/264]
61
+ * Update Docs: Net::LDAP now requires ruby >= 2 {#261}[https://github.com/ruby-ldap/ruby-net-ldap/pull/261]
62
+ * fix symbol proc {#255}[https://github.com/ruby-ldap/ruby-net-ldap/pull/255]
63
+ * fix trailing commas {#256}[https://github.com/ruby-ldap/ruby-net-ldap/pull/256]
64
+ * fix deprecated hash methods {#254}[https://github.com/ruby-ldap/ruby-net-ldap/pull/254]
65
+ * fix space after comma {#253}[https://github.com/ruby-ldap/ruby-net-ldap/pull/253]
66
+ * fix space inside brackets {#252}[https://github.com/ruby-ldap/ruby-net-ldap/pull/252]
67
+ * Rubocop style fixes {#249}[https://github.com/ruby-ldap/ruby-net-ldap/pull/249]
68
+ * Lazy initialize Net::LDAP::Connection's internal socket {#235}[https://github.com/ruby-ldap/ruby-net-ldap/pull/235]
69
+ * Support for rfc3062 Password Modify, closes #163 {#178}[https://github.com/ruby-ldap/ruby-net-ldap/pull/178]
70
+
71
+ === Net::LDAP 0.13.0
72
+
73
+ Avoid this release for because of an backwards incompatibility in how encryption
74
+ is initialized https://github.com/ruby-ldap/ruby-net-ldap/pull/264. We did not
75
+ yank it because people have already worked around it.
76
+
77
+ * Set a connect_timeout for the creation of a socket {#243}[https://github.com/ruby-ldap/ruby-net-ldap/pull/243]
78
+ * Update bundler before installing gems with bundler {#245}[https://github.com/ruby-ldap/ruby-net-ldap/pull/245]
79
+ * Net::LDAP#encryption accepts string {#239}[https://github.com/ruby-ldap/ruby-net-ldap/pull/239]
80
+ * Adds correct UTF-8 encoding to Net::BER::BerIdentifiedString {#242}[https://github.com/ruby-ldap/ruby-net-ldap/pull/242]
81
+ * Remove 2.3.0-preview since ruby-head already is included {#241}[https://github.com/ruby-ldap/ruby-net-ldap/pull/241]
82
+ * Drop support for ruby 1.9.3 {#240}[https://github.com/ruby-ldap/ruby-net-ldap/pull/240]
83
+ * Fixed capitalization of StartTLSError {#234}[https://github.com/ruby-ldap/ruby-net-ldap/pull/234]
84
+
85
+ === Net::LDAP 0.12.1
86
+
87
+ * Whitespace formatting cleanup {#236}[https://github.com/ruby-ldap/ruby-net-ldap/pull/236]
88
+ * Set operation result if LDAP server is not accessible {#232}[https://github.com/ruby-ldap/ruby-net-ldap/pull/232]
89
+
90
+ === Net::LDAP 0.12.0
91
+
92
+ * DRY up connection handling logic {#224}[https://github.com/ruby-ldap/ruby-net-ldap/pull/224]
93
+ * Define auth adapters {#226}[https://github.com/ruby-ldap/ruby-net-ldap/pull/226]
94
+ * add slash to attribute value filter {#225}[https://github.com/ruby-ldap/ruby-net-ldap/pull/225]
95
+ * Add the ability to provide a list of hosts for a connection {#223}[https://github.com/ruby-ldap/ruby-net-ldap/pull/223]
96
+ * Specify the port of LDAP server by giving INTEGRATION_PORT {#221}[https://github.com/ruby-ldap/ruby-net-ldap/pull/221]
97
+ * Correctly set BerIdentifiedString values to UTF-8 {#212}[https://github.com/ruby-ldap/ruby-net-ldap/pull/212]
98
+ * Raise Net::LDAP::ConnectionRefusedError when new connection is refused. {#213}[https://github.com/ruby-ldap/ruby-net-ldap/pull/213]
99
+ * obscure auth password upon #inspect, added test, closes #216 {#217}[https://github.com/ruby-ldap/ruby-net-ldap/pull/217]
100
+ * Fixing incorrect error class name {#207}[https://github.com/ruby-ldap/ruby-net-ldap/pull/207]
101
+ * Travis update {#205}[https://github.com/ruby-ldap/ruby-net-ldap/pull/205]
102
+ * Remove obsolete rbx-19mode from Travis {#204}[https://github.com/ruby-ldap/ruby-net-ldap/pull/204]
103
+ * mv "sudo" from script/install-openldap to .travis.yml {#199}[https://github.com/ruby-ldap/ruby-net-ldap/pull/199]
104
+ * Remove meaningless shebang {#200}[https://github.com/ruby-ldap/ruby-net-ldap/pull/200]
105
+ * Fix Travis CI build {#202}[https://github.com/ruby-ldap/ruby-net-ldap/pull/202]
106
+ * README.rdoc: fix travis link {#195}[https://github.com/ruby-ldap/ruby-net-ldap/pull/195]
107
+
108
+ === Net::LDAP 0.11
109
+ * Major enhancements:
110
+ * #183 Specific errors subclassing Net::LDAP::Error
111
+ * Bug fixes:
112
+ * #176 Fix nil tls options
113
+ * #184 Search guards against nil queued reads. Connection#unescape handles numerics
114
+ * Code clean-up:
115
+ * #180 Refactor connection establishment
116
+
117
+ === Net::LDAP 0.10.1
118
+ * Bug fixes:
119
+ * Fix Integer BER encoding of signed values
120
+
121
+ === Net::LDAP 0.10.0
122
+ * Major enhancements:
123
+ * Accept SimpleTLS/StartTLS encryption options (compatible with `OpenSSL::SSL::SSLContext#set_params`)
124
+ * Bug fixes:
125
+ * Parse filter strings with square and curly braces (`[]` and `{}`)
126
+ * Handle connection timeout errors (`Errno::ETIMEDOUT` raised as `Net::LDAP::LdapError`)
127
+ * Testing changes:
128
+ * Add integration tests for StartTLS connections to OpenLDAP
129
+ * Meta changes:
130
+ * Update Gem release tooling (remove Hoe, use Rake)
131
+ * Fix Gem release date
132
+
133
+ === Net::LDAP 0.9.0
134
+ * Major changes:
135
+ * Dropped support for ruby 1.8.7, ruby >= 1.9.3 now required
136
+ * Major enhancements:
137
+ * Add support for search time limit parameter
138
+ * Instrument received messages, PDU parsing
139
+ * Minor enhancments:
140
+ * Add support for querying ActiveDirectory capabilities from root dse
141
+ * Bug fixes:
142
+ * Fix reads for multiple concurrent requests with shared, open connections mixing up the results
143
+ * Fix search size option
144
+ * Fix BER encoding bug
145
+ * Code clean-up:
146
+ * Added integration test suite
147
+ * Switch to minitest
148
+
149
+ * Details
150
+ * #150 Support querying ActiveDirectory capabilities when searching root dse
151
+ * #142 Encode true as xFF
152
+ * #124, #145, #146, #152 Cleanup gemspec
153
+ * #138, #144 Track response messages by message id
154
+ * #141 Magic number/constant cleanup
155
+ * #119, #129, #130, #132, #133, #137 Integration tests
156
+ * #115 Search timeout support
157
+ * #140 Fix search size option
158
+ * #139 Cleanup and inline documentation for Net::LDAP::Connection#search
159
+ * #131 Instrumentation
160
+ * #116 Refactor Connection#write
161
+ * #126 Update gitignore
162
+ * #128 Fix whitespace
163
+ * #113, #121 Switch to minitest
164
+ * #123 Base64 encoded dn
165
+ * #114 Separate file for Net::LDAP::Connection
166
+ * #104 Parse version spec in LDIF datasets
167
+ * #106 ldap.modify doc fixes
168
+ * #111 Fix test deprecations
169
+
170
+ === Net::LDAP 0.5.0 / 2013-07-22
171
+ * Major changes:
172
+ * Required Ruby version is >=1.9.3
173
+ * Major enhancements:
174
+ * Added alias dereferencing (@ngwilson)
175
+ * BER now unescapes characters that are already escaped in the source string (@jzinn)
176
+ * BerIdentifiedString will now fall back to ASCII-8 encoding if the source Ruby object cannot be encoded in UTF-8 (@lfu)
177
+ * Bug fixes:
178
+ * Fixed nil variable error when following a reference response (@cmdrclueless)
179
+ * Fixed FilterParser unable to parse multibyte strings (@satoryu)
180
+ * Return ConverterNotFound when dealing with a potentially corrupt data response (@jamuc)
181
+
1
182
  === Net::LDAP 0.3.1 / 2012-02-15
2
183
  * Bug Fixes:
3
184
  * Bundler should now work again
data/README.rdoc CHANGED
@@ -1,4 +1,6 @@
1
- = Net::LDAP for Ruby
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
 
@@ -16,21 +18,16 @@ the most recent LDAP RFCs (4510–4519, plus portions of 4520–4532).
16
18
 
17
19
  == Where
18
20
 
19
- * {RubyForge}[http://rubyforge.org/projects/net-ldap]
20
21
  * {GitHub}[https://github.com/ruby-ldap/ruby-net-ldap]
21
22
  * {ruby-ldap@googlegroups.com}[http://groups.google.com/group/ruby-ldap]
22
- * {Documentation}[http://net-ldap.rubyforge.org/]
23
-
24
- The Net::LDAP for Ruby documentation, project description, and main downloads
25
- can currently be found on {RubyForge}[http://rubyforge.org/projects/net-ldap].
26
23
 
27
24
  == Synopsis
28
25
 
29
- See Net::LDAP for documentation and usage samples.
26
+ See {Net::LDAP on rubydoc.info}[https://www.rubydoc.info/gems/net-ldap/Net/LDAP] for documentation and usage samples.
30
27
 
31
28
  == Requirements
32
29
 
33
- Net::LDAP requires a Ruby 1.8.7 interpreter or better.
30
+ Net::LDAP requires a Ruby 2.0.0 compatible interpreter or better.
34
31
 
35
32
  == Install
36
33
 
@@ -42,10 +39,45 @@ sources.
42
39
 
43
40
  Simply require either 'net-ldap' or 'net/ldap'.
44
41
 
45
- For non-RubyGems installations of Net::LDAP, you can use Minero Aoki's
46
- {setup.rb}[http://i.loveruby.net/en/projects/setup/] as the layout of
47
- Net::LDAP is compliant. The setup installer is not included in the
48
- Net::LDAP repository.
42
+ == Extensions
43
+
44
+ This library focuses on the core LDAP RFCs referenced in the description.
45
+ However, we recognize there are commonly used extensions to the spec that are
46
+ useful. If there is another library which handles it, we list it here.
47
+
48
+ * {resolv-srv}[https://rubygems.org/gems/resolv-srv]: Support RFC2782 SRV record lookup and failover
49
+
50
+ == Develop
51
+
52
+ This task will run the test suite and the
53
+ {RuboCop}[https://github.com/bbatsov/rubocop] static code analyzer.
54
+
55
+ rake rubotest
56
+
57
+ CI takes too long? If your local box supports
58
+ {Docker}[https://www.docker.com/], you can also run integration tests locally.
59
+ Simply run:
60
+
61
+ script/ldap-docker
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
67
+
68
+ CAVEAT: you need to add the following line to /etc/hosts
69
+ 127.0.0.1 ldap.example.org
70
+ 127.0.0.1 cert.mismatch.example.org
71
+
72
+ == Release
73
+
74
+ This section is for gem maintainers to cut a new version of the gem.
75
+
76
+ * Check out a new branch `release-VERSION`
77
+ * Update lib/net/ldap/version.rb to next version number X.X.X following {semver}[http://semver.org/].
78
+ * Update `History.rdoc`. Get latest changes with `script/changelog`
79
+ * Open a pull request with these changes for review
80
+ * After merging, on the master branch, run `script/release`
49
81
 
50
82
  :include: Contributors.rdoc
51
83
 
data/lib/net-ldap.rb CHANGED
@@ -1,2 +1,2 @@
1
1
  # -*- ruby encoding: utf-8 -*-
2
- require 'net/ldap'
2
+ require_relative 'net/ldap'
data/lib/net/ber.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  # -*- ruby encoding: utf-8 -*-
2
+ require_relative 'ldap/version'
3
+
2
4
  module Net # :nodoc:
3
5
  ##
4
6
  # == Basic Encoding Rules (BER) Support Module
@@ -104,9 +106,10 @@ module Net # :nodoc:
104
106
  # <tr><th>CHARACTER STRING</th><th>C</th><td>29: 61 (0x3d, 0b00111101)</td></tr>
105
107
  # <tr><th>BMPString</th><th>P</th><td>30: 30 (0x1e, 0b00011110)</td></tr>
106
108
  # <tr><th>BMPString</th><th>C</th><td>30: 62 (0x3e, 0b00111110)</td></tr>
109
+ # <tr><th>ExtendedResponse</th><th>C</th><td>107: 139 (0x8b, 0b010001011)</td></tr>
107
110
  # </table>
108
111
  module BER
109
- VERSION = '0.3.1'
112
+ VERSION = Net::LDAP::VERSION
110
113
 
111
114
  ##
112
115
  # Used for BER-encoding the length and content bytes of a Fixnum integer
@@ -232,7 +235,7 @@ module Net # :nodoc:
232
235
  # TODO 20100327 AZ: Should we be allocating an array of 256 values
233
236
  # that will either be +nil+ or an object type symbol, or should we
234
237
  # allocate an empty Hash since unknown values return +nil+ anyway?
235
- out = [ nil ] * 256
238
+ out = [nil] * 256
236
239
  syntax.each do |tag_class_id, encodings|
237
240
  tag_class = TAG_CLASS[tag_class_id]
238
241
  encodings.each do |encoding_id, classes|
@@ -267,7 +270,7 @@ class Net::BER::BerIdentifiedOid
267
270
 
268
271
  def initialize(oid)
269
272
  if oid.is_a?(String)
270
- oid = oid.split(/\./).map {|s| s.to_i }
273
+ oid = oid.split(/\./).map(&:to_i)
271
274
  end
272
275
  @value = oid
273
276
  end
@@ -291,12 +294,43 @@ end
291
294
 
292
295
  ##
293
296
  # A String object with a BER identifier attached.
297
+ #
294
298
  class Net::BER::BerIdentifiedString < String
295
299
  attr_accessor :ber_identifier
300
+
301
+ # The binary data provided when parsing the result of the LDAP search
302
+ # has the encoding 'ASCII-8BIT' (which is basically 'BINARY', or 'unknown').
303
+ #
304
+ # This is the kind of a backtrace showing how the binary `data` comes to
305
+ # BerIdentifiedString.new(data):
306
+ #
307
+ # @conn.read_ber(syntax)
308
+ # -> StringIO.new(self).read_ber(syntax), i.e. included from module
309
+ # -> Net::BER::BERParser.read_ber(syntax)
310
+ # -> (private)Net::BER::BERParser.parse_ber_object(syntax, id, data)
311
+ #
312
+ # In the `#parse_ber_object` method `data`, according to its OID, is being
313
+ # 'casted' to one of the Net::BER:BerIdentifiedXXX classes.
314
+ #
315
+ # As we are using LDAP v3 we can safely assume that the data is encoded
316
+ # in UTF-8 and therefore the only thing to be done when instantiating is to
317
+ # switch the encoding from 'ASCII-8BIT' to 'UTF-8'.
318
+ #
319
+ # Unfortunately, there are some ActiveDirectory specific attributes
320
+ # (like `objectguid`) that should remain binary (do they really?).
321
+ # Using the `#valid_encoding?` we can trap this cases. Special cases like
322
+ # Japanese, Korean, etc. encodings might also profit from this. However
323
+ # I have no clue how this encodings function.
296
324
  def initialize args
297
- super args
298
- # LDAP uses UTF-8 encoded strings
299
- force_encoding('UTF-8') if respond_to?(:encoding)
325
+ super
326
+ #
327
+ # Check the encoding of the newly created String and set the encoding
328
+ # to 'UTF-8' (NOTE: we do NOT change the bytes, but only set the
329
+ # encoding to 'UTF-8').
330
+ return unless encoding == Encoding::BINARY
331
+ current_encoding = encoding
332
+ force_encoding('UTF-8')
333
+ force_encoding(current_encoding) unless valid_encoding?
300
334
  end
301
335
  end
302
336
 
@@ -315,4 +349,4 @@ module Net::BER
315
349
  Null = Net::BER::BerIdentifiedNull.new
316
350
  end
317
351
 
318
- require 'net/ber/core_ext'
352
+ require_relative 'ber/core_ext'
@@ -14,7 +14,7 @@ module Net::BER::BERParser
14
14
  }
15
15
  constructed = {
16
16
  16 => :array,
17
- 17 => :array
17
+ 17 => :array,
18
18
  }
19
19
  universal = { :primitive => primitive, :constructed => constructed }
20
20
 
@@ -41,9 +41,18 @@ module Net::BER::BERParser
41
41
  s.ber_identifier = id
42
42
  s
43
43
  elsif object_type == :integer
44
- j = 0
45
- data.each_byte { |b| j = (j << 8) + b }
46
- j
44
+ neg = !(data.unpack("C").first & 0x80).zero?
45
+ int = 0
46
+
47
+ data.each_byte do |b|
48
+ int = (int << 8) + (neg ? 255 - b : b)
49
+ end
50
+
51
+ if neg
52
+ (int + 1) * -1
53
+ else
54
+ int
55
+ end
47
56
  elsif object_type == :oid
48
57
  # See X.690 pgh 8.19 for an explanation of this algorithm.
49
58
  # This is potentially not good enough. We may need a
@@ -148,6 +157,9 @@ module Net::BER::BERParser
148
157
  # implemented on the including object and that it returns a Fixnum value.
149
158
  # Also requires #read(bytes) to work.
150
159
  #
160
+ # Yields the object type `id` and the data `content_length` if a block is
161
+ # given. This is namely to support instrumentation.
162
+ #
151
163
  # This does not work with non-blocking I/O.
152
164
  def read_ber(syntax = nil)
153
165
  # TODO: clean this up so it works properly with partial packets coming
@@ -157,11 +169,13 @@ module Net::BER::BERParser
157
169
  id = getbyte or return nil # don't trash this value, we'll use it later
158
170
  content_length = read_ber_length
159
171
 
172
+ yield id, content_length if block_given?
173
+
160
174
  if -1 == content_length
161
- raise Net::BER::BerError, "Indeterminite BER content length not implemented."
162
- else
163
- data = read(content_length)
175
+ raise Net::BER::BerError,
176
+ "Indeterminite BER content length not implemented."
164
177
  end
178
+ data = read(content_length)
165
179
 
166
180
  parse_ber_object(syntax, id, data)
167
181
  end