to reassure that selected attributes still work, do not count all matching entries but limit it to 1 in order to make it faster

This commit is contained in:
Arthur Schiwon 2014-10-29 10:24:48 +01:00
parent 71944a59a5
commit f9b4f5f4e5
2 changed files with 16 additions and 11 deletions

View File

@ -887,8 +887,10 @@ class Access extends LDAPUtility implements user\IUserTools {
private function count($filter, $base, $attr = null, $limit = null, $offset = null, $skipHandling = false) {
\OCP\Util::writeLog('user_ldap', 'Count filter: '.print_r($filter, true), \OCP\Util::DEBUG);
$limitPerPage = (intval($limit) < intval($this->connection->ldapPagingSize)) ?
intval($limit) : intval($this->connection->ldapPagingSize);
if(is_null($limit) || $limit <= 0) {
$limit = intval($this->connection->ldapPagingSize);
$limitPerPage = intval($this->connection->ldapPagingSize);
}
$counter = 0;
@ -898,19 +900,19 @@ class Access extends LDAPUtility implements user\IUserTools {
do {
$continue = false;
$search = $this->executeSearch($filter, $base, $attr,
$limit, $offset);
$limitPerPage, $offset);
if($search === false) {
return $counter > 0 ? $counter : false;
}
list($sr, $pagedSearchOK) = $search;
$count = $this->countEntriesInSearchResults($sr, $limit, $continue);
$count = $this->countEntriesInSearchResults($sr, $limitPerPage, $continue);
$counter += $count;
$this->processPagedSearchStatus($sr, $filter, $base, $count, $limit,
$this->processPagedSearchStatus($sr, $filter, $base, $count, $limitPerPage,
$offset, $pagedSearchOK, $skipHandling);
$offset += $limit;
} while($continue);
$offset += $limitPerPage;
} while($continue && (is_null($limit) || $limit <= 0 || $limit > $counter));
return $counter;
}

View File

@ -132,9 +132,10 @@ class Wizard extends LDAPUtility {
/**
* counts users with a specified attribute
* @param string $attr
* @param bool $existsCheck
* @return int|bool
*/
public function countUsersWithAttribute($attr) {
public function countUsersWithAttribute($attr, $existsCheck = false) {
if(!$this->checkRequirements(array('ldapHost',
'ldapPort',
'ldapBase',
@ -148,7 +149,9 @@ class Wizard extends LDAPUtility {
$attr . '=*'
));
return $this->access->countUsers($filter);
$limit = ($existsCheck === false) ? null : 1;
return $this->access->countUsers($filter, array('dn'), $limit);
}
/**
@ -169,7 +172,7 @@ class Wizard extends LDAPUtility {
if($attr !== 'displayName' && !empty($attr)) {
// most likely not the default value with upper case N,
// verify it still produces a result
$count = intval($this->countUsersWithAttribute($attr));
$count = intval($this->countUsersWithAttribute($attr, true));
if($count > 0) {
//no change, but we sent it back to make sure the user interface
//is still correct, even if the ajax call was cancelled inbetween
@ -181,7 +184,7 @@ class Wizard extends LDAPUtility {
// first attribute that has at least one result wins
$displayNameAttrs = array('displayname', 'cn');
foreach ($displayNameAttrs as $attr) {
$count = intval($this->countUsersWithAttribute($attr));
$count = intval($this->countUsersWithAttribute($attr, true));
if($count > 0) {
$this->applyFind('ldap_display_name', $attr);
@ -209,7 +212,7 @@ class Wizard extends LDAPUtility {
$attr = $this->configuration->ldapEmailAttribute;
if(!empty($attr)) {
$count = intval($this->countUsersWithAttribute($attr));
$count = intval($this->countUsersWithAttribute($attr, true));
if($count > 0) {
return false;
}