properly cancel a Paginated Results operation in order to avoid protocol errors, fixes #10526
This commit is contained in:
parent
5292a14cdf
commit
9a63693227
|
@ -36,8 +36,16 @@ class Access extends LDAPUtility implements user\IUserTools {
|
||||||
//never ever check this var directly, always use getPagedSearchResultState
|
//never ever check this var directly, always use getPagedSearchResultState
|
||||||
protected $pagedSearchedSuccessful;
|
protected $pagedSearchedSuccessful;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string[] $cookies an array of returned Paged Result cookies
|
||||||
|
*/
|
||||||
protected $cookies = array();
|
protected $cookies = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string $lastCookie the last cookie returned from a Paged Results
|
||||||
|
* operation, defaults to an empty string
|
||||||
|
*/
|
||||||
|
protected $lastCookie = '';
|
||||||
|
|
||||||
public function __construct(Connection $connection, ILDAPWrapper $ldap,
|
public function __construct(Connection $connection, ILDAPWrapper $ldap,
|
||||||
user\Manager $userManager) {
|
user\Manager $userManager) {
|
||||||
|
@ -84,7 +92,9 @@ class Access extends LDAPUtility implements user\IUserTools {
|
||||||
\OCP\Util::writeLog('user_ldap', 'LDAP resource not available.', \OCP\Util::DEBUG);
|
\OCP\Util::writeLog('user_ldap', 'LDAP resource not available.', \OCP\Util::DEBUG);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//all or nothing! otherwise we get in trouble with.
|
//Cancel possibly running Paged Results operation, otherwise we run in
|
||||||
|
//LDAP protocol errors
|
||||||
|
$this->abandonPagedSearch();
|
||||||
$dn = $this->DNasBaseParameter($dn);
|
$dn = $this->DNasBaseParameter($dn);
|
||||||
$rr = @$this->ldap->read($cr, $dn, $filter, array($attr));
|
$rr = @$this->ldap->read($cr, $dn, $filter, array($attr));
|
||||||
if(!$this->ldap->isResource($rr)) {
|
if(!$this->ldap->isResource($rr)) {
|
||||||
|
@ -805,9 +815,6 @@ class Access extends LDAPUtility implements user\IUserTools {
|
||||||
$linkResources = array_pad(array(), count($base), $cr);
|
$linkResources = array_pad(array(), count($base), $cr);
|
||||||
$sr = $this->ldap->search($linkResources, $base, $filter, $attr);
|
$sr = $this->ldap->search($linkResources, $base, $filter, $attr);
|
||||||
$error = $this->ldap->errno($cr);
|
$error = $this->ldap->errno($cr);
|
||||||
if ($pagedSearchOK) {
|
|
||||||
$this->ldap->controlPagedResult($cr, 999999, false, "");
|
|
||||||
}
|
|
||||||
if(!is_array($sr) || $error !== 0) {
|
if(!is_array($sr) || $error !== 0) {
|
||||||
\OCP\Util::writeLog('user_ldap',
|
\OCP\Util::writeLog('user_ldap',
|
||||||
'Error when searching: '.$this->ldap->error($cr).
|
'Error when searching: '.$this->ldap->error($cr).
|
||||||
|
@ -1365,6 +1372,19 @@ class Access extends LDAPUtility implements user\IUserTools {
|
||||||
return $belongsToBase;
|
return $belongsToBase;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* resets a running Paged Search operation
|
||||||
|
*/
|
||||||
|
private function abandonPagedSearch() {
|
||||||
|
if(count($this->cookies) > 0) {
|
||||||
|
$cr = $this->connection->getConnectionResource();
|
||||||
|
$this->ldap->controlPagedResult($cr, 0, false, $this->lastCookie);
|
||||||
|
$this->getPagedSearchResultState();
|
||||||
|
$this->lastCookie = '';
|
||||||
|
$this->cookies = array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get a cookie for the next LDAP paged search
|
* get a cookie for the next LDAP paged search
|
||||||
* @param string $base a string with the base DN for the search
|
* @param string $base a string with the base DN for the search
|
||||||
|
@ -1403,6 +1423,7 @@ class Access extends LDAPUtility implements user\IUserTools {
|
||||||
if(!empty($cookie)) {
|
if(!empty($cookie)) {
|
||||||
$cacheKey = 'lc' . crc32($base) . '-' . crc32($filter) . '-' .intval($limit) . '-' . intval($offset);
|
$cacheKey = 'lc' . crc32($base) . '-' . crc32($filter) . '-' .intval($limit) . '-' . intval($offset);
|
||||||
$this->cookies[$cacheKey] = $cookie;
|
$this->cookies[$cacheKey] = $cookie;
|
||||||
|
$this->lastCookie = $cookie;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue