Fix LDAP searches in kolab_auth_ldap::search() when fieldmap does not

contain requested attribute mapping (Bug #2302)
This commit is contained in:
Aleksander Machniak 2013-12-10 11:41:24 +01:00
parent bf028bb53f
commit 94339e0e4b

View file

@ -207,7 +207,7 @@ class kolab_auth_ldap extends rcube_ldap_generic
/** /**
* Search records (simplified version of rcube_ldap::search) * Search records (simplified version of rcube_ldap::search)
* *
* @param mixed $fields The field name of array of field names to search in * @param mixed $fields The field name or array of field names to search in
* @param mixed $value Search value (or array of values when $fields is array) * @param mixed $value Search value (or array of values when $fields is array)
* @param int $mode Matching mode: * @param int $mode Matching mode:
* 0 - partial (*abc*), * 0 - partial (*abc*),
@ -221,6 +221,10 @@ class kolab_auth_ldap extends rcube_ldap_generic
*/ */
function search($fields, $value, $mode=1, $required = array(), $limit = 0) function search($fields, $value, $mode=1, $required = array(), $limit = 0)
{ {
if (empty($fields)) {
return array();
}
$mode = intval($mode); $mode = intval($mode);
// use AND operator for advanced searches // use AND operator for advanced searches
@ -237,7 +241,12 @@ class kolab_auth_ldap extends rcube_ldap_generic
foreach ((array)$fields as $idx => $field) { foreach ((array)$fields as $idx => $field) {
$val = is_array($value) ? $value[$idx] : $value; $val = is_array($value) ? $value[$idx] : $value;
if ($attrs = (array) $this->fieldmap[$field]) { $attrs = (array) $this->fieldmap[$field];
if (empty($attrs)) {
$filter .= "($field=$wp" . rcube_ldap_generic::quote_string($val) . "$ws)";
}
else {
if (count($attrs) > 1) if (count($attrs) > 1)
$filter .= '(|'; $filter .= '(|';
foreach ($attrs as $f) foreach ($attrs as $f)
@ -254,7 +263,13 @@ class kolab_auth_ldap extends rcube_ldap_generic
foreach ((array)$required as $field) { foreach ((array)$required as $field) {
if (in_array($field, (array)$fields)) // required field is already in search filter if (in_array($field, (array)$fields)) // required field is already in search filter
continue; continue;
if ($attrs = (array) $this->fieldmap[$field]) {
$attrs = (array) $this->fieldmap[$field];
if (empty($attrs)) {
$req_filter .= "($field=*)";
}
else {
if (count($attrs) > 1) if (count($attrs) > 1)
$req_filter .= '(|'; $req_filter .= '(|';
foreach ($attrs as $f) foreach ($attrs as $f)