@@ -91,23 +91,21 @@ class TransferOwnership extends Command { | |||
} | |||
protected function execute(InputInterface $input, OutputInterface $output) { | |||
$this->sourceUser = $input->getArgument('source-user'); | |||
$this->destinationUser = $input->getArgument('destination-user'); | |||
$source = $this->userManager->get($this->sourceUser); | |||
$destination = $this->userManager->get($this->destinationUser); | |||
$sourceUserObject = $this->userManager->get($input->getArgument('source-user')); | |||
$destinationUserObject = $this->userManager->get($input->getArgument('destination-user')); | |||
if (!$source instanceof IUser) { | |||
if (!$sourceUserObject instanceof IUser) { | |||
$output->writeln("<error>Unknown source user $this->sourceUser</error>"); | |||
return; | |||
} | |||
if (!$destination instanceof IUser) { | |||
if (!$destinationUserObject instanceof IUser) { | |||
$output->writeln("<error>Unknown destination user $this->destinationUser</error>"); | |||
return; | |||
} | |||
$this->sourceUser = $source->getUID(); | |||
$this->destinationUser = $destination->getUID(); | |||
$this->sourceUser = $sourceUserObject->getUID(); | |||
$this->destinationUser = $destinationUserObject->getUID(); | |||
// target user has to be ready | |||
if (!\OC::$server->getEncryptionManager()->isReadyForUser($this->destinationUser)) { |
@@ -394,9 +394,6 @@ class Filesystem { | |||
if ($user === null || $user === false || $user === '') { | |||
throw new \OC\User\NoUserException('Attempted to initialize mount points for null user and no user in session'); | |||
} | |||
if (isset(self::$usersSetup[$user])) { | |||
return; | |||
} | |||
$userManager = \OC::$server->getUserManager(); | |||
$userObject = $userManager->get($user); | |||
@@ -406,6 +403,17 @@ class Filesystem { | |||
throw new \OC\User\NoUserException('Backends provided no user object for ' . $user); | |||
} | |||
// workaround in case of different casings | |||
if ($user !== $userObject->getUID()) { | |||
$stack = json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 50)); | |||
\OCP\Util::writeLog('files', 'initMountPoints() called with wrong user casing. This could be a bug. Expected: "' . $userObject->getUID() . '" got "' . $user . '". Stack: ' . $stack, \OCP\Util::WARN); | |||
} | |||
$user = $userObject->getUID(); | |||
if (isset(self::$usersSetup[$user])) { | |||
return; | |||
} | |||
self::$usersSetup[$user] = true; | |||
/** @var \OC\Files\Config\MountProviderCollection $mountConfigManager */ |
@@ -347,6 +347,15 @@ class Root extends Folder implements IRootFolder { | |||
* @return \OCP\Files\Folder | |||
*/ | |||
public function getUserFolder($userId) { | |||
$userObject = \OC::$server->getUserManager()->get($userId); | |||
if (is_null($userObject)) { | |||
\OCP\Util::writeLog('files', 'Backends provided no user object for ' . $userId, \OCP\Util::ERROR); | |||
throw new \OC\User\NoUserException('Backends provided no user object for ' . $userId); | |||
} | |||
$userId = $userObject->getUID(); | |||
if (!$this->userFolderCache->hasKey($userId)) { | |||
\OC\Files\Filesystem::initMountPoints($userId); | |||
@@ -136,6 +136,15 @@ class Share extends Constants { | |||
* not '/admin/data/file.txt' | |||
*/ | |||
public static function getUsersSharingFile($path, $ownerUser, $includeOwner = false, $returnUserPaths = false, $recursive = true) { | |||
$userManager = \OC::$server->getUserManager(); | |||
$userObject = $userManager->get($ownerUser); | |||
if (is_null($ownerUser)) { | |||
\OCP\Util::writeLog('files', ' Backends provided no user object for ' . $ownerUser, \OCP\Util::ERROR); | |||
throw new \OC\User\NoUserException('Backends provided no user object for ' . $ownerUser); | |||
} | |||
$ownerUser = $userObject->getUID(); | |||
Filesystem::initMountPoints($ownerUser); | |||
$shares = $sharePaths = $fileTargets = array(); |
@@ -26,6 +26,7 @@ namespace Test; | |||
use OC\Avatar; | |||
use OC\AvatarManager; | |||
use OC\Files\AppData\AppData; | |||
use OCP\Files\IAppData; | |||
use OCP\Files\SimpleFS\ISimpleFolder; | |||
use OCP\IConfig; | |||
@@ -48,7 +49,7 @@ class AvatarManagerTest extends \Test\TestCase { | |||
private $logger; | |||
/** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */ | |||
private $config; | |||
/** @var AvatarManager */ | |||
/** @var AvatarManager | \PHPUnit_Framework_MockObject_MockObject */ | |||
private $avatarManager; | |||
public function setUp() { | |||
@@ -101,8 +102,29 @@ class AvatarManagerTest extends \Test\TestCase { | |||
->with('valid-user') | |||
->willReturn($folder); | |||
$expected = new Avatar($folder, $this->l10n, $user, $this->logger, $this->config);; | |||
$expected = new Avatar($folder, $this->l10n, $user, $this->logger, $this->config); | |||
$this->assertEquals($expected, $this->avatarManager->getAvatar('valid-user')); | |||
} | |||
public function testGetAvatarValidUserDifferentCasing() { | |||
$user = $this->createMock(IUser::class); | |||
$this->userManager->expects($this->once()) | |||
->method('get') | |||
->with('vaLid-USER') | |||
->willReturn($user); | |||
$user->expects($this->once()) | |||
->method('getUID') | |||
->willReturn('valid-user'); | |||
$folder = $this->createMock(ISimpleFolder::class); | |||
$this->appData | |||
->expects($this->once()) | |||
->method('getFolder') | |||
->with('valid-user') | |||
->willReturn($folder); | |||
$expected = new Avatar($folder, $this->l10n, $user, $this->logger, $this->config); | |||
$this->assertEquals($expected, $this->avatarManager->getAvatar('vaLid-USER')); | |||
} | |||
} |
@@ -79,6 +79,7 @@ class FilesystemTest extends \Test\TestCase { | |||
protected function setUp() { | |||
parent::setUp(); | |||
\OC_User::clearBackends(); | |||
$userBackend = new \Test\Util\User\Dummy(); | |||
$userBackend->createUser(self::TEST_FILESYSTEM_USER1, self::TEST_FILESYSTEM_USER1); | |||
$userBackend->createUser(self::TEST_FILESYSTEM_USER2, self::TEST_FILESYSTEM_USER2); | |||
@@ -93,6 +94,7 @@ class FilesystemTest extends \Test\TestCase { | |||
$this->logout(); | |||
$this->invokePrivate('\OC\Files\Filesystem', 'normalizedPathCache', [null]); | |||
\OC_User::clearBackends(); | |||
parent::tearDown(); | |||
} | |||
@@ -368,6 +370,39 @@ class FilesystemTest extends \Test\TestCase { | |||
$this->assertEquals(2, $thrown); | |||
} | |||
public function testUserNameCasing() { | |||
$this->logout(); | |||
$userId = $this->getUniqueID('user_'); | |||
\OC_User::clearBackends(); | |||
// needed for loginName2UserName mapping | |||
$userBackend = $this->getMock('\OC\User\Database'); | |||
\OC::$server->getUserManager()->registerBackend($userBackend); | |||
$userBackend->expects($this->once()) | |||
->method('userExists') | |||
->with(strtoupper($userId)) | |||
->will($this->returnValue(true)); | |||
$userBackend->expects($this->once()) | |||
->method('loginName2UserName') | |||
->with(strtoupper($userId)) | |||
->will($this->returnValue($userId)); | |||
$view = new \OC\Files\View(); | |||
$this->assertFalse($view->file_exists('/' . $userId)); | |||
\OC\Files\Filesystem::initMountPoints(strtoupper($userId)); | |||
list($storage1, $path1) = $view->resolvePath('/' . $userId); | |||
list($storage2, $path2) = $view->resolvePath('/' . strtoupper($userId)); | |||
$this->assertTrue($storage1->instanceOfStorage('\OCP\Files\IHomeStorage')); | |||
$this->assertEquals('', $path1); | |||
// not mounted, still on the local root storage | |||
$this->assertEquals(strtoupper($userId), $path2); | |||
} | |||
/** | |||
* Tests that the home storage is used for the user's mount point | |||
*/ |
@@ -9,6 +9,8 @@ | |||
namespace Test\Files\Node; | |||
use OC\Files\FileInfo; | |||
use OC\Files\Mount\Manager; | |||
use OC\User\NoUserException; | |||
class RootTest extends \Test\TestCase { | |||
/** @var \OC\User\User */ | |||
@@ -125,4 +127,59 @@ class RootTest extends \Test\TestCase { | |||
$root->get('/bar/foo'); | |||
} | |||
public function testGetUserFolder() { | |||
$this->logout(); | |||
$manager = new Manager(); | |||
/** | |||
* @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view | |||
*/ | |||
$view = new \OC\Files\View(); | |||
$user1 = $this->getUniqueID('user1_'); | |||
$user2 = $this->getUniqueID('user2_'); | |||
\OC_User::clearBackends(); | |||
// needed for loginName2UserName mapping | |||
$userBackend = $this->getMock('\OC\User\Database'); | |||
\OC::$server->getUserManager()->registerBackend($userBackend); | |||
$userBackend->expects($this->any()) | |||
->method('userExists') | |||
->will($this->returnValueMap([ | |||
[$user1, true], | |||
[$user2, true], | |||
[strtoupper($user1), true], | |||
[strtoupper($user2), true], | |||
])); | |||
$userBackend->expects($this->any()) | |||
->method('loginName2UserName') | |||
->will($this->returnValueMap([ | |||
[strtoupper($user1), $user1], | |||
[$user1, $user1], | |||
[strtoupper($user2), $user2], | |||
[$user2, $user2], | |||
])); | |||
$this->loginAsUser($user1); | |||
$root = new \OC\Files\Node\Root($manager, $view, null, $this->userMountCache); | |||
$folder = $root->getUserFolder($user1); | |||
$this->assertEquals('/' . $user1 . '/files', $folder->getPath()); | |||
$folder = $root->getUserFolder($user2); | |||
$this->assertEquals('/' . $user2 . '/files', $folder->getPath()); | |||
// case difference must not matter here | |||
$folder = $root->getUserFolder(strtoupper($user2)); | |||
$this->assertEquals('/' . $user2 . '/files', $folder->getPath()); | |||
$thrown = false; | |||
try { | |||
$folder = $root->getUserFolder($this->getUniqueID('unexist')); | |||
} catch (NoUserException $e) { | |||
$thrown = true; | |||
} | |||
$this->assertTrue($thrown); | |||
} | |||
} |
@@ -273,6 +273,9 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase { | |||
self::tearDownAfterClassCleanStrayHooks(); | |||
self::tearDownAfterClassCleanStrayLocks(); | |||
\OC_User::clearBackends(); | |||
\OC_User::useBackend('dummy'); | |||
parent::tearDownAfterClass(); | |||
} | |||