From 5731a1b01cc5ba1a4f1226336a56761d967c8e88 Mon Sep 17 00:00:00 2001
From: Thomas Mueller <thomas.mueller@tmit.eu>
Date: Mon, 11 Feb 2013 22:01:52 +0100
Subject: [PATCH] introduce new virtual method hasUserListings() to determine
 if a user backend can list it's users.

---
 apps/user_ldap/user_ldap.php             |  6 ++
 apps/user_ldap/user_proxy.php            |  8 +++
 apps/user_webdavauth/user_webdavauth.php |  6 ++
 lib/user.php                             |  2 +-
 lib/user/backend.php                     | 24 ++++---
 lib/user/database.php                    | 82 +++++++++++++-----------
 lib/user/dummy.php                       |  7 ++
 lib/user/interface.php                   |  7 +-
 8 files changed, 95 insertions(+), 47 deletions(-)

diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php
index 0962756228..7778c37c79 100644
--- a/apps/user_ldap/user_ldap.php
+++ b/apps/user_ldap/user_ldap.php
@@ -261,4 +261,10 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
 		return (bool)((OC_USER_BACKEND_CHECK_PASSWORD | OC_USER_BACKEND_GET_HOME) & $actions);
 	}
 
+	/**
+	 * @return bool
+	 */
+	public function hasUserListings() {
+		return true;
+	}
 }
\ No newline at end of file
diff --git a/apps/user_ldap/user_proxy.php b/apps/user_ldap/user_proxy.php
index a94be3354f..b150e2f32c 100644
--- a/apps/user_ldap/user_proxy.php
+++ b/apps/user_ldap/user_proxy.php
@@ -183,4 +183,12 @@ class User_Proxy extends lib\Proxy implements \OCP\UserInterface {
 	public function deleteUser($uid) {
 		return false;
 	}
+
+	/**
+	 * @return bool
+	 */
+	public function hasUserListings() {
+		return true;
+	}
+
 }
\ No newline at end of file
diff --git a/apps/user_webdavauth/user_webdavauth.php b/apps/user_webdavauth/user_webdavauth.php
index dd34e0ad2f..6417e45434 100755
--- a/apps/user_webdavauth/user_webdavauth.php
+++ b/apps/user_webdavauth/user_webdavauth.php
@@ -65,6 +65,12 @@ class OC_USER_WEBDAVAUTH extends OC_User_Backend {
 		return true;
 	}
 
+	/**
+	 * @return bool
+	 */
+	public function hasUserListings() {
+		return false;
+	}
 
 	/*
 	* we don“t know the users so all we can do it return an empty array here
diff --git a/lib/user.php b/lib/user.php
index 0ab224bb15..16680be4aa 100644
--- a/lib/user.php
+++ b/lib/user.php
@@ -555,7 +555,7 @@ class OC_User {
 
     public static function userExistsForCreation($uid) {
         foreach(self::$_usedBackends as $backend) {
-            if(!$backend->implementsActions(OC_USER_BACKEND_CREATE_USER))
+            if(!$backend->hasUserListings())
                 continue;
 
             $result=$backend->userExists($uid);
diff --git a/lib/user/backend.php b/lib/user/backend.php
index 56fa319597..34de1e5069 100644
--- a/lib/user/backend.php
+++ b/lib/user/backend.php
@@ -134,18 +134,26 @@ abstract class OC_User_Backend implements OC_User_Interface {
 		return $uid;
 	}
 	
-	/**
-	 * @brief Get a list of all display names
-	 * @returns array with  all displayNames (value) and the correspondig uids (key)
-	 *
-	 * Get a list of all display names and user ids.
-	 */
-	public function getDisplayNames($search = '', $limit = null, $offset = null) {
+	/**
+	 * @brief Get a list of all display names
+	 * @returns array with  all displayNames (value) and the corresponding uids (key)
+	 *
+	 * Get a list of all display names and user ids.
+	 */
+	public function getDisplayNames($search = '', $limit = null, $offset = null) {
 		$displayNames = array();
 		$users = $this->getUsers($search, $limit, $offset);
 		foreach ( $users as $user) {
 			$displayNames[$user] = $user;
 		}
-		return $displayNames;
+		return $displayNames;
+	}
+
+	/**
+	 * @brief Check if a user list is available or not
+	 * @return boolean if users can be listed or not
+	 */
+	public function hasUserListings() {
+		return false;
 	}
 }
diff --git a/lib/user/database.php b/lib/user/database.php
index 8dfd9534a9..1a6a22d7a1 100644
--- a/lib/user/database.php
+++ b/lib/user/database.php
@@ -111,30 +111,30 @@ class OC_User_Database extends OC_User_Backend {
 		}
 	}
 	
-	/**
-	 * @brief Set display name
-	 * @param $uid The username
-	 * @param $displayName The new display name
-	 * @returns true/false
-	 *
-	 * Change the display name of a user
+	/**
+	 * @brief Set display name
+	 * @param $uid The username
+	 * @param $displayName The new display name
+	 * @returns true/false
+	 *
+	 * Change the display name of a user
 	 */
 	public function setDisplayName( $uid, $displayName ) {
-		if( $this->userExists($uid) ) {
-			$query = OC_DB::prepare( 'UPDATE `*PREFIX*users` SET `displayname` = ? WHERE `uid` = ?' );
-			$query->execute( array( $displayName, $uid ));
-			return true;
-		}else{
-			return false;
-		}
+		if( $this->userExists($uid) ) {
+			$query = OC_DB::prepare( 'UPDATE `*PREFIX*users` SET `displayname` = ? WHERE `uid` = ?' );
+			$query->execute( array( $displayName, $uid ));
+			return true;
+		}else{
+			return false;
+		}
 	}
 
-	/**
-	 * @brief get display name of the user
-	 * @param $uid user ID of the user
-	 * @return display name
-	 */
-	public function getDisplayName($uid) {
+	/**
+	 * @brief get display name of the user
+	 * @param $uid user ID of the user
+	 * @return display name
+	 */
+	public function getDisplayName($uid) {
 		if( $this->userExists($uid) ) {
 			$query = OC_DB::prepare( 'SELECT displayname FROM `*PREFIX*users` WHERE `uid` = ?' );
 			$result = $query->execute( array( $uid ))->fetchAll();
@@ -144,36 +144,36 @@ class OC_User_Database extends OC_User_Backend {
 			} else {
 				return $uid;
 			}
-		}
+		}
 	}
 	
-	/**
-	 * @brief Get a list of all display names
-	 * @returns array with  all displayNames (value) and the correspondig uids (key)
-	 *
-	 * Get a list of all display names and user ids.
-	 */
+	/**
+	 * @brief Get a list of all display names
+	 * @returns array with  all displayNames (value) and the correspondig uids (key)
+	 *
+	 * Get a list of all display names and user ids.
+	 */
 	public function getDisplayNames($search = '', $limit = null, $offset = null) {
 		$displayNames = array();
-		$query = OC_DB::prepare('SELECT `uid`, `displayname` FROM `*PREFIX*users` WHERE LOWER(`displayname`) LIKE LOWER(?)', $limit, $offset);
+		$query = OC_DB::prepare('SELECT `uid`, `displayname` FROM `*PREFIX*users` WHERE LOWER(`displayname`) LIKE LOWER(?)', $limit, $offset);
 		$result = $query->execute(array($search.'%'));
-		$users = array();
-		while ($row = $result->fetchRow()) {
-			$displayNames[$row['uid']] = $row['displayname'];
+		$users = array();
+		while ($row = $result->fetchRow()) {
+			$displayNames[$row['uid']] = $row['displayname'];
 		}
 		
 		// let's see if we can also find some users who don't have a display name yet
-		$query = OC_DB::prepare('SELECT `uid`, `displayname` FROM `*PREFIX*users` WHERE LOWER(`uid`) LIKE LOWER(?)', $limit, $offset);
+		$query = OC_DB::prepare('SELECT `uid`, `displayname` FROM `*PREFIX*users` WHERE LOWER(`uid`) LIKE LOWER(?)', $limit, $offset);
 		$result = $query->execute(array($search.'%'));
-		while ($row = $result->fetchRow()) {
+		while ($row = $result->fetchRow()) {
 			$displayName =  trim($row['displayname'], ' ');
-			if ( empty($displayName) ) {
+			if ( empty($displayName) ) {
 				$displayNames[$row['uid']] = $row['uid'];
-			}
+			}
 		}
 		
-		
-		return $displayNames;
+		
+		return $displayNames;
 	}
 	
 	/**
@@ -256,4 +256,12 @@ class OC_User_Database extends OC_User_Backend {
 			return false;
 		}
 	}
+
+	/**
+	 * @return bool
+	 */
+	public function hasUserListings() {
+		return true;
+	}
+
 }
diff --git a/lib/user/dummy.php b/lib/user/dummy.php
index 4dbbc02b88..d63f60efbe 100644
--- a/lib/user/dummy.php
+++ b/lib/user/dummy.php
@@ -112,4 +112,11 @@ class OC_User_Dummy extends OC_User_Backend {
 	public function userExists($uid) {
 		return isset($this->users[$uid]);
 	}
+
+	/**
+	 * @return bool
+	 */
+	public function hasUserListings() {
+		return true;
+	}
 }
diff --git a/lib/user/interface.php b/lib/user/interface.php
index b4667633b5..b1e19aea7f 100644
--- a/lib/user/interface.php
+++ b/lib/user/interface.php
@@ -66,10 +66,15 @@ interface OC_User_Interface {
 
 	/**
 	 * @brief Get a list of all display names
-	 * @returns array with  all displayNames (value) and the correspondig uids (key)
+	 * @returns array with  all displayNames (value) and the corresponding uids (key)
 	 *
 	 * Get a list of all display names and user ids.
 	 */
 	public function getDisplayNames($search = '', $limit = null, $offset = null);
 
+	/**
+	 * @brief Check if a user list is available or not
+	 * @return boolean if users can be listed or not
+	 */
+	public function hasUserListings();
 }
\ No newline at end of file
-- 
GitLab