Add associative edit list option widget with optional folder list selector for values...
[squirrelmail.git] / functions / addressbook.php
index 36edcb02a9b159e33e74f4223bb4a7d7332bccf3..7a616cfcfb4fb8f12e437fb3d0b602304b21666a 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Functions require SM_PATH and support of forms.php functions
  *
- * @copyright © 1999-2007 The SquirrelMail Project Team
+ * @copyright 1999-2013 The SquirrelMail Project Team
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  * @version $Id$
  * @package squirrelmail
@@ -54,6 +54,7 @@ function addressbook_init($showerr = true, $onlylocal = false) {
         /* File */
         $filename = getHashedFile($username, $data_dir, "$username.abook");
         $r = $abook->add_backend('local_file', Array('filename' => $filename,
+                                                     'umask' => 0077,
                                                      'line_length' => $abook_file_line_length,
                                                      'create'   => true));
         if(!$r && $showerr) {
@@ -161,7 +162,7 @@ function addressbook_init($showerr = true, $onlylocal = false) {
      * display address book init errors.
      */
     if ($abook_init_error!='' && $showerr) {
-        error_box(nl2br(htmlspecialchars($abook_init_error)));
+        error_box(nl2br(sm_encode_html_special_chars($abook_init_error)));
     }
 
     /* Return the initialized object */
@@ -191,7 +192,7 @@ function abook_create_form($form_url, $name, $title, $button,
 
     global $oTemplate;
 
-    $output = addForm($form_url, 'post', 'f_add');
+    $output = addForm($form_url, 'post', 'f_add', '', '', array(), TRUE);
 
     if ($button == _("Update address")) {
         $edit = true;
@@ -363,9 +364,8 @@ function show_abook_sort_button($abook_sort_order, $alt_tag,
         $which = 8;
     }
 
-    $uri = $form_url .'?abook_sort_order=' . $which;
-    foreach ($uri_extra as $key => $value)
-       $uri = set_url_var($uri, $key, $value, FALSE);
+    $uri_extra['abook_sort_order'] = $which;
+    $uri = set_uri_vars($form_url, $uri_extra, FALSE);
 
     /* Now that we have everything figured out, show the actual button. */
     return create_hyperlink($uri,
@@ -414,7 +414,7 @@ class AddressBook {
      *
      * Extra field can be used to add link to form, which allows
      * to modify all fields supported by backend. This is the only field
-     * that is not sanitized with htmlspecialchars. Backends MUST make
+     * that is not sanitized with sm_encode_html_special_chars. Backends MUST make
      * sure that field data is sanitized and displayed correctly inside
      * table cell. Use of html formating in other address book fields is
      * not allowed. Backends that don't return 'extra' row in address book
@@ -515,14 +515,27 @@ class AddressBook {
      * @return string email address with real name prepended
      */
     function full_address($row) {
-        global $data_dir, $username;
-        $addrsrch_fullname = getPref($data_dir, $username, 'addrsrch_fullname');
-        if ($addrsrch_fullname == 'fullname')
-            return $row['name'] . ' <' . trim($row['email']) . '>';
-        else if ($addrsrch_fullname == 'nickname')
-            return $row['nickname'] . ' <' . trim($row['email']) . '>';
-        else // "noprefix"
-            return trim($row['email']);
+        global $data_dir, $username, $addrsrch_fullname;
+
+        // allow multiple addresses in one row (poor person's grouping - bah)
+        // (separate with commas)
+        //
+        $return = '';
+        $addresses = explode(',', $row['email']);
+        foreach ($addresses as $address) {
+            
+            if (!empty($return)) $return .= ', ';
+
+            if ($addrsrch_fullname == 'fullname')
+                $return .= '"' . $row['name'] . '" <' . trim($address) . '>';
+            else if ($addrsrch_fullname == 'nickname')
+                $return .= '"' . $row['nickname'] . '" <' . trim($address) . '>';
+            else // "noprefix"
+                $return .= trim($address);
+
+        }
+
+        return $return;
     }
 
     /**
@@ -595,13 +608,29 @@ class AddressBook {
 
 
     /**
-     * Lookup an address by alias.
+     * Lookup an address by the indicated field.
+     *
      * Only possible in local backends.
-     * @param string $alias
-     * @param integer backend number
-     * @return array lookup results. False, if not found.
+     *
+     * @param string  $value The value to look up
+     * @param integer $bnum  The number of the backend to
+     *                       look within (OPTIONAL; defaults 
+     *                       to look in all local backends)
+     * @param integer $field The field to look in, should be one
+     *                       of the SM_ABOOK_FIELD_* constants
+     *                       defined in include/constants.php
+     *                       (OPTIONAL; defaults to nickname field)
+     *                       NOTE: uniqueness is only guaranteed
+     *                       when the nickname field is used here;
+     *                       otherwise, the first matching address
+     *                       is returned.
+     *
+     * @return mixed Array with lookup results when the value
+     *               was found, an empty array if the value was
+     *               not found, or false if an error occured.
+     *
      */
-    function lookup($alias, $bnum = -1) {
+    function lookup($value, $bnum = -1, $field = SM_ABOOK_FIELD_NICKNAME) {
 
         $ret = array();
 
@@ -610,7 +639,7 @@ class AddressBook {
                 $this->error = _("Unknown address book backend");
                 return false;
             }
-            $res = $this->backends[$bnum]->lookup($alias);
+            $res = $this->backends[$bnum]->lookup($value, $field);
             if (is_array($res)) {
                return $res;
             } else {
@@ -623,13 +652,18 @@ class AddressBook {
         for ($i = 0 ; $i < sizeof($sel) ; $i++) {
             $backend = &$sel[$i];
             $backend->error = '';
-            $res = $backend->lookup($alias);
+            $res = $backend->lookup($value, $field);
+
+            // return an address if one is found
+            // (empty array means lookup concluded
+            // but no result found - in this case,
+            // proceed to next backend)
+            //
             if (is_array($res)) {
-               if(!empty($res))
-              return $res;
+                if (!empty($res)) return $res;
             } else {
-               $this->error = $backend->error;
-               return false;
+                $this->error = $backend->error;
+                return false;
             }
         }
 
@@ -697,7 +731,7 @@ class AddressBook {
         }
 
         /* Blocks use of space, :, |, #, " and ! in nickname */
-        if (eregi('[ \\:\\|\\#\\"\\!]', $userdata['nickname'])) {
+        if (preg_match('/[ :|#"!]/', $userdata['nickname'])) {
             $this->error = _("Nickname contains illegal characters");
             return false;
         }
@@ -797,7 +831,7 @@ class AddressBook {
             return false;
         }
 
-        if (eregi('[\\: \\|\\#"\\!]', $userdata['nickname'])) {
+        if (preg_match('/[: |#"!]/', $userdata['nickname'])) {
             $this->error = _("Nickname contains illegal characters");
             return false;
         }
@@ -907,11 +941,23 @@ class addressbook_backend {
     }
 
     /**
-     * Find entry in backend by alias
-     * @param string $alias name used for id
-     * @return bool
+     * Find entry in backend by the indicated field
+     *
+     * @param string  $value The value to look up
+     * @param integer $field The field to look in, should be one
+     *                       of the SM_ABOOK_FIELD_* constants
+     *                       defined in include/constants.php
+     *                       NOTE: uniqueness is only guaranteed
+     *                       when the nickname field is used here;
+     *                       otherwise, the first matching address
+     *                       is returned.
+     *
+     * @return mixed Array with lookup results when the value
+     *               was found, an empty array if the value was
+     *               not found, or false if an error occured.
+     *
      */
-    function lookup($alias) {
+    function lookup($value, $field=SM_ABOOK_FIELD_NICKNAME) {
         $this->set_error('lookup is not implemented');
         return false;
     }