Skip to content

Commit 805520e

Browse files
committed
Merge branch 'master' into instrument-messages
Conflicts: lib/net/ldap/connection.rb
2 parents cd3dc7f + ed84f2b commit 805520e

File tree

2 files changed

+38
-23
lines changed

2 files changed

+38
-23
lines changed

lib/net/ldap/connection.rb

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def initialize(server)
1010
@instrumentation_service = server[:instrumentation_service]
1111

1212
begin
13-
@conn = TCPSocket.new(server[:host], server[:port])
13+
@conn = server[:socket] || TCPSocket.new(server[:host], server[:port])
1414
rescue SocketError
1515
raise Net::LDAP::LdapError, "No such address or other socket error."
1616
rescue Errno::ECONNREFUSED
@@ -87,10 +87,8 @@ def setup_encryption(args)
8787
# additional branches requiring server validation and peer certs, etc.
8888
# go here.
8989
when :start_tls
90-
msgid = next_msgid.to_ber
9190
request = [Net::LDAP::StartTlsOid.to_ber_contextspecific(0)].to_ber_appsequence(Net::LDAP::PDU::ExtendedRequest)
92-
request_pkt = [msgid, request].to_ber_sequence
93-
write request_pkt
91+
write(request)
9492
pdu = read
9593
raise Net::LDAP::LdapError, "no start_tls result" if pdu.nil?
9694
if pdu.result_code.zero?
@@ -140,14 +138,17 @@ def read(syntax = Net::LDAP::AsnSyntax)
140138
end
141139
private :read
142140

143-
# Internal: Writes the given packet to the configured connection.
141+
# Internal: Write a BER formatted packet with the next message id to the
142+
# configured connection.
144143
#
145-
# - packet: the BER data packet to write on the socket.
144+
# - request: required BER formatted request
145+
# - controls: optional BER formatted controls
146146
#
147147
# Returns the return value from writing to the connection, which in some
148148
# cases is the Integer number of bytes written to the socket.
149-
def write(packet)
149+
def write(request, controls = nil)
150150
instrument "write.net_ldap_connection" do |payload|
151+
packet = [next_msgid.to_ber, request, controls].compact.to_ber_sequence
151152
payload[:content_length] = @conn.write(packet)
152153
end
153154
end
@@ -186,11 +187,9 @@ def bind_simple(auth)
186187

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

189-
msgid = next_msgid.to_ber
190190
request = [LdapVersion.to_ber, user.to_ber,
191191
psw.to_ber_contextspecific(0)].to_ber_appsequence(0)
192-
request_pkt = [msgid, request].to_ber_sequence
193-
write request_pkt
192+
write(request)
194193

195194
pdu = read
196195
raise Net::LDAP::LdapError, "no bind result" unless pdu
@@ -226,11 +225,9 @@ def bind_sasl(auth)
226225

227226
n = 0
228227
loop {
229-
msgid = next_msgid.to_ber
230228
sasl = [mech.to_ber, cred.to_ber].to_ber_contextspecific(3)
231229
request = [LdapVersion.to_ber, "".to_ber, sasl].to_ber_appsequence(0)
232-
request_pkt = [msgid, request].to_ber_sequence
233-
write request_pkt
230+
write(request)
234231

235232
pdu = read
236233
raise Net::LDAP::LdapError, "no bind result" unless pdu
@@ -406,8 +403,7 @@ def search(args = {})
406403
controls << sort_control if sort_control
407404
controls = controls.empty? ? nil : controls.to_ber_contextspecific(0)
408405

409-
pkt = [next_msgid.to_ber, request, controls].compact.to_ber_sequence
410-
write pkt
406+
write(request, controls)
411407

412408
result_pdu = nil
413409
controls = []
@@ -515,8 +511,7 @@ def modify(args)
515511
ops = self.class.modify_ops args[:operations]
516512
request = [ modify_dn.to_ber,
517513
ops.to_ber_sequence ].to_ber_appsequence(6)
518-
pkt = [ next_msgid.to_ber, request ].to_ber_sequence
519-
write pkt
514+
write(request)
520515

521516
pdu = read
522517

@@ -542,8 +537,7 @@ def add(args)
542537
}
543538

544539
request = [add_dn.to_ber, add_attrs.to_ber_sequence].to_ber_appsequence(8)
545-
pkt = [next_msgid.to_ber, request].to_ber_sequence
546-
write pkt
540+
write(request)
547541

548542
pdu = read
549543

@@ -566,8 +560,7 @@ def rename(args)
566560
request = [old_dn.to_ber, new_rdn.to_ber, delete_attrs.to_ber]
567561
request << new_superior.to_ber_contextspecific(0) unless new_superior == nil
568562

569-
pkt = [next_msgid.to_ber, request.to_ber_appsequence(12)].to_ber_sequence
570-
write pkt
563+
write(request.to_ber_appsequence(12))
571564

572565
pdu = read
573566

@@ -585,8 +578,7 @@ def delete(args)
585578
dn = args[:dn] or raise "Unable to delete empty DN"
586579
controls = args.include?(:control_codes) ? args[:control_codes].to_ber_control : nil #use nil so we can compact later
587580
request = dn.to_s.to_ber_application_string(10)
588-
pkt = [next_msgid.to_ber, request, controls].compact.to_ber_sequence
589-
write pkt
581+
write(request, controls)
590582

591583
pdu = read
592584

test/test_ldap_connection.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,29 @@ def test_modify_ops_replace
4242
expected = [ "0#\n\x01\x020\x1E\x04\x04mail1\x16\x04\x14testuser@example.com" ]
4343
assert_equal(expected, result)
4444
end
45+
46+
def test_write
47+
mock = flexmock("socket")
48+
mock.should_receive(:write).with([1.to_ber, "request"].to_ber_sequence).and_return(true)
49+
conn = Net::LDAP::Connection.new(:socket => mock)
50+
conn.send(:write, "request")
51+
end
52+
53+
def test_write_with_controls
54+
mock = flexmock("socket")
55+
mock.should_receive(:write).with([1.to_ber, "request", "controls"].to_ber_sequence).and_return(true)
56+
conn = Net::LDAP::Connection.new(:socket => mock)
57+
conn.send(:write, "request", "controls")
58+
end
59+
60+
def test_write_increments_msgid
61+
mock = flexmock("socket")
62+
mock.should_receive(:write).with([1.to_ber, "request1"].to_ber_sequence).and_return(true)
63+
mock.should_receive(:write).with([2.to_ber, "request2"].to_ber_sequence).and_return(true)
64+
conn = Net::LDAP::Connection.new(:socket => mock)
65+
conn.send(:write, "request1")
66+
conn.send(:write, "request2")
67+
end
4568
end
4669

4770

0 commit comments

Comments
 (0)