From f9b4f5f4e548715b06feec14236d68d330e865b2 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 29 Oct 2014 10:24:48 +0100 Subject: [PATCH] to reassure that selected attributes still work, do not count all matching entries but limit it to 1 in order to make it faster --- apps/user_ldap/lib/access.php | 14 ++++++++------ apps/user_ldap/lib/wizard.php | 13 ++++++++----- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index 0d51fc51143..3a118891f40 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -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; } diff --git a/apps/user_ldap/lib/wizard.php b/apps/user_ldap/lib/wizard.php index 59911fe77d1..63b7e22ce8c 100644 --- a/apps/user_ldap/lib/wizard.php +++ b/apps/user_ldap/lib/wizard.php @@ -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; }