simplify getGroups, fixing wrong chunking logic

pagination is taken care of properly in the search logic in Access class

Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
This commit is contained in:
Arthur Schiwon 2020-05-27 14:41:10 +02:00
parent a0771a389a
commit aed6f0f71e
No known key found for this signature in database
GPG Key ID: 7424F1874854DF23
1 changed files with 7 additions and 50 deletions

View File

@ -1015,16 +1015,19 @@ class Group_LDAP extends BackendUtility implements \OCP\GroupInterface, IGroupLD
} }
/** /**
* get a list of all groups * get a list of all groups using a paged search
* *
* @param string $search * @param string $search
* @param $limit * @param int $limit
* @param int $offset * @param int $offset
* @return array with group names * @return array with group names
* *
* Returns a list with all groups (used by getGroups) * Returns a list with all groups
* Uses a paged search if available to override a
* server side search limit.
* (active directory has a limit of 1000 by default)
*/ */
protected function getGroupsChunk($search = '', $limit = -1, $offset = 0) { public function getGroups($search = '', $limit = -1, $offset = 0) {
if (!$this->enabled) { if (!$this->enabled) {
return []; return [];
} }
@ -1057,52 +1060,6 @@ class Group_LDAP extends BackendUtility implements \OCP\GroupInterface, IGroupLD
return $ldap_groups; return $ldap_groups;
} }
/**
* get a list of all groups using a paged search
*
* @param string $search
* @param int $limit
* @param int $offset
* @return array with group names
*
* Returns a list with all groups
* Uses a paged search if available to override a
* server side search limit.
* (active directory has a limit of 1000 by default)
*/
public function getGroups($search = '', $limit = -1, $offset = 0) {
if (!$this->enabled) {
return [];
}
$search = $this->access->escapeFilterPart($search, true);
$pagingSize = (int)$this->access->connection->ldapPagingSize;
if ($pagingSize <= 0) {
return $this->getGroupsChunk($search, $limit, $offset);
}
$maxGroups = 100000; // limit max results (just for safety reasons)
if ($limit > -1) {
$overallLimit = min($limit + $offset, $maxGroups);
} else {
$overallLimit = $maxGroups;
}
$chunkOffset = $offset;
$allGroups = [];
while ($chunkOffset < $overallLimit) {
$chunkLimit = min($pagingSize, $overallLimit - $chunkOffset);
$ldapGroups = $this->getGroupsChunk($search, $chunkLimit, $chunkOffset);
$nread = count($ldapGroups);
\OCP\Util::writeLog('user_ldap', 'getGroups(' . $search . '): read ' . $nread . ' at offset ' . $chunkOffset . ' (limit: ' . $chunkLimit . ')', ILogger::DEBUG);
if ($nread) {
$allGroups = array_merge($allGroups, $ldapGroups);
$chunkOffset += $nread;
}
if ($nread < $chunkLimit) {
break;
}
}
return $allGroups;
}
/** /**
* @param string $group * @param string $group
* @return bool * @return bool