Skip to content

Commit 75c0bcb

Browse files
Add controls for modify and add operations (#426)
* Allow controls for add and modify * Add tests for add and modify --------- Co-authored-by: Kevin McCormack <[email protected]>
1 parent a515dad commit 75c0bcb

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

lib/net/ldap/connection.rb

+12-2
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,12 @@ def modify(args)
569569
ops.to_ber_sequence,
570570
].to_ber_appsequence(Net::LDAP::PDU::ModifyRequest)
571571

572-
write(request, nil, message_id)
572+
controls = args.fetch(:controls, nil)
573+
unless controls.nil?
574+
controls = controls.to_ber_contextspecific(0)
575+
end
576+
577+
write(request, controls, message_id)
573578
pdu = queued_read(message_id)
574579

575580
if !pdu || pdu.app_tag != Net::LDAP::PDU::ModifyResponse
@@ -641,7 +646,12 @@ def add(args)
641646
message_id = next_msgid
642647
request = [add_dn.to_ber, add_attrs.to_ber_sequence].to_ber_appsequence(Net::LDAP::PDU::AddRequest)
643648

644-
write(request, nil, message_id)
649+
controls = args.fetch(:controls, nil)
650+
unless controls.nil?
651+
controls = controls.to_ber_contextspecific(0)
652+
end
653+
654+
write(request, controls, message_id)
645655
pdu = queued_read(message_id)
646656

647657
if !pdu || pdu.app_tag != Net::LDAP::PDU::AddResponse

test/test_ldap_connection.rb

+34
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,40 @@ def test_search_net_ldap_connection_event
502502
assert unread.empty?, "should not have any leftover unread messages"
503503
end
504504

505+
def test_add_with_controls
506+
dacl_flag = 0x4 # DACL_SECURITY_INFORMATION
507+
control_values = [dacl_flag].map(&:to_ber).to_ber_sequence.to_s.to_ber
508+
controls = []
509+
# LDAP_SERVER_SD_FLAGS constant definition, taken from https://ldapwiki.com/wiki/LDAP_SERVER_SD_FLAGS_OID
510+
ldap_server_sd_flags = '1.2.840.113556.1.4.801'.freeze
511+
controls << [ldap_server_sd_flags.to_ber, true.to_ber, control_values].to_ber_sequence
512+
513+
ber = Net::BER::BerIdentifiedArray.new([Net::LDAP::ResultCodeSuccess, "", ""])
514+
ber.ber_identifier = Net::LDAP::PDU::AddResponse
515+
@tcp_socket.should_receive(:read_ber).and_return([1, ber])
516+
517+
result = @connection.add(:dn => "uid=added-user1,ou=People,dc=rubyldap,dc=com", :controls => controls)
518+
assert result.success?, "should be success"
519+
assert_equal "", result.error_message
520+
end
521+
522+
def test_modify_with_controls
523+
dacl_flag = 0x4 # DACL_SECURITY_INFORMATION
524+
control_values = [dacl_flag].map(&:to_ber).to_ber_sequence.to_s.to_ber
525+
controls = []
526+
# LDAP_SERVER_SD_FLAGS constant definition, taken from https://ldapwiki.com/wiki/LDAP_SERVER_SD_FLAGS_OID
527+
ldap_server_sd_flags = '1.2.840.113556.1.4.801'.freeze
528+
controls << [ldap_server_sd_flags.to_ber, true.to_ber, control_values].to_ber_sequence
529+
530+
ber = Net::BER::BerIdentifiedArray.new([Net::LDAP::ResultCodeSuccess, "", ""])
531+
ber.ber_identifier = Net::LDAP::PDU::ModifyResponse
532+
@tcp_socket.should_receive(:read_ber).and_return([1, ber])
533+
534+
result = @connection.modify(:dn => "1", :operations => [[:replace, "mail", "[email protected]"]], :controls => controls)
535+
assert result.success?, "should be success"
536+
assert_equal "", result.error_message
537+
end
538+
505539
def test_search_with_controls
506540
# search data
507541
search_data_ber = Net::BER::BerIdentifiedArray.new([1, [

0 commit comments

Comments
 (0)