From 9a4040c7ca2c0e4fc3f213ba3f6144e80f687754 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 2 Jun 2015 12:27:30 +0200 Subject: Move the storage wrapping into a testable method --- lib/private/encryption/manager.php | 53 +++++++------------------------------- lib/private/encryption/util.php | 49 +++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 43 deletions(-) (limited to 'lib') diff --git a/lib/private/encryption/manager.php b/lib/private/encryption/manager.php index ecbb86993ec..eeddea26b1a 100644 --- a/lib/private/encryption/manager.php +++ b/lib/private/encryption/manager.php @@ -208,49 +208,16 @@ class Manager implements IManager { return $this->config->getAppValue('core', 'default_encryption_module'); } + /** + * Add storage wrapper + */ public static function setupStorage() { - \OC\Files\Filesystem::addStorageWrapper('oc_encryption', function ($mountPoint, $storage, IMountPoint $mount) { - $parameters = [ - 'storage' => $storage, - 'mountPoint' => $mountPoint, - 'mount' => $mount]; - - if (!($storage instanceof Shared)) { - $manager = \OC::$server->getEncryptionManager(); - $util = new Util( - new View(), - \OC::$server->getUserManager(), - \OC::$server->getGroupManager(), - \OC::$server->getConfig() - ); - $user = \OC::$server->getUserSession()->getUser(); - $logger = \OC::$server->getLogger(); - $mountManager = Filesystem::getMountManager(); - $uid = $user ? $user->getUID() : null; - $fileHelper = \OC::$server->getEncryptionFilesHelper(); - $keyStorage = \OC::$server->getEncryptionKeyStorage(); - $update = new Update( - new View(), - $util, - Filesystem::getMountManager(), - $manager, - $fileHelper, - $uid - ); - return new Encryption( - $parameters, - $manager, - $util, - $logger, - $fileHelper, - $uid, - $keyStorage, - $update, - $mountManager - ); - } else { - return $storage; - } - }, 2); + $util = new Util( + new View(), + \OC::$server->getUserManager(), + \OC::$server->getGroupManager(), + \OC::$server->getConfig() + ); + \OC\Files\Filesystem::addStorageWrapper('oc_encryption', array($util, 'wrapStorage'), 2); } } diff --git a/lib/private/encryption/util.php b/lib/private/encryption/util.php index b77672d2f6b..d233b715f88 100644 --- a/lib/private/encryption/util.php +++ b/lib/private/encryption/util.php @@ -26,8 +26,12 @@ use OC\Encryption\Exceptions\EncryptionHeaderKeyExistsException; use OC\Encryption\Exceptions\EncryptionHeaderToLargeException; use OC\Encryption\Exceptions\ModuleDoesNotExistsException; use OC\Files\Filesystem; +use OC\Files\Storage\Shared; +use OC\Files\Storage\Wrapper\Encryption; use OC\Files\View; use OCP\Encryption\IEncryptionModule; +use OCP\Files\Mount\IMountPoint; +use OCP\Files\Storage; use OCP\IConfig; class Util { @@ -386,4 +390,49 @@ class Util { return ($enabled === '1') ? true : false; } + /** + * Wraps the given storage when it is not a shared storage + * + * @param string $mountPoint + * @param Storage $storage + * @param IMountPoint $mount + * @return Encryption|Storage + */ + public function wrapStorage($mountPoint, Storage $storage, IMountPoint $mount) { + $parameters = [ + 'storage' => $storage, + 'mountPoint' => $mountPoint, + 'mount' => $mount]; + + if (!($storage instanceof Shared)) { + $manager = \OC::$server->getEncryptionManager(); + $user = \OC::$server->getUserSession()->getUser(); + $logger = \OC::$server->getLogger(); + $mountManager = Filesystem::getMountManager(); + $uid = $user ? $user->getUID() : null; + $fileHelper = \OC::$server->getEncryptionFilesHelper(); + $keyStorage = \OC::$server->getEncryptionKeyStorage(); + $update = new Update( + new View(), + $this, + Filesystem::getMountManager(), + $manager, + $fileHelper, + $uid + ); + return new Encryption( + $parameters, + $manager, + $this, + $logger, + $fileHelper, + $uid, + $keyStorage, + $update, + $mountManager + ); + } else { + return $storage; + } + } } -- cgit v1.2.3 From 50a31fa8f905c3f9483137bc7b1e57cbf950d2c2 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 2 Jun 2015 12:33:17 +0200 Subject: Add unit tests for wrapStorage --- lib/private/encryption/util.php | 3 +-- tests/lib/encryption/utiltest.php | 45 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/private/encryption/util.php b/lib/private/encryption/util.php index d233b715f88..16c09cd26b3 100644 --- a/lib/private/encryption/util.php +++ b/lib/private/encryption/util.php @@ -26,7 +26,6 @@ use OC\Encryption\Exceptions\EncryptionHeaderKeyExistsException; use OC\Encryption\Exceptions\EncryptionHeaderToLargeException; use OC\Encryption\Exceptions\ModuleDoesNotExistsException; use OC\Files\Filesystem; -use OC\Files\Storage\Shared; use OC\Files\Storage\Wrapper\Encryption; use OC\Files\View; use OCP\Encryption\IEncryptionModule; @@ -404,7 +403,7 @@ class Util { 'mountPoint' => $mountPoint, 'mount' => $mount]; - if (!($storage instanceof Shared)) { + if (!$storage->instanceOfStorage('OC\Files\Storage\Shared')) { $manager = \OC::$server->getEncryptionManager(); $user = \OC::$server->getUserSession()->getUser(); $logger = \OC::$server->getLogger(); diff --git a/tests/lib/encryption/utiltest.php b/tests/lib/encryption/utiltest.php index d3a4e211daa..d5f5ce4c2e9 100644 --- a/tests/lib/encryption/utiltest.php +++ b/tests/lib/encryption/utiltest.php @@ -194,4 +194,49 @@ class UtilTest extends TestCase { ); } + /** + * @dataProvider provideWrapStorage + */ + public function testWrapStorage($expectedWrapped, $wrappedStorages) { + $storage = $this->getMockBuilder('OC\Files\Storage\Storage') + ->disableOriginalConstructor() + ->getMock(); + + foreach ($wrappedStorages as $wrapper) { + $storage->expects($this->any()) + ->method('instanceOfStorage') + ->willReturnMap([ + [$wrapper, true], + ]); + } + + $mount = $this->getMockBuilder('OCP\Files\Mount\IMountPoint') + ->disableOriginalConstructor() + ->getMock(); + + $returnedStorage = $this->util->wrapStorage('mountPoint', $storage, $mount); + + $this->assertEquals( + $expectedWrapped, + $returnedStorage->instanceOfStorage('OC\Files\Storage\Wrapper\Encryption'), + 'Asserted that the storage is (not) wrapped with encryption' + ); + } + + public function provideWrapStorage() { + return [ + // Wrap when not wrapped or not wrapped with storage + [true, []], + [true, ['OCA\Files_Trashbin\Storage']], + + // Do not wrap shared storages + [false, ['OC\Files\Storage\Shared']], + [false, ['OCA\Files_Sharing\External\Storage']], + [false, ['OC\Files\Storage\OwnCloud']], + [false, ['OC\Files\Storage\Shared', 'OCA\Files_Sharing\External\Storage']], + [false, ['OC\Files\Storage\Shared', 'OC\Files\Storage\OwnCloud']], + [false, ['OCA\Files_Sharing\External\Storage', 'OC\Files\Storage\OwnCloud']], + [false, ['OC\Files\Storage\Shared', 'OCA\Files_Sharing\External\Storage', 'OC\Files\Storage\OwnCloud']], + ]; + } } -- cgit v1.2.3 From be1f319511b3faaf4552ec68a6697b4dda1f5c6c Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 2 Jun 2015 12:33:51 +0200 Subject: Correctly ignore remote shares aswell --- lib/private/encryption/util.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/private/encryption/util.php b/lib/private/encryption/util.php index 16c09cd26b3..80499249561 100644 --- a/lib/private/encryption/util.php +++ b/lib/private/encryption/util.php @@ -403,7 +403,10 @@ class Util { 'mountPoint' => $mountPoint, 'mount' => $mount]; - if (!$storage->instanceOfStorage('OC\Files\Storage\Shared')) { + if (!$storage->instanceOfStorage('OC\Files\Storage\Shared') + && !$storage->instanceOfStorage('OCA\Files_Sharing\External\Storage') + && !$storage->instanceOfStorage('OC\Files\Storage\OwnCloud')) { + $manager = \OC::$server->getEncryptionManager(); $user = \OC::$server->getUserSession()->getUser(); $logger = \OC::$server->getLogger(); -- cgit v1.2.3