diff -N functions/abook_global_database.php /usr/local/httpd/htdocs/functions/abook_global_database.php
0a1,332
> <?php
>    
> /**
>  * abook_database.php
>  *
>  * Copyright (c) 1999-2002 The Squirrelmail Project Team
>  * Licensed under the GNU GPL. For full terms see the file COPYING.
>  *
>  * Backend for personal addressbook stored in a database,
>  * accessed using the DB-classes in PEAR.
>  *
>  * IMPORTANT:  The PEAR modules must be in the include path
>  * for this class to work.
>  *
>  * An array with the following elements must be passed to
>  * the class constructor (elements marked ? are optional):
>  *
>  *    dsn       => database DNS (see PEAR for syntax)
>  *    table     => table to store addresses in (must exist)
>  *    owner     => current user (owner of address data)
>  *  ? writeable => set writeable flag (true/false)
>  *
>  * The table used should have the following columns:
>  * owner, nickname, firstname, lastname, email, label
>  * The pair (owner,nickname) should be unique (primary key).
>  *
>  *  NOTE. This class should not be used directly. Use the
>  *        "AddressBook" class instead.
>  *
>  * $Id: abook_database.php,v 1.13 2001/12/23 07:42:38 thomppj Exp $
>  */
>    
> require_once('DB.php');
>    
> class abook_global_database extends addressbook_backend {
>     var $btype = 'local';
>     var $bname = 'global_database';
>       
>     var $dsn       = '';
>     var $table     = '';
>     var $owner     = '';
>     var $dbh       = false;
>       
>     var $writeable = false;
>       
>     /* ========================== Private ======================= */
>       
>     /* Constructor */
>     function abook_global_database($param) {
>         $this->sname = _("Global address book");
>          
>         if (is_array($param)) {
>             if (empty($param['dsn']) || 
>                 empty($param['table']) || 
>                 empty($param['owner'])) {
>                 return $this->set_error('Invalid parameters');
>             }
>             
>             $this->dsn   = $param['dsn'];
>             $this->table = $param['table'];
>             $this->owner = $param['owner'];
>             
>             if (!empty($param['name'])) {
>                $this->sname = $param['name'];
>             }
> 
>             if (isset($param['writeable'])) {
>                $this->writeable = $param['writeable'];
>             }
> 
>             $this->open(true);
>         }
>         else {
>             return $this->set_error('Invalid argument to constructor');
>         }
>     }
>       
>       
>     /* Open the database. New connection if $new is true */
>     function open($new = false) {
>         $this->error = '';
>          
>         /* Return true is file is open and $new is unset */
>         if ($this->dbh && !$new) {
>             return true;
>         }
>          
>         /* Close old file, if any */
>         if ($this->dbh) {
>             $this->close();
>         }
>          
>         $dbh = DB::connect($this->dsn, true);
>          
>         if (DB::isError($dbh) || DB::isWarning($dbh)) {
>             return $this->set_error(sprintf(_("Database error: %s"),
>                                             DB::errorMessage($dbh)));
>         }
>          
>         $this->dbh = $dbh;
>         return true;
>     }
> 
>     /* Close the file and forget the filehandle */
>     function close() {
>         $this->dbh->disconnect();
>         $this->dbh = false;
>     }
> 
>     /* ========================== Public ======================== */
>      
>     /* Search the file */
>     function &search($expr) {
>         $ret = array();
>         if(!$this->open()) {
>             return false;
>         }
>          
>         /* To be replaced by advanded search expression parsing */
>         if (is_array($expr)) {
>             return;
>         }
> 
>         /* Make regexp from glob'ed expression  */
>         $expr = str_replace('?', '_', $expr);
>         $expr = str_replace('*', '%', $expr);
>         $expr = $this->dbh->quoteString($expr);
>         $expr = "%$expr%";
> 
>         $query = sprintf("SELECT * FROM %s WHERE owner='%s' AND " .
>                          "(firstname LIKE '%s' OR lastname LIKE '%s')",
>                          $this->table, $this->owner, $expr, $expr);
>         $res = $this->dbh->query($query);
> 
>         if (DB::isError($res)) {
>             return $this->set_error(sprintf(_("Database error: %s"),
>                                             DB::errorMessage($res)));
>         }
> 
>         while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
>             array_push($ret, array('nickname'  => $row['nickname'],
>                                    'name'      => "$row[firstname] $row[lastname]",
>                                    'firstname' => $row['firstname'],
>                                    'lastname'  => $row['lastname'],
>                                    'email'     => $row['email'],
>                                    'label'     => $row['label'],
>                                    'backend'   => $this->bnum,
>                                    'source'    => &$this->sname));
>         }
>         return $ret;
>     }
>      
>     /* Lookup alias */
>     function &lookup($alias) {
>         if (empty($alias)) {
>             return array();
>         }
>          
>         $alias = strtolower($alias);
> 
>         if (!$this->open()) {
>             return false;
>         }
>          
>         $query = sprintf("SELECT * FROM %s WHERE owner='%s' AND nickname='%s'",
>                          $this->table, $this->owner, $alias);
> 
>         $res = $this->dbh->query($query);
> 
>         if (DB::isError($res)) {
>             return $this->set_error(sprintf(_("Database error: %s"),
>                                             DB::errorMessage($res)));
>         }
> 
>         if ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
>             return array('nickname'  => $row['nickname'],
>                          'name'      => "$row[firstname] $row[lastname]",
>                          'firstname' => $row['firstname'],
>                          'lastname'  => $row['lastname'],
>                          'email'     => $row['email'],
>                          'label'     => $row['label'],
>                          'backend'   => $this->bnum,
>                          'source'    => &$this->sname);
>         }
>         return array();
>     }
> 
>     /* List all addresses */
>     function &list_addr() {
>         $ret = array();
>         if (!$this->open()) {
>             return false;
>         }
> 
>         $query = sprintf("SELECT * FROM %s WHERE owner='%s'",
>                          $this->table, $this->owner);
> 
>         $res = $this->dbh->query($query);
>         
>         if (DB::isError($res)) {
>             return $this->set_error(sprintf(_("Database error: %s"),
>                                             DB::errorMessage($res)));
>         }
> 
>         while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
>             array_push($ret, array('nickname'  => $row['nickname'],
>                                    'name'      => "$row[firstname] $row[lastname]",
>                                    'firstname' => $row['firstname'],
>                                    'lastname'  => $row['lastname'],
>                                    'email'     => $row['email'],
>                                    'label'     => $row['label'],
>                                    'backend'   => $this->bnum,
>                                    'source'    => &$this->sname));
>         }
>         return $ret;
>     }
> 
>     /* Add address */
>     function add($userdata) {
>         if (!$this->writeable) {
>             return $this->set_error(_("Addressbook is read-only"));
>         }
> 
>         if (!$this->open()) {
>             return false;
>         }
>          
>         /* See if user exist already */
>         $ret = $this->lookup($userdata['nickname']);
>         if (!empty($ret)) {
>             return $this->set_error(sprintf(_("User '%s' already exist"),
>                                             $ret['nickname']));
>         }
> 
>         /* Create query */
>         $query = sprintf("INSERT INTO %s (owner, nickname, firstname, " .
>                          "lastname, email, label) VALUES('%s','%s','%s'," .
>                          "'%s','%s','%s')",
>                          $this->table, $this->owner,
>                          $this->dbh->quoteString($userdata['nickname']),
>                          $this->dbh->quoteString($userdata['firstname']), 
>                          $this->dbh->quoteString($userdata['lastname']),
>                          $this->dbh->quoteString($userdata['email']), 
>                          $this->dbh->quoteString($userdata['label']) );
> 
>          /* Do the insert */
>          $r = $this->dbh->simpleQuery($query);
>          if ($r == DB_OK) {
>              return true;
>          }
> 
>          /* Fail */
>          return $this->set_error(sprintf(_("Database error: %s"),
>                                          DB::errorMessage($r)));
>     }
> 
>     /* Delete address */
>     function remove($alias) {
>         if (!$this->writeable) {
>             return $this->set_error(_("Addressbook is read-only"));
>         }
> 
>         if (!$this->open()) {
>             return false;
>         }
>          
>         /* Create query */
>         $query = sprintf("DELETE FROM %s WHERE owner='%s' AND (",
>                          $this->table, $this->owner);
> 
>         $sepstr = '';
>         while (list($undef, $nickname) = each($alias)) {
>             $query .= sprintf("%s nickname='%s' ", $sepstr,
>                               $this->dbh->quoteString($nickname));
>             $sepstr = 'OR';
>         }
>         $query .= ')';
> 
>         /* Delete entry */
>         $r = $this->dbh->simpleQuery($query);
>         if ($r == DB_OK) {
>             return true;
>         }
> 
>         /* Fail */
>         return $this->set_error(sprintf(_("Database error: %s"),
>                                          DB::errorMessage($r)));
>     }
> 
>     /* Modify address */
>     function modify($alias, $userdata) {
>         if (!$this->writeable) {
>             return $this->set_error(_("Addressbook is read-only"));
>         }
> 
>         if (!$this->open()) {
>             return false;
>         }
>          
>          /* See if user exist */
>         $ret = $this->lookup($alias);
>         if (empty($ret)) {
>             return $this->set_error(sprintf(_("User '%s' does not exist"),
>                                             $alias));
>         }
> 
>         /* Create query */
>         $query = sprintf("UPDATE %s SET nickname='%s', firstname='%s', ".
>                          "lastname='%s', email='%s', label='%s' ".
>                          "WHERE owner='%s' AND nickname='%s'",
>                          $this->table, 
>                          $this->dbh->quoteString($userdata['nickname']),
>                          $this->dbh->quoteString($userdata['firstname']), 
>                          $this->dbh->quoteString($userdata['lastname']),
>                          $this->dbh->quoteString($userdata['email']), 
>                          $this->dbh->quoteString($userdata['label']),
>                          $this->owner,
>                          $this->dbh->quoteString($alias) );
> 
>         /* Do the insert */
>         $r = $this->dbh->simpleQuery($query);
>         if ($r == DB_OK) {
>             return true;
>         }
> 
>         /* Fail */
>         return $this->set_error(sprintf(_("Database error: %s"),
>                                         DB::errorMessage($r)));
>     }
> } /* End of class abook_database */
> 
> ?>
diff -N functions/addressbook.php /usr/local/httpd/htdocs/functions/addressbook.php
37a38,53
> /*
>  * Modifications by Dominique Leuenberger (dominique.leuenberger@gibb.ch)
>  * Version 0.1 - 15. May 2002
>  * Definitiion for gobal Addressbook in a Database
>  * just set the Variable $addrbook_global_dsn to whatever 
>  * DSN you need. Same Syntax as in ../config/config.php
>  * I set it to the same Database as the User-DB but in another Table...
>  * Owner in Database has to be 'global' to identify, wether it's personal or
>  * global address book entry
>  * System defaults to Table address if not defined
>  */ 
> 
> $addrbook_global_dsn = $addrbook_dsn;
> $addrbook_global_table = "GlobAddress";
> 
> 
47a64,68
> /* Only load Global Database backend if it is configured to do so */
> if(isset($addrbook_global_dsn) && !empty($addrbook_global_dsn)) {
>   include_once('../functions/abook_global_database.php');
> }
> 
54a76
>     global $addrbook_global_dsn, $addrbook_global_table;
88a111,123
> 
>     /* Load global Addressbok from MySQL if configured */
>      if (isset($addrbook_global_dsn) && !empty($addrbook_global_dsn)) {
>        /* Database configured */
>        if (!isset($addrbook_global_table) || empty($addrbook_global_table)) {
>           $addrbook_global_table = 'address';
>        }
>        $r = $abook->add_backend('global_database', 
>                                Array('dsn' => $addrbook_global_dsn,
>                                      'owner' => 'global',
>                                      'table' => $addrbook_global_table));    
>       }
> 
