parent
045f8cc971
commit
289e9130f3
@ -0,0 +1,270 @@ |
||||
<?php |
||||
/** |
||||
* @author Björn Schießle <schiessle@owncloud.com> |
||||
* |
||||
* @copyright Copyright (c) 2015, ownCloud, Inc. |
||||
* @license AGPL-3.0 |
||||
* |
||||
* This code is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License, version 3, |
||||
* as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU Affero General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public License, version 3, |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/> |
||||
* |
||||
*/ |
||||
|
||||
|
||||
namespace OC\Core\Command\Encryption; |
||||
|
||||
use OC\Encryption\Keys\Storage; |
||||
use OC\Encryption\Util; |
||||
use OC\Files\Filesystem; |
||||
use OC\Files\View; |
||||
use OCP\IConfig; |
||||
use OCP\IUserManager; |
||||
use Symfony\Component\Console\Command\Command; |
||||
use Symfony\Component\Console\Helper\ProgressBar; |
||||
use Symfony\Component\Console\Helper\QuestionHelper; |
||||
use Symfony\Component\Console\Input\InputArgument; |
||||
use Symfony\Component\Console\Input\InputInterface; |
||||
use Symfony\Component\Console\Output\OutputInterface; |
||||
use Symfony\Component\Console\Question\ConfirmationQuestion; |
||||
|
||||
class ChangeKeyStorageRoot extends Command { |
||||
|
||||
/** @var View */ |
||||
protected $rootView; |
||||
|
||||
/** @var IUserManager */ |
||||
protected $userManager; |
||||
|
||||
/** @var IConfig */ |
||||
protected $config; |
||||
|
||||
/** @var Util */ |
||||
protected $util; |
||||
|
||||
/** @var QuestionHelper */ |
||||
protected $questionHelper; |
||||
|
||||
/** |
||||
* @param View $view |
||||
* @param IUserManager $userManager |
||||
* @param IConfig $config |
||||
* @param Util $util |
||||
* @param QuestionHelper $questionHelper |
||||
*/ |
||||
public function __construct(View $view, IUserManager $userManager, IConfig $config, Util $util, QuestionHelper $questionHelper) { |
||||
parent::__construct(); |
||||
$this->rootView = $view; |
||||
$this->userManager = $userManager; |
||||
$this->config = $config; |
||||
$this->util = $util; |
||||
$this->questionHelper = $questionHelper; |
||||
} |
||||
|
||||
protected function configure() { |
||||
parent::configure(); |
||||
$this |
||||
->setName('encryption:change-key-storage-root') |
||||
->setDescription('Change key storage root') |
||||
->addArgument( |
||||
'newRoot', |
||||
InputArgument::OPTIONAL, |
||||
'new root of the key storage relative to the data folder' |
||||
); |
||||
} |
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output) { |
||||
$oldRoot = $this->util->getKeyStorageRoot(); |
||||
$newRoot = $input->getArgument('newRoot'); |
||||
|
||||
if ($newRoot === null) { |
||||
$question = new ConfirmationQuestion('No storage root given, do you want to reset the key storage root to the default location? (y/n) ', false); |
||||
if (!$this->questionHelper->ask($input, $output, $question)) { |
||||
return; |
||||
} |
||||
$newRoot = ''; |
||||
} |
||||
|
||||
$oldRootDescription = $oldRoot !== '' ? $oldRoot : 'default storage location'; |
||||
$newRootDescription = $newRoot !== '' ? $newRoot : 'default storage location'; |
||||
$output->writeln("Change key storage root from <info>$oldRootDescription</info> to <info>$newRootDescription</info>"); |
||||
$success = $this->moveAllKeys($oldRoot, $newRoot, $output); |
||||
if ($success) { |
||||
$this->util->setKeyStorageRoot($newRoot); |
||||
$output->writeln(''); |
||||
$output->writeln("Key storage root successfully changed to <info>$newRootDescription</info>"); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* move keys to new key storage root |
||||
* |
||||
* @param string $oldRoot |
||||
* @param string $newRoot |
||||
* @param OutputInterface $output |
||||
* @return bool |
||||
* @throws \Exception |
||||
*/ |
||||
protected function moveAllKeys($oldRoot, $newRoot, OutputInterface $output) { |
||||
|
||||
$output->writeln("Start to move keys:"); |
||||
|
||||
if ($this->rootView->is_dir(($oldRoot)) === false) { |
||||
$output->writeln("No old keys found: Nothing needs to be moved"); |
||||
return false; |
||||
} |
||||
|
||||
$this->prepareNewRoot($newRoot); |
||||
$this->moveSystemKeys($oldRoot, $newRoot); |
||||
$this->moveUserKeys($oldRoot, $newRoot, $output); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
/** |
||||
* prepare new key storage |
||||
* |
||||
* @param string $newRoot |
||||
* @throws \Exception |
||||
*/ |
||||
protected function prepareNewRoot($newRoot) { |
||||
if ($this->rootView->is_dir($newRoot) === false) { |
||||
throw new \Exception("New root folder doesn't exist. Please create the folder or check the permissions and try again."); |
||||
} |
||||
|
||||
$result = $this->rootView->file_put_contents( |
||||
$newRoot . '/' . Storage::KEY_STORAGE_MARKER, |
||||
'ownCloud will detect this folder as key storage root only if this file exists' |
||||
); |
||||
|
||||
if ($result === false) { |
||||
throw new \Exception("Can't write to new root folder. Please check the permissions and try again"); |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
/** |
||||
* move system key folder |
||||
* |
||||
* @param string $oldRoot |
||||
* @param string $newRoot |
||||
*/ |
||||
protected function moveSystemKeys($oldRoot, $newRoot) { |
||||
if ( |
||||
$this->rootView->is_dir($oldRoot . '/files_encryption') && |
||||
$this->targetExists($newRoot . '/files_encryption') === false |
||||
) { |
||||
$this->rootView->rename($oldRoot . '/files_encryption', $newRoot . '/files_encryption'); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* setup file system for the given user |
||||
* |
||||
* @param string $uid |
||||
*/ |
||||
protected function setupUserFS($uid) { |
||||
\OC_Util::tearDownFS(); |
||||
\OC_Util::setupFS($uid); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* iterate over each user and move the keys to the new storage |
||||
* |
||||
* @param string $oldRoot |
||||
* @param string $newRoot |
||||
* @param OutputInterface $output |
||||
*/ |
||||
protected function moveUserKeys($oldRoot, $newRoot, OutputInterface $output) { |
||||
|
||||
$progress = new ProgressBar($output); |
||||
$progress->start(); |
||||
|
||||
|
||||
foreach($this->userManager->getBackends() as $backend) { |
||||
$limit = 500; |
||||
$offset = 0; |
||||
do { |
||||
$users = $backend->getUsers('', $limit, $offset); |
||||
foreach ($users as $user) { |
||||
$progress->advance(); |
||||
$this->setupUserFS($user); |
||||
$this->moveUserEncryptionFolder($user, $oldRoot, $newRoot); |
||||
} |
||||
$offset += $limit; |
||||
} while(count($users) >= $limit); |
||||
} |
||||
$progress->finish(); |
||||
} |
||||
|
||||
/** |
||||
* move user encryption folder to new root folder |
||||
* |
||||
* @param string $user |
||||
* @param string $oldRoot |
||||
* @param string $newRoot |
||||
* @throws \Exception |
||||
*/ |
||||
protected function moveUserEncryptionFolder($user, $oldRoot, $newRoot) { |
||||
|
||||
if ($this->userManager->userExists($user)) { |
||||
|
||||
$source = $oldRoot . '/' . $user . '/files_encryption'; |
||||
$target = $newRoot . '/' . $user . '/files_encryption'; |
||||
if ( |
||||
$this->rootView->is_dir($source) && |
||||
$this->targetExists($target) === false |
||||
) { |
||||
$this->prepareParentFolder($newRoot . '/' . $user); |
||||
$this->rootView->rename($source, $target); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Make preparations to filesystem for saving a key file |
||||
* |
||||
* @param string $path relative to data/ |
||||
*/ |
||||
protected function prepareParentFolder($path) { |
||||
$path = Filesystem::normalizePath($path); |
||||
// If the file resides within a subdirectory, create it |
||||
if ($this->rootView->file_exists($path) === false) { |
||||
$sub_dirs = explode('/', ltrim($path, '/')); |
||||
$dir = ''; |
||||
foreach ($sub_dirs as $sub_dir) { |
||||
$dir .= '/' . $sub_dir; |
||||
if ($this->rootView->file_exists($dir) === false) { |
||||
$this->rootView->mkdir($dir); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* check if target already exists |
||||
* |
||||
* @param $path |
||||
* @return bool |
||||
* @throws \Exception |
||||
*/ |
||||
protected function targetExists($path) { |
||||
if ($this->rootView->file_exists($path)) { |
||||
throw new \Exception("new folder '$path' already exists"); |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,58 @@ |
||||
<?php |
||||
/** |
||||
* @author Björn Schießle <schiessle@owncloud.com> |
||||
* |
||||
* @copyright Copyright (c) 2015, ownCloud, Inc. |
||||
* @license AGPL-3.0 |
||||
* |
||||
* This code is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License, version 3, |
||||
* as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU Affero General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public License, version 3, |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/> |
||||
* |
||||
*/ |
||||
|
||||
|
||||
namespace OC\Core\Command\Encryption; |
||||
|
||||
use OC\Encryption\Util; |
||||
use Symfony\Component\Console\Command\Command; |
||||
use Symfony\Component\Console\Input\InputInterface; |
||||
use Symfony\Component\Console\Output\OutputInterface; |
||||
|
||||
class ShowKeyStorageRoot extends Command{ |
||||
|
||||
/** @var Util */ |
||||
protected $util; |
||||
|
||||
/** |
||||
* @param Util $util |
||||
*/ |
||||
public function __construct(Util $util) { |
||||
parent::__construct(); |
||||
$this->util = $util; |
||||
} |
||||
|
||||
protected function configure() { |
||||
parent::configure(); |
||||
$this |
||||
->setName('encryption:show-key-storage-root') |
||||
->setDescription('Show current key storage root'); |
||||
} |
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output) { |
||||
$currentRoot = $this->util->getKeyStorageRoot(); |
||||
|
||||
$rootDescription = $currentRoot !== '' ? $currentRoot : 'default storage location (data/)'; |
||||
|
||||
$output->writeln("Current key storage root: <info>$rootDescription</info>"); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,381 @@ |
||||
<?php |
||||
/** |
||||
* @author Björn Schießle <schiessle@owncloud.com> |
||||
* |
||||
* @copyright Copyright (c) 2015, ownCloud, Inc. |
||||
* @license AGPL-3.0 |
||||
* |
||||
* This code is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License, version 3, |
||||
* as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU Affero General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public License, version 3, |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/> |
||||
* |
||||
*/ |
||||
|
||||
|
||||
namespace Tests\Core\Command\Encryption; |
||||
|
||||
|
||||
use OC\Core\Command\Encryption\ChangeKeyStorageRoot; |
||||
use OC\Encryption\Util; |
||||
use OC\Files\View; |
||||
use OCP\IConfig; |
||||
use OCP\IUserManager; |
||||
use Symfony\Component\Console\Helper\QuestionHelper; |
||||
use Symfony\Component\Console\Input\InputInterface; |
||||
use Symfony\Component\Console\Output\OutputInterface; |
||||
use Test\TestCase; |
||||
|
||||
class ChangeKeyStorageRootTest extends TestCase { |
||||
|
||||
/** @var ChangeKeyStorageRoot */ |
||||
protected $changeKeyStorageRoot; |
||||
|
||||
/** @var View | \PHPUnit_Framework_MockObject_MockObject */ |
||||
protected $view; |
||||
|
||||
/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject */ |
||||
protected $userManager; |
||||
|
||||
/** @var IConfig | \PHPUnit_Framework_MockObject_MockObject */ |
||||
protected $config; |
||||
|
||||
/** @var Util | \PHPUnit_Framework_MockObject_MockObject */ |
||||
protected $util; |
||||
|
||||
/** @var QuestionHelper | \PHPUnit_Framework_MockObject_MockObject */ |
||||
protected $questionHelper; |
||||
|
||||
/** @var InputInterface | \PHPUnit_Framework_MockObject_MockObject */ |
||||
protected $inputInterface; |
||||
|
||||
/** @var OutputInterface | \PHPUnit_Framework_MockObject_MockObject */ |
||||
protected $outputInterface; |
||||
|
||||
/** @var \OCP\UserInterface | \PHPUnit_Framework_MockObject_MockObject */ |
||||
protected $userInterface; |
||||
|
||||
public function setUp() { |
||||
parent::setUp(); |
||||
|
||||
$this->view = $this->getMock('\OC\Files\View'); |
||||
$this->userManager = $this->getMock('\OCP\IUserManager'); |
||||
$this->config = $this->getMock('\OCP\IConfig'); |
||||
$this->util = $this->getMockBuilder('OC\Encryption\Util')->disableOriginalConstructor()->getMock(); |
||||
$this->questionHelper = $this->getMock('Symfony\Component\Console\Helper\QuestionHelper'); |
||||
$this->inputInterface = $this->getMock('Symfony\Component\Console\Input\InputInterface'); |
||||
$this->outputInterface = $this->getMock('Symfony\Component\Console\Output\OutputInterface'); |
||||
$this->userInterface = $this->getMock('\OCP\UserInterface'); |
||||
|
||||
$outputFormaterInterface = $this->getMock('Symfony\Component\Console\Formatter\OutputFormatterInterface'); |
||||
$this->outputInterface->expects($this->any())->method('getFormatter') |
||||
->willReturn($outputFormaterInterface); |
||||
|
||||
$this->changeKeyStorageRoot = new ChangeKeyStorageRoot( |
||||
$this->view, |
||||
$this->userManager, |
||||
$this->config, |
||||
$this->util, |
||||
$this->questionHelper |
||||
); |
||||
|
||||
} |
||||
|
||||
/** |
||||
* @dataProvider dataTestExecute |
||||
*/ |
||||
public function testExecute($newRoot, $answer, $successMoveKey) { |
||||
|
||||
$changeKeyStorageRoot = $this->getMockBuilder('OC\Core\Command\Encryption\ChangeKeyStorageRoot') |
||||
->setConstructorArgs( |
||||
[ |
||||
$this->view, |
||||
$this->userManager, |
||||
$this->config, |
||||
$this->util, |
||||
$this->questionHelper |
||||
] |
||||
)->setMethods(['moveAllKeys'])->getMock(); |
||||
|
||||
$this->util->expects($this->once())->method('getKeyStorageRoot') |
||||
->willReturn(''); |
||||
$this->inputInterface->expects($this->once())->method('getArgument') |
||||
->with('newRoot')->willReturn($newRoot); |
||||
|
||||
if ($answer === true || $newRoot !== null) { |
||||
$changeKeyStorageRoot->expects($this->once())->method('moveAllKeys') |
||||
->willReturn($successMoveKey); |
||||
} else { |
||||
$changeKeyStorageRoot->expects($this->never())->method('moveAllKeys'); |
||||
} |
||||
|
||||
if ($successMoveKey === true) { |
||||
$this->util->expects($this->once())->method('setKeyStorageRoot'); |
||||
} else { |
||||
$this->util->expects($this->never())->method('setKeyStorageRoot'); |
||||
} |
||||
|
||||
if ($newRoot === null) { |
||||
$this->questionHelper->expects($this->once())->method('ask')->willReturn($answer); |
||||
} else { |
||||
$this->questionHelper->expects($this->never())->method('ask'); |
||||
} |
||||
|
||||
$this->invokePrivate( |
||||
$changeKeyStorageRoot, |
||||
'execute', |
||||
[$this->inputInterface, $this->outputInterface] |
||||
); |
||||
} |
||||
|
||||
public function dataTestExecute() { |
||||
return [ |
||||
[null, true, true], |
||||
[null, true, false], |
||||
[null, false, null], |
||||
['/newRoot', null, true], |
||||
['/newRoot', null, false] |
||||
]; |
||||
} |
||||
|
||||
public function testMoveAllKeys() { |
||||
|
||||
/** @var \OC\Core\Command\Encryption\ChangeKeyStorageRoot $changeKeyStorageRoot */ |
||||
$changeKeyStorageRoot = $this->getMockBuilder('OC\Core\Command\Encryption\ChangeKeyStorageRoot') |
||||
->setConstructorArgs( |
||||
[ |
||||
$this->view, |
||||
$this->userManager, |
||||
$this->config, |
||||
$this->util, |
||||
$this->questionHelper |
||||
] |
||||
)->setMethods(['prepareNewRoot', 'moveSystemKeys', 'moveUserKeys'])->getMock(); |
||||
|
||||
$changeKeyStorageRoot->expects($this->at(0))->method('prepareNewRoot')->with('newRoot'); |
||||
$changeKeyStorageRoot->expects($this->at(1))->method('moveSystemKeys')->with('oldRoot', 'newRoot'); |
||||
$changeKeyStorageRoot->expects($this->at(2))->method('moveUserKeys')->with('oldRoot', 'newRoot', $this->outputInterface); |
||||
|
||||
$this->invokePrivate($changeKeyStorageRoot, 'moveAllKeys', ['oldRoot', 'newRoot', $this->outputInterface]); |
||||
|
||||
} |
||||
|
||||
public function testPrepareNewRoot() { |
||||
$this->view->expects($this->once())->method('is_dir')->with('newRoot') |
||||
->willReturn(true); |
||||
|
||||
$this->view->expects($this->once())->method('file_put_contents') |
||||
->with('newRoot/' . \OC\Encryption\Keys\Storage::KEY_STORAGE_MARKER, |
||||
'ownCloud will detect this folder as key storage root only if this file exists'); |
||||
|
||||
$this->invokePrivate($this->changeKeyStorageRoot, 'prepareNewRoot', ['newRoot']); |
||||
} |
||||
|
||||
/** |
||||
* @dataProvider dataTestPrepareNewRootException |
||||
* @expectedException \Exception |
||||
* |
||||
* @param bool $dirExists |
||||
* @param bool $couldCreateFile |
||||
*/ |
||||
public function testPrepareNewRootException($dirExists, $couldCreateFile) { |
||||
$this->view->expects($this->once())->method('is_dir')->with('newRoot') |
||||
->willReturn($dirExists); |
||||
$this->view->expects($this->any())->method('file_put_contents')->willReturn($couldCreateFile); |
||||
|
||||
$this->invokePrivate($this->changeKeyStorageRoot, 'prepareNewRoot', ['newRoot']); |
||||
} |
||||
|
||||
public function dataTestPrepareNewRootException() { |
||||
return [ |
||||
[true, false], |
||||
[false, true] |
||||
]; |
||||
} |
||||
|
||||
/** |
||||
* @dataProvider dataTestMoveSystemKeys |
||||
* |
||||
* @param bool $dirExists |
||||
* @param bool $targetExists |
||||
* @param bool $executeRename |
||||
*/ |
||||
public function testMoveSystemKeys($dirExists, $targetExists, $executeRename) { |
||||
|
||||
$changeKeyStorageRoot = $this->getMockBuilder('OC\Core\Command\Encryption\ChangeKeyStorageRoot') |
||||
->setConstructorArgs( |
||||
[ |
||||
$this->view, |
||||
$this->userManager, |
||||
$this->config, |
||||
$this->util, |
||||
$this->questionHelper |
||||
] |
||||
)->setMethods(['targetExists'])->getMock(); |
||||
|
||||
$this->view->expects($this->once())->method('is_dir') |
||||
->with('oldRoot/files_encryption')->willReturn($dirExists); |
||||
$changeKeyStorageRoot->expects($this->any())->method('targetExists') |
||||
->with('newRoot/files_encryption')->willReturn($targetExists); |
||||
|
||||
if ($executeRename) { |
||||
$this->view->expects($this->once())->method('rename') |
||||
->with('oldRoot/files_encryption', 'newRoot/files_encryption'); |
||||
} else { |
||||
$this->view->expects($this->never())->method('rename'); |
||||
} |
||||
|
||||
$this->invokePrivate($changeKeyStorageRoot, 'moveSystemKeys', ['oldRoot', 'newRoot']); |
||||
|
||||
} |
||||
|
||||
public function dataTestMoveSystemKeys() { |
||||
return [ |
||||
[true, false, true], |
||||
[false, true, false], |
||||
[true, true, false], |
||||
[false, false, false] |
||||
]; |
||||
} |
||||
|
||||
|
||||
public function testMoveUserKeys() { |
||||
|
||||
$changeKeyStorageRoot = $this->getMockBuilder('OC\Core\Command\Encryption\ChangeKeyStorageRoot') |
||||
->setConstructorArgs( |
||||
[ |
||||
$this->view, |
||||
$this->userManager, |
||||
$this->config, |
||||
$this->util, |
||||
$this->questionHelper |
||||
] |
||||
)->setMethods(['setupUserFS', 'moveUserEncryptionFolder'])->getMock(); |
||||
|
||||
$this->userManager->expects($this->once())->method('getBackends') |
||||
->willReturn([$this->userInterface]); |
||||
$this->userInterface->expects($this->once())->method('getUsers') |
||||
->willReturn(['user1', 'user2']); |
||||
$changeKeyStorageRoot->expects($this->exactly(2))->method('setupUserFS'); |
||||
$changeKeyStorageRoot->expects($this->exactly(2))->method('moveUserEncryptionFolder'); |
||||
|
||||
$this->invokePrivate($changeKeyStorageRoot, 'moveUserKeys', ['oldRoot', 'newRoot', $this->outputInterface]); |
||||
} |
||||
|
||||
/** |
||||
* @dataProvider dataTestMoveUserEncryptionFolder |
||||
* |
||||
* @param bool $userExists |
||||
* @param bool $isDir |
||||
* @param bool $targetExists |
||||
* @param bool $shouldRename |
||||
*/ |
||||
public function testMoveUserEncryptionFolder($userExists, $isDir, $targetExists, $shouldRename) { |
||||
|
||||
$changeKeyStorageRoot = $this->getMockBuilder('OC\Core\Command\Encryption\ChangeKeyStorageRoot') |
||||
->setConstructorArgs( |
||||
[ |
||||
$this->view, |
||||
$this->userManager, |
||||
$this->config, |
||||
$this->util, |
||||
$this->questionHelper |
||||
] |
||||
)->setMethods(['targetExists', 'prepareParentFolder'])->getMock(); |
||||
|
||||
$this->userManager->expects($this->once())->method('userExists') |
||||
->willReturn($userExists); |
||||
$this->view->expects($this->any())->method('is_dir') |
||||
->willReturn($isDir); |
||||
$changeKeyStorageRoot->expects($this->any())->method('targetExists') |
||||
->willReturn($targetExists); |
||||
|
||||
if ($shouldRename) { |
||||
$changeKeyStorageRoot->expects($this->once())->method('prepareParentFolder') |
||||
->with('newRoot/user1'); |
||||
$this->view->expects($this->once())->method('rename') |
||||
->with('oldRoot/user1/files_encryption', 'newRoot/user1/files_encryption'); |
||||
} else { |
||||
$changeKeyStorageRoot->expects($this->never())->method('prepareParentFolder'); |
||||
$this->view->expects($this->never())->method('rename'); |
||||
} |
||||
|
||||
$this->invokePrivate($changeKeyStorageRoot, 'moveUserEncryptionFolder', ['user1', 'oldRoot', 'newRoot']); |
||||
|
||||
} |
||||
|
||||
public function dataTestMoveUserEncryptionFolder() { |
||||
return [ |
||||
[true, true, false, true], |
||||
[true, false, true, false], |
||||
[false, true, true, false], |
||||
[false, false, true, false], |
||||
[false, true, false, false], |
||||
[false, true, true, false], |
||||
[false, false, false, false] |
||||
]; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* @dataProvider dataTestPrepareParentFolder |
||||
*/ |
||||
public function testPrepareParentFolder($path, $pathExists) { |
||||
$this->view->expects($this->any())->method('file_exists') |
||||
->willReturnCallback( |
||||
function($fileExistsPath) use ($path, $pathExists) { |
||||
if ($path === $fileExistsPath) { |
||||
return $pathExists; |
||||
} |
||||
return false; |
||||
} |
||||
); |
||||
|
||||
if ($pathExists === false) { |
||||
$subDirs = explode('/', ltrim($path, '/')); |
||||
$this->view->expects($this->exactly(count($subDirs)))->method('mkdir'); |
||||
} else { |
||||
$this->view->expects($this->never())->method('mkdir'); |
||||
} |
||||
|
||||
$this->invokePrivate( |
||||
$this->changeKeyStorageRoot, |
||||
'prepareParentFolder', |
||||
[$path] |
||||
); |
||||
} |
||||
|
||||
public function dataTestPrepareParentFolder() { |
||||
return [ |
||||
['/user/folder/sub_folder/keystorage', true], |
||||
['/user/folder/sub_folder/keystorage', false] |
||||
]; |
||||
} |
||||
|
||||
public function testTargetExists() { |
||||
$this->view->expects($this->once())->method('file_exists')->with('path') |
||||
->willReturn(false); |
||||
|
||||
$this->assertFalse( |
||||
$this->invokePrivate($this->changeKeyStorageRoot, 'targetExists', ['path']) |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* @expectedException \Exception |
||||
*/ |
||||
public function testTargetExistsException() { |
||||
$this->view->expects($this->once())->method('file_exists')->with('path') |
||||
->willReturn(true); |
||||
|
||||
$this->invokePrivate($this->changeKeyStorageRoot, 'targetExists', ['path']); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue