From ecfaed571b2c38f4bcc2b6a0fa39fba15a5126ce Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Fri, 11 Nov 2011 10:04:45 -0500 Subject: [PATCH] - Apply fixes fom trunk up to r5414 --- program/include/rcube_ldap.php | 67 ++++++++++++++++++++++++++++----- 1 files changed, 56 insertions(+), 11 deletions(-) diff --git a/program/include/rcube_ldap.php b/program/include/rcube_ldap.php index 8329315..c1bff53 100644 --- a/program/include/rcube_ldap.php +++ b/program/include/rcube_ldap.php @@ -181,6 +181,9 @@ ldap_set_option($lc, LDAP_OPT_PROTOCOL_VERSION, $this->prop['ldap_version']); $this->prop['host'] = $host; $this->conn = $lc; + + if (isset($this->prop['referrals'])) + ldap_set_option($lc, LDAP_OPT_REFERRALS, $this->prop['referrals']); break; } $this->_debug("S: NOT OK"); @@ -687,15 +690,20 @@ * * @param mixed $fields The field name of array of field names to search in * @param mixed $value Search value (or array of values when $fields is array) - * @param boolean $strict True for strict, False for partial (fuzzy) matching + * @param int $mode Matching mode: + * 0 - partial (*abc*), + * 1 - strict (=), + * 2 - prefix (abc*) * @param boolean $select True if results are requested, False if count only * @param boolean $nocount (Not used) * @param array $required List of fields that cannot be empty * * @return array Indexed list of contact records and 'count' value */ - function search($fields, $value, $strict=false, $select=true, $nocount=false, $required=array()) + function search($fields, $value, $mode=0, $select=true, $nocount=false, $required=array()) { + $mode = intval($mode); + // special treatment for ID-based search if ($fields == 'ID' || $fields == $this->primary_key) { @@ -727,13 +735,31 @@ array_values($this->fieldmap), 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit']); // get all entries of this page and post-filter those that really match the query + $search = mb_strtolower($value); $this->result = new rcube_result_set(0); $entries = ldap_get_entries($this->conn, $this->ldap_result); + for ($i = 0; $i < $entries['count']; $i++) { $rec = $this->_ldap2result($entries[$i]); - if (stripos($rec['name'] . $rec['email'], $value) !== false) { - $this->result->add($rec); - $this->result->count++; + foreach (array('email', 'name') as $f) { + $val = mb_strtolower($rec[$f]); + switch ($mode) { + case 1: + $got = ($val == $search); + break; + case 2: + $got = ($search == substr($val, 0, strlen($search))); + break; + default: + $got = (strpos($val, $search) !== false); + break; + } + + if ($got) { + $this->result->add($rec); + $this->result->count++; + break; + } } } @@ -742,7 +768,14 @@ // use AND operator for advanced searches $filter = is_array($value) ? '(&' : '(|'; - $wc = !$strict && $this->prop['fuzzy_search'] ? '*' : ''; + // set wildcards + $wp = $ws = ''; + if (!empty($this->prop['fuzzy_search']) && $mode != 1) { + $ws = '*'; + if (!$mode) { + $wp = '*'; + } + } if ($fields == '*') { @@ -756,7 +789,7 @@ if (is_array($this->prop['search_fields'])) { foreach ($this->prop['search_fields'] as $field) { - $filter .= "($field=$wc" . $this->_quote_string($value) . "$wc)"; + $filter .= "($field=$wp" . $this->_quote_string($value) . "$ws)"; } } } @@ -765,7 +798,7 @@ foreach ((array)$fields as $idx => $field) { $val = is_array($value) ? $value[$idx] : $value; if ($f = $this->_map_field($field)) { - $filter .= "($f=$wc" . $this->_quote_string($val) . "$wc)"; + $filter .= "($f=$wp" . $this->_quote_string($val) . "$ws)"; } } } @@ -1339,6 +1372,18 @@ /** + * Activate/deactivate debug mode + * + * @param boolean $dbg True if LDAP commands should be logged + * @access public + */ + function set_debug($dbg = true) + { + $this->debug = $dbg; + } + + + /** * Quotes attribute value string * * @param string $str Attribute value @@ -1402,9 +1447,9 @@ $groups = array(); if ($search) { - $search = strtolower($search); + $search = mb_strtolower($search); foreach ($group_cache as $group) { - if (strstr(strtolower($group['name']), $search)) + if (strpos(mb_strtolower($group['name']), $search) !== false) $groups[] = $group; } } @@ -1480,7 +1525,7 @@ $groups[$group_id]['email'][] = $ldap_data[$i][$email_attr][$j]; } - $group_sortnames[] = strtolower($ldap_data[$i][$sort_attr][0]); + $group_sortnames[] = mb_strtolower($ldap_data[$i][$sort_attr][0]); } // recursive call can exit here -- Gitblit v1.9.1