Merge pull request #12292 from nextcloud/fix/2947/lapse-sizelimit-error

avoid logging of "Partial search results returned: Sizelimit exceeded…"
This commit is contained in:
Morris Jobke 2018-11-15 10:48:57 +01:00 committed by GitHub
commit 159d75945a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 57 additions and 1 deletions

View File

@ -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])) {

View File

@ -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';