LDAP: let getUsers make use of paged search

This commit is contained in:
Arthur Schiwon 2012-10-26 21:54:22 +02:00
parent 84130b885f
commit 1313cad1b9
1 changed files with 31 additions and 17 deletions

View File

@ -104,24 +104,38 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
* Get a list of all users.
*/
public function getUsers($search = '', $limit = 10, $offset = 0) {
$ldap_users = $this->connection->getFromCache('getUsers');
if(is_null($ldap_users)) {
$ldap_users = $this->fetchListOfUsers($this->connection->ldapUserFilter, array($this->connection->ldapUserDisplayName, 'dn'));
$ldap_users = $this->ownCloudUserNames($ldap_users);
$this->connection->writeToCache('getUsers', $ldap_users);
}
$this->userSearch = $search;
if(!empty($this->userSearch)) {
$ldap_users = array_filter($ldap_users, array($this, 'userMatchesFilter'));
}
if($limit == -1) {
$limit = null;
}
return array_slice($ldap_users, $offset, $limit);
}
$cachekey = 'getUsers-'.$search.'-'.$limit.'-'.$offset;
public function userMatchesFilter($user) {
return (strripos($user, $this->userSearch) !== false);
//check if users are cached, if so return
$ldap_users = $this->connection->getFromCache($cachekey);
if(!is_null($ldap_users)) {
return $ldap_users;
}
//prepare search filter
$search = empty($search) ? '*' : '*'.$search.'*';
$filter = $this->combineFilterWithAnd(array(
$this->connection->ldapUserFilter,
$this->connection->ldapGroupDisplayName.'='.$search
));
\OCP\Util::writeLog('user_ldap', 'getUsers: Get users filter '.$filter, \OCP\Util::DEBUG);
//do the search and translate results to owncloud names
$ldap_users = $this->fetchListOfUsers($filter, array($this->connection->ldapUserDisplayName, 'dn'), $limit, $offset);
$ldap_users = $this->ownCloudUserNames($ldap_users);
if(!$this->getPagedSearchResultState()) {
\OCP\Util::writeLog('user_ldap', 'getUsers: We got old-style results', \OCP\Util::DEBUG);
//if not supported, a 'normal' search has run automatically, we just need to get our slice of the cake. And we cache the general search, too
$this->connection->writeToCache('getUsers-'.$search, $ldap_users);
$ldap_users = array_slice($ldap_users, $offset, $limit);
} else {
//debug message only
\OCP\Util::writeLog('user_ldap', 'getUsers: We got paged results', \OCP\Util::DEBUG);
}
$this->connection->writeToCache($cachekey, $ldap_users);
return $ldap_users;
}
/**