X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;ds=sidebyside;f=functions%2Faddressbook.php;h=8779c99e84564d5c4af0d26452c2b8d4e2c4a9d3;hb=23ed73eb80c7af06f1868ffa1e3be078922a63a3;hp=a8766a7c1fc615a3e2a2df6f56061a443370a383;hpb=cca9bc69f67583b960ee691bd813d3ced0352dc0;p=squirrelmail.git diff --git a/functions/addressbook.php b/functions/addressbook.php index a8766a7c..8779c99e 100644 --- a/functions/addressbook.php +++ b/functions/addressbook.php @@ -13,6 +13,7 @@ include("../functions/abook_local_file.php"); include("../functions/abook_ldap_server.php"); + // Create and initialize an addressbook object. // Returns the created object function addressbook_init($showerr = true, $onlylocal = false) { @@ -33,24 +34,36 @@ if($onlylocal) 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(" "._("Error initializing LDAP server %s:")."
\n", - $param["host"]); - printf(" ".$abook->error); - exit; - } - } + // Load configured LDAP servers (if PHP has LDAP support) + if(is_array($ldap_server) && function_exists("ldap_connect")) { + reset($ldap_server); + while(list($undef,$param) = each($ldap_server)) { + if(is_array($param)) { + $r = $abook->add_backend("ldap_server", $param); + if(!$r && $showerr) { + printf(" "._("Error initializing LDAP server %s:"). + "
\n", $param["host"]); + printf(" ".$abook->error); + exit; + } + } + } } // Return the initialized object return $abook; } + + // Had to move this function outside of the Addressbook Class + // PHP 4.0.4 Seemed to be having problems with inline functions. + function cmp($a,$b) { + if($a["backend"] > $b["backend"]) + return 1; + else if($a["backend"] < $b["backend"]) + return -1; + return (strtolower($a["name"]) > strtolower($b["name"])) ? 1 : -1; + } /** @@ -58,14 +71,17 @@ ** backends and provide services to the functions above. ** **/ + class AddressBook { 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, @@ -101,8 +117,10 @@ $this->backends[$this->numbackends] = $newback; // Store ID of first local backend added - if($this->localbackend == 0 && $newback->btype == "local") + if($this->localbackend == 0 && $newback->btype == "local") { $this->localbackend = $this->numbackends; + $this->localbackendname = $newback->sname; + } return $this->numbackends; } @@ -110,66 +128,79 @@ // 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 . "
\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 . "
\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 . "
\n". $this->backends[$bnum]->error; + return false; + } + } return $ret; } - + // Return a sorted search - function s_search($expression, $btype = "") { - - $ret = $this->search($expression, $btype); - if(!is_array($ret)) - return $ret; - - // Inline function - Not nice, but still.. - function cmp($a,$b) { - if($a["backend"] > $b["backend"]) - return 1; - else if($a["backend"] < $b["backend"]) - return -1; - - return (strtolower($a["name"]) > strtolower($b["name"])) ? 1 : -1; - } - - usort($ret, 'cmp'); - return $ret; + function s_search($expression, $bnum = -1) { + + $ret = $this->search($expression, $bnum); + if(!is_array($ret)) + return $ret; + usort($ret, 'cmp'); + 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; @@ -181,10 +212,14 @@ // 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 = ""; @@ -224,6 +259,11 @@ $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"); @@ -240,10 +280,92 @@ } 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(eregi("[\: \|\#\"\!]", $userdata["nickname"])) { + $this->error = _("Nickname contain illegal characters"); + return false; + } + + if(empty($userdata["nickname"])) { + $userdata["nickname"] = $userdata["email"]; + } + + // Check that specified backend is writable + if(!$this->backends[$bnum]->writeable) { + $this->error = _("Addressbook 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 /** ** Generic backend that all other backends extend @@ -289,6 +411,16 @@ 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; + } + } ?>