]> source.dussan.org Git - nextcloud-server.git/commitdiff
do not try to search after the last page 26798/head
authorArthur Schiwon <blizzz@arthur-schiwon.de>
Tue, 27 Apr 2021 10:52:26 +0000 (12:52 +0200)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Tue, 27 Apr 2021 17:41:58 +0000 (17:41 +0000)
- saves an LDAP requests in these cases
- prevents a Protocol Error logged on < 7.3 API (for backports)

Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
apps/user_ldap/composer/composer/autoload_classmap.php
apps/user_ldap/composer/composer/autoload_static.php
apps/user_ldap/lib/Access.php
apps/user_ldap/lib/Exceptions/NoMoreResults.php [new file with mode: 0644]

index 4e77ab6b817d5936864ac5a12b84b979e99d188b..c8969223267d793880305d93aacfa3dfc9bd88c3 100644 (file)
@@ -28,6 +28,7 @@ return array(
     'OCA\\User_LDAP\\Events\\UserBackendRegistered' => $baseDir . '/../lib/Events/UserBackendRegistered.php',
     'OCA\\User_LDAP\\Exceptions\\AttributeNotSet' => $baseDir . '/../lib/Exceptions/AttributeNotSet.php',
     'OCA\\User_LDAP\\Exceptions\\ConstraintViolationException' => $baseDir . '/../lib/Exceptions/ConstraintViolationException.php',
+    'OCA\\User_LDAP\\Exceptions\\NoMoreResults' => $baseDir . '/../lib/Exceptions/NoMoreResults.php',
     'OCA\\User_LDAP\\Exceptions\\NotOnLDAP' => $baseDir . '/../lib/Exceptions/NotOnLDAP.php',
     'OCA\\User_LDAP\\FilesystemHelper' => $baseDir . '/../lib/FilesystemHelper.php',
     'OCA\\User_LDAP\\GroupPluginManager' => $baseDir . '/../lib/GroupPluginManager.php',
index 6a510b972ee5c10972f394e489de49c6e9436f8c..e9ba3c6534130d4e23bae09e5b6fb84d372d2053 100644 (file)
@@ -43,6 +43,7 @@ class ComposerStaticInitUser_LDAP
         'OCA\\User_LDAP\\Events\\UserBackendRegistered' => __DIR__ . '/..' . '/../lib/Events/UserBackendRegistered.php',
         'OCA\\User_LDAP\\Exceptions\\AttributeNotSet' => __DIR__ . '/..' . '/../lib/Exceptions/AttributeNotSet.php',
         'OCA\\User_LDAP\\Exceptions\\ConstraintViolationException' => __DIR__ . '/..' . '/../lib/Exceptions/ConstraintViolationException.php',
+        'OCA\\User_LDAP\\Exceptions\\NoMoreResults' => __DIR__ . '/..' . '/../lib/Exceptions/NoMoreResults.php',
         'OCA\\User_LDAP\\Exceptions\\NotOnLDAP' => __DIR__ . '/..' . '/../lib/Exceptions/NotOnLDAP.php',
         'OCA\\User_LDAP\\FilesystemHelper' => __DIR__ . '/..' . '/../lib/FilesystemHelper.php',
         'OCA\\User_LDAP\\GroupPluginManager' => __DIR__ . '/..' . '/../lib/GroupPluginManager.php',
index 087969b7ffeb53e642e3a81cbb9d8f3c362877c0..10e4df30626b499f77f01c9761228ef9909e676c 100644 (file)
@@ -51,6 +51,7 @@ use OC\HintException;
 use OC\Hooks\PublicEmitter;
 use OC\ServerNotAvailableException;
 use OCA\User_LDAP\Exceptions\ConstraintViolationException;
+use OCA\User_LDAP\Exceptions\NoMoreResults;
 use OCA\User_LDAP\Mapping\AbstractMapping;
 use OCA\User_LDAP\User\Manager;
 use OCA\User_LDAP\User\OfflineUser;
@@ -267,7 +268,14 @@ class Access extends LDAPUtility {
         * @throws ServerNotAvailableException
         */
        public function executeRead($cr, $dn, $attribute, $filter, $maxResults) {
-               $this->initPagedSearch($filter, $dn, [$attribute], $maxResults, 0);
+               try {
+                       $this->initPagedSearch($filter, $dn, [$attribute], $maxResults, 0);
+               } catch (NoMoreResults $e) {
+                       // does not happen, no pagination here since offset is 0, but the
+                       // previous call is needed for a potential reset of the state.
+                       // Tools would still point out a possible NoMoreResults exception.
+                       return false;
+               }
                $dn = $this->helper->DNasBaseParameter($dn);
                $rr = @$this->invokeLDAPMethod('read', $cr, $dn, $filter, [$attribute]);
                if (!$this->ldap->isResource($rr)) {
@@ -1146,7 +1154,12 @@ class Access extends LDAPUtility {
                }
 
                //check whether paged search should be attempted
-               $pagedSearchOK = $this->initPagedSearch($filter, $base, $attr, (int)$limit, (int)$offset);
+               try {
+                       $pagedSearchOK = $this->initPagedSearch($filter, $base, $attr, (int)$limit, (int)$offset);
+               } catch (NoMoreResults $e) {
+                       // beyond last results page
+                       return false;
+               }
 
                $sr = $this->invokeLDAPMethod('search', $cr, $base, $filter, $attr);
                // cannot use $cr anymore, might have changed in the previous call!
@@ -1999,6 +2012,7 @@ class Access extends LDAPUtility {
         * @param int $offset
         * @return bool|true
         * @throws ServerNotAvailableException
+        * @throws NoMoreResults
         */
        private function initPagedSearch(
                string $filter,
@@ -2030,7 +2044,7 @@ class Access extends LDAPUtility {
                                if (!$this->hasMoreResults()) {
                                        // when the cookie is reset with != 0 offset, there are no further
                                        // results, so stop.
-                                       return false;
+                                       throw new NoMoreResults();
                                }
                        }
                        if ($this->lastCookie !== '' && $offset === 0) {
diff --git a/apps/user_ldap/lib/Exceptions/NoMoreResults.php b/apps/user_ldap/lib/Exceptions/NoMoreResults.php
new file mode 100644 (file)
index 0000000..cf04a15
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2021 Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\User_LDAP\Exceptions;
+
+class NoMoreResults extends \Exception {
+}