aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2014-12-13 08:50:15 +0100
committerMorris Jobke <hey@morrisjobke.de>2014-12-13 08:50:15 +0100
commitefb495b09f220410defbbbd786ccddab4de609fd (patch)
tree36cae63f8a8f1d467782e810ef84bc1aba597411
parent416e21d90292677f4b94d335544550a5af5e1e12 (diff)
parent76a633bf52647ab9ae44c5f53bc86fa02cb7d3a8 (diff)
downloadnextcloud-server-efb495b09f220410defbbbd786ccddab4de609fd.tar.gz
nextcloud-server-efb495b09f220410defbbbd786ccddab4de609fd.zip
Merge pull request #12726 from owncloud/add-filter-for-backend-to-rest-index
Add filter for backend to rest index
-rw-r--r--lib/private/user.php1
-rw-r--r--lib/private/user/manager.php16
-rw-r--r--lib/public/iusermanager.php6
-rw-r--r--settings/controller/userscontroller.php58
-rw-r--r--tests/lib/user/manager.php11
-rw-r--r--tests/settings/controller/userscontrollertest.php89
6 files changed, 157 insertions, 24 deletions
diff --git a/lib/private/user.php b/lib/private/user.php
index f93b76a3a64..ff45e9e26a6 100644
--- a/lib/private/user.php
+++ b/lib/private/user.php
@@ -546,6 +546,7 @@ class OC_User {
* @return array associative array with all display names (value) and corresponding uids (key)
*
* Get a list of all display names and user ids.
+ * @deprecated Use \OC::$server->getUserManager->searchDisplayName($search, $limit, $offset) instead.
*/
public static function getDisplayNames($search = '', $limit = null, $offset = null) {
$displayNames = array();
diff --git a/lib/private/user/manager.php b/lib/private/user/manager.php
index 4fa3711e3b8..1bc3b51c2ef 100644
--- a/lib/private/user/manager.php
+++ b/lib/private/user/manager.php
@@ -28,7 +28,7 @@ use OCP\IConfig;
*/
class Manager extends PublicEmitter implements IUserManager {
/**
- * @var \OC_User_Interface[] $backends
+ * @var \OCP\UserInterface [] $backends
*/
private $backends = array();
@@ -63,9 +63,17 @@ class Manager extends PublicEmitter implements IUserManager {
}
/**
+ * Get the active backends
+ * @return \OCP\UserInterface[]
+ */
+ public function getBackends() {
+ return $this->backends;
+ }
+
+ /**
* register a user backend
*
- * @param \OC_User_Interface $backend
+ * @param \OCP\UserInterface $backend
*/
public function registerBackend($backend) {
$this->backends[] = $backend;
@@ -74,7 +82,7 @@ class Manager extends PublicEmitter implements IUserManager {
/**
* remove a user backend
*
- * @param \OC_User_Interface $backend
+ * @param \OCP\UserInterface $backend
*/
public function removeBackend($backend) {
$this->cachedUsers = array();
@@ -113,7 +121,7 @@ class Manager extends PublicEmitter implements IUserManager {
* get or construct the user object
*
* @param string $uid
- * @param \OC_User_Interface $backend
+ * @param \OCP\UserInterface $backend
* @return \OC\User\User
*/
protected function getUserObject($uid, $backend) {
diff --git a/lib/public/iusermanager.php b/lib/public/iusermanager.php
index fc0729b860b..1691aee8e7d 100644
--- a/lib/public/iusermanager.php
+++ b/lib/public/iusermanager.php
@@ -32,6 +32,12 @@ interface IUserManager {
public function registerBackend($backend);
/**
+ * Get the active backends
+ * @return \OCP\UserInterface[]
+ */
+ public function getBackends();
+
+ /**
* remove a user backend
*
* @param \OCP\UserInterface $backend
diff --git a/settings/controller/userscontroller.php b/settings/controller/userscontroller.php
index dd3aa72890e..c25989af1a9 100644
--- a/settings/controller/userscontroller.php
+++ b/settings/controller/userscontroller.php
@@ -11,6 +11,7 @@
namespace OC\Settings\Controller;
use OC\AppFramework\Http;
+use OC\User\Manager;
use OC\User\User;
use \OCP\AppFramework\Controller;
use OCP\AppFramework\Http\DataResponse;
@@ -85,45 +86,68 @@ class UsersController extends Controller {
}
/**
+ * @param array $userIDs Array with schema [$uid => $displayName]
+ * @return IUser[]
+ */
+ private function getUsersForUID(array $userIDs) {
+ $users = [];
+ foreach ($userIDs as $uid => $displayName) {
+ $users[] = $this->userManager->get($uid);
+ }
+ return $users;
+ }
+
+ /**
* @NoAdminRequired
*
* @param int $offset
* @param int $limit
- * @param string $gid
- * @param string $pattern
+ * @param string $gid GID to filter for
+ * @param string $pattern Pattern to search for in the username
+ * @param string $backend Backend to filter for (class-name)
* @return DataResponse
*
* TODO: Tidy up and write unit tests - code is mainly static method calls
*/
- public function index($offset = 0, $limit = 10, $gid = '', $pattern = '') {
+ public function index($offset = 0, $limit = 10, $gid = '', $pattern = '', $backend = '') {
// FIXME: The JS sends the group '_everyone' instead of no GID for the "all users" group.
if($gid === '_everyone') {
$gid = '';
}
+
+ // Remove backends
+ if(!empty($backend)) {
+ $activeBackends = $this->userManager->getBackends();
+ $this->userManager->clearBackends();
+ foreach($activeBackends as $singleActiveBackend) {
+ if($backend === get_class($singleActiveBackend)) {
+ $this->userManager->registerBackend($singleActiveBackend);
+ break;
+ }
+ }
+ }
+
$users = array();
if ($this->isAdmin) {
+
if($gid !== '') {
- $batch = $this->groupManager->displayNamesInGroup($gid, $pattern, $limit, $offset);
+ $batch = $this->getUsersForUID($this->groupManager->displayNamesInGroup($gid, $pattern, $limit, $offset));
} else {
- // FIXME: Remove static method call
- $batch = \OC_User::getDisplayNames($pattern, $limit, $offset);
+ $batch = $this->userManager->search('', $limit, $offset);
}
- foreach ($batch as $uid => $displayname) {
- $users[] = $this->formatUserForIndex($this->userManager->get($uid));
+ foreach ($batch as $user) {
+ $users[] = $this->formatUserForIndex($user);
}
+
} else {
- $groups = \OC_SubAdmin::getSubAdminsGroups($this->userSession->getUser()->getUID());
- if($gid !== '' && in_array($gid, $groups)) {
- $groups = array($gid);
- } elseif($gid !== '') {
- //don't you try to investigate loops you must not know about
- $groups = array();
+ // Set the $gid parameter to an empty value if the subadmin has no rights to access a specific group
+ if($gid !== '' && !in_array($gid, \OC_SubAdmin::getSubAdminsGroups($this->userSession->getUser()->getUID()))) {
+ $gid = '';
}
- $batch = \OC_Group::usersInGroups($groups, $pattern, $limit, $offset);
- foreach ($batch as $uid) {
- $user = $this->userManager->get($uid);
+ $batch = $this->getUsersForUID($this->groupManager->displayNamesInGroup($gid, $pattern, $limit, $offset));
+ foreach ($batch as $user) {
// Only add the groups, this user is a subadmin of
$userGroups = array_intersect($this->groupManager->getUserGroupIds($user),
\OC_SubAdmin::getSubAdminsGroups($this->userSession->getUser()->getUID()));
diff --git a/tests/lib/user/manager.php b/tests/lib/user/manager.php
index c825ec05775..9cb9374d89f 100644
--- a/tests/lib/user/manager.php
+++ b/tests/lib/user/manager.php
@@ -10,6 +10,17 @@
namespace Test\User;
class Manager extends \Test\TestCase {
+ public function testGetBackends() {
+ $userDummyBackend = $this->getMock('\OC_User_Dummy');
+ $manager = new \OC\User\Manager();
+ $manager->registerBackend($userDummyBackend);
+ $this->assertEquals([$userDummyBackend], $manager->getBackends());
+ $dummyDatabaseBackend = $this->getMock('\OC_User_Database');
+ $manager->registerBackend($dummyDatabaseBackend);
+ $this->assertEquals([$userDummyBackend, $dummyDatabaseBackend], $manager->getBackends());
+ }
+
+
public function testUserExistsSingleBackendExists() {
/**
* @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend
diff --git a/tests/settings/controller/userscontrollertest.php b/tests/settings/controller/userscontrollertest.php
index 26ca6f7e5f3..0ac6d3f0c01 100644
--- a/tests/settings/controller/userscontrollertest.php
+++ b/tests/settings/controller/userscontrollertest.php
@@ -126,9 +126,20 @@ class UsersControllerTest extends \Test\TestCase {
->method('getUserGroupIds')
->will($this->onConsecutiveCalls(array('Users', 'Support'), array('admins', 'Support'), array('External Users')));
$this->container['UserManager']
- ->expects($this->exactly(3))
+ ->expects($this->at(0))
+ ->method('get')
+ ->with('foo')
+ ->will($this->returnValue($foo));
+ $this->container['UserManager']
+ ->expects($this->at(1))
+ ->method('get')
+ ->with('admin')
+ ->will($this->returnValue($admin));
+ $this->container['UserManager']
+ ->expects($this->at(2))
->method('get')
- ->will($this->onConsecutiveCalls($foo, $admin, $bar));
+ ->with('bar')
+ ->will($this->returnValue($bar));
$this->container['Config']
->expects($this->exactly(3))
->method('getUserValue')
@@ -168,7 +179,79 @@ class UsersControllerTest extends \Test\TestCase {
),
)
);
- $response = $this->usersController->index(0, 10, 'pattern');
+ $response = $this->usersController->index(0, 10, 'gid', 'pattern');
+ $this->assertEquals($expectedResponse, $response);
+ }
+
+ public function testIndexWithBackend() {
+ $user = $this->getMockBuilder('\OC\User\User')
+ ->disableOriginalConstructor()->getMock();
+ $user
+ ->expects($this->exactly(3))
+ ->method('getUID')
+ ->will($this->returnValue('foo'));
+ $user
+ ->expects($this->once())
+ ->method('getDisplayName')
+ ->will($this->returnValue('M. Foo'));
+ $user
+ ->method('getLastLogin')
+ ->will($this->returnValue(500));
+ $user
+ ->method('getHome')
+ ->will($this->returnValue('/home/foo'));
+ $user
+ ->expects($this->once())
+ ->method('getBackendClassName')
+ ->will($this->returnValue('OC_User_Database'));
+ $this->container['UserManager']
+ ->expects($this->once())
+ ->method('getBackends')
+ ->will($this->returnValue([new \OC_User_Dummy(), new \OC_User_Database()]));
+ $this->container['UserManager']
+ ->expects($this->once())
+ ->method('clearBackends');
+ $this->container['UserManager']
+ ->expects($this->once())
+ ->method('registerBackend')
+ ->with(new \OC_User_Dummy());
+ $this->container['UserManager']
+ ->expects($this->once())
+ ->method('search')
+ ->with('')
+ ->will($this->returnValue([$user]));
+
+ $expectedResponse = new DataResponse(
+ array(
+ 0 => array(
+ 'name' => 'foo',
+ 'displayname' => 'M. Foo',
+ 'groups' => null,
+ 'subadmin' => array(),
+ 'quota' => null,
+ 'storageLocation' => '/home/foo',
+ 'lastLogin' => 500,
+ 'backend' => 'OC_User_Database'
+ )
+ )
+ );
+ $response = $this->usersController->index(0, 10, '','', 'OC_User_Dummy');
+ $this->assertEquals($expectedResponse, $response);
+ }
+
+ public function testIndexWithBackendNoUser() {
+ $this->container['UserManager']
+ ->expects($this->once())
+ ->method('getBackends')
+ ->will($this->returnValue([new \OC_User_Dummy(), new \OC_User_Database()]));
+ $this->container['UserManager']
+ ->expects($this->once())
+ ->method('search')
+ ->with('')
+ ->will($this->returnValue([]));
+
+ $expectedResponse = new DataResponse([]);
+ $response = $this->usersController->index(0, 10, '','', 'OC_User_Dummy');
$this->assertEquals($expectedResponse, $response);
}