From deec5a70a00ac930d67c439c99a1a3fbf09af9ac Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Mon, 5 Nov 2018 18:35:50 +0100 Subject: [PATCH] avoid logging of "Partial search results returned: Sizelimit exceeded at" LDAP servers respond with that even if a limit was passed with the request. Having this statement logged causes a lot of confusion. Signed-off-by: Arthur Schiwon --- apps/user_ldap/lib/LDAP.php | 18 +++++++++++++- apps/user_ldap/tests/LDAPTest.php | 40 +++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/apps/user_ldap/lib/LDAP.php b/apps/user_ldap/lib/LDAP.php index 2411b8d3438e3..e6039c77d12c9 100644 --- a/apps/user_ldap/lib/LDAP.php +++ b/apps/user_ldap/lib/LDAP.php @@ -189,9 +189,24 @@ public function read($link, $baseDN, $filter, $attr) { * @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 @@ private function processLDAPError($resource) { /** * 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 8e181741b50c6..3e754dbd272d9 100644 --- a/apps/user_ldap/tests/LDAPTest.php +++ b/apps/user_ldap/tests/LDAPTest.php @@ -37,6 +37,46 @@ public function setUp() { ->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';