X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=lib%2FPerson.pm;h=96a5977efd9f31190c067fa653125e469a767db0;hb=845409cba4a524df11ff516537fd5a8ea0923923;hp=79ed9f7afef82dd689bc98d97fe7a57e4a0fe888;hpb=6333caf0b25222e22ccae4e103b10a366d8155f5;p=licom.git diff --git a/lib/Person.pm b/lib/Person.pm index 79ed9f7..96a5977 100644 --- a/lib/Person.pm +++ b/lib/Person.pm @@ -134,7 +134,7 @@ sub load my $pkg = shift; my $cn = shift; - my ($retval) = search ($pkg, cn => $cn); + my ($retval) = search ($pkg, [[cn => $cn]]); if (!$retval) { @@ -245,47 +245,67 @@ sub create Search for the given patterns. Returns a list of I-objects. + @filter = + ( + [ + [field => value], # OR + [field => value] + ], # AND + ... + ); + =cut sub search { my $pkg = shift; - my %patterns = @_; - my %filter = (); - my $filter = '(objectclass=inetOrgPerson)'; + + my @patterns = @_; + my @konjunct = (); + my $filter; + my $mesg; my @retval = (); - for (keys %patterns) + for (@patterns) { - my $key = $_; - my $val = $patterns{$key}; + my $dj = $_; + my @disjunc = (); - $key = $ExternalNames{$key} if (defined ($ExternalNames{$key})); - if (!defined ($ValidFields{$key})) + for (@$dj) { - warn ("Not a valid field: $key"); - next; - } + my $field = $_->[0]; + my $value = $_->[1]; - $filter{$key} = $val; - } + $field = $ExternalNames{$field} if (defined ($ExternalNames{$field})); + if (!defined ($ValidFields{$field})) + { + warn ("Not a valid field: $field"); + next; + } - if (%filter) - { - if (scalar (keys %filter) == 1) - { - my ($key) = keys (%filter); - my $val = $filter{$key}; - $filter = "(& $filter ($key=$val))"; + $value =~ s/([\(\)\\])/\\$1/g; + + push (@disjunc, "($field=$value)"); } - else + + if (@disjunc) { - my $tmp = join (' ', map { '(' . $_ . '=' . $filter->{$_} . ')' } (keys (%$filter))); - $filter = "(& $filter (| $tmp))"; + push (@konjunct, join ('', '(|', @disjunc, ')')); } } + if (@konjunct) + { + $filter = join ('', '(&(objectclass=inetOrgPerson)', @konjunct, ')'); + } + else + { + $filter = '(objectclass=inetOrgPerson)'; + } + + print STDERR "Debug: using filter: $filter"; + $mesg = $Ldap->search ( base => $Config{'base_dn'},