Added "List all" button to javascript address book.
[squirrelmail.git] / functions / addressbook.php
index 738be3ffa7d0d11ecd209a5fd39d65569fc7c9e7..45f586b38b7e0d9da0a5709349c1e5feebe8b429 100644 (file)
        return $abook;
 
       // Load configured LDAP servers
-      reset($ldap_server);
-      while(list($key,$param) = each($ldap_server)) {
-        if(is_array($param)) {
-           $r = $abook->add_backend("ldap_server", $param);
-            if(!$r && $showerr) {
-              printf("&nbsp;"._("Error initializing LDAP server %s:")."<BR>\n",
-                     $param["host"]);
-              printf("&nbsp;".$abook->error);
-              exit;
-            }
-         }
+      if(is_array($ldap_server)) {
+        reset($ldap_server);
+        while(list($key,$param) = each($ldap_server)) {
+           if(is_array($param)) {
+              $r = $abook->add_backend("ldap_server", $param);
+              if(!$r && $showerr) {
+                 printf("&nbsp;"._("Error initializing LDAP server %s:").
+                        "<BR>\n", $param["host"]);
+                 printf("&nbsp;".$abook->error);
+                 exit;
+              }
+           }
+        }
       }
 
       // Return the initialized object
       var $backends    = array();
       var $numbackends = 0;
       var $error       = "";
+      var $localbackend = 0;
+      var $localbackendname = "";
 
       // Constructor function.
       function AddressBook() {
+        $localbackendname = _("Personal address book");
       }
 
       // Return an array of backends of a given type, 
        
         $newback->bnum = $this->numbackends;
         $this->backends[$this->numbackends] = $newback;
+
+        // Store ID of first local backend added
+        if($this->localbackend == 0 && $newback->btype == "local") {
+           $this->localbackend = $this->numbackends;
+           $this->localbackendname = $newback->sname;
+        }
+
         return $this->numbackends;
       }
 
 
       // Return a list of addresses matching expression in
       // all backends of a given type.
-      function search($expression, $btype = "") {
+      function search($expression, $bnum = -1) {
         $ret = array();
         $this->error = "";
 
-        $sel = $this->get_backend_list($btype);
-        $failed = 0;
-        for($i = 0 ; $i < sizeof($sel) ; $i++) {
-           $backend = &$sel[$i];
-           $backend->error = "";
-           $res = $backend->search($expression);
-           if(is_array($res)) {
-              $ret = array_merge($ret, $res);
-           } else {
-              $this->error = $this->error . "<br>\n". $backend->error;
-              $failed++;
+        // Search all backends
+        if($bnum == -1) {
+           $sel = $this->get_backend_list("");
+           $failed = 0;
+           for($i = 0 ; $i < sizeof($sel) ; $i++) {
+              $backend = &$sel[$i];
+              $backend->error = "";
+              $res = $backend->search($expression);
+              if(is_array($res)) {
+                 $ret = array_merge($ret, $res);
+              } else {
+                 $this->error = $this->error . "<br>\n". $backend->error;
+                 $failed++;
+              }
            }
+
+           // Only fail if all backends failed
+           if($failed >= sizeof($sel))
+              return false;
+
         }
 
-        // Only fail if all backends failed
-        if($failed >= sizeof($sel))
-           return false;
+        // Search only one backend
+        else {
+           $ret = $this->backends[$bnum]->search($expression);
+           if(!is_array($ret)) {
+              $this->error = $this->error . "<br>\n". $this->backends[$bnum]->error;
+              return false;
+           }
+        }
 
         return $ret;
       }
 
 
       // Return a sorted search
-      function s_search($expression, $btype = "") {
+      function s_search($expression, $bnum = -1) {
 
-        $ret = $this->search($expression, $btype);
+        $ret = $this->search($expression, $bnum);
         if(!is_array($ret))
            return $ret;
 
 
       // Lookup an address by alias. Only possible in
       // local backends.
-      function lookup($alias) {
+      function lookup($alias, $bnum = -1) {
         $ret = array();
 
+        if($bnum > -1) {
+           $res = $this->backends[$bnum]->lookup($alias);
+           if(is_array($res)) {
+              return $res;
+           } else {
+              $this->error = $backend->error;
+              return false;
+           }
+        }     
+
         $sel = $this->get_backend_list("local");
         for($i = 0 ; $i < sizeof($sel) ; $i++) {
            $backend = &$sel[$i];
            $backend->error = "";
            $res = $backend->lookup($alias);
            if(is_array($res)) {
-              return $res;
+              if(!empty($res))
+                 return $res;
            } else {
               $this->error = $backend->error;
               return false;
 
 
       // Return all addresses
-      function list_addr() {
+      function list_addr($bnum = -1) {
         $ret = array();
 
-        $sel = $this->get_backend_list("local");
+        if($bnum == -1) 
+           $sel = $this->get_backend_list("local");
+        else
+           $sel = array(0 => &$this->backends[$bnum]);
+
         for($i = 0 ; $i < sizeof($sel) ; $i++) {
            $backend = &$sel[$i];
            $backend->error = "";
            $this->error = _("Invalid input data");
            return false;
         }
-        if(empty($userdata["fullname"]) &&
+        if(empty($userdata["firstname"]) &&
            empty($userdata["lastname"])) {
            $this->error = _("Name is missing");
            return false;
            $userdata["nickname"] = $userdata["email"];
         }
 
+        if(eregi("[\: \|\#\"\!]", $userdata["nickname"])) {
+           $this->error = _("Nickname contain illegal characters");
+           return false;
+        }
+
         // Check that specified backend accept new entries
         if(!$this->backends[$bnum]->writeable) {
            $this->error = _("Addressbook is read-only");
         }
 
         return false;  // Not reached
-      }
+      } // end of add()
 
-   }
+
+      // Remove the user identified by $alias from backend $bnum
+      // If $alias is an array, all users in the array are removed.
+      function remove($alias, $bnum) {
+
+        // Check input
+        if(empty($alias))
+           return true;
+
+        // Convert string to single element array
+        if(!is_array($alias))
+          $alias = array(0 => $alias);
+
+        // Check that specified backend is writable
+        if(!$this->backends[$bnum]->writeable) {
+           $this->error = _("Addressbook is read-only");
+           return false;
+        }
+
+        // Remove user from backend
+        $res = $this->backends[$bnum]->remove($alias);
+        if($res) {
+           return $bnum;
+        } else {
+           $this->error = $this->backends[$bnum]->error;
+           return false;
+        }
+
+        return false;  // Not reached
+      } // end of remove()
+
+
+      // Remove the user identified by $alias from backend $bnum
+      // If $alias is an array, all users in the array are removed.
+      function modify($alias, $userdata, $bnum) {
+
+        // Check input
+        if(empty($alias) || !is_string($alias))
+           return true;
+
+        // Validate data
+        if(!is_array($userdata)) {
+           $this->error = _("Invalid input data");
+           return false;
+        }
+        if(empty($userdata["firstname"]) &&
+           empty($userdata["lastname"])) {
+           $this->error = _("Name is missing");
+           return false;
+        }
+        if(empty($userdata["email"])) {
+           $this->error = _("E-mail address is missing");
+           return false;
+        }
+        if(empty($userdata["nickname"])) {
+           $userdata["nickname"] = $userdata["email"];
+        }
+
+        // Check that specified backend is writable
+        if(!$this->backends[$bnum]->writeable) {
+           $this->error = _("Addressbook $bnum is read-only");
+           return false;
+        }
+
+        // Modify user in backend
+        $res = $this->backends[$bnum]->modify($alias, $userdata);
+        if($res) {
+           return $bnum;
+        } else {
+           $this->error = $this->backends[$bnum]->error;
+           return false;
+        }
+
+        return false;  // Not reached
+      } // end of modify()
+
+   } // End of class Addressbook
 
 
   /**
         return false;
       }
 
+      function remove($alias) {
+        $this->set_error("delete not implemented");
+        return false;
+      }
+
+      function modify($alias, $newuserdata) {
+        $this->set_error("modify not implemented");
+        return false;
+      }
+
    }
 
 ?>