This adds a "backend" type filter to the index REST route which is a pre-requisite for https://github.com/owncloud/core/issues/12620 For example when calling `index.php/settings/users/users?offset=0&limit=10&gid=&pattern=&backend=OC_User_Database` only users within the backend `OC_User_Database` would be shown. (requires sending a CSRF token as well) Depends upon https://github.com/owncloud/core/pull/12711tags/v8.0.0alpha1
@@ -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(); |
@@ -62,6 +62,14 @@ class Manager extends PublicEmitter implements IUserManager { | |||
}); | |||
} | |||
/** | |||
* Get the active backends | |||
* @return \OC_User_Interface[] | |||
*/ | |||
public function getBackends() { | |||
return $this->backends; | |||
} | |||
/** | |||
* register a user backend | |||
* |
@@ -31,6 +31,12 @@ interface IUserManager { | |||
*/ | |||
public function registerBackend($backend); | |||
/** | |||
* Get the active backends | |||
* @return \OC_User_Interface[] | |||
*/ | |||
public function getBackends(); | |||
/** | |||
* remove a user backend | |||
* |
@@ -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; | |||
@@ -84,46 +85,67 @@ class UsersController extends Controller { | |||
); | |||
} | |||
/** | |||
* @param array $userIDs | |||
* @return IUser[] | |||
*/ | |||
private function getUsersForUID(array $userIDs) { | |||
$users = []; | |||
foreach ($userIDs as $uid) { | |||
$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); | |||
} | |||
} | |||
} | |||
$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(''); | |||
} | |||
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(); | |||
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())); |
@@ -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 |
@@ -172,6 +172,62 @@ class UsersControllerTest extends \Test\TestCase { | |||
$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); | |||
} | |||
/** | |||
* TODO: Since the function uses the static OC_Subadmin class it can't be mocked | |||
* to test for subadmins. Thus the test always assumes you have admin permissions... |