Add filter for 'backend' to user REST route
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/12711
This commit is contained in:
parent
5398bbdc00
commit
5dc6406b70
6 changed files with 121 additions and 17 deletions
|
@ -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...
|
||||
|
|
Loading…
Reference in a new issue