Skip to content

Commit 6186e41

Browse files
committed
Use queued_read for start_tls
1 parent e015dfb commit 6186e41

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

lib/net/ldap/connection.rb

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,18 @@ def setup_encryption(args)
8787
# additional branches requiring server validation and peer certs, etc.
8888
# go here.
8989
when :start_tls
90-
request = [Net::LDAP::StartTlsOid.to_ber_contextspecific(0)].to_ber_appsequence(Net::LDAP::PDU::ExtendedRequest)
91-
write(request)
92-
pdu = read
93-
raise Net::LDAP::LdapError, "no start_tls result" if pdu.nil?
90+
message_id = next_msgid
91+
request = [
92+
Net::LDAP::StartTlsOid.to_ber_contextspecific(0)
93+
].to_ber_appsequence(Net::LDAP::PDU::ExtendedRequest)
94+
95+
write(request, nil, message_id)
96+
pdu = queued_read(message_id)
97+
98+
if pdu.nil? || pdu.app_tag != Net::LDAP::PDU::ExtendedResponse
99+
raise Net::LDAP::LdapError, "no start_tls result"
100+
end
101+
94102
if pdu.result_code.zero?
95103
@conn = self.class.wrap_with_ssl(@conn)
96104
else

test/test_ldap_connection.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,25 @@ def test_queued_read_delete
191191
assert result.success?
192192
assert_equal 2, result.message_id
193193
end
194+
195+
def test_queued_read_setup_encryption_with_start_tls
196+
result1 = make_message(1, app_tag: Net::LDAP::PDU::SearchResult)
197+
result2 = make_message(2, app_tag: Net::LDAP::PDU::ExtendedResponse)
198+
199+
mock = flexmock("socket")
200+
mock.should_receive(:read_ber).
201+
and_return(result1).
202+
and_return(result2)
203+
mock.should_receive(:write)
204+
conn = Net::LDAP::Connection.new(:socket => mock)
205+
flexmock(Net::LDAP::Connection).should_receive(:wrap_with_ssl).with(mock).
206+
and_return(mock)
207+
208+
conn.next_msgid # simulates ongoing query
209+
210+
assert result = conn.setup_encryption(method: :start_tls)
211+
assert_equal mock, result
212+
end
194213
end
195214

196215
class TestLDAPConnectionErrors < Test::Unit::TestCase

0 commit comments

Comments
 (0)