Skip to content

Commit

Permalink
Merge pull request #12292 from nextcloud/fix/2947/lapse-sizelimit-error
Browse files Browse the repository at this point in the history
avoid logging of "Partial search results returned: Sizelimit exceeded…"
  • Loading branch information
MorrisJobke authored Nov 15, 2018
2 parents d70b010 + deec5a7 commit 159d759
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 1 deletion.
18 changes: 17 additions & 1 deletion apps/user_ldap/lib/LDAP.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

/**
Expand Down Expand Up @@ -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])) {
Expand Down
40 changes: 40 additions & 0 deletions apps/user_ldap/tests/LDAPTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down

0 comments on commit 159d759

Please sign in to comment.