Merge pull request #7815 from owncloud/ldap_fix_usercount_master
correct LDAP user count on setup with many users (occ user:report)
This commit is contained in:
commit
f6551d214f
1 changed files with 42 additions and 17 deletions
|
@ -659,7 +659,7 @@ class Access extends LDAPUtility {
|
||||||
* @param string $filter
|
* @param string $filter
|
||||||
*/
|
*/
|
||||||
public function countUsers($filter, $attr = array('dn'), $limit = null, $offset = null) {
|
public function countUsers($filter, $attr = array('dn'), $limit = null, $offset = null) {
|
||||||
return $this->count($filter, $this->connection->ldapBaseGroups, $attr, $limit, $offset);
|
return $this->count($filter, $this->connection->ldapBaseUsers, $attr, $limit, $offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -775,22 +775,47 @@ class Access extends LDAPUtility {
|
||||||
*/
|
*/
|
||||||
private function count($filter, $base, $attr = null, $limit = null, $offset = null, $skipHandling = false) {
|
private function count($filter, $base, $attr = null, $limit = null, $offset = null, $skipHandling = false) {
|
||||||
\OCP\Util::writeLog('user_ldap', 'Count filter: '.print_r($filter, true), \OCP\Util::DEBUG);
|
\OCP\Util::writeLog('user_ldap', 'Count filter: '.print_r($filter, true), \OCP\Util::DEBUG);
|
||||||
$search = $this->executeSearch($filter, $base, $attr, $limit, $offset);
|
|
||||||
if($search === false) {
|
if(is_null($limit)) {
|
||||||
return false;
|
$limit = $this->connection->ldapPagingSize;
|
||||||
}
|
|
||||||
list($sr, $pagedSearchOK) = $search;
|
|
||||||
$cr = $this->connection->getConnectionResource();
|
|
||||||
$counter = 0;
|
|
||||||
foreach($sr as $key => $res) {
|
|
||||||
$count = $this->ldap->countEntries($cr, $res);
|
|
||||||
if($count !== false) {
|
|
||||||
$counter += $count;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->processPagedSearchStatus($sr, $filter, $base, $counter, $limit,
|
$counter = 0;
|
||||||
|
$count = null;
|
||||||
|
$cr = $this->connection->getConnectionResource();
|
||||||
|
|
||||||
|
do {
|
||||||
|
$continue = false;
|
||||||
|
$search = $this->executeSearch($filter, $base, $attr,
|
||||||
|
$limit, $offset);
|
||||||
|
if($search === false) {
|
||||||
|
return $counter > 0 ? $counter : false;
|
||||||
|
}
|
||||||
|
list($sr, $pagedSearchOK) = $search;
|
||||||
|
|
||||||
|
$count = $this->countEntriesInSearchResults($sr, $limit, $continue);
|
||||||
|
$counter += $count;
|
||||||
|
|
||||||
|
$this->processPagedSearchStatus($sr, $filter, $base, $count, $limit,
|
||||||
$offset, $pagedSearchOK, $skipHandling);
|
$offset, $pagedSearchOK, $skipHandling);
|
||||||
|
$offset += $limit;
|
||||||
|
} while($continue);
|
||||||
|
|
||||||
|
return $counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function countEntriesInSearchResults($searchResults, $limit,
|
||||||
|
&$hasHitLimit) {
|
||||||
|
$cr = $this->connection->getConnectionResource();
|
||||||
|
$count = 0;
|
||||||
|
|
||||||
|
foreach($searchResults as $res) {
|
||||||
|
$count = intval($this->ldap->countEntries($cr, $res));
|
||||||
|
$counter += $count;
|
||||||
|
if($count === $limit) {
|
||||||
|
$hasHitLimit = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $counter;
|
return $counter;
|
||||||
}
|
}
|
||||||
|
@ -891,7 +916,7 @@ class Access extends LDAPUtility {
|
||||||
//we slice the findings, when
|
//we slice the findings, when
|
||||||
//a) paged search insuccessful, though attempted
|
//a) paged search insuccessful, though attempted
|
||||||
//b) no paged search, but limit set
|
//b) no paged search, but limit set
|
||||||
if((!$this->pagedSearchedSuccessful
|
if((!$this->getPagedSearchResultState()
|
||||||
&& $pagedSearchOK)
|
&& $pagedSearchOK)
|
||||||
|| (
|
|| (
|
||||||
!$pagedSearchOK
|
!$pagedSearchOK
|
||||||
|
@ -1184,7 +1209,7 @@ class Access extends LDAPUtility {
|
||||||
}
|
}
|
||||||
$offset -= $limit;
|
$offset -= $limit;
|
||||||
//we work with cache here
|
//we work with cache here
|
||||||
$cachekey = 'lc' . crc32($base) . '-' . crc32($filter) . '-' . $limit . '-' . $offset;
|
$cachekey = 'lc' . crc32($base) . '-' . crc32($filter) . '-' . intval($limit) . '-' . intval($offset);
|
||||||
$cookie = '';
|
$cookie = '';
|
||||||
if(isset($this->cookies[$cachekey])) {
|
if(isset($this->cookies[$cachekey])) {
|
||||||
$cookie = $this->cookies[$cachekey];
|
$cookie = $this->cookies[$cachekey];
|
||||||
|
@ -1206,7 +1231,7 @@ class Access extends LDAPUtility {
|
||||||
*/
|
*/
|
||||||
private function setPagedResultCookie($base, $filter, $limit, $offset, $cookie) {
|
private function setPagedResultCookie($base, $filter, $limit, $offset, $cookie) {
|
||||||
if(!empty($cookie)) {
|
if(!empty($cookie)) {
|
||||||
$cachekey = 'lc' . crc32($base) . '-' . crc32($filter) . '-' .$limit . '-' . $offset;
|
$cachekey = 'lc' . crc32($base) . '-' . crc32($filter) . '-' .intval($limit) . '-' . intval($offset);
|
||||||
$this->cookies[$cachekey] = $cookie;
|
$this->cookies[$cachekey] = $cookie;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue