net-ldap 0.17.1 → 0.20.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.
- checksums.yaml +4 -4
- data/History.rdoc +24 -0
- data/README.rdoc +1 -1
- data/lib/net/ldap/auth_adapter/gss_spnego.rb +1 -1
- data/lib/net/ldap/auth_adapter/sasl.rb +1 -1
- data/lib/net/ldap/auth_adapter/simple.rb +1 -1
- data/lib/net/ldap/connection.rb +43 -10
- data/lib/net/ldap/dn.rb +9 -17
- data/lib/net/ldap/password.rb +6 -2
- data/lib/net/ldap/pdu.rb +2 -2
- data/lib/net/ldap/version.rb +1 -1
- data/lib/net/ldap.rb +24 -4
- metadata +16 -61
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f1ae20f7f3f599999e4178becdc139f1aaa81b97021696ab3dd8aa78442ca7f
|
4
|
+
data.tar.gz: 7dc05aad5c2d2e6cb2ca9abd22654139fa236cd97d5e16467733f64dd3cf398e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e39aaf763a7e29c4f271958a4cc93216afef8705661fc8483c2facf67796a67f1e42d2683efe4bca4b908178d251bb2acb1d2dc3fae8e2c489067e2767d547ce
|
7
|
+
data.tar.gz: fb6c7de22a5584d39e9a08bc2b270870cde9c6454af49eeadaccaf4717a6432763bdb0ced4488821b7dfaa9875635e6b4683baf8cd851f48aca743927c54af8a
|
data/History.rdoc
CHANGED
@@ -1,3 +1,27 @@
|
|
1
|
+
=== Net::LDAP 0.20.0
|
2
|
+
* Update test.yml by @HarlemSquirrel in #433
|
3
|
+
* Add `ostruct` as a dependency to the gemspec by @Ivanov-Anton in #432
|
4
|
+
* Require Ruby >= 3.0 by @HarlemSquirrel in #435
|
5
|
+
* Link to usage examples by @sebbASF in #428
|
6
|
+
* Add controls for modify and add operations by @zeroSteiner in #426
|
7
|
+
* Add support for ldapwhoami (RFC4532) (now with tests) by @zeroSteiner in #425
|
8
|
+
* Update for ruby 3.4 by @HarlemSquirrel in #439
|
9
|
+
* Add ruby 3.4 to CI by @hakeem0114 in #438
|
10
|
+
* Add support for UTF-8 encoded passwords by @frankwalentowski in #430
|
11
|
+
|
12
|
+
=== Net::LDAP 0.19.0
|
13
|
+
* Net::LDAP::DN - Retain trailing spaces in RDN values in DNs #412
|
14
|
+
* Add in ability for users to specify LDAP controls when conducting searches #411
|
15
|
+
* Document connect_timeout in Constructor Details #415
|
16
|
+
* Fix openssl error when using multiple hosts #417
|
17
|
+
|
18
|
+
=== Net::LDAP 0.18.0
|
19
|
+
* Fix escaping of # and space in attrs #408
|
20
|
+
* Add support to use SNI #406
|
21
|
+
* Drop Ruby 2.5 and JRuby 9.2 from CI tests
|
22
|
+
* Bump rubocop to 1.48.1
|
23
|
+
* Update CI for TruffleRuby 22
|
24
|
+
|
1
25
|
=== Net::LDAP 0.17.1
|
2
26
|
* Fixed shebang of bash #385
|
3
27
|
* Omit some tests for now until we update our CA cert #386
|
data/README.rdoc
CHANGED
@@ -23,7 +23,7 @@ the most recent LDAP RFCs (4510–4519, plus portions of 4520–4532).
|
|
23
23
|
|
24
24
|
== Synopsis
|
25
25
|
|
26
|
-
See {Net::LDAP on rubydoc.info}[https://www.rubydoc.info/github/ruby-ldap/ruby-net-ldap] for documentation and usage samples.
|
26
|
+
See {Net::LDAP on rubydoc.info}[https://www.rubydoc.info/github/ruby-ldap/ruby-net-ldap/Net/LDAP] for documentation and usage samples.
|
27
27
|
|
28
28
|
== Requirements
|
29
29
|
|
@@ -20,7 +20,7 @@ module Net
|
|
20
20
|
require 'ntlm'
|
21
21
|
|
22
22
|
user, psw = [auth[:username] || auth[:dn], auth[:password]]
|
23
|
-
raise Net::LDAP::BindingInformationInvalidError, "Invalid binding information" unless
|
23
|
+
raise Net::LDAP::BindingInformationInvalidError, "Invalid binding information" unless user && psw
|
24
24
|
|
25
25
|
nego = proc do |challenge|
|
26
26
|
t2_msg = NTLM::Message.parse(challenge)
|
@@ -30,7 +30,7 @@ module Net
|
|
30
30
|
def bind(auth)
|
31
31
|
mech, cred, chall = auth[:mechanism], auth[:initial_credential],
|
32
32
|
auth[:challenge_response]
|
33
|
-
raise Net::LDAP::BindingInformationInvalidError, "Invalid binding information" unless
|
33
|
+
raise Net::LDAP::BindingInformationInvalidError, "Invalid binding information" unless mech && cred && chall
|
34
34
|
|
35
35
|
message_id = @connection.next_msgid
|
36
36
|
|
@@ -11,7 +11,7 @@ module Net
|
|
11
11
|
["", ""]
|
12
12
|
end
|
13
13
|
|
14
|
-
raise Net::LDAP::BindingInformationInvalidError, "Invalid binding information" unless
|
14
|
+
raise Net::LDAP::BindingInformationInvalidError, "Invalid binding information" unless user && psw
|
15
15
|
|
16
16
|
message_id = @connection.next_msgid
|
17
17
|
request = [
|
data/lib/net/ldap/connection.rb
CHANGED
@@ -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] &&
|
@@ -86,7 +86,7 @@ class Net::LDAP::Connection #:nodoc:
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
-
def self.wrap_with_ssl(io, tls_options = {}, timeout=nil)
|
89
|
+
def self.wrap_with_ssl(io, tls_options = {}, timeout=nil, hostname=nil)
|
90
90
|
raise Net::LDAP::NoOpenSSLError, "OpenSSL is unavailable" unless Net::LDAP::HasOpenSSL
|
91
91
|
|
92
92
|
ctx = OpenSSL::SSL::SSLContext.new
|
@@ -96,6 +96,7 @@ class Net::LDAP::Connection #:nodoc:
|
|
96
96
|
ctx.set_params(tls_options) unless tls_options.empty?
|
97
97
|
|
98
98
|
conn = OpenSSL::SSL::SSLSocket.new(io, ctx)
|
99
|
+
conn.hostname = hostname
|
99
100
|
|
100
101
|
begin
|
101
102
|
if timeout
|
@@ -148,11 +149,11 @@ class Net::LDAP::Connection #:nodoc:
|
|
148
149
|
# communications, as with simple_tls. Thanks for Kouhei Sutou for
|
149
150
|
# generously contributing the :start_tls path.
|
150
151
|
#++
|
151
|
-
def setup_encryption(args, timeout=nil)
|
152
|
+
def setup_encryption(args, timeout=nil, hostname=nil)
|
152
153
|
args[:tls_options] ||= {}
|
153
154
|
case args[:method]
|
154
155
|
when :simple_tls
|
155
|
-
@conn = self.class.wrap_with_ssl(@conn, args[:tls_options], timeout)
|
156
|
+
@conn = self.class.wrap_with_ssl(@conn, args[:tls_options], timeout, hostname)
|
156
157
|
# additional branches requiring server validation and peer certs, etc.
|
157
158
|
# go here.
|
158
159
|
when :start_tls
|
@@ -170,7 +171,7 @@ class Net::LDAP::Connection #:nodoc:
|
|
170
171
|
|
171
172
|
raise Net::LDAP::StartTLSError,
|
172
173
|
"start_tls failed: #{pdu.result_code}" unless pdu.result_code.zero?
|
173
|
-
@conn = self.class.wrap_with_ssl(@conn, args[:tls_options], timeout)
|
174
|
+
@conn = self.class.wrap_with_ssl(@conn, args[:tls_options], timeout, hostname)
|
174
175
|
else
|
175
176
|
raise Net::LDAP::EncMethodUnsupportedError, "unsupported encryption method #{args[:method]}"
|
176
177
|
end
|
@@ -423,6 +424,7 @@ class Net::LDAP::Connection #:nodoc:
|
|
423
424
|
# this breaks when calling to_ber. (Can't force binary data to UTF-8)
|
424
425
|
# we have to disable paging (even though server supports it) to get around this...
|
425
426
|
|
427
|
+
user_controls = args.fetch(:controls, [])
|
426
428
|
controls = []
|
427
429
|
controls <<
|
428
430
|
[
|
@@ -432,7 +434,12 @@ class Net::LDAP::Connection #:nodoc:
|
|
432
434
|
rfc2696_cookie.map(&:to_ber).to_ber_sequence.to_s.to_ber,
|
433
435
|
].to_ber_sequence if paged
|
434
436
|
controls << ber_sort if ber_sort
|
435
|
-
|
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
|
436
443
|
|
437
444
|
write(request, controls, message_id)
|
438
445
|
|
@@ -562,7 +569,12 @@ class Net::LDAP::Connection #:nodoc:
|
|
562
569
|
ops.to_ber_sequence,
|
563
570
|
].to_ber_appsequence(Net::LDAP::PDU::ModifyRequest)
|
564
571
|
|
565
|
-
|
572
|
+
controls = args.fetch(:controls, nil)
|
573
|
+
unless controls.nil?
|
574
|
+
controls = controls.to_ber_contextspecific(0)
|
575
|
+
end
|
576
|
+
|
577
|
+
write(request, controls, message_id)
|
566
578
|
pdu = queued_read(message_id)
|
567
579
|
|
568
580
|
if !pdu || pdu.app_tag != Net::LDAP::PDU::ModifyResponse
|
@@ -634,7 +646,12 @@ class Net::LDAP::Connection #:nodoc:
|
|
634
646
|
message_id = next_msgid
|
635
647
|
request = [add_dn.to_ber, add_attrs.to_ber_sequence].to_ber_appsequence(Net::LDAP::PDU::AddRequest)
|
636
648
|
|
637
|
-
|
649
|
+
controls = args.fetch(:controls, nil)
|
650
|
+
unless controls.nil?
|
651
|
+
controls = controls.to_ber_contextspecific(0)
|
652
|
+
end
|
653
|
+
|
654
|
+
write(request, controls, message_id)
|
638
655
|
pdu = queued_read(message_id)
|
639
656
|
|
640
657
|
if !pdu || pdu.app_tag != Net::LDAP::PDU::AddResponse
|
@@ -686,6 +703,22 @@ class Net::LDAP::Connection #:nodoc:
|
|
686
703
|
pdu
|
687
704
|
end
|
688
705
|
|
706
|
+
def ldapwhoami
|
707
|
+
ext_seq = [Net::LDAP::WhoamiOid.to_ber_contextspecific(0)]
|
708
|
+
request = ext_seq.to_ber_appsequence(Net::LDAP::PDU::ExtendedRequest)
|
709
|
+
|
710
|
+
message_id = next_msgid
|
711
|
+
|
712
|
+
write(request, nil, message_id)
|
713
|
+
pdu = queued_read(message_id)
|
714
|
+
|
715
|
+
if !pdu || pdu.app_tag != Net::LDAP::PDU::ExtendedResponse
|
716
|
+
raise Net::LDAP::ResponseMissingOrInvalidError, "response missing or invalid"
|
717
|
+
end
|
718
|
+
|
719
|
+
pdu
|
720
|
+
end
|
721
|
+
|
689
722
|
# Internal: Returns a Socket like object used internally to communicate with
|
690
723
|
# LDAP server.
|
691
724
|
#
|
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
|
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
|
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
|
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
|
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
|
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
|
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.
|
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| "\\" +
|
207
|
+
string.gsub(ESCAPE_RE) { |char| "\\" + char }
|
216
208
|
end
|
217
209
|
|
218
210
|
##
|
data/lib/net/ldap/password.rb
CHANGED
@@ -28,10 +28,14 @@ class Net::LDAP::Password
|
|
28
28
|
'{SHA}' + Base64.strict_encode64(Digest::SHA1.digest(str))
|
29
29
|
when :ssha
|
30
30
|
salt = SecureRandom.random_bytes(16)
|
31
|
-
|
31
|
+
digest = Digest::SHA1.new
|
32
|
+
digest << str << salt
|
33
|
+
'{SSHA}' + Base64.strict_encode64(digest.digest + salt)
|
32
34
|
when :ssha256
|
33
35
|
salt = SecureRandom.random_bytes(16)
|
34
|
-
|
36
|
+
digest = Digest::SHA256.new
|
37
|
+
digest << str << salt
|
38
|
+
'{SSHA256}' + Base64.strict_encode64(digest.digest + salt)
|
35
39
|
else
|
36
40
|
raise Net::LDAP::HashTypeUnsupportedError, "Unsupported password-hash type (#{type})"
|
37
41
|
end
|
data/lib/net/ldap/pdu.rb
CHANGED
@@ -194,13 +194,13 @@ class Net::LDAP::PDU
|
|
194
194
|
# requestValue [1] OCTET STRING OPTIONAL }
|
195
195
|
|
196
196
|
def parse_extended_response(sequence)
|
197
|
-
sequence.length
|
197
|
+
sequence.length.between?(3, 5) or raise Net::LDAP::PDU::Error, "Invalid LDAP result length."
|
198
198
|
@ldap_result = {
|
199
199
|
:resultCode => sequence[0],
|
200
200
|
:matchedDN => sequence[1],
|
201
201
|
:errorMessage => sequence[2],
|
202
202
|
}
|
203
|
-
@extended_response = sequence
|
203
|
+
@extended_response = sequence.length == 3 ? nil : sequence.last
|
204
204
|
end
|
205
205
|
private :parse_extended_response
|
206
206
|
|
data/lib/net/ldap/version.rb
CHANGED
data/lib/net/ldap.rb
CHANGED
@@ -311,7 +311,7 @@ class Net::LDAP
|
|
311
311
|
0 => :array, # RFC-2251 Control and Filter-AND
|
312
312
|
1 => :array, # SearchFilter-OR
|
313
313
|
2 => :array, # SearchFilter-NOT
|
314
|
-
3 => :array, #
|
314
|
+
3 => :array, # Search referral
|
315
315
|
4 => :array, # unknown use in Microsoft Outlook
|
316
316
|
5 => :array, # SearchFilter-GE
|
317
317
|
6 => :array, # SearchFilter-LE
|
@@ -325,7 +325,7 @@ class Net::LDAP
|
|
325
325
|
|
326
326
|
universal = {
|
327
327
|
constructed: {
|
328
|
-
107 => :
|
328
|
+
107 => :string, # ExtendedResponse
|
329
329
|
},
|
330
330
|
}
|
331
331
|
|
@@ -341,6 +341,7 @@ class Net::LDAP
|
|
341
341
|
|
342
342
|
StartTlsOid = '1.3.6.1.4.1.1466.20037'
|
343
343
|
PasswdModifyOid = '1.3.6.1.4.1.4203.1.11.1'
|
344
|
+
WhoamiOid = '1.3.6.1.4.1.4203.1.11.3'
|
344
345
|
|
345
346
|
# https://tools.ietf.org/html/rfc4511#section-4.1.9
|
346
347
|
# https://tools.ietf.org/html/rfc4511#appendix-A
|
@@ -480,6 +481,8 @@ class Net::LDAP
|
|
480
481
|
# server says it supports them. This is a fix for MS Active Directory
|
481
482
|
# * :instrumentation_service => An object responsible for instrumenting
|
482
483
|
# operations, compatible with ActiveSupport::Notifications' public API.
|
484
|
+
# * :connect_timeout => The TCP socket timeout (in seconds) to use when
|
485
|
+
# connecting to the LDAP server (default 5 seconds).
|
483
486
|
# * :encryption => specifies the encryption to be used in communicating
|
484
487
|
# with the LDAP server. The value must be a Hash containing additional
|
485
488
|
# parameters, which consists of two keys:
|
@@ -1198,6 +1201,23 @@ class Net::LDAP
|
|
1198
1201
|
end
|
1199
1202
|
end
|
1200
1203
|
|
1204
|
+
# Return the authorization identity of the client that issues the
|
1205
|
+
# ldapwhoami request. The method does not support any arguments.
|
1206
|
+
#
|
1207
|
+
# Returns True or False to indicate whether the request was successfull.
|
1208
|
+
# The result is available in the extended status information when calling
|
1209
|
+
# #get_operation_result.
|
1210
|
+
#
|
1211
|
+
# ldap.ldapwhoami
|
1212
|
+
# puts ldap.get_operation_result.extended_response
|
1213
|
+
def ldapwhoami(args = {})
|
1214
|
+
instrument "ldapwhoami.net_ldap", args do |payload|
|
1215
|
+
@result = use_connection(args, &:ldapwhoami)
|
1216
|
+
@result.success? ? @result.extended_response : nil
|
1217
|
+
end
|
1218
|
+
end
|
1219
|
+
alias_method :whoami, :ldapwhoami
|
1220
|
+
|
1201
1221
|
# This method is experimental and subject to change. Return the rootDSE
|
1202
1222
|
# record from the LDAP server as a Net::LDAP::Entry, or an empty Entry if
|
1203
1223
|
# the server doesn't return the record.
|
@@ -1255,10 +1275,10 @@ class Net::LDAP
|
|
1255
1275
|
rs = search(:ignore_server_caps => true, :base => "",
|
1256
1276
|
:scope => SearchScope_BaseObject,
|
1257
1277
|
:attributes => [:subschemaSubentry])
|
1258
|
-
return Net::LDAP::Entry.new unless
|
1278
|
+
return Net::LDAP::Entry.new unless rs and rs.first
|
1259
1279
|
|
1260
1280
|
subschema_name = rs.first.subschemasubentry
|
1261
|
-
return Net::LDAP::Entry.new unless
|
1281
|
+
return Net::LDAP::Entry.new unless subschema_name and subschema_name.first
|
1262
1282
|
|
1263
1283
|
rs = search(:ignore_server_caps => true, :base => subschema_name.first,
|
1264
1284
|
:scope => SearchScope_BaseObject,
|
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.
|
4
|
+
version: 0.20.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Francis Cianfrocca
|
@@ -10,81 +10,38 @@ authors:
|
|
10
10
|
- Kaspar Schiess
|
11
11
|
- Austin Ziegler
|
12
12
|
- Michael Schaarschmidt
|
13
|
-
autorequire:
|
14
13
|
bindir: bin
|
15
14
|
cert_chain: []
|
16
|
-
date:
|
15
|
+
date: 2025-08-22 00:00:00.000000000 Z
|
17
16
|
dependencies:
|
18
17
|
- !ruby/object:Gem::Dependency
|
19
|
-
name:
|
18
|
+
name: base64
|
20
19
|
requirement: !ruby/object:Gem::Requirement
|
21
20
|
requirements:
|
22
|
-
- - "
|
21
|
+
- - ">="
|
23
22
|
- !ruby/object:Gem::Version
|
24
|
-
version: '
|
25
|
-
type: :
|
23
|
+
version: '0'
|
24
|
+
type: :runtime
|
26
25
|
prerelease: false
|
27
26
|
version_requirements: !ruby/object:Gem::Requirement
|
28
27
|
requirements:
|
29
|
-
- - "
|
28
|
+
- - ">="
|
30
29
|
- !ruby/object:Gem::Version
|
31
|
-
version: '
|
30
|
+
version: '0'
|
32
31
|
- !ruby/object:Gem::Dependency
|
33
|
-
name:
|
32
|
+
name: ostruct
|
34
33
|
requirement: !ruby/object:Gem::Requirement
|
35
34
|
requirements:
|
36
|
-
- - "
|
35
|
+
- - ">="
|
37
36
|
- !ruby/object:Gem::Version
|
38
|
-
version:
|
39
|
-
type: :
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
40
39
|
prerelease: false
|
41
40
|
version_requirements: !ruby/object:Gem::Requirement
|
42
41
|
requirements:
|
43
|
-
- - "
|
42
|
+
- - ">="
|
44
43
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: rubocop
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
requirements:
|
50
|
-
- - "~>"
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: 0.49.0
|
53
|
-
type: :development
|
54
|
-
prerelease: false
|
55
|
-
version_requirements: !ruby/object:Gem::Requirement
|
56
|
-
requirements:
|
57
|
-
- - "~>"
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version: 0.49.0
|
60
|
-
- !ruby/object:Gem::Dependency
|
61
|
-
name: test-unit
|
62
|
-
requirement: !ruby/object:Gem::Requirement
|
63
|
-
requirements:
|
64
|
-
- - "~>"
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: '3.3'
|
67
|
-
type: :development
|
68
|
-
prerelease: false
|
69
|
-
version_requirements: !ruby/object:Gem::Requirement
|
70
|
-
requirements:
|
71
|
-
- - "~>"
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
version: '3.3'
|
74
|
-
- !ruby/object:Gem::Dependency
|
75
|
-
name: byebug
|
76
|
-
requirement: !ruby/object:Gem::Requirement
|
77
|
-
requirements:
|
78
|
-
- - "~>"
|
79
|
-
- !ruby/object:Gem::Version
|
80
|
-
version: 9.0.6
|
81
|
-
type: :development
|
82
|
-
prerelease: false
|
83
|
-
version_requirements: !ruby/object:Gem::Requirement
|
84
|
-
requirements:
|
85
|
-
- - "~>"
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version: 9.0.6
|
44
|
+
version: '0'
|
88
45
|
description: |-
|
89
46
|
Net::LDAP for Ruby (also called net-ldap) implements client access for the
|
90
47
|
Lightweight Directory Access Protocol (LDAP), an IETF standard protocol for
|
@@ -146,7 +103,6 @@ homepage: http://github.com/ruby-ldap/ruby-net-ldap
|
|
146
103
|
licenses:
|
147
104
|
- MIT
|
148
105
|
metadata: {}
|
149
|
-
post_install_message:
|
150
106
|
rdoc_options:
|
151
107
|
- "--main"
|
152
108
|
- README.rdoc
|
@@ -156,15 +112,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
156
112
|
requirements:
|
157
113
|
- - ">="
|
158
114
|
- !ruby/object:Gem::Version
|
159
|
-
version:
|
115
|
+
version: 3.0.0
|
160
116
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
161
117
|
requirements:
|
162
118
|
- - ">="
|
163
119
|
- !ruby/object:Gem::Version
|
164
120
|
version: '0'
|
165
121
|
requirements: []
|
166
|
-
rubygems_version: 3.
|
167
|
-
signing_key:
|
122
|
+
rubygems_version: 3.6.2
|
168
123
|
specification_version: 4
|
169
124
|
summary: Net::LDAP for Ruby (also called net-ldap) implements client access for the
|
170
125
|
Lightweight Directory Access Protocol (LDAP), an IETF standard protocol for accessing
|