X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=functions%2Faddressbook.php;h=5c5dbcb2bbf80aa221577e1e6eb115c2468a4b46;hp=577571859a5b6d57ff470ef0f306c32fe7c61b15;hb=ea72131677da03d6287fe826838231be356e4607;hpb=48b58dca23895f9baa21ef15fd22900b0b5be2b1 diff --git a/functions/addressbook.php b/functions/addressbook.php index 57757185..5c5dbcb2 100644 --- a/functions/addressbook.php +++ b/functions/addressbook.php @@ -4,7 +4,7 @@ * * Functions require SM_PATH and support of forms.php functions * - * @copyright © 1999-2006 The SquirrelMail Project Team + * @copyright 1999-2012 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) { @@ -85,7 +86,7 @@ function addressbook_init($showerr = true, $onlylocal = false) { } $r = $abook->add_backend('local_file',array('filename'=>$abook_global_filename, - 'name' => _("Global address book"), + 'name' => _("Global Address Book"), 'detect_writeable' => false, 'line_length' => $abook_file_line_length, 'writeable'=> $abook_global_file_writeable, @@ -107,7 +108,7 @@ function addressbook_init($showerr = true, $onlylocal = false) { $r = $abook->add_backend('database', Array('dsn' => $addrbook_global_dsn, 'owner' => 'global', - 'name' => _("Global address book"), + 'name' => _("Global Address Book"), 'writeable' => $addrbook_global_writeable, 'listing' => $addrbook_global_listing, 'table' => $addrbook_global_table)); @@ -125,10 +126,13 @@ function addressbook_init($showerr = true, $onlylocal = false) { * Since 1.5.2 hook sends third ($onlylocal) argument to address book * plugins in order to allow detection of local address book init. * @since 1.5.1 and 1.4.5 + * Since 1.5.2, the plugin arguments are passed inside an array + * and by reference, so plugins hooking in here need to accept arguments + * in an array and change those values as needed instead of returning + * the changed values. */ - $hookReturn = do_hook('abook_init', $abook, $r, $onlylocal); - $abook = $hookReturn[1]; - $r = $hookReturn[2]; + $temp = array(&$abook, &$r, &$onlylocal); + do_hook('abook_init', $temp); if (!$r && $showerr) { if ($abook_init_error!='') $abook_init_error.="\n"; $abook_init_error.=_("Error initializing other address books.") . "\n" . $abook->error; @@ -158,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 */ @@ -166,20 +170,29 @@ function addressbook_init($showerr = true, $onlylocal = false) { } /** - * Display the "new address" form + * Constructs the "new address" form + * + * NOTE! The form is not closed - the caller + * must add the closing form tag itself. * - * Form is not closed and you must add closing form tag. * @since 1.5.1 - * @param string $form_url form action url - * @param string $name form name - * @param string $title form title - * @param string $button form button name - * @param array $defdata values of form fields + * + * @param string $form_url Form action url + * @param string $name Form name + * @param string $title Form title + * @param string $button Form button name + * @param int $backend The current backend being displayed + * @param array $defdata Values of form fields + * + * @return string The desired address form display code + * */ -function abook_create_form($form_url,$name,$title,$button,$defdata=array()) { +function abook_create_form($form_url, $name, $title, $button, + $backend, $defdata=array()) { + global $oTemplate; - echo addForm($form_url, 'post', 'f_add'); + $output = addForm($form_url, 'post', 'f_add', '', '', array(), TRUE); if ($button == _("Update address")) { $edit = true; @@ -204,8 +217,11 @@ function abook_create_form($form_url,$name,$title,$button,$defdata=array()) { $oTemplate->assign('writable_backends', $backends); $oTemplate->assign('values', $values); $oTemplate->assign('edit', $edit); + $oTemplate->assign('current_backend', $backend); - $oTemplate->display('addrbook_addedit.tpl'); + $output .= $oTemplate->fetch('addrbook_addedit.tpl'); + + return $output; } @@ -313,13 +329,24 @@ function get_abook_sort() { /** * This function shows the address book sort button. * - * @param integer $abook_sort_order current sort value - * @param string $alt_tag alt tag value (string visible to text only browsers) - * @param integer $Down sort value when list is sorted ascending - * @param integer $Up sort value when list is sorted descending + * @param integer $abook_sort_order Current sort value + * @param string $alt_tag The alt tag value (string + * visible to text only browsers) + * @param integer $Down Sort value when list is sorted + * ascending + * @param integer $Up Sort value when list is sorted + * descending + * @param array $uri_extra Any additional parameters to add + * to the button's link, as an + * associative array of key/value pairs + * (OPTIONAL; default none) + * * @return string html code with sorting images and urls + * */ -function show_abook_sort_button($abook_sort_order, $alt_tag, $Down, $Up ) { +function show_abook_sort_button($abook_sort_order, $alt_tag, + $Down, $Up, $uri_extra=array() ) { + global $form_url, $icon_theme_path; /* Figure out which image we want to use. */ @@ -337,11 +364,16 @@ function show_abook_sort_button($abook_sort_order, $alt_tag, $Down, $Up ) { $which = 8; } + $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 ' ' . - getIcon($icon_theme_path, $img, $text_icon, $alt_tag) . - ''; + return create_hyperlink($uri, + getIcon($icon_theme_path, $img, $text_icon, $alt_tag), + '', '', '', '', '', + array('style' => 'text-decoration:none', + 'title' => $alt_tag), + FALSE); } @@ -382,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 @@ -396,7 +428,7 @@ class AddressBook { * Constructor function. */ function AddressBook() { - $this->localbackendname = _("Personal address book"); + $this->localbackendname = _("Personal Address Book"); } /** @@ -441,7 +473,8 @@ class AddressBook { * NB: Because the backend files are included from within this function they DO NOT have access to * vars in the global scope. This function is the global scope for the included backend !!! */ - $aBackend = do_hook('abook_add_class'); + global $null; + $aBackend = do_hook('abook_add_class', $null); if (isset($aBackend) && is_array($aBackend) && isset($aBackend[$backend])) { require_once($aBackend[$backend]); } else { @@ -482,15 +515,27 @@ class AddressBook { * @return string email address with real name prepended */ function full_address($row) { - global $addrsrch_fullname, $data_dir, $username; - $prefix = getPref($data_dir, $username, 'addrsrch_fullname'); - if (($prefix != "" || (isset($addrsrch_fullname) && - $prefix == $addrsrch_fullname)) && $prefix != 'noprefix') { - $name = ($prefix == 'nickname' ? $row['nickname'] : $row['name']); - return $name . ' <' . trim($row['email']) . '>'; - } else { - 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; } /** @@ -563,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(); @@ -578,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 { @@ -591,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; } } @@ -665,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; } @@ -765,7 +831,7 @@ class AddressBook { return false; } - if (eregi('[\\: \\|\\#"\\!]', $userdata['nickname'])) { + if (preg_match('/[: |#"!]/', $userdata['nickname'])) { $this->error = _("Nickname contains illegal characters"); return false; } @@ -875,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; } @@ -938,15 +1016,13 @@ class addressbook_backend { * @since 1.5.2 */ function fullname($firstname,$lastname) { - /** - * i18n: allows to control fullname layout in address book listing - * first %s is for first name, second %s is for last name. - * Translate it to '%2$s %1$s', if surname must be displayed first in your language. - * Please note that variables can be set to empty string and extra formating - * (for example '%2$s, %1$s' as in 'Smith, John') might break. Use it only for - * setting name and surname order. scripts will remove all prepended and appended - * whitespace. - */ + // i18n: allows to control fullname layout in address book listing + // first %s is for first name, second %s is for last name. + // Translate it to '%2$s %1$s', if surname must be displayed first in your language. + // Please note that variables can be set to empty string and extra formating + // (for example '%2$s, %1$s' as in 'Smith, John') might break. Use it only for + // setting name and surname order. scripts will remove all prepended and appended + // whitespace. return trim(sprintf(dgettext('squirrelmail',"%s %s"),$firstname,$lastname)); } }