Skip to content

Commit 7a3dbc3

Browse files
committed
Fix processing password modify responses
Per RFC4511 section 4.12, the responseValue field of an ExtendedResponse object is an optional string. Per RFC3062 section 2, the response to a passsword modify request is a sequence. This means the extended response must be parsed.
1 parent c3320a0 commit 7a3dbc3

File tree

3 files changed

+23
-5
lines changed

3 files changed

+23
-5
lines changed

lib/net/ldap.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ class Net::LDAP
311311
0 => :array, # RFC-2251 Control and Filter-AND
312312
1 => :array, # SearchFilter-OR
313313
2 => :array, # SearchFilter-NOT
314-
3 => :array, # Seach referral
314+
3 => :array, # Search referral
315315
4 => :array, # unknown use in Microsoft Outlook
316316
5 => :array, # SearchFilter-GE
317317
6 => :array, # SearchFilter-LE

lib/net/ldap/pdu.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ def parse_extended_response(sequence)
200200
:matchedDN => sequence[1],
201201
:errorMessage => sequence[2],
202202
}
203-
@extended_response = sequence.last
203+
@extended_response = sequence.length == 3 ? nil : sequence.last
204204
end
205205
private :parse_extended_response
206206

test/integration/test_password_modify.rb

+21-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
require_relative '../test_helper'
22

33
class TestPasswordModifyIntegration < LDAPIntegrationTestCase
4+
# see: https://www.rfc-editor.org/rfc/rfc3062#section-2
5+
PASSWORD_MODIFY_SYNTAX = Net::BER.compile_syntax(
6+
application: {},
7+
universal: {},
8+
context_specific: { primitive: { 0 => :string } },
9+
)
10+
411
def setup
512
super
613
@admin_account = { dn: 'cn=admin,dc=example,dc=org', password: 'admin', method: :simple }
@@ -49,7 +56,13 @@ def test_password_modify_generate
4956
auth: @auth,
5057
old_password: 'admin')
5158

52-
generated_password = @ldap.get_operation_result.extended_response[0][0]
59+
passwd_modify_response_value = @ldap.get_operation_result.extended_response
60+
seq = Net::BER::BerIdentifiedArray.new
61+
sio = StringIO.new(passwd_modify_response_value)
62+
until (e = sio.read_ber(PASSWORD_MODIFY_SYNTAX)).nil?
63+
seq << e
64+
end
65+
generated_password = seq[0][0]
5366

5467
assert generated_password, 'Should have generated a password'
5568

@@ -64,8 +77,13 @@ def test_password_modify_generate_no_old_password
6477
assert @ldap.password_modify(dn: @dn,
6578
auth: @auth)
6679

67-
generated_password = @ldap.get_operation_result.extended_response[0][0]
68-
80+
passwd_modify_response_value = @ldap.get_operation_result.extended_response
81+
seq = Net::BER::BerIdentifiedArray.new
82+
sio = StringIO.new(passwd_modify_response_value)
83+
until (e = sio.read_ber(PASSWORD_MODIFY_SYNTAX)).nil?
84+
seq << e
85+
end
86+
generated_password = seq[0][0]
6987
assert generated_password, 'Should have generated a password'
7088

7189
refute @ldap.bind(username: @dn, password: 'admin', method: :simple),

0 commit comments

Comments
 (0)