From 1e5295138a010f33264de3013c536210ab87e0f4 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 27 May 2020 14:41:10 +0200 Subject: [PATCH] simplify getGroups, fixing wrong chunking logic pagination is taken care of properly in the search logic in Access class Signed-off-by: Arthur Schiwon --- apps/user_ldap/lib/Group_LDAP.php | 57 ++++--------------------------- 1 file changed, 7 insertions(+), 50 deletions(-) diff --git a/apps/user_ldap/lib/Group_LDAP.php b/apps/user_ldap/lib/Group_LDAP.php index 0fb8c93d16..a6cd9669c9 100644 --- a/apps/user_ldap/lib/Group_LDAP.php +++ b/apps/user_ldap/lib/Group_LDAP.php @@ -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 $limit + * @param int $limit * @param int $offset * @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) { return []; } @@ -1057,52 +1060,6 @@ class Group_LDAP extends BackendUtility implements \OCP\GroupInterface, IGroupLD 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 * @return bool