Skip to content

Commit d124182

Browse files
committed
Use queued_read for bind_sasl
1 parent 47017f1 commit d124182

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

lib/net/ldap/connection.rb

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -276,14 +276,21 @@ def bind_sasl(auth)
276276
auth[:challenge_response]
277277
raise Net::LDAP::LdapError, "Invalid binding information" unless (mech && cred && chall)
278278

279+
message_id = next_msgid
280+
279281
n = 0
280282
loop {
281283
sasl = [mech.to_ber, cred.to_ber].to_ber_contextspecific(3)
282-
request = [LdapVersion.to_ber, "".to_ber, sasl].to_ber_appsequence(Net::LDAP::PDU::BindRequest)
283-
write(request)
284+
request = [
285+
LdapVersion.to_ber, "".to_ber, sasl
286+
].to_ber_appsequence(Net::LDAP::PDU::BindRequest)
287+
288+
write(request, nil, message_id)
289+
pdu = queued_read(message_id)
284290

285-
pdu = read
286-
raise Net::LDAP::LdapError, "no bind result" unless pdu
291+
if !pdu || pdu.app_tag != Net::LDAP::PDU::BindResult
292+
raise Net::LDAP::LdapError, "no bind result"
293+
end
287294

288295
return pdu unless pdu.result_code == Net::LDAP::ResultCodeSaslBindInProgress
289296
raise Net::LDAP::LdapError, "sasl-challenge overflow" if ((n += 1) > MaxSaslChallenges)

test/test_ldap_connection.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,28 @@ def test_queued_read_bind_simple
231231
assert result.success?
232232
assert_equal 2, result.message_id
233233
end
234+
235+
def test_queued_read_bind_sasl
236+
result1 = make_message(1, app_tag: Net::LDAP::PDU::SearchResult)
237+
result2 = make_message(2, app_tag: Net::LDAP::PDU::BindResult)
238+
239+
mock = flexmock("socket")
240+
mock.should_receive(:read_ber).
241+
and_return(result1).
242+
and_return(result2)
243+
mock.should_receive(:write)
244+
conn = Net::LDAP::Connection.new(:socket => mock)
245+
246+
conn.next_msgid # simulates ongoing query
247+
248+
assert result = conn.bind(
249+
method: :sasl,
250+
mechanism: "fake",
251+
initial_credential: "passworD1",
252+
challenge_response: flexmock("challenge proc"))
253+
assert result.success?
254+
assert_equal 2, result.message_id
255+
end
234256
end
235257

236258
class TestLDAPConnectionErrors < Test::Unit::TestCase

0 commit comments

Comments
 (0)