@@ -87,10 +87,18 @@ def setup_encryption(args)
87
87
# additional branches requiring server validation and peer certs, etc.
88
88
# go here.
89
89
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
+
94
102
if pdu . result_code . zero?
95
103
@conn = self . class . wrap_with_ssl ( @conn )
96
104
else
@@ -226,12 +234,18 @@ def bind_simple(auth)
226
234
227
235
raise Net ::LDAP ::LdapError , "Invalid binding information" unless ( user && psw )
228
236
229
- request = [ LdapVersion . to_ber , user . to_ber ,
230
- psw . to_ber_contextspecific ( 0 ) ] . to_ber_appsequence ( Net ::LDAP ::PDU ::BindRequest )
231
- 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 )
232
242
233
- pdu = read
234
- raise Net ::LDAP ::LdapError , "no bind result" unless pdu
243
+ write ( request , nil , message_id )
244
+ pdu = queued_read ( message_id )
245
+
246
+ if !pdu || pdu . app_tag != Net ::LDAP ::PDU ::BindResult
247
+ raise Net ::LDAP ::LdapError , "no bind result"
248
+ end
235
249
236
250
pdu
237
251
end
@@ -262,14 +276,21 @@ def bind_sasl(auth)
262
276
auth [ :challenge_response ]
263
277
raise Net ::LDAP ::LdapError , "Invalid binding information" unless ( mech && cred && chall )
264
278
279
+ message_id = next_msgid
280
+
265
281
n = 0
266
282
loop {
267
283
sasl = [ mech . to_ber , cred . to_ber ] . to_ber_contextspecific ( 3 )
268
- request = [ LdapVersion . to_ber , "" . to_ber , sasl ] . to_ber_appsequence ( Net ::LDAP ::PDU ::BindRequest )
269
- write ( request )
284
+ request = [
285
+ LdapVersion . to_ber , "" . to_ber , sasl
286
+ ] . to_ber_appsequence ( Net ::LDAP ::PDU ::BindRequest )
270
287
271
- pdu = read
272
- raise Net ::LDAP ::LdapError , "no bind result" unless pdu
288
+ write ( request , nil , message_id )
289
+ pdu = queued_read ( message_id )
290
+
291
+ if !pdu || pdu . app_tag != Net ::LDAP ::PDU ::BindResult
292
+ raise Net ::LDAP ::LdapError , "no bind result"
293
+ end
273
294
274
295
return pdu unless pdu . result_code == Net ::LDAP ::ResultCodeSaslBindInProgress
275
296
raise Net ::LDAP ::LdapError , "sasl-challenge overflow" if ( ( n += 1 ) > MaxSaslChallenges )
@@ -583,11 +604,15 @@ def self.modify_ops(operations)
583
604
def modify ( args )
584
605
modify_dn = args [ :dn ] or raise "Unable to modify empty DN"
585
606
ops = self . class . modify_ops args [ :operations ]
586
- request = [ modify_dn . to_ber ,
587
- ops . to_ber_sequence ] . to_ber_appsequence ( Net ::LDAP ::PDU ::ModifyRequest )
588
- write ( request )
589
607
590
- pdu = read
608
+ message_id = next_msgid
609
+ request = [
610
+ modify_dn . to_ber ,
611
+ ops . to_ber_sequence
612
+ ] . to_ber_appsequence ( Net ::LDAP ::PDU ::ModifyRequest )
613
+
614
+ write ( request , nil , message_id )
615
+ pdu = queued_read ( message_id )
591
616
592
617
if !pdu || pdu . app_tag != Net ::LDAP ::PDU ::ModifyResponse
593
618
raise Net ::LDAP ::LdapError , "response missing or invalid"
@@ -610,10 +635,11 @@ def add(args)
610
635
add_attrs << [ k . to_s . to_ber , Array ( v ) . map { |m | m . to_ber } . to_ber_set ] . to_ber_sequence
611
636
}
612
637
613
- request = [ add_dn . to_ber , add_attrs . to_ber_sequence ] . to_ber_appsequence ( Net :: LDAP :: PDU :: AddRequest )
614
- write ( request )
638
+ message_id = next_msgid
639
+ request = [ add_dn . to_ber , add_attrs . to_ber_sequence ] . to_ber_appsequence ( Net :: LDAP :: PDU :: AddRequest )
615
640
616
- pdu = read
641
+ write ( request , nil , message_id )
642
+ pdu = queued_read ( message_id )
617
643
618
644
if !pdu || pdu . app_tag != Net ::LDAP ::PDU ::AddResponse
619
645
raise Net ::LDAP ::LdapError , "response missing or invalid"
@@ -631,12 +657,12 @@ def rename(args)
631
657
delete_attrs = args [ :delete_attributes ] ? true : false
632
658
new_superior = args [ :new_superior ]
633
659
634
- request = [ old_dn . to_ber , new_rdn . to_ber , delete_attrs . to_ber ]
635
- request << new_superior . to_ber_contextspecific ( 0 ) unless new_superior == nil
636
-
637
- write ( request . to_ber_appsequence ( Net ::LDAP ::PDU ::ModifyRDNRequest ) )
660
+ message_id = next_msgid
661
+ request = [ old_dn . to_ber , new_rdn . to_ber , delete_attrs . to_ber ]
662
+ request << new_superior . to_ber_contextspecific ( 0 ) unless new_superior == nil
638
663
639
- pdu = read
664
+ write ( request . to_ber_appsequence ( Net ::LDAP ::PDU ::ModifyRDNRequest ) , nil , message_id )
665
+ pdu = queued_read ( message_id )
640
666
641
667
if !pdu || pdu . app_tag != Net ::LDAP ::PDU ::ModifyRDNResponse
642
668
raise Net ::LDAP ::LdapError . new "response missing or invalid"
@@ -650,11 +676,12 @@ def rename(args)
650
676
#++
651
677
def delete ( args )
652
678
dn = args [ :dn ] or raise "Unable to delete empty DN"
653
- controls = args . include? ( :control_codes ) ? args [ :control_codes ] . to_ber_control : nil #use nil so we can compact later
654
- request = dn . to_s . to_ber_application_string ( Net :: LDAP :: PDU :: DeleteRequest )
655
- write ( request , controls )
679
+ controls = args . include? ( :control_codes ) ? args [ :control_codes ] . to_ber_control : nil #use nil so we can compact later
680
+ message_id = next_msgid
681
+ request = dn . to_s . to_ber_application_string ( Net :: LDAP :: PDU :: DeleteRequest )
656
682
657
- pdu = read
683
+ write ( request , controls , message_id )
684
+ pdu = queued_read ( message_id )
658
685
659
686
if !pdu || pdu . app_tag != Net ::LDAP ::PDU ::DeleteResponse
660
687
raise Net ::LDAP ::LdapError , "response missing or invalid"
0 commit comments