my $pkg = shift;
my $cn = shift;
- my ($retval) = search ($pkg, cn => $cn);
+ my ($retval) = search ($pkg, [[cn => $cn]]);
if (!$retval)
{
Search for the given patterns. Returns a list of I<Person>-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'},