diff --git a/apps/files_trashbin/lib/BackgroundJob/ExpireTrash.php b/apps/files_trashbin/lib/BackgroundJob/ExpireTrash.php index 7d481afeb5..d366a401e2 100644 --- a/apps/files_trashbin/lib/BackgroundJob/ExpireTrash.php +++ b/apps/files_trashbin/lib/BackgroundJob/ExpireTrash.php @@ -77,9 +77,9 @@ class ExpireTrash extends \OC\BackgroundJob\TimedJob { return; } - $this->userManager->callForAllUsers(function(IUser $user) { + $this->userManager->callForSeenUsers(function(IUser $user) { $uid = $user->getUID(); - if ($user->getLastLogin() === 0 || !$this->setupFS($uid)) { + if (!$this->setupFS($uid)) { return; } $dirContent = Helper::getTrashFiles('/', $uid, 'mtime'); diff --git a/apps/files_trashbin/lib/Command/ExpireTrash.php b/apps/files_trashbin/lib/Command/ExpireTrash.php index ff82771888..b016fdd6ae 100644 --- a/apps/files_trashbin/lib/Command/ExpireTrash.php +++ b/apps/files_trashbin/lib/Command/ExpireTrash.php @@ -89,7 +89,7 @@ class ExpireTrash extends Command { } else { $p = new ProgressBar($output); $p->start(); - $this->userManager->callForAllUsers(function(IUser $user) use ($p) { + $this->userManager->callForSeenUsers(function(IUser $user) use ($p) { $p->advance(); $this->expireTrashForUser($user); }); @@ -100,7 +100,7 @@ class ExpireTrash extends Command { function expireTrashForUser(IUser $user) { $uid = $user->getUID(); - if ($user->getLastLogin() === 0 || !$this->setupFS($uid)) { + if (!$this->setupFS($uid)) { return; } $dirContent = Helper::getTrashFiles('/', $uid, 'mtime'); diff --git a/apps/files_versions/lib/BackgroundJob/ExpireVersions.php b/apps/files_versions/lib/BackgroundJob/ExpireVersions.php index 8e1f02cdfb..89b8a96613 100644 --- a/apps/files_versions/lib/BackgroundJob/ExpireVersions.php +++ b/apps/files_versions/lib/BackgroundJob/ExpireVersions.php @@ -67,9 +67,9 @@ class ExpireVersions extends \OC\BackgroundJob\TimedJob { return; } - $this->userManager->callForAllUsers(function(IUser $user) { + $this->userManager->callForSeenUsers(function(IUser $user) { $uid = $user->getUID(); - if ($user->getLastLogin() === 0 || !$this->setupFS($uid)) { + if (!$this->setupFS($uid)) { return; } Storage::expireOlderThanMaxForUser($uid); diff --git a/apps/files_versions/lib/Command/ExpireVersions.php b/apps/files_versions/lib/Command/ExpireVersions.php index f384420f22..e88ea1f7a0 100644 --- a/apps/files_versions/lib/Command/ExpireVersions.php +++ b/apps/files_versions/lib/Command/ExpireVersions.php @@ -88,7 +88,7 @@ class ExpireVersions extends Command { } else { $p = new ProgressBar($output); $p->start(); - $this->userManager->callForAllUsers(function(IUser $user) use ($p) { + $this->userManager->callForSeenUsers(function(IUser $user) use ($p) { $p->advance(); $this->expireVersionsForUser($user); }); @@ -99,7 +99,7 @@ class ExpireVersions extends Command { function expireVersionsForUser(IUser $user) { $uid = $user->getUID(); - if ($user->getLastLogin() === 0 || !$this->setupFS($uid)) { + if (!$this->setupFS($uid)) { return; } Storage::expireOlderThanMaxForUser($uid); diff --git a/lib/private/Repair/NC11/MoveAvatarBackgroundJob.php b/lib/private/Repair/NC11/MoveAvatarBackgroundJob.php index 993235146c..f8c0d9b3ab 100644 --- a/lib/private/Repair/NC11/MoveAvatarBackgroundJob.php +++ b/lib/private/Repair/NC11/MoveAvatarBackgroundJob.php @@ -64,35 +64,33 @@ class MoveAvatarsBackgroundJob extends QueuedJob { private function moveAvatars() { $counter = 0; - $this->userManager->callForAllUsers(function (IUser $user) use ($counter) { - if ($user->getLastLogin() !== 0) { - $uid = $user->getUID(); + $this->userManager->callForSeenUsers(function (IUser $user) use ($counter) { + $uid = $user->getUID(); - \OC\Files\Filesystem::initMountPoints($uid); - /** @var Folder $userFolder */ - $userFolder = $this->rootFolder->get($uid); + \OC\Files\Filesystem::initMountPoints($uid); + /** @var Folder $userFolder */ + $userFolder = $this->rootFolder->get($uid); - try { - $userData = $this->appData->getFolder($uid); - } catch (NotFoundException $e) { - $userData = $this->appData->newFolder($uid); - } + try { + $userData = $this->appData->getFolder($uid); + } catch (NotFoundException $e) { + $userData = $this->appData->newFolder($uid); + } - $regex = '/^avatar\.([0-9]+\.)?(jpg|png)$/'; - $avatars = $userFolder->getDirectoryListing(); + $regex = '/^avatar\.([0-9]+\.)?(jpg|png)$/'; + $avatars = $userFolder->getDirectoryListing(); - foreach ($avatars as $avatar) { - /** @var File $avatar */ - if (preg_match($regex, $avatar->getName())) { - /* - * This is not the most effective but it is the most abstract way - * to handle this. Avatars should be small anyways. - */ - $newAvatar = $userData->newFile($avatar->getName()); - $newAvatar->putContent($avatar->getContent()); - $avatar->delete(); - } + foreach ($avatars as $avatar) { + /** @var File $avatar */ + if (preg_match($regex, $avatar->getName())) { + /* + * This is not the most effective but it is the most abstract way + * to handle this. Avatars should be small anyways. + */ + $newAvatar = $userData->newFile($avatar->getName()); + $newAvatar->putContent($avatar->getContent()); + $avatar->delete(); } } $counter++; diff --git a/lib/private/Repair/RemoveRootShares.php b/lib/private/Repair/RemoveRootShares.php index 1fd7d8d7da..69fcb1b449 100644 --- a/lib/private/Repair/RemoveRootShares.php +++ b/lib/private/Repair/RemoveRootShares.php @@ -96,30 +96,13 @@ class RemoveRootShares implements IRepairStep { $output->advance(); }; - $userCount = $this->countUsers(); - $output->startProgress($userCount); + $output->startProgress($this->userManager->countSeenUsers()); - $this->userManager->callForAllUsers($function); + $this->userManager->callForSeenUsers($function); $output->finishProgress(); } - /** - * Count all the users - * - * @return int - */ - private function countUsers() { - $allCount = $this->userManager->countUsers(); - - $totalCount = 0; - foreach ($allCount as $backend => $count) { - $totalCount += $count; - } - - return $totalCount; - } - /** * Verify if this repair steps is required * It *should* not be necessary in most cases and it can be very diff --git a/lib/private/Repair/RepairUnmergedShares.php b/lib/private/Repair/RepairUnmergedShares.php index d57bc3779f..56d935c74f 100644 --- a/lib/private/Repair/RepairUnmergedShares.php +++ b/lib/private/Repair/RepairUnmergedShares.php @@ -335,22 +335,6 @@ class RepairUnmergedShares implements IRepairStep { } } - /** - * Count all the users - * - * @return int - */ - private function countUsers() { - $allCount = $this->userManager->countUsers(); - - $totalCount = 0; - foreach ($allCount as $backend => $count) { - $totalCount += $count; - } - - return $totalCount; - } - public function run(IOutput $output) { $ocVersionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0'); if (version_compare($ocVersionFromBeforeUpdate, '9.1.0.16', '<')) { @@ -363,8 +347,7 @@ class RepairUnmergedShares implements IRepairStep { $this->buildPreparedQueries(); - $userCount = $this->countUsers(); - $output->startProgress($userCount); + $output->startProgress($this->userManager->countUsers()); $this->userManager->callForAllUsers($function); diff --git a/lib/private/User/Manager.php b/lib/private/User/Manager.php index 7d8c6d48b2..c3fb873742 100644 --- a/lib/private/User/Manager.php +++ b/lib/private/User/Manager.php @@ -72,7 +72,7 @@ class Manager extends PublicEmitter implements IUserManager { /** * @param \OCP\IConfig $config */ - public function __construct(IConfig $config = null) { + public function __construct(IConfig $config) { $this->config = $config; $cachedUsers = &$this->cachedUsers; $this->listen('\OC\User', 'postDelete', function ($user) use (&$cachedUsers) { @@ -314,10 +314,16 @@ class Manager extends PublicEmitter implements IUserManager { /** * returns how many users per backend exist (if supported by backend) * - * @return array an array of backend class as key and count number as value + * @param boolean $hasLoggedIn when true only users that have a lastLogin + * entry in the preferences table will be affected + * @return array|int an array of backend class as key and count number as value + * if $hasLoggedIn is true only an int is returned */ - public function countUsers() { - $userCountStatistics = array(); + public function countUsers($hasLoggedIn = false) { + if ($hasLoggedIn) { + return $this->countSeenUsers(); + } + $userCountStatistics = []; foreach ($this->backends as $backend) { if ($backend->implementsActions(Backend::COUNT_USERS)) { $backendUsers = $backend->countUsers(); @@ -344,27 +350,119 @@ class Manager extends PublicEmitter implements IUserManager { * * @param \Closure $callback * @param string $search + * @param boolean $onlySeen when true only users that have a lastLogin entry + * in the preferences table will be affected * @since 9.0.0 */ - public function callForAllUsers(\Closure $callback, $search = '') { - foreach($this->getBackends() as $backend) { - $limit = 500; - $offset = 0; - do { - $users = $backend->getUsers($search, $limit, $offset); - foreach ($users as $uid) { - if (!$backend->userExists($uid)) { - continue; + public function callForAllUsers(\Closure $callback, $search = '', $onlySeen = false) { + if ($onlySeen) { + $this->callForSeenUsers($callback); + } else { + foreach ($this->getBackends() as $backend) { + $limit = 500; + $offset = 0; + do { + $users = $backend->getUsers($search, $limit, $offset); + foreach ($users as $uid) { + if (!$backend->userExists($uid)) { + continue; + } + $user = $this->getUserObject($uid, $backend, false); + $return = $callback($user); + if ($return === false) { + break; + } } - $user = $this->getUserObject($uid, $backend, false); - $return = $callback($user); - if ($return === false) { - break; + $offset += $limit; + } while (count($users) >= $limit); + } + } + } + + /** + * returns how many users have logged in once + * + * @return int + * @since 9.2.0 + */ + public function countSeenUsers() { + $queryBuilder = \OC::$server->getDatabaseConnection()->getQueryBuilder(); + $queryBuilder->select($queryBuilder->createFunction('COUNT(*)')) + ->from('preferences') + ->where($queryBuilder->expr()->eq('appid', $queryBuilder->createNamedParameter('login'))) + ->andWhere($queryBuilder->expr()->eq('configkey', $queryBuilder->createNamedParameter('lastLogin'))) + ->andWhere($queryBuilder->expr()->isNotNull('configvalue')); + + $query = $queryBuilder->execute(); + + $result = (int)$query->fetchColumn(); + $query->closeCursor(); + + return $result; + } + + /** + * @param \Closure $callback + * @since 9.2.0 + */ + public function callForSeenUsers(\Closure $callback) { + $limit = 1000; + $offset = 0; + do { + $userIds = $this->getSeenUserIds($limit, $offset); + $offset += $limit; + foreach ($userIds as $userId) { + foreach ($this->backends as $backend) { + if ($backend->userExists($userId)) { + $user = $this->getUserObject($userId, $backend, false); + $return = $callback($user); + if ($return === false) { + return; + } } } - $offset += $limit; - } while (count($users) >= $limit); + } + } while (count($userIds) >= $limit); + } + + /** + * Getting all userIds that have a listLogin value requires checking the + * value in php because on oracle you cannot use a clob in a where clause, + * preventing us from doing a not null or length(value) > 0 check. + * + * @param int $limit + * @param int $offset + * @return string[] with user ids + */ + private function getSeenUserIds($limit = null, $offset = null) { + $queryBuilder = \OC::$server->getDatabaseConnection()->getQueryBuilder(); + $queryBuilder->select(['userid']) + ->from('preferences') + ->where($queryBuilder->expr()->eq( + 'appid', $queryBuilder->createNamedParameter('login')) + ) + ->andWhere($queryBuilder->expr()->eq( + 'configkey', $queryBuilder->createNamedParameter('lastLogin')) + ) + ->andWhere($queryBuilder->expr()->isNotNull('configvalue') + ); + + if ($limit !== null) { + $queryBuilder->setMaxResults($limit); } + if ($offset !== null) { + $queryBuilder->setFirstResult($offset); + } + $query = $queryBuilder->execute(); + $result = []; + + while ($row = $query->fetch()) { + $result[] = $row['userid']; + } + + $query->closeCursor(); + + return $result; } /** diff --git a/lib/public/IUserManager.php b/lib/public/IUserManager.php index 1e0c298edc..5220a0c65c 100644 --- a/lib/public/IUserManager.php +++ b/lib/public/IUserManager.php @@ -142,7 +142,21 @@ interface IUserManager { * @param string $search * @since 9.0.0 */ - public function callForAllUsers (\Closure $callback, $search = ''); + public function callForAllUsers(\Closure $callback, $search = ''); + + /** + * returns how many users have logged in once + * + * @return int + * @since 9.2.0 + */ + public function countSeenUsers(); + + /** + * @param \Closure $callback + * @since 9.2.0 + */ + public function callForSeenUsers(\Closure $callback); /** * @param string $email diff --git a/tests/lib/Files/Config/UserMountCacheTest.php b/tests/lib/Files/Config/UserMountCacheTest.php index 51d488e6de..376f0a0276 100644 --- a/tests/lib/Files/Config/UserMountCacheTest.php +++ b/tests/lib/Files/Config/UserMountCacheTest.php @@ -13,6 +13,7 @@ use OC\Files\Mount\MountPoint; use OC\Log; use OC\User\Manager; use OCP\Files\Config\ICachedMountInfo; +use OCP\IConfig; use OCP\IDBConnection; use OCP\IUserManager; use Test\TestCase; @@ -42,7 +43,7 @@ class UserMountCacheTest extends TestCase { public function setUp() { $this->fileIds = []; $this->connection = \OC::$server->getDatabaseConnection(); - $this->userManager = new Manager(null); + $this->userManager = new Manager($this->createMock(IConfig::class)); $userBackend = new Dummy(); $userBackend->createUser('u1', ''); $userBackend->createUser('u2', ''); diff --git a/tests/lib/Files/Storage/Wrapper/EncryptionTest.php b/tests/lib/Files/Storage/Wrapper/EncryptionTest.php index 55b38d546d..245f39f5e2 100644 --- a/tests/lib/Files/Storage/Wrapper/EncryptionTest.php +++ b/tests/lib/Files/Storage/Wrapper/EncryptionTest.php @@ -121,7 +121,7 @@ class EncryptionTest extends Storage { $this->util = $this->getMockBuilder('\OC\Encryption\Util') ->setMethods(['getUidAndFilename', 'isFile', 'isExcluded']) - ->setConstructorArgs([new View(), new Manager(), $this->groupManager, $this->config, $this->arrayCache]) + ->setConstructorArgs([new View(), new Manager($this->config), $this->groupManager, $this->config, $this->arrayCache]) ->getMock(); $this->util->expects($this->any()) ->method('getUidAndFilename') @@ -547,7 +547,7 @@ class EncryptionTest extends Storage { ->setConstructorArgs( [ new View(), - new Manager(), + new Manager($this->config), $this->groupManager, $this->config, $this->arrayCache @@ -612,7 +612,7 @@ class EncryptionTest extends Storage { ->disableOriginalConstructor()->getMock(); $util = $this->getMockBuilder('\OC\Encryption\Util') - ->setConstructorArgs([new View(), new Manager(), $this->groupManager, $this->config, $this->arrayCache]) + ->setConstructorArgs([new View(), new Manager($this->config), $this->groupManager, $this->config, $this->arrayCache]) ->getMock(); $cache = $this->getMockBuilder('\OC\Files\Cache\Cache') diff --git a/tests/lib/Files/Stream/EncryptionTest.php b/tests/lib/Files/Stream/EncryptionTest.php index 6f3c879f9e..e072dd6718 100644 --- a/tests/lib/Files/Stream/EncryptionTest.php +++ b/tests/lib/Files/Stream/EncryptionTest.php @@ -43,7 +43,7 @@ class EncryptionTest extends \Test\TestCase { $file->expects($this->any())->method('getAccessList')->willReturn([]); $util = $this->getMockBuilder('\OC\Encryption\Util') ->setMethods(['getUidAndFilename']) - ->setConstructorArgs([new View(), new \OC\User\Manager(), $groupManager, $config, $arrayCache]) + ->setConstructorArgs([new View(), new \OC\User\Manager($config), $groupManager, $config, $arrayCache]) ->getMock(); $util->expects($this->any()) ->method('getUidAndFilename') diff --git a/tests/lib/Repair/RemoveRootSharesTest.php b/tests/lib/Repair/RemoveRootSharesTest.php index bf255fc7e9..cfb81cb1ec 100644 --- a/tests/lib/Repair/RemoveRootSharesTest.php +++ b/tests/lib/Repair/RemoveRootSharesTest.php @@ -106,6 +106,7 @@ class RemoveRootSharesTest extends \Test\TestCase { $user = $this->userManager->createUser('test', 'test'); $userFolder = $this->rootFolder->getUserFolder('test'); $fileId = $userFolder->getId(); + $user->updateLastLoginTimestamp(); //Now insert cyclic share $qb = $this->connection->getQueryBuilder(); @@ -134,6 +135,7 @@ class RemoveRootSharesTest extends \Test\TestCase { $user1 = $this->userManager->createUser('test1', 'test1'); $userFolder = $this->rootFolder->getUserFolder('test1'); $fileId = $userFolder->getId(); + $user1->updateLastLoginTimestamp(); //Now insert cyclic share $qb = $this->connection->getQueryBuilder(); @@ -156,6 +158,7 @@ class RemoveRootSharesTest extends \Test\TestCase { $userFolder = $this->rootFolder->getUserFolder('test2'); $folder = $userFolder->newFolder('foo'); $fileId = $folder->getId(); + $user2->updateLastLoginTimestamp(); //Now insert cyclic share $qb = $this->connection->getQueryBuilder(); diff --git a/tests/lib/User/ManagerTest.php b/tests/lib/User/ManagerTest.php index f6318ff353..123271bcc8 100644 --- a/tests/lib/User/ManagerTest.php +++ b/tests/lib/User/ManagerTest.php @@ -9,6 +9,9 @@ namespace Test\User; use OC\User\Database; +use OCP\IConfig; +use OCP\IUser; +use Test\TestCase; /** * Class ManagerTest @@ -17,10 +20,20 @@ use OC\User\Database; * * @package Test\User */ -class ManagerTest extends \Test\TestCase { +class ManagerTest extends TestCase { + + /** @var IConfig */ + private $config; + + public function setUp() { + parent::setUp(); + + $this->config = $this->createMock(IConfig::class); + } + public function testGetBackends() { $userDummyBackend = $this->createMock(\Test\Util\User\Dummy::class); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($userDummyBackend); $this->assertEquals([$userDummyBackend], $manager->getBackends()); $dummyDatabaseBackend = $this->createMock(Database::class); @@ -39,7 +52,7 @@ class ManagerTest extends \Test\TestCase { ->with($this->equalTo('foo')) ->will($this->returnValue(true)); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend); $this->assertTrue($manager->userExists('foo')); @@ -55,14 +68,14 @@ class ManagerTest extends \Test\TestCase { ->with($this->equalTo('foo')) ->will($this->returnValue(false)); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend); $this->assertFalse($manager->userExists('foo')); } public function testUserExistsNoBackends() { - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $this->assertFalse($manager->userExists('foo')); } @@ -86,7 +99,7 @@ class ManagerTest extends \Test\TestCase { ->with($this->equalTo('foo')) ->will($this->returnValue(true)); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend1); $manager->registerBackend($backend2); @@ -110,7 +123,7 @@ class ManagerTest extends \Test\TestCase { $backend2->expects($this->never()) ->method('userExists'); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend1); $manager->registerBackend($backend2); @@ -137,7 +150,7 @@ class ManagerTest extends \Test\TestCase { } })); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend); $user = $manager->checkPassword('foo', 'bar'); @@ -156,7 +169,7 @@ class ManagerTest extends \Test\TestCase { ->method('implementsActions') ->will($this->returnValue(false)); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend); $this->assertFalse($manager->checkPassword('foo', 'bar')); @@ -172,7 +185,7 @@ class ManagerTest extends \Test\TestCase { ->with($this->equalTo('foo')) ->will($this->returnValue(true)); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend); $this->assertEquals('foo', $manager->get('foo')->getUID()); @@ -188,7 +201,7 @@ class ManagerTest extends \Test\TestCase { ->with($this->equalTo('foo')) ->will($this->returnValue(false)); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend); $this->assertEquals(null, $manager->get('foo')); @@ -204,7 +217,7 @@ class ManagerTest extends \Test\TestCase { ->with($this->equalTo('fo')) ->will($this->returnValue(array('foo', 'afoo'))); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend); $result = $manager->search('fo'); @@ -232,7 +245,7 @@ class ManagerTest extends \Test\TestCase { ->with($this->equalTo('fo'), $this->equalTo(3), $this->equalTo(1)) ->will($this->returnValue(array('foo3'))); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend1); $manager->registerBackend($backend2); @@ -261,7 +274,7 @@ class ManagerTest extends \Test\TestCase { ->with($this->equalTo('foo')) ->will($this->returnValue(false)); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend); $user = $manager->createUser('foo', 'bar'); @@ -288,7 +301,7 @@ class ManagerTest extends \Test\TestCase { ->with($this->equalTo('foo')) ->will($this->returnValue(true)); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend); $manager->createUser('foo', 'bar'); @@ -311,14 +324,14 @@ class ManagerTest extends \Test\TestCase { ->with($this->equalTo('foo')) ->will($this->returnValue(false)); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend); $this->assertFalse($manager->createUser('foo', 'bar')); } public function testCreateUserNoBackends() { - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $this->assertFalse($manager->createUser('foo', 'bar')); } @@ -359,7 +372,7 @@ class ManagerTest extends \Test\TestCase { ->with($this->equalTo('foo')) ->will($this->returnValue(true)); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend1); $manager->registerBackend($backend2); @@ -367,7 +380,7 @@ class ManagerTest extends \Test\TestCase { } public function testCountUsersNoBackend() { - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $result = $manager->countUsers(); $this->assertTrue(is_array($result)); @@ -392,7 +405,7 @@ class ManagerTest extends \Test\TestCase { ->method('getBackendName') ->will($this->returnValue('Mock_Test_Util_User_Dummy')); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend); $result = $manager->countUsers(); @@ -433,7 +446,7 @@ class ManagerTest extends \Test\TestCase { ->method('getBackendName') ->will($this->returnValue('Mock_Test_Util_User_Dummy')); - $manager = new \OC\User\Manager(); + $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend1); $manager->registerBackend($backend2); @@ -448,6 +461,66 @@ class ManagerTest extends \Test\TestCase { $this->assertEquals(7 + 16, $users); } + public function testCountUsersOnlySeen() { + $manager = \OC::$server->getUserManager(); + // count other users in the db before adding our own + $countBefore = $manager->countUsers(true); + + //Add test users + $user1 = $manager->createUser('testseencount1', 'testseencount1'); + $user1->updateLastLoginTimestamp(); + + $user2 = $manager->createUser('testseencount2', 'testseencount2'); + $user2->updateLastLoginTimestamp(); + + $user3 = $manager->createUser('testseencount3', 'testseencount3'); + + $user4 = $manager->createUser('testseencount4', 'testseencount4'); + $user4->updateLastLoginTimestamp(); + + $this->assertEquals($countBefore + 3, $manager->countUsers(true)); + + //cleanup + $user1->delete(); + $user2->delete(); + $user3->delete(); + $user4->delete(); + } + + public function testCallForSeenUsers() { + $manager = \OC::$server->getUserManager(); + // count other users in the db before adding our own + $count = 0; + $function = function (IUser $user) use (&$count) { + $count++; + }; + $manager->callForAllUsers($function, '', true); + $countBefore = $count; + + //Add test users + $user1 = $manager->createUser('testseen1', 'testseen1'); + $user1->updateLastLoginTimestamp(); + + $user2 = $manager->createUser('testseen2', 'testseen2'); + $user2->updateLastLoginTimestamp(); + + $user3 = $manager->createUser('testseen3', 'testseen3'); + + $user4 = $manager->createUser('testseen4', 'testseen4'); + $user4->updateLastLoginTimestamp(); + + $count = 0; + $manager->callForAllUsers($function, '', true); + + $this->assertEquals($countBefore + 3, $count); + + //cleanup + $user1->delete(); + $user2->delete(); + $user3->delete(); + $user4->delete(); + } + public function testDeleteUser() { $config = $this->getMockBuilder('OCP\IConfig') ->disableOriginalConstructor() diff --git a/tests/lib/User/SessionTest.php b/tests/lib/User/SessionTest.php index 1b3d5cc460..268d8e10e5 100644 --- a/tests/lib/User/SessionTest.php +++ b/tests/lib/User/SessionTest.php @@ -190,7 +190,10 @@ class SessionTest extends \Test\TestCase { unset($managerMethods[$i]); } } - $manager = $this->getMockBuilder(Manager::class)->setMethods($managerMethods)->getMock(); + $manager = $this->getMockBuilder(Manager::class) + ->setMethods($managerMethods) + ->setConstructorArgs([$this->config]) + ->getMock(); $backend = $this->createMock(\Test\Util\User\Dummy::class); @@ -245,7 +248,10 @@ class SessionTest extends \Test\TestCase { unset($managerMethods[$i]); } } - $manager = $this->getMockBuilder(Manager::class)->setMethods($managerMethods)->getMock(); + $manager = $this->getMockBuilder(Manager::class) + ->setMethods($managerMethods) + ->setConstructorArgs([$this->config]) + ->getMock(); $backend = $this->createMock(\Test\Util\User\Dummy::class); @@ -277,7 +283,10 @@ class SessionTest extends \Test\TestCase { unset($managerMethods[$i]); } } - $manager = $this->getMockBuilder(Manager::class)->setMethods($managerMethods)->getMock(); + $manager = $this->getMockBuilder(Manager::class) + ->setMethods($managerMethods) + ->setConstructorArgs([$this->config]) + ->getMock(); $backend = $this->createMock(\Test\Util\User\Dummy::class); $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config); @@ -527,7 +536,10 @@ class SessionTest extends \Test\TestCase { unset($managerMethods[$i]); } } - $manager = $this->getMockBuilder(Manager::class)->setMethods($managerMethods)->getMock(); + $manager = $this->getMockBuilder(Manager::class) + ->setMethods($managerMethods) + ->setConstructorArgs([$this->config]) + ->getMock(); $backend = $this->createMock(\Test\Util\User\Dummy::class); @@ -577,7 +589,10 @@ class SessionTest extends \Test\TestCase { unset($managerMethods[$i]); } } - $manager = $this->getMockBuilder(Manager::class)->setMethods($managerMethods)->getMock(); + $manager = $this->getMockBuilder(Manager::class) + ->setMethods($managerMethods) + ->setConstructorArgs([$this->config]) + ->getMock(); $backend = $this->createMock(\Test\Util\User\Dummy::class); @@ -621,7 +636,10 @@ class SessionTest extends \Test\TestCase { unset($managerMethods[$i]); } } - $manager = $this->getMockBuilder(Manager::class)->setMethods($managerMethods)->getMock(); + $manager = $this->getMockBuilder(Manager::class) + ->setMethods($managerMethods) + ->setConstructorArgs([$this->config]) + ->getMock(); $backend = $this->createMock(\Test\Util\User\Dummy::class);