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 <blizzz@arthur-schiwon.de>tags/v15.0.0beta2
@@ -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])) { |
@@ -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'; |