]> source.dussan.org Git - nextcloud-server.git/commitdiff
LDAP: let getUsers make use of paged search
authorArthur Schiwon <blizzz@owncloud.com>
Fri, 26 Oct 2012 19:54:22 +0000 (21:54 +0200)
committerArthur Schiwon <blizzz@owncloud.com>
Fri, 26 Oct 2012 19:54:35 +0000 (21:54 +0200)
apps/user_ldap/user_ldap.php

index e104c8d1764925cde9d016d4d024ecbeb02ded9d..e95bd24fbdd7e84a3e524cd48a23ecfdc7bd37d7 100644 (file)
@@ -104,24 +104,38 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
         * Get a list of all users.
         */
        public function getUsers($search = '', $limit = 10, $offset = 0) {
-               $ldap_users = $this->connection->getFromCache('getUsers');
-               if(is_null($ldap_users)) {
-                       $ldap_users = $this->fetchListOfUsers($this->connection->ldapUserFilter, array($this->connection->ldapUserDisplayName, 'dn'));
-                       $ldap_users = $this->ownCloudUserNames($ldap_users);
-                       $this->connection->writeToCache('getUsers', $ldap_users);
-               }
-               $this->userSearch = $search;
-               if(!empty($this->userSearch)) {
-                       $ldap_users = array_filter($ldap_users, array($this, 'userMatchesFilter'));
+               $cachekey = 'getUsers-'.$search.'-'.$limit.'-'.$offset;
+
+               //check if users are cached, if so return
+               $ldap_users = $this->connection->getFromCache($cachekey);
+               if(!is_null($ldap_users)) {
+                       return $ldap_users;
                }
-               if($limit == -1) {
-                       $limit = null;
+
+               //prepare search filter
+               $search = empty($search) ? '*' : '*'.$search.'*';
+               $filter = $this->combineFilterWithAnd(array(
+                       $this->connection->ldapUserFilter,
+                       $this->connection->ldapGroupDisplayName.'='.$search
+               ));
+
+               \OCP\Util::writeLog('user_ldap', 'getUsers: Get users filter '.$filter, \OCP\Util::DEBUG);
+               //do the search and translate results to owncloud names
+               $ldap_users = $this->fetchListOfUsers($filter, array($this->connection->ldapUserDisplayName, 'dn'), $limit, $offset);
+               $ldap_users = $this->ownCloudUserNames($ldap_users);
+
+               if(!$this->getPagedSearchResultState()) {
+                       \OCP\Util::writeLog('user_ldap', 'getUsers: We got old-style results', \OCP\Util::DEBUG);
+                       //if not supported, a 'normal' search has run automatically, we just need to get our slice of the cake. And we cache the general search, too
+                       $this->connection->writeToCache('getUsers-'.$search, $ldap_users);
+                       $ldap_users = array_slice($ldap_users, $offset, $limit);
+               } else {
+                       //debug message only
+                       \OCP\Util::writeLog('user_ldap', 'getUsers: We got paged results', \OCP\Util::DEBUG);
                }
-               return array_slice($ldap_users, $offset, $limit);
-       }
 
-       public function userMatchesFilter($user) {
-               return (strripos($user, $this->userSearch) !== false);
+               $this->connection->writeToCache($cachekey, $ldap_users);
+               return $ldap_users;
        }
 
        /**