Many bugs fixed, more features inplemented. Rapid debelopment at work..
[licom.git] / lib / Person.pm
index 79ed9f7..96a5977 100644 (file)
@@ -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<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'},