Hello:
I've run into a problem when parsing an LDIF file that contains an entry
with a value that begins with a "<" (and probably a ":"), for example:
statusflag: <<AWAY>>
While this isn't valid for the strictest interpretation of the LDIF
specs/rfc2849 (the above should be base-64 encoded), neither is trying
to interpret the value as a URL when there is a space between the colon
and the "<" when you actually are trying to specify a URL, e.g.:
# Invalid URL line
myfile: < file:://myfilename
# Valid URL line
myfile:< file::/myfilename
This was pretty easy to make a bit more tolerant with a couple minor
changes to LDIF.pm, the diff output follows.
Regards,
James
*** LDIF.pm.orig 2004-07-01 18:48:38 -0400
--- LDIF.pm 2004-08-03 20:27:24 -0400
***************
*** 215,220 ****
--- 215,221 ----
while(@ldif) {
my $line = shift @ldif;
my $attr;
+ my $xattr;
if ($line eq "-") {
$entry->$modify($lastattr, [EMAIL PROTECTED])
***************
*** 224,233 ****
last;
}
! $line =~ s/^([-;\w]+):\s*// and $attr = $1;
# base64 encoded attribute: decode it
! if ($line =~ s/^:\s*//) {
eval { require MIME::Base64 };
if ($@) {
$self->_error($@, @ldif);
--- 225,234 ----
last;
}
! $line =~ s/^([-;\w]+):([\<\:]?)\s*// and ($attr, $xattr) =
($1, $2);
# base64 encoded attribute: decode it
! if ($xattr eq ':') {
eval { require MIME::Base64 };
if ($@) {
$self->_error($@, @ldif);
***************
*** 236,242 ****
$line = MIME::Base64::decode($line);
}
# url attribute: read in file:// url, fail on others
! elsif ($line =~ s/^\<\s*(.*?)\s*$/$1/) {
$line = $self->_read_url_attribute($line, @ldif);
return if !defined($line);
}
--- 237,243 ----
$line = MIME::Base64::decode($line);
}
# url attribute: read in file:// url, fail on others
! elsif ($xattr eq '<' and $line =~ s/^(.*?)\s*$/$1/) {
$line = $self->_read_url_attribute($line, @ldif);
return if !defined($line);
}
***************
*** 266,276 ****
my $vals = [];
my $line;
my $attr;
foreach $line (@ldif) {
! $line =~ s/^([-;\w]+):\s*// && ($attr = $1) or next;
# base64 encoded attribute: decode it
! if ($line =~ s/^:\s*//) {
eval { require MIME::Base64 };
if ($@) {
$self->_error($@, @ldif);
--- 267,278 ----
my $vals = [];
my $line;
my $attr;
+ my $xattr;
foreach $line (@ldif) {
! $line =~ s/^([-;\w]+):([\<\:]?)\s*// && (($attr, $xattr) = ($1,
$2)) or next;
# base64 encoded attribute: decode it
! if ($xattr eq ':') {
eval { require MIME::Base64 };
if ($@) {
$self->_error($@, @ldif);
***************
*** 279,285 ****
$line = MIME::Base64::decode($line);
}
# url attribute: read in file:// url, fail on others
! elsif ($line =~ s/^\<\s*(.*?)\s*$/$1/) {
$line = $self->_read_url_attribute($line, @ldif);
return if !defined($line);
}
--- 281,287 ----
$line = MIME::Base64::decode($line);
}
# url attribute: read in file:// url, fail on others
! elsif ($xattr eq '<' and $line =~ s/^(.*?)\s*$/$1/) {
$line = $self->_read_url_attribute($line, @ldif);
return if !defined($line);
}