X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Faddressbook.php;h=baa1c606dfd66ca5ce790723d9bf0de61756c77a;hb=c53195bbbf00d53343b5b33c35f43f75bb2646a9;hp=d35e9eeaeee0c23548a0d11766565cd655399c56;hpb=47ccfad452e8d345542d09e59112cac317cffed8;p=squirrelmail.git
diff --git a/functions/addressbook.php b/functions/addressbook.php
index d35e9eea..baa1c606 100644
--- a/functions/addressbook.php
+++ b/functions/addressbook.php
@@ -1,42 +1,32 @@
$username,
'table' => $addrbook_table));
if (!$r && $showerr) {
- $abook_init_error.=_("Error initializing addressbook database.") . "
\n" . $abook->error;
+ $abook_init_error.=_("Error initializing address book database.") . "\n" . $abook->error;
}
} else {
/* File */
$filename = getHashedFile($username, $data_dir, "$username.abook");
$r = $abook->add_backend('local_file', Array('filename' => $filename,
- 'create' => true));
+ 'umask' => 0077,
+ 'line_length' => $abook_file_line_length,
+ 'create' => true));
if(!$r && $showerr) {
// no need to use $abook->error, because message explains error.
$abook_init_error.=sprintf( _("Error opening file %s"), $filename );
@@ -94,15 +86,16 @@ 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,
'listing' => $abook_global_file_listing));
/* global abook init error is not fatal. add error message and continue */
if (!$r && $showerr) {
- if ($abook_init_error!='') $abook_init_error.="
\n";
- $abook_init_error.=_("Error initializing global addressbook.") . "
\n" . $abook->error;
+ if ($abook_init_error!='') $abook_init_error.="\n";
+ $abook_init_error.=_("Error initializing global address book.") . "\n" . $abook->error;
}
}
@@ -115,14 +108,14 @@ 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));
/* global abook init error is not fatal. add error message and continue */
if (!$r && $showerr) {
- if ($abook_init_error!='') $abook_init_error.="
\n";
- $abook_init_error.=_("Error initializing global addressbook.") . "
\n" . $abook->error;
+ if ($abook_init_error!='') $abook_init_error.="\n";
+ $abook_init_error.=_("Error initializing global address book.") . "\n" . $abook->error;
}
}
@@ -130,35 +123,46 @@ function addressbook_init($showerr = true, $onlylocal = false) {
* hook allows to include different address book backends.
* plugins should extract $abook and $r from arguments
* and use same add_backend commands as above functions.
+ * 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);
- $abook = $hookReturn[1];
- $r = $hookReturn[2];
-
- if (! $onlylocal) {
- /* Load configured LDAP servers (if PHP has LDAP support) */
- if (isset($ldap_server) && is_array($ldap_server)) {
- reset($ldap_server);
- while (list($undef,$param) = each($ldap_server)) {
- if (is_array($param)) {
- $r = $abook->add_backend('ldap_server', $param);
- if (!$r && $showerr) {
- if ($abook_init_error!='') $abook_init_error.="
\n";
- $abook_init_error.=sprintf(_("Error initializing LDAP server %s:") .
- "
\n", $param['host']);
- $abook_init_error.= $abook->error;
- }
- }
+ $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;
+ }
+
+ /* Load configured LDAP servers (if PHP has LDAP support) */
+ if (isset($ldap_server) && is_array($ldap_server)) {
+ reset($ldap_server);
+ foreach ($ldap_server as $param) {
+ if (!is_array($param))
+ continue;
+
+ /* if onlylocal is true, we only add writeable ldap servers */
+ if ($onlylocal && (!isset($param['writeable']) || $param['writeable'] != true))
+ continue;
+
+ $r = $abook->add_backend('ldap_server', $param);
+ if (!$r && $showerr) {
+ if ($abook_init_error!='') $abook_init_error.="\n";
+ $abook_init_error.=sprintf(_("Error initializing LDAP server %s:"), $param['host'])."\n";
+ $abook_init_error.= $abook->error;
}
- } // end of ldap server init
- } // end of remote abook backend init
+ }
+ } // end of ldap server init
/**
* display address book init errors.
*/
if ($abook_init_error!='' && $showerr) {
- error_box($abook_init_error,$color);
+ error_box(nl2br(sm_encode_html_special_chars($abook_init_error)));
}
/* Return the initialized object */
@@ -166,27 +170,58 @@ 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()) {
- global $color;
- echo addForm($form_url, 'post', 'f_add').
- html_tag( 'table',
- html_tag( 'tr',
- html_tag( 'td', "\n". '' . $title . '' . "\n",
- 'center', $color[0]
- )
- )
- , 'center', '', 'width="90%"' ) ."\n";
- address_form($name, $button, $defdata);
+function abook_create_form($form_url, $name, $title, $button,
+ $backend, $defdata=array()) {
+
+ global $oTemplate;
+
+ $output = addForm($form_url, 'post', 'f_add', '', '', array(), TRUE);
+
+ if ($button == _("Update address")) {
+ $edit = true;
+ $backends = NULL;
+ } else {
+ $edit = false;
+ $backends = getWritableBackends();
+ }
+
+ $fields = array (
+ 'nickname' => 'NickName',
+ 'firstname' => 'FirstName',
+ 'lastname' => 'LastName',
+ 'email' => 'Email',
+ 'label' => 'Info',
+ );
+ $values = array();
+ foreach ($fields as $sqm=>$template) {
+ $values[$template] = isset($defdata[$sqm]) ? $defdata[$sqm] : '';
+ }
+
+ $oTemplate->assign('writable_backends', $backends);
+ $oTemplate->assign('values', $values);
+ $oTemplate->assign('edit', $edit);
+ $oTemplate->assign('current_backend', $backend);
+
+ $output .= $oTemplate->fetch('addrbook_addedit.tpl');
+
+ return $output;
}
@@ -208,105 +243,21 @@ function addressbook_cmp($a,$b) {
}
/**
- * Make an input field
- * @param string $label
- * @param string $field
- * @param string $name
- * @param string $size
- * @param array $values
- * @param string $add
- */
-function addressbook_inp_field($label, $field, $name, $size, $values, $add='') {
- global $color;
- $value = ( isset($values[$field]) ? $values[$field] : '');
-
- if (is_array($value)) {
- $td_str = addSelect($name.'['.$field.']', $value);
- } else {
- $td_str = addInput($name.'['.$field.']', $value, $size);
- }
- $td_str .= $add ;
-
- return html_tag( 'tr' ,
- html_tag( 'td', $label . ':', 'right', $color[4]) .
- html_tag( 'td', $td_str, 'left', $color[4])
- )
- . "\n";
-}
-
-/**
- * Output form to add and modify address data
- */
-function address_form($name, $submittext, $values = array()) {
- global $color, $squirrelmail_language;
-
- if ($squirrelmail_language == 'ja_JP') {
- echo html_tag( 'table',
- addressbook_inp_field(_("Nickname"), 'nickname', $name, 15, $values,
- ' ' . _("Must be unique") . '') .
- addressbook_inp_field(_("E-mail address"), 'email', $name, 45, $values, '') .
- addressbook_inp_field(_("Last name"), 'lastname', $name, 45, $values, '') .
- addressbook_inp_field(_("First name"), 'firstname', $name, 45, $values, '') .
- addressbook_inp_field(_("Additional info"), 'label', $name, 45, $values, '') .
- list_writable_backends($name) .
- html_tag( 'tr',
- html_tag( 'td',
- addSubmit($submittext, $name.'[SUBMIT]'),
- 'center', $color[4], 'colspan="2"')
- )
- , 'center', '', 'border="0" cellpadding="1" width="90%"') ."\n";
- } else {
- echo html_tag( 'table',
- addressbook_inp_field(_("Nickname"), 'nickname', $name, 15, $values,
- ' ' . _("Must be unique") . '') .
- addressbook_inp_field(_("E-mail address"), 'email', $name, 45, $values, '') .
- addressbook_inp_field(_("First name"), 'firstname', $name, 45, $values, '') .
- addressbook_inp_field(_("Last name"), 'lastname', $name, 45, $values, '') .
- addressbook_inp_field(_("Additional info"), 'label', $name, 45, $values, '') .
- list_writable_backends($name) .
- html_tag( 'tr',
- html_tag( 'td',
- addSubmit($submittext, $name.'[SUBMIT]') ,
- 'center', $color[4], 'colspan="2"')
- )
- , 'center', '', 'border="0" cellpadding="1" width="90%"') ."\n";
- }
-}
-
-/**
- * Provides list of writeable backends.
- * Works only when address is added ($name='addaddr')
- * @param string $name name of form
- * @return string html formated backend field (select or hidden)
+ * Retrieve a list of writable backends
+ * @since 1.5.2
*/
-function list_writable_backends($name) {
- global $color, $abook;
- if ( $name != 'addaddr' ) { return; }
- $writeable_abook = 1;
- if ( $abook->numbackends > 1 ) {
- $backends = $abook->get_backend_list();
- $writeable_abooks=array();
- while (list($undef,$v) = each($backends)) {
- if ($v->writeable) {
- // add each backend to array
- $writeable_abooks[$v->bnum]=$v->sname;
- // save backend number
- $writeable_abook=$v->bnum;
- }
- }
- if (count($writeable_abooks)>1) {
- // we have more than one writeable backend
- $ret=addSelect('backend',$writeable_abooks,null,true);
- return html_tag( 'tr',
- html_tag( 'td', _("Add to:"),'right', $color[4] ) .
- html_tag( 'td', $ret, 'left', $color[4] )) . "\n";
+function getWritableBackends () {
+ global $abook;
+
+ $write = array();
+ $backends = $abook->get_backend_list();
+ foreach ($backends as $v) {
+ if ($v->writeable) {
+ $write[$v->bnum]=$v->sname;
}
}
- // Only one backend exists or is writeable.
- return html_tag( 'tr',
- html_tag( 'td',
- addHidden('backend', $writeable_abook),
- 'center', $color[4], 'colspan="2"')) . "\n";
+
+ return $write;
}
/**
@@ -378,32 +329,51 @@ 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 ) {
- global $form_url;
+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. */
if ($abook_sort_order != $Up && $abook_sort_order != $Down) {
$img = 'sort_none.png';
+ $text_icon = '◻'; // U+25FB WHITE MEDIUM SQUARE
$which = $Up;
} elseif ($abook_sort_order == $Up) {
$img = 'up_pointer.png';
+ $text_icon = '⇧'; // U+21E7 UPWARDS WHITE ARROW
$which = $Down;
} else {
$img = 'down_pointer.png';
+ $text_icon = '⇩'; // U+21E9 DOWNWARDS WHITE ARROW
$which = 8;
}
- /* Now that we have everything figured out, show the actual button. */
- return ' ';
+ $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,
+ getIcon($icon_theme_path, $img, $text_icon, $alt_tag),
+ '', '', '', '', '',
+ array('style' => 'text-decoration:none',
+ 'title' => $alt_tag),
+ FALSE);
}
@@ -414,14 +384,6 @@ function show_abook_sort_button($abook_sort_order, $alt_tag, $Down, $Up ) {
* @subpackage addressbook
*/
class AddressBook {
-
- /*
- Cleaning errors from html with htmlspecialchars:
- Errors from the backend are cleaned up in this class because we not always
- have control over it when error output is generated in the backend.
- If this appears to be wrong place then clean it up at the source (the backend)
- */
-
/**
* Enabled address book backends
* @var array
@@ -449,13 +411,13 @@ class AddressBook {
var $localbackendname = '';
/**
* Controls use of 'extra' field
- *
- * 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
+ *
+ * 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 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
+ * not allowed. Backends that don't return 'extra' row in address book
* data should not modify this object property.
* @var boolean
* @since 1.5.1
@@ -463,10 +425,17 @@ class AddressBook {
var $add_extra_field = false;
/**
- * Constructor function.
+ * Constructor (PHP5 style, required in some future version of PHP)
+ */
+ function __construct() {
+ $this->localbackendname = _("Personal Address Book");
+ }
+
+ /**
+ * Constructor (PHP4 style, kept for compatibility reasons)
*/
function AddressBook() {
- $this->localbackendname = _("Personal address book");
+ self::__construct();
}
/**
@@ -497,8 +466,32 @@ class AddressBook {
* @return integer number of backends
*/
function add_backend($backend, $param = '') {
+ static $backend_classes;
+ if (!isset($backend_classes)) {
+ $backend_classes = array();
+ }
+ if (!isset($backend_classes[$backend])) {
+ /**
+ * Support backend provided by plugins. Plugin function must
+ * return an associative array with as key the backend name ($backend)
+ * and as value the file including the path containing the backend class.
+ * i.e.: $aBackend = array('backend_template' => SM_PATH . 'plugins/abook_backend_template/functions.php')
+ *
+ * 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 !!!
+ */
+ global $null;
+ $aBackend = do_hook('abook_add_class', $null);
+ if (isset($aBackend) && is_array($aBackend) && isset($aBackend[$backend])) {
+ require_once($aBackend[$backend]);
+ } else {
+ require_once(SM_PATH . 'functions/abook_'.$backend.'.php');
+ }
+ $backend_classes[$backend] = true;
+ }
$backend_name = 'abook_' . $backend;
- eval('$newback = new ' . $backend_name . '($param);');
+ $newback = new $backend_name($param);
+ //eval('$newback = new ' . $backend_name . '($param);');
if(!empty($newback->error)) {
$this->error = $newback->error;
return false;
@@ -528,16 +521,28 @@ class AddressBook {
* @param array $row address book entry
* @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']);
+ static function full_address($row) {
+ 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;
}
/**
@@ -564,7 +569,7 @@ class AddressBook {
if (is_array($res)) {
$ret = array_merge($ret, $res);
} else {
- $this->error .= "
\n" . htmlspecialchars($backend->error);
+ $this->error .= "\n" . $backend->error;
$failed++;
}
}
@@ -574,13 +579,17 @@ class AddressBook {
$ret = FALSE;
}
- } else {
+ } elseif (! isset($this->backends[$bnum])) {
+ /* make sure that backend exists */
+ $this->error = _("Unknown address book backend");
+ $ret = false;
+ } else {
/* Search only one backend */
$ret = $this->backends[$bnum]->search($expression);
if (!is_array($ret)) {
- $this->error .= "
\n" . htmlspecialchars($this->backends[$bnum]->error);
+ $this->error .= "\n" . $this->backends[$bnum]->error;
$ret = FALSE;
}
}
@@ -606,22 +615,42 @@ 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();
if ($bnum > -1) {
- $res = $this->backends[$bnum]->lookup($alias);
+ if (!isset($this->backends[$bnum])) {
+ $this->error = _("Unknown address book backend");
+ return false;
+ }
+ $res = $this->backends[$bnum]->lookup($value, $field);
if (is_array($res)) {
return $res;
} else {
- $this->error = htmlspecialchars($this->backends[$bnum]->error);
+ $this->error = $this->backends[$bnum]->error;
return false;
}
}
@@ -630,13 +659,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 = htmlspecialchars($backend->error);
- return false;
+ $this->error = $backend->error;
+ return false;
}
}
@@ -647,13 +681,17 @@ class AddressBook {
/**
* Return all addresses
* @param integer $bnum backend number
- * @return array search results
+ * @return mixed array with search results or boolean false on error.
*/
function list_addr($bnum = -1) {
$ret = array();
if ($bnum == -1) {
$sel = $this->get_backend_list('');
+ } elseif (! isset($this->backends[$bnum])) {
+ /* make sure that backend exists */
+ $this->error = _("Unknown address book backend");
+ $ret = false;
} else {
$sel = array(0 => &$this->backends[$bnum]);
}
@@ -665,7 +703,7 @@ class AddressBook {
if (is_array($res)) {
$ret = array_merge($ret, $res);
} else {
- $this->error = htmlspecialchars($backend->error);
+ $this->error = $backend->error;
return false;
}
}
@@ -699,14 +737,21 @@ class AddressBook {
$userdata['nickname'] = $userdata['email'];
}
- if (eregi('[ \\:\\|\\#\\"\\!]', $userdata['nickname'])) {
+ /* Blocks use of space, :, |, #, " and ! in nickname */
+ if (preg_match('/[ :|#"!]/', $userdata['nickname'])) {
$this->error = _("Nickname contains illegal characters");
return false;
}
+ /* make sure that backend exists */
+ if (! isset($this->backends[$bnum])) {
+ $this->error = _("Unknown address book backend");
+ return false;
+ }
+
/* Check that specified backend accept new entries */
if (!$this->backends[$bnum]->writeable) {
- $this->error = _("Addressbook is read-only");
+ $this->error = _("Address book is read-only");
return false;
}
@@ -715,7 +760,7 @@ class AddressBook {
if ($res) {
return $bnum;
} else {
- $this->error = htmlspecialchars($this->backends[$bnum]->error);
+ $this->error = $this->backends[$bnum]->error;
return false;
}
@@ -741,9 +786,15 @@ class AddressBook {
$alias = array(0 => $alias);
}
+ /* make sure that backend exists */
+ if (! isset($this->backends[$bnum])) {
+ $this->error = _("Unknown address book backend");
+ return false;
+ }
+
/* Check that specified backend is writable */
if (!$this->backends[$bnum]->writeable) {
- $this->error = _("Addressbook is read-only");
+ $this->error = _("Address book is read-only");
return false;
}
@@ -752,7 +803,7 @@ class AddressBook {
if ($res) {
return $bnum;
} else {
- $this->error = htmlspecialchars($this->backends[$bnum]->error);
+ $this->error = $this->backends[$bnum]->error;
return false;
}
@@ -787,7 +838,7 @@ class AddressBook {
return false;
}
- if (eregi('[\\: \\|\\#"\\!]', $userdata['nickname'])) {
+ if (preg_match('/[: |#"!]/', $userdata['nickname'])) {
$this->error = _("Nickname contains illegal characters");
return false;
}
@@ -796,9 +847,15 @@ class AddressBook {
$userdata['nickname'] = $userdata['email'];
}
+ /* make sure that backend exists */
+ if (! isset($this->backends[$bnum])) {
+ $this->error = _("Unknown address book backend");
+ return false;
+ }
+
/* Check that specified backend is writable */
if (!$this->backends[$bnum]->writeable) {
- $this->error = _("Addressbook is read-only");;
+ $this->error = _("Address book is read-only");;
return false;
}
@@ -807,7 +864,7 @@ class AddressBook {
if ($res) {
return $bnum;
} else {
- $this->error = htmlspecialchars($this->backends[$bnum]->error);
+ $this->error = $this->backends[$bnum]->error;
return false;
}
@@ -879,24 +936,36 @@ class addressbook_backend {
/**
* Search for entries in backend
*
- * Working backend should support use of wildcards. * symbol
+ * Working backend should support use of wildcards. * symbol
* should match one or more symbols. ? symbol should match any
- * single symbol.
+ * single symbol.
* @param string $expression
* @return bool
*/
function search($expression) {
- $this->set_error('search not implemented');
+ $this->set_error('search is not implemented');
return false;
}
/**
- * 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) {
- $this->set_error('lookup not implemented');
+ function lookup($value, $field=SM_ABOOK_FIELD_NICKNAME) {
+ $this->set_error('lookup is not implemented');
return false;
}
@@ -908,7 +977,7 @@ class addressbook_backend {
* @return bool
*/
function list_addr() {
- $this->set_error('list_addr not implemented');
+ $this->set_error('list_addr is not implemented');
return false;
}
@@ -918,7 +987,7 @@ class addressbook_backend {
* @return bool
*/
function add($userdata) {
- $this->set_error('add not implemented');
+ $this->set_error('add is not implemented');
return false;
}
@@ -928,7 +997,7 @@ class addressbook_backend {
* @return bool
*/
function remove($alias) {
- $this->set_error('delete not implemented');
+ $this->set_error('delete is not implemented');
return false;
}
@@ -939,32 +1008,28 @@ class addressbook_backend {
* @return bool
*/
function modify($alias, $newuserdata) {
- $this->set_error('modify not implemented');
+ $this->set_error('modify is not implemented');
return false;
}
-}
-
-/*
- PHP 5 requires that the class be made first, which seems rather
- logical, and should have been the way it was generated the first time.
-*/
-
-require_once(SM_PATH . 'functions/abook_local_file.php');
-require_once(SM_PATH . 'functions/abook_ldap_server.php');
-/* Only load database backend if database is configured */
-if((isset($addrbook_dsn) && !empty($addrbook_dsn)) ||
- (isset($addrbook_global_dsn) && !empty($addrbook_global_dsn))) {
- include_once(SM_PATH . 'functions/abook_database.php');
+ /**
+ * Creates full name from given name and surname
+ *
+ * Handles name order differences. Function always runs in SquirrelMail gettext domain.
+ * Plugins don't have to switch domains before calling this function.
+ * @param string $firstname given name
+ * @param string $lastname surname
+ * @return string full name
+ * @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.
+ return trim(sprintf(dgettext('squirrelmail',"%s %s"),$firstname,$lastname));
+ }
}
-
-/*
- * hook allows adding different address book classes.
- * class must follow address book class coding standards.
- *
- * see addressbook_backend class and functions/abook_*.php files.
- * @since 1.5.1 and 1.4.5
- */
-do_hook('abook_add_class');
-
-?>