Skip to content

Commit 5b54513

Browse files
committed
Merge pull request #141 from ruby-ldap/magic-number-cleanup
Magic number/constant cleanup
2 parents 39fdf34 + b225088 commit 5b54513

File tree

9 files changed

+167
-76
lines changed

9 files changed

+167
-76
lines changed

lib/net/ldap.rb

Lines changed: 103 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -321,29 +321,103 @@ class LdapError < StandardError; end
321321

322322
StartTlsOid = "1.3.6.1.4.1.1466.20037"
323323

324+
# https://tools.ietf.org/html/rfc4511#section-4.1.9
325+
# https://tools.ietf.org/html/rfc4511#appendix-A
326+
ResultCodeSuccess = 0
327+
ResultCodeOperationsError = 1
328+
ResultCodeProtocolError = 2
329+
ResultCodeTimeLimitExceeded = 3
330+
ResultCodeSizeLimitExceeded = 4
331+
ResultCodeCompareFalse = 5
332+
ResultCodeCompareTrue = 6
333+
ResultCodeAuthMethodNotSupported = 7
334+
ResultCodeStrongerAuthRequired = 8
335+
ResultCodeReferral = 10
336+
ResultCodeAdminLimitExceeded = 11
337+
ResultCodeUnavailableCriticalExtension = 12
338+
ResultCodeConfidentialityRequired = 13
339+
ResultCodeSaslBindInProgress = 14
340+
ResultCodeNoSuchAttribute = 16
341+
ResultCodeUndefinedAttributeType = 17
342+
ResultCodeInappropriateMatching = 18
343+
ResultCodeConstraintViolation = 19
344+
ResultCodeAttributeOrValueExists = 20
345+
ResultCodeInvalidAttributeSyntax = 21
346+
ResultCodeNoSuchObject = 32
347+
ResultCodeAliasProblem = 33
348+
ResultCodeInvalidDNSyntax = 34
349+
ResultCodeAliasDereferencingProblem = 36
350+
ResultCodeInappropriateAuthentication = 48
351+
ResultCodeInvalidCredentials = 49
352+
ResultCodeInsufficientAccessRights = 50
353+
ResultCodeBusy = 51
354+
ResultCodeUnavailable = 52
355+
ResultCodeUnwillingToPerform = 53
356+
ResultCodeNamingViolation = 64
357+
ResultCodeObjectClassViolation = 65
358+
ResultCodeNotAllowedOnNonLeaf = 66
359+
ResultCodeNotAllowedOnRDN = 67
360+
ResultCodeEntryAlreadyExists = 68
361+
ResultCodeObjectClassModsProhibited = 69
362+
ResultCodeAffectsMultipleDSAs = 71
363+
ResultCodeOther = 80
364+
365+
# https://tools.ietf.org/html/rfc4511#appendix-A.1
366+
ResultCodesNonError = [
367+
ResultCodeSuccess,
368+
ResultCodeCompareFalse,
369+
ResultCodeCompareTrue,
370+
ResultCodeReferral,
371+
ResultCodeSaslBindInProgress
372+
]
373+
374+
# nonstandard list of "successful" result codes for searches
375+
ResultCodesSearchSuccess = [
376+
ResultCodeSuccess,
377+
ResultCodeTimeLimitExceeded,
378+
ResultCodeSizeLimitExceeded
379+
]
380+
381+
# map of result code to human message
324382
ResultStrings = {
325-
0 => "Success",
326-
1 => "Operations Error",
327-
2 => "Protocol Error",
328-
3 => "Time Limit Exceeded",
329-
4 => "Size Limit Exceeded",
330-
10 => "Referral",
331-
12 => "Unavailable crtical extension",
332-
14 => "saslBindInProgress",
333-
16 => "No Such Attribute",
334-
17 => "Undefined Attribute Type",
335-
19 => "Constraint Violation",
336-
20 => "Attribute or Value Exists",
337-
32 => "No Such Object",
338-
34 => "Invalid DN Syntax",
339-
48 => "Inappropriate Authentication",
340-
49 => "Invalid Credentials",
341-
50 => "Insufficient Access Rights",
342-
51 => "Busy",
343-
52 => "Unavailable",
344-
53 => "Unwilling to perform",
345-
65 => "Object Class Violation",
346-
68 => "Entry Already Exists"
383+
ResultCodeSuccess => "Success",
384+
ResultCodeOperationsError => "Operations Error",
385+
ResultCodeProtocolError => "Protocol Error",
386+
ResultCodeTimeLimitExceeded => "Time Limit Exceeded",
387+
ResultCodeSizeLimitExceeded => "Size Limit Exceeded",
388+
ResultCodeCompareFalse => "False Comparison",
389+
ResultCodeCompareTrue => "True Comparison",
390+
ResultCodeAuthMethodNotSupported => "Auth Method Not Supported",
391+
ResultCodeStrongerAuthRequired => "Stronger Auth Needed",
392+
ResultCodeReferral => "Referral",
393+
ResultCodeAdminLimitExceeded => "Admin Limit Exceeded",
394+
ResultCodeUnavailableCriticalExtension => "Unavailable crtical extension",
395+
ResultCodeConfidentialityRequired => "Confidentiality Required",
396+
ResultCodeSaslBindInProgress => "saslBindInProgress",
397+
ResultCodeNoSuchAttribute => "No Such Attribute",
398+
ResultCodeUndefinedAttributeType => "Undefined Attribute Type",
399+
ResultCodeInappropriateMatching => "Inappropriate Matching",
400+
ResultCodeConstraintViolation => "Constraint Violation",
401+
ResultCodeAttributeOrValueExists => "Attribute or Value Exists",
402+
ResultCodeInvalidAttributeSyntax => "Invalide Attribute Syntax",
403+
ResultCodeNoSuchObject => "No Such Object",
404+
ResultCodeAliasProblem => "Alias Problem",
405+
ResultCodeInvalidDNSyntax => "Invalid DN Syntax",
406+
ResultCodeAliasDereferencingProblem => "Alias Dereferencing Problem",
407+
ResultCodeInappropriateAuthentication => "Inappropriate Authentication",
408+
ResultCodeInvalidCredentials => "Invalid Credentials",
409+
ResultCodeInsufficientAccessRights => "Insufficient Access Rights",
410+
ResultCodeBusy => "Busy",
411+
ResultCodeUnavailable => "Unavailable",
412+
ResultCodeUnwillingToPerform => "Unwilling to perform",
413+
ResultCodeNamingViolation => "Naming Violation",
414+
ResultCodeObjectClassViolation => "Object Class Violation",
415+
ResultCodeNotAllowedOnNonLeaf => "Not Allowed On Non-Leaf",
416+
ResultCodeNotAllowedOnRDN => "Not Allowed On RDN",
417+
ResultCodeEntryAlreadyExists => "Entry Already Exists",
418+
ResultCodeObjectClassModsProhibited => "ObjectClass Modifications Prohibited",
419+
ResultCodeAffectsMultipleDSAs => "Affects Multiple DSAs",
420+
ResultCodeOther => "Other"
347421
}
348422

349423
module LDAPControls
@@ -549,7 +623,7 @@ def get_operation_result
549623
elsif result
550624
os.code = result
551625
else
552-
os.code = 0
626+
os.code = Net::LDAP::ResultCodeSuccess
553627
end
554628
os.message = Net::LDAP.result2string(os.code)
555629
os
@@ -667,7 +741,7 @@ def search(args = {})
667741
:port => @port,
668742
:encryption => @encryption,
669743
:instrumentation_service => @instrumentation_service
670-
if (@result = conn.bind(args[:auth] || @auth)).result_code == 0
744+
if (@result = conn.bind(args[:auth] || @auth)).result_code == Net::LDAP::ResultCodeSuccess
671745
@result = conn.search(args) { |entry|
672746
result_set << entry if result_set
673747
yield entry if block_given?
@@ -680,14 +754,7 @@ def search(args = {})
680754

681755
if return_result_set
682756
unless @result.nil?
683-
case @result.result_code
684-
when ResultStrings.key("Success")
685-
# everything good
686-
result_set
687-
when ResultStrings.key("Size Limit Exceeded"), ResultStrings.key("Time Limit Exceeded")
688-
# LDAP: Size/Time limit exceeded
689-
# This happens when we use size option and results are truncated
690-
# Still we need to return user results
757+
if ResultCodesSearchSuccess.include?(@result.result_code)
691758
result_set
692759
end
693760
end
@@ -873,7 +940,7 @@ def add(args)
873940
:port => @port,
874941
:encryption => @encryption,
875942
:instrumentation_service => @instrumentation_service
876-
if (@result = conn.bind(args[:auth] || @auth)).result_code == 0
943+
if (@result = conn.bind(args[:auth] || @auth)).result_code == Net::LDAP::ResultCodeSuccess
877944
@result = conn.add(args)
878945
end
879946
ensure
@@ -977,7 +1044,7 @@ def modify(args)
9771044
:port => @port,
9781045
:encryption => @encryption,
9791046
:instrumentation_service => @instrumentation_service
980-
if (@result = conn.bind(args[:auth] || @auth)).result_code == 0
1047+
if (@result = conn.bind(args[:auth] || @auth)).result_code == Net::LDAP::ResultCodeSuccess
9811048
@result = conn.modify(args)
9821049
end
9831050
ensure
@@ -1054,7 +1121,7 @@ def rename(args)
10541121
:port => @port,
10551122
:encryption => @encryption,
10561123
:instrumentation_service => @instrumentation_service
1057-
if (@result = conn.bind(args[:auth] || @auth)).result_code == 0
1124+
if (@result = conn.bind(args[:auth] || @auth)).result_code == Net::LDAP::ResultCodeSuccess
10581125
@result = conn.rename(args)
10591126
end
10601127
ensure
@@ -1087,7 +1154,7 @@ def delete(args)
10871154
:port => @port,
10881155
:encryption => @encryption,
10891156
:instrumentation_service => @instrumentation_service
1090-
if (@result = conn.bind(args[:auth] || @auth)).result_code == 0
1157+
if (@result = conn.bind(args[:auth] || @auth)).result_code == Net::LDAP::ResultCodeSuccess
10911158
@result = conn.delete(args)
10921159
end
10931160
ensure

lib/net/ldap/connection.rb

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ def bind_simple(auth)
227227
raise Net::LDAP::LdapError, "Invalid binding information" unless (user && psw)
228228

229229
request = [LdapVersion.to_ber, user.to_ber,
230-
psw.to_ber_contextspecific(0)].to_ber_appsequence(0)
230+
psw.to_ber_contextspecific(0)].to_ber_appsequence(Net::LDAP::PDU::BindRequest)
231231
write(request)
232232

233233
pdu = read
@@ -265,13 +265,13 @@ def bind_sasl(auth)
265265
n = 0
266266
loop {
267267
sasl = [mech.to_ber, cred.to_ber].to_ber_contextspecific(3)
268-
request = [LdapVersion.to_ber, "".to_ber, sasl].to_ber_appsequence(0)
268+
request = [LdapVersion.to_ber, "".to_ber, sasl].to_ber_appsequence(Net::LDAP::PDU::BindRequest)
269269
write(request)
270270

271271
pdu = read
272272
raise Net::LDAP::LdapError, "no bind result" unless pdu
273273

274-
return pdu unless pdu.result_code == 14 # saslBindInProgress
274+
return pdu unless pdu.result_code == Net::LDAP::ResultCodeSaslBindInProgress
275275
raise Net::LDAP::LdapError, "sasl-challenge overflow" if ((n += 1) > MaxSaslChallenges)
276276

277277
cred = chall.call(pdu.result_server_sasl_creds)
@@ -450,7 +450,7 @@ def search(args = nil)
450450
attrs_only.to_ber,
451451
filter.to_ber,
452452
ber_attrs.to_ber_sequence
453-
].to_ber_appsequence(3)
453+
].to_ber_appsequence(Net::LDAP::PDU::SearchRequest)
454454

455455
# rfc2696_cookie sometimes contains binary data from Microsoft Active Directory
456456
# this breaks when calling to_ber. (Can't force binary data to UTF-8)
@@ -488,7 +488,7 @@ def search(args = nil)
488488
when Net::LDAP::PDU::SearchResult
489489
result_pdu = pdu
490490
controls = pdu.result_controls
491-
if refs && pdu.result_code == 10
491+
if refs && pdu.result_code == Net::LDAP::ResultCodeReferral
492492
if block_given?
493493
se = Net::LDAP::Entry.new
494494
se[:search_referrals] = (pdu.search_referrals || [])
@@ -516,7 +516,7 @@ def search(args = nil)
516516
# of type OCTET STRING, covered in the default syntax supported by
517517
# read_ber, so I guess we're ok.
518518
more_pages = false
519-
if result_pdu.result_code == 0 and controls
519+
if result_pdu.result_code == Net::LDAP::ResultCodeSuccess and controls
520520
controls.each do |c|
521521
if c.oid == Net::LDAP::LDAPControls::PAGED_RESULTS
522522
# just in case some bogus server sends us more than 1 of these.
@@ -538,7 +538,7 @@ def search(args = nil)
538538
# track total result count
539539
payload[:result_count] = n_results
540540

541-
result_pdu || OpenStruct.new(:status => :failure, :result_code => 1, :message => "Invalid search")
541+
result_pdu || OpenStruct.new(:status => :failure, :result_code => Net::LDAP::ResultCodeOperationsError, :message => "Invalid search")
542542
end # instrument
543543
ensure
544544
# clean up message queue for this search
@@ -584,7 +584,7 @@ def modify(args)
584584
modify_dn = args[:dn] or raise "Unable to modify empty DN"
585585
ops = self.class.modify_ops args[:operations]
586586
request = [ modify_dn.to_ber,
587-
ops.to_ber_sequence ].to_ber_appsequence(6)
587+
ops.to_ber_sequence ].to_ber_appsequence(Net::LDAP::PDU::ModifyRequest)
588588
write(request)
589589

590590
pdu = read
@@ -610,7 +610,7 @@ def add(args)
610610
add_attrs << [ k.to_s.to_ber, Array(v).map { |m| m.to_ber}.to_ber_set ].to_ber_sequence
611611
}
612612

613-
request = [add_dn.to_ber, add_attrs.to_ber_sequence].to_ber_appsequence(8)
613+
request = [add_dn.to_ber, add_attrs.to_ber_sequence].to_ber_appsequence(Net::LDAP::PDU::AddRequest)
614614
write(request)
615615

616616
pdu = read
@@ -634,7 +634,7 @@ def rename(args)
634634
request = [old_dn.to_ber, new_rdn.to_ber, delete_attrs.to_ber]
635635
request << new_superior.to_ber_contextspecific(0) unless new_superior == nil
636636

637-
write(request.to_ber_appsequence(12))
637+
write(request.to_ber_appsequence(Net::LDAP::PDU::ModifyRDNRequest))
638638

639639
pdu = read
640640

@@ -651,7 +651,7 @@ def rename(args)
651651
def delete(args)
652652
dn = args[:dn] or raise "Unable to delete empty DN"
653653
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(10)
654+
request = dn.to_s.to_ber_application_string(Net::LDAP::PDU::DeleteRequest)
655655
write(request, controls)
656656

657657
pdu = read

lib/net/ldap/pdu.rb

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,48 @@
1818
# well with our approach.
1919
#
2020
# Currently, we only support controls on SearchResult.
21+
#
22+
# http://tools.ietf.org/html/rfc4511#section-4.1.1
23+
# http://tools.ietf.org/html/rfc4511#section-4.1.9
2124
class Net::LDAP::PDU
2225
class Error < RuntimeError; end
2326

24-
##
25-
# This message packet is a bind request.
27+
# http://tools.ietf.org/html/rfc4511#section-4.2
2628
BindRequest = 0
29+
# http://tools.ietf.org/html/rfc4511#section-4.2.2
2730
BindResult = 1
31+
# http://tools.ietf.org/html/rfc4511#section-4.3
2832
UnbindRequest = 2
33+
# http://tools.ietf.org/html/rfc4511#section-4.5.1
2934
SearchRequest = 3
35+
# http://tools.ietf.org/html/rfc4511#section-4.5.2
3036
SearchReturnedData = 4
3137
SearchResult = 5
38+
# see also SearchResultReferral (19)
39+
# http://tools.ietf.org/html/rfc4511#section-4.6
40+
ModifyRequest = 6
3241
ModifyResponse = 7
42+
# http://tools.ietf.org/html/rfc4511#section-4.7
43+
AddRequest = 8
3344
AddResponse = 9
45+
# http://tools.ietf.org/html/rfc4511#section-4.8
46+
DeleteRequest = 10
3447
DeleteResponse = 11
48+
# http://tools.ietf.org/html/rfc4511#section-4.9
49+
ModifyRDNRequest = 12
3550
ModifyRDNResponse = 13
51+
# http://tools.ietf.org/html/rfc4511#section-4.10
52+
CompareRequest = 14
53+
CompareResponse = 15
54+
# http://tools.ietf.org/html/rfc4511#section-4.11
55+
AbandonRequest = 16
56+
# http://tools.ietf.org/html/rfc4511#section-4.5.2
3657
SearchResultReferral = 19
58+
# http://tools.ietf.org/html/rfc4511#section-4.12
3759
ExtendedRequest = 23
3860
ExtendedResponse = 24
61+
# unused: http://tools.ietf.org/html/rfc4511#section-4.13
62+
IntermediateResponse = 25
3963

4064
##
4165
# The LDAP packet message ID.
@@ -125,7 +149,7 @@ def result_code(code = :resultCode)
125149
end
126150

127151
def status
128-
result_code == 0 ? :success : :failure
152+
Net::LDAP::ResultCodesNonError.include?(result_code) ? :success : :failure
129153
end
130154

131155
def success?
@@ -152,7 +176,7 @@ def parse_ldap_result(sequence)
152176
:matchedDN => sequence[1],
153177
:errorMessage => sequence[2]
154178
}
155-
parse_search_referral(sequence[3]) if @ldap_result[:resultCode] == 10
179+
parse_search_referral(sequence[3]) if @ldap_result[:resultCode] == Net::LDAP::ResultCodeReferral
156180
end
157181
private :parse_ldap_result
158182

test/integration/test_bind.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ def test_bind_anonymous_fail
99
refute @ldap.bind(method: :simple, username: "uid=user1,ou=People,dc=rubyldap,dc=com", password: ""), @ldap.get_operation_result.inspect
1010

1111
result = @ldap.get_operation_result
12-
assert_equal 53, result.code
13-
assert_equal "Unwilling to perform", result.message
12+
assert_equal Net::LDAP::ResultCodeUnwillingToPerform, result.code
13+
assert_equal Net::LDAP::ResultStrings[Net::LDAP::ResultCodeUnwillingToPerform], result.message
1414
assert_equal "unauthenticated bind (DN with no password) disallowed",
1515
result.error_message
1616
assert_equal "", result.matched_dn

test/integration/test_delete.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def test_delete
2525
refute @ldap.search(base: @dn, scope: Net::LDAP::SearchScope_BaseObject)
2626

2727
result = @ldap.get_operation_result
28-
assert_equal 32, result.code
29-
assert_equal Net::LDAP::ResultStrings[32], result.message
28+
assert_equal Net::LDAP::ResultCodeNoSuchObject, result.code
29+
assert_equal Net::LDAP::ResultStrings[Net::LDAP::ResultCodeNoSuchObject], result.message
3030
end
3131
end

0 commit comments

Comments
 (0)