Hi!
First: http://ldap.perl.org/ says last release of perl-ldap
was (April 2005) but the changes file says:
perl-ldap 0.34 -- Sat Feb 10 17:39:49 CST 2007
I've spotted a problem in the Authen::SASL::Perl implementation.
To be more precise in Authen::SASL::Perl::DIGEST_MD5:
In client_step there is following code to parse the challenge:
while($challenge =~ s/^(?:\s*,)?\s*(\w+)=("([^\\"]+|\\.)*"|[^,]+)\s*//) {
The problem I stumbled accross was parsing of a GnuSASL challenge like
this:
', realm="....", nonce="dxv3yw4CGXoSwh7IgmEj2Q==", qop="auth, auth-int, ",
, , charset=utf-8, algorithm=md5-sess, '
This is a valid challenge by http://www.ietf.org/rfc/rfc2831.txt where
a digest-challenge looks like:
digest-challenge =
1#( realm | nonce | qop-options | stale | maxbuf | charset
algorithm | cipher-opts | auth-param )
And below in section '7.1 Augmented BNF' it says:
#rule
...
Wherever this construct is used, null elements are
allowed, but do not contribute to the count of elements
present. That is, "(element), , (element) "
The code above fails to parse these empty elements. A quick local
hack was this:
while($challenge =~
s/^(?:(?:\s*,)?\s*(\w+)=("([^\\"]+|\\.)*"|[^,]+)\s*)|(?:(?:\s*,\s*))//) {
my ($k, $v) = ($1,$2);
next unless defined $1 or defined $2;
I don't like it, but it at leasts parses the GnuSASL challenge.
Greetings,
Robin Redeker