| | |
| | | |
| | | // fieldmap property is given |
| | | if (is_array($p['fieldmap'])) { |
| | | $p['fieldmap'] = array_filter($p['fieldmap']); |
| | | foreach ($p['fieldmap'] as $rf => $lf) |
| | | $this->fieldmap[$rf] = $this->_attr_name(strtolower($lf)); |
| | | } |
| | | else if (!empty($p)) { |
| | | // read deprecated *_field properties to remain backwards compatible |
| | | foreach ($p as $prop => $value) |
| | | if (preg_match('/^(.+)_field$/', $prop, $matches)) |
| | | if (!empty($value) && preg_match('/^(.+)_field$/', $prop, $matches)) |
| | | $this->fieldmap[$matches[1]] = $this->_attr_name(strtolower($value)); |
| | | } |
| | | |
| | |
| | | |
| | | for ($i=0; $i < $entry['memberurl']['count']; $i++) { |
| | | // extract components from url |
| | | if (!preg_match('!ldap:///([^\?]+)\?\?(\w+)\?(.*)$!', $entry['memberurl'][$i], $m)) |
| | | if (!preg_match('!ldap://[^/]*/([^\?]+)\?\?(\w+)\?(.*)$!', $entry['memberurl'][$i], $m)) { |
| | | continue; |
| | | } |
| | | |
| | | // add search filter if any |
| | | $filter = $this->filter ? '(&(' . $m[3] . ')(' . $this->filter . '))' : $m[3]; |
| | |
| | | if ($this->prop['vlv_search'] && $this->ready && join(',', (array)$fields) == join(',', $list_fields)) { |
| | | $this->result = new rcube_result_set(0); |
| | | |
| | | $search_suffix = $this->prop['fuzzy_search'] && $mode != 1 ? '*' : ''; |
| | | $this->ldap->config_set('fuzzy_search', intval($this->prop['fuzzy_search'] && $mode != 1)); |
| | | $ldap_data = $this->ldap->search($this->base_dn, $this->prop['filter'], $this->prop['scope'], $this->prop['attributes'], |
| | | array('search' => $value . $search_suffix /*, 'sort' => $this->prop['sort'] */)); |
| | | array('search' => $value /*, 'sort' => $this->prop['sort'] */)); |
| | | if ($ldap_data === false) { |
| | | return $this->result; |
| | | } |
| | |
| | | return $this->result; |
| | | } |
| | | |
| | | // use AND operator for advanced searches |
| | | $filter = is_array($value) ? '(&' : '(|'; |
| | | // set wildcards |
| | | $wp = $ws = ''; |
| | | if (!empty($this->prop['fuzzy_search']) && $mode != 1) { |
| | | $ws = '*'; |
| | | if (!$mode) { |
| | | $wp = '*'; |
| | | } |
| | | } |
| | | // advanced per-attribute search |
| | | if (is_array($value)) { |
| | | // use AND operator for advanced searches |
| | | $filter = '(&'; |
| | | |
| | | if ($fields == '*') { |
| | | // search_fields are required for fulltext search |
| | | if (empty($this->prop['search_fields'])) { |
| | | $this->set_error(self::ERROR_SEARCH, 'nofulltextsearch'); |
| | | $this->result = new rcube_result_set(); |
| | | return $this->result; |
| | | } |
| | | if (is_array($this->prop['search_fields'])) { |
| | | foreach ($this->prop['search_fields'] as $field) { |
| | | $filter .= "($field=$wp" . rcube_ldap_generic::quote_string($value) . "$ws)"; |
| | | // set wildcards |
| | | $wp = $ws = ''; |
| | | if (!empty($this->prop['fuzzy_search']) && $mode != 1) { |
| | | $ws = '*'; |
| | | if (!$mode) { |
| | | $wp = '*'; |
| | | } |
| | | } |
| | | } |
| | | else { |
| | | |
| | | foreach ((array)$fields as $idx => $field) { |
| | | $val = is_array($value) ? $value[$idx] : $value; |
| | | $val = $value[$idx]; |
| | | if (!strlen($val)) |
| | | continue; |
| | | if ($attrs = $this->_map_field($field)) { |
| | | if (count($attrs) > 1) |
| | | $filter .= '(|'; |
| | |
| | | $filter .= ')'; |
| | | } |
| | | } |
| | | |
| | | $filter .= ')'; |
| | | } |
| | | $filter .= ')'; |
| | | else { |
| | | if ($fields == '*') { |
| | | // search_fields are required for fulltext search |
| | | if (empty($this->prop['search_fields'])) { |
| | | $this->set_error(self::ERROR_SEARCH, 'nofulltextsearch'); |
| | | $this->result = new rcube_result_set(); |
| | | return $this->result; |
| | | } |
| | | $attributes = (array)$this->prop['search_fields']; |
| | | } |
| | | else { |
| | | // map address book fields into ldap attributes |
| | | $me = $this; |
| | | $attributes = array(); |
| | | array_walk($fields, function($field) use ($me, &$attributes) { |
| | | if ($me->coltypes[$field] && ($attrs = (array)$me->coltypes[$field]['attributes'])) { |
| | | $attributes = array_merge($attributes, $attrs); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | // compose a full-text-like search filter |
| | | $filter = rcube_ldap_generic::fulltext_search_filter($value, $attributes, $mode); |
| | | } |
| | | |
| | | // add required (non empty) fields filter |
| | | $req_filter = ''; |