Skip to content

Commit 47017f1

Browse files
committed
Use queued_read for bind_simple
1 parent 6186e41 commit 47017f1

File tree

2 files changed

+37
-10
lines changed

2 files changed

+37
-10
lines changed

lib/net/ldap/connection.rb

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -234,12 +234,18 @@ def bind_simple(auth)
234234

235235
raise Net::LDAP::LdapError, "Invalid binding information" unless (user && psw)
236236

237-
request = [LdapVersion.to_ber, user.to_ber,
238-
psw.to_ber_contextspecific(0)].to_ber_appsequence(Net::LDAP::PDU::BindRequest)
239-
write(request)
237+
message_id = next_msgid
238+
request = [
239+
LdapVersion.to_ber, user.to_ber,
240+
psw.to_ber_contextspecific(0)
241+
].to_ber_appsequence(Net::LDAP::PDU::BindRequest)
242+
243+
write(request, nil, message_id)
244+
pdu = queued_read(message_id)
240245

241-
pdu = read
242-
raise Net::LDAP::LdapError, "no bind result" unless pdu
246+
if !pdu || pdu.app_tag != Net::LDAP::PDU::BindResult
247+
raise Net::LDAP::LdapError, "no bind result"
248+
end
243249

244250
pdu
245251
end

test/test_ldap_connection.rb

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,27 @@ def test_queued_read_setup_encryption_with_start_tls
210210
assert result = conn.setup_encryption(method: :start_tls)
211211
assert_equal mock, result
212212
end
213+
214+
def test_queued_read_bind_simple
215+
result1 = make_message(1, app_tag: Net::LDAP::PDU::SearchResult)
216+
result2 = make_message(2, app_tag: Net::LDAP::PDU::BindResult)
217+
218+
mock = flexmock("socket")
219+
mock.should_receive(:read_ber).
220+
and_return(result1).
221+
and_return(result2)
222+
mock.should_receive(:write)
223+
conn = Net::LDAP::Connection.new(:socket => mock)
224+
225+
conn.next_msgid # simulates ongoing query
226+
227+
assert result = conn.bind(
228+
method: :simple,
229+
username: "uid=user1,ou=People,dc=rubyldap,dc=com",
230+
password: "passworD1")
231+
assert result.success?
232+
assert_equal 2, result.message_id
233+
end
213234
end
214235

215236
class TestLDAPConnectionErrors < Test::Unit::TestCase
@@ -257,7 +278,7 @@ def setup
257278
def test_write_net_ldap_connection_event
258279
ber = Net::BER::BerIdentifiedArray.new([Net::LDAP::ResultCodeSuccess, "", ""])
259280
ber.ber_identifier = Net::LDAP::PDU::BindResult
260-
read_result = [2, ber]
281+
read_result = [1, ber]
261282
@tcp_socket.should_receive(:read_ber).and_return(read_result)
262283

263284
events = @service.subscribe "write.net_ldap_connection"
@@ -274,7 +295,7 @@ def test_write_net_ldap_connection_event
274295
def test_read_net_ldap_connection_event
275296
ber = Net::BER::BerIdentifiedArray.new([Net::LDAP::ResultCodeSuccess, "", ""])
276297
ber.ber_identifier = Net::LDAP::PDU::BindResult
277-
read_result = [2, ber]
298+
read_result = [1, ber]
278299
@tcp_socket.should_receive(:read_ber).and_return(read_result)
279300

280301
events = @service.subscribe "read.net_ldap_connection"
@@ -291,7 +312,7 @@ def test_read_net_ldap_connection_event
291312
def test_parse_pdu_net_ldap_connection_event
292313
ber = Net::BER::BerIdentifiedArray.new([Net::LDAP::ResultCodeSuccess, "", ""])
293314
ber.ber_identifier = Net::LDAP::PDU::BindResult
294-
read_result = [2, ber]
315+
read_result = [1, ber]
295316
@tcp_socket.should_receive(:read_ber).and_return(read_result)
296317

297318
events = @service.subscribe "parse_pdu.net_ldap_connection"
@@ -305,15 +326,15 @@ def test_parse_pdu_net_ldap_connection_event
305326
assert payload.has_key?(:app_tag)
306327
assert payload.has_key?(:message_id)
307328
assert_equal Net::LDAP::PDU::BindResult, payload[:app_tag]
308-
assert_equal 2, payload[:message_id]
329+
assert_equal 1, payload[:message_id]
309330
pdu = payload[:pdu]
310331
assert_equal Net::LDAP::ResultCodeSuccess, pdu.result_code
311332
end
312333

313334
def test_bind_net_ldap_connection_event
314335
ber = Net::BER::BerIdentifiedArray.new([Net::LDAP::ResultCodeSuccess, "", ""])
315336
ber.ber_identifier = Net::LDAP::PDU::BindResult
316-
bind_result = [2, ber]
337+
bind_result = [1, ber]
317338
@tcp_socket.should_receive(:read_ber).and_return(bind_result)
318339

319340
events = @service.subscribe "bind.net_ldap_connection"

0 commit comments

Comments
 (0)