Fix LDAP search calls and return the number of matches

This commit is contained in:
Thomas Bruederli 2014-05-16 10:36:57 +02:00
parent 115c4c54b7
commit 7d5fe4c794
2 changed files with 41 additions and 5 deletions

View file

@ -36,6 +36,7 @@ function kolab_folderlist(node, p)
var search_results_widget;
var search_results_container;
var listsearch_request;
var search_messagebox;
var Q = rcmail.quote_html;
@ -164,8 +165,29 @@ function kolab_folderlist(node, p)
}
search_results = {};
if (search_messagebox)
rcmail.hide_message(search_messagebox);
// send search request(s) to server
if (search.query && search.execute) {
// require a minimum length for the search string
if (rcmail.env.autocomplete_min_length && search.query.length < rcmail.env.autocomplete_min_length) {
search_messagebox = rcmail.display_message(
rcmail.get_label('autocompletechars').replace('$min', rcmail.env.autocomplete_min_length));
return;
}
if (listsearch_request) {
// ignore, let the currently runnung sequest finish
if (listsearch_request.query == search.query) {
return;
}
else { // cancel previous search request
rcmail.multi_thread_request_abort(listsearch_request.id);
listsearch_request = null;
}
}
var sources = p.search_sources || [ 'folders' ];
var reqid = rcmail.multi_thread_http_request({
items: sources,
@ -173,10 +195,15 @@ function kolab_folderlist(node, p)
action: p.search_action || 'listsearch',
postdata: { action:'search', q:search.query, source:'%s' },
lock: rcmail.display_message(rcmail.get_label('searching'), 'loading'),
onresponse: render_search_results
onresponse: render_search_results,
whendone: function(e){ listsearch_request = null; }
});
listsearch_request = { id:reqid, sources:sources.slice(), num:sources.length };
listsearch_request = { id:reqid, query:search.query };
}
else if (!search.query && listsearch_request) {
rcmail.multi_thread_request_abort(listsearch_request.id);
listsearch_request = null;
}
});

View file

@ -1318,11 +1318,12 @@ class kolab_storage
* @param mixed $query Search value (or array of field => value pairs)
* @param int $mode Matching mode: 0 - partial (*abc*), 1 - strict (=), 2 - prefix (abc*)
* @param array $required List of fields that shall ot be empty
* @param int $limit Number of records
* @param int $limit Maximum number of records
* @param int $count Returns the number of records found
*
* @return array List or false on error
*/
public static function search_users($query, $mode = 1, $required = array(), $limit = 0)
public static function search_users($query, $mode = 1, $required = array(), $limit = 0, &$count = 0)
{
// requires a working LDAP setup
if (!self::ldap()) {
@ -1330,7 +1331,12 @@ class kolab_storage
}
// search users using the configured attributes
$results = self::$ldap->search(self::$config->get('kolab_users_search_attrib', array('cn','mail','alias')), $query, $mode, $required, $limit);
$results = self::$ldap->dosearch(self::$config->get('kolab_users_search_attrib', array('cn','mail','alias')), $query, $mode, $required, $limit, $count);
// exclude myself
if ($_SESSION['kolab_dn']) {
unset($results[$_SESSION['kolab_dn']]);
}
// resolve to IMAP folder name
$root = self::namespace_root('other');
@ -1391,6 +1397,9 @@ class kolab_storage
$path_len = count(explode($delimiter, $other_ns));
foreach ((array)self::list_folders($other_ns, '*', '', $subscribed) as $foldername) {
if ($foldername == 'INBOX') // skip INBOX which is added by default
continue;
// truncate folder path to top-level folders of the 'other' namespace
$path = explode($delimiter, $foldername);
$foldername = join($delimiter, array_slice($path, 0, $path_len + 1));