]> source.dussan.org Git - nextcloud-server.git/commitdiff
always create a new instance of the encryption module
authorBjoern Schiessle <schiessle@owncloud.com>
Tue, 14 Apr 2015 14:48:39 +0000 (16:48 +0200)
committerBjoern Schiessle <schiessle@owncloud.com>
Fri, 17 Apr 2015 08:31:33 +0000 (10:31 +0200)
apps/encryption/appinfo/application.php
apps/encryption/lib/crypto/encryption.php
lib/private/encryption/manager.php
lib/public/encryption/imanager.php
settings/admin.php
tests/lib/encryption/managertest.php

index dbeb1171bd81f3db42f7092922d6854cf01fd07d..5d0fe2c9184e2ad216c30dddf96801ca10897e07 100644 (file)
@@ -27,6 +27,7 @@ namespace OCA\Encryption\AppInfo;
 use OC\Files\Filesystem;
 use OC\Files\View;
 use OCA\Encryption\Crypto\Crypt;
+use OCA\Encryption\Crypto\Encryption;
 use OCA\Encryption\HookManager;
 use OCA\Encryption\Hooks\UserHooks;
 use OCA\Encryption\KeyManager;
@@ -90,14 +91,17 @@ class Application extends \OCP\AppFramework\App {
 
        public function registerEncryptionModule() {
                $container = $this->getContainer();
-               $container->registerService('EncryptionModule', function (IAppContainer $c) {
-                       return new \OCA\Encryption\Crypto\Encryption(
-                               $c->query('Crypt'),
-                               $c->query('KeyManager'),
-                               $c->query('Util'));
+
+               $this->encryptionManager->registerEncryptionModule(
+                       Encryption::ID,
+                       Encryption::DISPLAY_NAME,
+                       function() use ($container) {
+                       return new Encryption(
+                               $container->query('Crypt'),
+                               $container->query('KeyManager'),
+                               $container->query('Util')
+                       );
                });
-               $module = $container->query('EncryptionModule');
-               $this->encryptionManager->registerEncryptionModule($module);
        }
 
        public function registerServices() {
index fd5a84c9734fcb83e753636c1475b7242d3e22a7..8498b4223e16aa804a6d20daee820658ebc8f33d 100644 (file)
@@ -32,6 +32,7 @@ use OCA\Encryption\KeyManager;
 class Encryption implements IEncryptionModule {
 
        const ID = 'OC_DEFAULT_MODULE';
+       const DISPLAY_NAME = 'ownCloud Default Encryption';
 
        /**
         * @var Crypt
@@ -90,7 +91,7 @@ class Encryption implements IEncryptionModule {
         * @return string
         */
        public function getDisplayName() {
-               return 'ownCloud Default Encryption';
+               return self::DISPLAY_NAME;
        }
 
        /**
index 89abad4934a33dc115cb6cb26b576cdfaafa7d4e..e01054c92a4251e87fbe2b53a9fdd47bbbd6b429 100644 (file)
@@ -87,17 +87,17 @@ class Manager implements IManager {
        }
 
        /**
-        * Registers an encryption module
+        * Registers an callback function which must return an encryption module instance
         *
-        * @param IEncryptionModule $module
+        * @param string $id
+        * @param string $displayName
+        * @param callable $callback
         * @throws Exceptions\ModuleAlreadyExistsException
         */
-       public function registerEncryptionModule(IEncryptionModule $module) {
-               $id = $module->getId();
-               $name = $module->getDisplayName();
+       public function registerEncryptionModule($id, $displayName, callable $callback) {
 
                if (isset($this->encryptionModules[$id])) {
-                       throw new Exceptions\ModuleAlreadyExistsException($id, $name);
+                       throw new Exceptions\ModuleAlreadyExistsException($id, $displayName);
                }
 
                $defaultEncryptionModuleId = $this->getDefaultEncryptionModuleId();
@@ -106,22 +106,26 @@ class Manager implements IManager {
                        $this->setDefaultEncryptionModule($id);
                }
 
-               $this->encryptionModules[$id] = $module;
+               $this->encryptionModules[$id] = array(
+                       'id' => $id,
+                       'displayName' => 'displayName',
+                       'callback' => $callback
+               );
        }
 
        /**
         * Unregisters an encryption module
         *
-        * @param IEncryptionModule $module
+        * @param string $moduleId
         */
-       public function unregisterEncryptionModule(IEncryptionModule $module) {
-               unset($this->encryptionModules[$module->getId()]);
+       public function unregisterEncryptionModule($moduleId) {
+               unset($this->encryptionModules[$moduleId]);
        }
 
        /**
         * get a list of all encryption modules
         *
-        * @return IEncryptionModule[]
+        * @return array [id => ['id' => $id, 'displayName' => $displayName, 'callback' => callback]]
         */
        public function getEncryptionModules() {
                return $this->encryptionModules;
@@ -137,21 +141,13 @@ class Manager implements IManager {
        public function getEncryptionModule($moduleId = '') {
                if (!empty($moduleId)) {
                        if (isset($this->encryptionModules[$moduleId])) {
-                               return $this->encryptionModules[$moduleId];
+                               return call_user_func($this->encryptionModules[$moduleId]['callback']);
                        } else {
                                $message = "Module with id: $moduleId does not exists.";
                                throw new Exceptions\ModuleDoesNotExistsException($message);
                        }
-               } else { // get default module and return this
-                                // For now we simply return the first module until we have a way
-                    // to enable multiple modules and define a default module
-                       $module = reset($this->encryptionModules);
-                       if ($module) {
-                               return $module;
-                       } else {
-                               $message = 'No encryption module registered';
-                               throw new Exceptions\ModuleDoesNotExistsException($message);
-                       }
+               } else {
+                       return $this->getDefaultEncryptionModule();
                }
        }
 
@@ -165,7 +161,7 @@ class Manager implements IManager {
                $defaultModuleId = $this->getDefaultEncryptionModuleId();
                if (!empty($defaultModuleId)) {
                        if (isset($this->encryptionModules[$defaultModuleId])) {
-                               return $this->encryptionModules[$defaultModuleId];
+                               return call_user_func($this->encryptionModules[$defaultModuleId]['callback']);
                        } else {
                                $message = 'Default encryption module not loaded';
                                throw new Exceptions\ModuleDoesNotExistsException($message);
index badc91c9023dda9cbd6a23a2e14589e81ab28f63..3a37071078178d5a649a08ab0373b334916570fc 100644 (file)
@@ -40,26 +40,28 @@ interface IManager {
        function isEnabled();
 
        /**
-        * Registers an encryption module
+        * Registers an callback function which must return an encryption module instance
         *
-        * @param IEncryptionModule $module
+        * @param string $id
+        * @param string $displayName
+        * @param callable $callback
         * @throws ModuleAlreadyExistsException
         * @since 8.1.0
         */
-       function registerEncryptionModule(IEncryptionModule $module);
+       function registerEncryptionModule($id, $displayName, callable $callback);
 
        /**
         * Unregisters an encryption module
         *
-        * @param IEncryptionModule $module
+        * @param string $moduleId
         * @since 8.1.0
         */
-       function unregisterEncryptionModule(IEncryptionModule $module);
+       function unregisterEncryptionModule($moduleId);
 
        /**
         * get a list of all encryption modules
         *
-        * @return array
+        * @return array [id => ['id' => $id, 'displayName' => $displayName, 'callback' => callback]]
         * @since 8.1.0
         */
        function getEncryptionModules();
index 5cfe2654f66c5eb21e5ab3dd4bdcab2aafd0ee5a..08b114b6d9e2ba67bf8a347ca00422ad45585de5 100644 (file)
@@ -96,10 +96,10 @@ try {
 }
 $encModulues = array();
 foreach ($encryptionModules as $module) {
-       $encModulues[$module->getId()]['displayName'] = $module->getDisplayName();
-       $encModulues[$module->getId()]['default'] = false;
-       if ($defaultEncryptionModule && $module->getId() === $defaultEncryptionModuleId) {
-               $encModulues[$module->getId()]['default'] = true;
+       $encModulues[$module['id']]['displayName'] = $module['displayName'];
+       $encModulues[$module['id']]['default'] = false;
+       if ($defaultEncryptionModule && $module['id'] === $defaultEncryptionModuleId) {
+               $encModulues[$module['id']]['default'] = true;
        }
 }
 $template->assign('encryptionModules', $encModulues);
index f123f438311b575a9b25af2a76c6aafea5dec015..13f5d47b0834ad5b0b26a6602a48ac9e7dc4b092 100644 (file)
@@ -36,9 +36,9 @@ class ManagerTest extends TestCase {
        public function testManagerIsDisabledIfDisabledButModules() {
                $this->config->expects($this->any())->method('getAppValue')->willReturn(false);
                $em = $this->getMock('\OCP\Encryption\IEncryptionModule');
-               $em->expects($this->any())->method('getId')->willReturn(0);
+               $em->expects($this->any())->method('getId')->willReturn('id');
                $em->expects($this->any())->method('getDisplayName')->willReturn('TestDummyModule0');
-               $this->manager->registerEncryptionModule($em);
+               $this->manager->registerEncryptionModule('id', 'TestDummyModule0', function() use ($em) {return $em;});
                $this->assertFalse($this->manager->isEnabled());
        }
 
@@ -50,29 +50,32 @@ class ManagerTest extends TestCase {
 
        /**
         * @expectedException \OC\Encryption\Exceptions\ModuleAlreadyExistsException
-        * @expectedExceptionMessage Id "0" already used by encryption module "TestDummyModule0"
+        * @expectedExceptionMessage Id "id" already used by encryption module "TestDummyModule0"
         */
        public function testModuleRegistration() {
                $this->config->expects($this->any())->method('getAppValue')->willReturn('yes');
                $em = $this->getMock('\OCP\Encryption\IEncryptionModule');
-               $em->expects($this->any())->method('getId')->willReturn(0);
+               $em->expects($this->any())->method('getId')->willReturn('id');
                $em->expects($this->any())->method('getDisplayName')->willReturn('TestDummyModule0');
-               $this->manager->registerEncryptionModule($em);
+
+               $this->manager->registerEncryptionModule('id', 'TestDummyModule0', function () use ($em) { return $em;});
                $this->assertSame(1, count($this->manager->getEncryptionModules()));
-               $this->manager->registerEncryptionModule($em);
+               $this->manager->registerEncryptionModule('id', 'TestDummyModule0', function () use ($em) { return $em;});
        }
 
        public function testModuleUnRegistration() {
                $this->config->expects($this->any())->method('getAppValue')->willReturn(true);
                $em = $this->getMock('\OCP\Encryption\IEncryptionModule');
-               $em->expects($this->any())->method('getId')->willReturn(0);
+               $em->expects($this->any())->method('getId')->willReturn('id');
                $em->expects($this->any())->method('getDisplayName')->willReturn('TestDummyModule0');
-               $this->manager->registerEncryptionModule($em);
+               $this->manager->registerEncryptionModule('id', 'TestDummyModule0', function () use ($em) { return $em;});
                $this->assertSame(1,
                        count($this->manager->getEncryptionModules())
                );
-               $this->manager->unregisterEncryptionModule($em);
+
+               $this->manager->unregisterEncryptionModule('id');
                $this->assertEmpty($this->manager->getEncryptionModules());
+
        }
 
        /**
@@ -82,9 +85,9 @@ class ManagerTest extends TestCase {
        public function testGetEncryptionModuleUnknown() {
                $this->config->expects($this->any())->method('getAppValue')->willReturn(true);
                $em = $this->getMock('\OCP\Encryption\IEncryptionModule');
-               $em->expects($this->any())->method('getId')->willReturn(0);
+               $em->expects($this->any())->method('getId')->willReturn('id');
                $em->expects($this->any())->method('getDisplayName')->willReturn('TestDummyModule0');
-               $this->manager->registerEncryptionModule($em);
+               $this->manager->registerEncryptionModule('id', 'TestDummyModule0', function () use ($em) { return $em;});
                $this->assertSame(1, count($this->manager->getEncryptionModules()));
                $this->manager->getEncryptionModule('unknown');
        }
@@ -92,23 +95,23 @@ class ManagerTest extends TestCase {
        public function testGetEncryptionModule() {
                $this->config->expects($this->any())->method('getAppValue')->willReturn(true);
                $em = $this->getMock('\OCP\Encryption\IEncryptionModule');
-               $em->expects($this->any())->method('getId')->willReturn(0);
+               $em->expects($this->any())->method('getId')->willReturn('id');
                $em->expects($this->any())->method('getDisplayName')->willReturn('TestDummyModule0');
-               $this->manager->registerEncryptionModule($em);
+               $this->manager->registerEncryptionModule('id', 'TestDummyModule0', function () use ($em) { return $em;});
                $this->assertSame(1, count($this->manager->getEncryptionModules()));
-               $en0 = $this->manager->getEncryptionModule(0);
-               $this->assertEquals(0, $en0->getId());
+               $en0 = $this->manager->getEncryptionModule('id');
+               $this->assertEquals('id', $en0->getId());
        }
 
        public function testGetDefaultEncryptionModule() {
                $this->config->expects($this->any())->method('getAppValue')->willReturn(true);
                $em = $this->getMock('\OCP\Encryption\IEncryptionModule');
-               $em->expects($this->any())->method('getId')->willReturn(0);
+               $em->expects($this->any())->method('getId')->willReturn('id');
                $em->expects($this->any())->method('getDisplayName')->willReturn('TestDummyModule0');
-               $this->manager->registerEncryptionModule($em);
+               $this->manager->registerEncryptionModule('id', 'TestDummyModule0', function () use ($em) { return $em;});
                $this->assertSame(1, count($this->manager->getEncryptionModules()));
-               $en0 = $this->manager->getEncryptionModule(0);
-               $this->assertEquals(0, $en0->getId());
+               $en0 = $this->manager->getEncryptionModule('id');
+               $this->assertEquals('id', $en0->getId());
        }
 
 //     /**