Question =============
Leaving aside whether it is bad practice to have blank passwords, I would like to know: Which of the following two has the correct LDAP behaviour? Command line "ldapsearch" Perl package "Net::LDAP" I suspect "ldapsearch" is correct in how it handles binding with blank passwords. I am of the opinion that Net::LDAP contains a bug / special feature! Example with "ldapsearch" ============================== Joe Bloggs has a password set but it is empty / blank. Using ldapsearch the following happens when you search for the details on Joe Bloggs. 1) Fails: name 2) Success: name + password ldapsearch -h 'localhost' -x -s base -D 'cn=Joe Bloggs,ou=London,dc=axomic,dc=com' -b 'cn=Joe Bloggs,ou=London,dc=axomic,dc=com' ldapsearch -h 'localhost' -x -s base -D 'cn=Joe Bloggs,ou=London,dc=axomic,dc=com' -b 'cn=Joe Bloggs,ou=London,dc=axomic,dc=com' -w '' I assume case 1) with just a name in fact just attempts an anonymous bind as the password is missing. Example with "Net::LDAP" ============================== The following code errors with (in summary): resultCode 48 'No password, did you mean noauth or anonymous ?' #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Net::LDAP; my $ldapServer = new Net::LDAP('ldap://localhost', 'port' =>'389', 'timeout'=>'2'); my $message = $ldapServer-> bind('cn=Joe Bloggs,ou=London,dc=axomic,dc=com', 'password'=>''); if ($message->is_error()) { print "***Bind Error\n"; print Dumper($message); } else { my $search = $ldapServer-> search('base' =>'cn=Joe Bloggs,ou=London,dc=axomic,dc=com', 'filter'=>'(objectClass=user)', 'scope' =>'base'); print Dumper($search); } Test Hack ============== As a test hack I tried commenting out the lines below, but as far as I can tell it is still trying an anonymous bind. Using the bundle perl-ldap-0.3202 Net/LDAP.pm line 318 and 319 ########## return _error($ldap, $mesg, LDAP_INAPPROPRIATE_AUTH, "No password, did you mean noauth or anonymous ?") if $type eq 'simple' and $passwd eq ''; ########## I followed the code through for a while to look at the packets sent on the wire but kind of ran out of steam. Net/LDAP/ASN.pm (Net::LDAP::ASN 0.0.3) Convert/ASN1.pm (Convert::ASN1 0.18) Convert/ASN1/_encode.pm (Convert::ASN1 0.18) Convert::ASN1->prepare Convert::ASN1->encode Convert::ASN1->_encode Work Around ================ Comment out the lines mentioned above in... Net/LDAP.pm line 318 and 319 If a user gives a blank password, rather than just trying a bind with their name and password, do a bind then search for their details. This will tell you whether the bind really was successful. #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Net::LDAP; my $ldapServer = new Net::LDAP('ldap://localhost', 'port' =>'389', 'timeout'=>'2'); my $dn = 'cn=Joe Bloggs,ou=London,dc=axomic,dc=com'; my $password = ''; my $message = $ldapServer->bind($dn,'password'=>$password); my $success; if ($password) { $success = $message->is_error()?'0':'1'; } else { my $search = $ldapServer-> search('base' =>$dn, 'filter'=>'(objectClass=user)', 'scope' =>'base'); $success = $search->{'resultCode'}?'0':'1'; } print $success?"Success\n":"Failure\n"; Somebody Else With The Same Issue ====================================== http://www.nntp.perl.org/group/perl.ldap/512 OpenAsset - Image Management for Architects, Designers & Engineers Axomic Ltd 338 City Road London EC1V 2PY t: +44 (0)20 7239 8287 m: +44 (0)7812 122418 http://www.axomic.com