Browse Source

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 <blizzz@arthur-schiwon.de>
tags/v15.0.0beta2
Arthur Schiwon 5 years ago
parent
commit
deec5a70a0
No account linked to committer's email address
2 changed files with 57 additions and 1 deletions
  1. 17
    1
      apps/user_ldap/lib/LDAP.php
  2. 40
    0
      apps/user_ldap/tests/LDAPTest.php

+ 17
- 1
apps/user_ldap/lib/LDAP.php 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])) {

+ 40
- 0
apps/user_ldap/tests/LDAPTest.php 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';

Loading…
Cancel
Save