diff --git a/apps/user_ldap/lib/LDAP.php b/apps/user_ldap/lib/LDAP.php index 2411b8d343..e6039c77d1 100644 --- a/apps/user_ldap/lib/LDAP.php +++ b/apps/user_ldap/lib/LDAP.php @@ -189,9 +189,24 @@ class LDAP implements ILDAPWrapper { * @param int $attrsOnly * @param int $limit * @return mixed + * @throws \Exception */ public function search($link, $baseDN, $filter, $attr, $attrsOnly = 0, $limit = 0) { - return $this->invokeLDAPMethod('search', $link, $baseDN, $filter, $attr, $attrsOnly, $limit); + $oldHandler = set_error_handler(function($no, $message, $file, $line) use (&$oldHandler) { + if(strpos($message, 'Partial search results returned: Sizelimit exceeded') !== false) { + return true; + } + $oldHandler($no, $message, $file, $line); + return true; + }); + try { + $result = $this->invokeLDAPMethod('search', $link, $baseDN, $filter, $attr, $attrsOnly, $limit); + restore_error_handler(); + return $result; + } catch (\Exception $e) { + restore_error_handler(); + throw $e; + } } /** @@ -342,6 +357,7 @@ class LDAP implements ILDAPWrapper { /** * Called after an ldap method is run to act on LDAP error if necessary + * @throw \Exception */ private function postFunctionCall() { if($this->isResource($this->curArgs[0])) { diff --git a/apps/user_ldap/tests/LDAPTest.php b/apps/user_ldap/tests/LDAPTest.php index 8e181741b5..3e754dbd27 100644 --- a/apps/user_ldap/tests/LDAPTest.php +++ b/apps/user_ldap/tests/LDAPTest.php @@ -37,6 +37,46 @@ class LDAPTest extends TestCase { ->getMock(); } + public function errorProvider() { + return [ + [ + 'ldap_search(): Partial search results returned: Sizelimit exceeded at /srv/http/nextcloud/master/apps/user_ldap/lib/LDAP.php#292', + false + ], + [ + 'Some other error', true + ] + ]; + } + + /** + * @param string $errorMessage + * @param bool $passThrough + * @dataProvider errorProvider + */ + public function testSearchWithErrorHandler(string $errorMessage, bool $passThrough) { + + $wasErrorHandlerCalled = false; + $errorHandler = function($number, $message, $file, $line) use (&$wasErrorHandlerCalled) { + $wasErrorHandlerCalled = true; + }; + + set_error_handler($errorHandler); + + $this->ldap + ->expects($this->once()) + ->method('invokeLDAPMethod') + ->with('search', $this->anything(), $this->anything(), $this->anything(), $this->anything(), $this->anything()) + ->willReturnCallback(function() use($errorMessage) { + trigger_error($errorMessage); + }); + + $this->ldap->search('pseudo-resource', 'base', 'filter', []); + $this->assertSame($wasErrorHandlerCalled, $passThrough); + + restore_error_handler(); + } + public function testModReplace() { $link = $this->createMock(LDAP::class); $userDN = 'CN=user';