Skip to content

Commit 1a27513

Browse files
a7b81a9086zeroSteiner
a7b81a9086
authored andcommitted
Add support for ldapwhoami (RFC4532)
1 parent 7f060e1 commit 1a27513

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

lib/net/ldap.rb

+19
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,7 @@ class Net::LDAP
306306
3 => :string, # SearchFilter-extensible
307307
4 => :string, # SearchFilter-extensible
308308
7 => :string, # serverSaslCreds
309+
11 => :string, # responseValue
309310
}
310311
constructed = {
311312
0 => :array, # RFC-2251 Control and Filter-AND
@@ -341,6 +342,7 @@ class Net::LDAP
341342

342343
StartTlsOid = '1.3.6.1.4.1.1466.20037'
343344
PasswdModifyOid = '1.3.6.1.4.1.4203.1.11.1'
345+
WhoamiOid = '1.3.6.1.4.1.4203.1.11.3'
344346

345347
# https://tools.ietf.org/html/rfc4511#section-4.1.9
346348
# https://tools.ietf.org/html/rfc4511#appendix-A
@@ -1200,6 +1202,23 @@ def delete_tree(args)
12001202
end
12011203
end
12021204

1205+
# Return the authorization identity of the client that issues the
1206+
# ldapwhoami request. The method does not support any arguments.
1207+
#
1208+
# Returns True or False to indicate whether the request was successfull.
1209+
# The result is available in the extended status information when calling
1210+
# #get_operation_result.
1211+
#
1212+
# ldap.ldapwhoami
1213+
# puts ldap.get_operation_result.extended_response
1214+
def ldapwhoami(args = {})
1215+
instrument "ldapwhoami.net_ldap", args do |payload|
1216+
@result = use_connection(args, &:ldapwhoami)
1217+
@result.success?
1218+
end
1219+
end
1220+
alias_method :whoami, :ldapwhoami
1221+
12031222
# This method is experimental and subject to change. Return the rootDSE
12041223
# record from the LDAP server as a Net::LDAP::Entry, or an empty Entry if
12051224
# the server doesn't return the record.

lib/net/ldap/connection.rb

+16
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,22 @@ def delete(args)
693693
pdu
694694
end
695695

696+
def ldapwhoami
697+
ext_seq = [Net::LDAP::WhoamiOid.to_ber_contextspecific(0)]
698+
request = ext_seq.to_ber_appsequence(Net::LDAP::PDU::ExtendedRequest)
699+
700+
message_id = next_msgid
701+
702+
write(request, nil, message_id)
703+
pdu = queued_read(message_id)
704+
705+
if !pdu || pdu.app_tag != Net::LDAP::PDU::ExtendedResponse
706+
raise Net::LDAP::ResponseMissingOrInvalidError, "response missing or invalid"
707+
end
708+
709+
pdu
710+
end
711+
696712
# Internal: Returns a Socket like object used internally to communicate with
697713
# LDAP server.
698714
#

0 commit comments

Comments
 (0)