[Pkg-owncloud-commits] [owncloud] 11/165: add migration script from old encryption to new one
David Prévot
taffit at moszumanska.debian.org
Thu Apr 23 04:06:15 UTC 2015
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch stable8
in repository owncloud.
commit e3d77c4b0181e2219f30f720ac7077b334210f5d
Author: Bjoern Schiessle <schiessle at owncloud.com>
Date: Tue Apr 7 18:05:54 2015 +0200
add migration script from old encryption to new one
---
apps/encryption/appinfo/app.php | 8 +-
apps/encryption/appinfo/application.php | 13 +-
apps/encryption/appinfo/info.xml | 2 +-
apps/encryption/appinfo/register_command.php | 15 +
apps/encryption/command/migratekeys.php | 105 +++++++
apps/encryption/lib/migration.php | 319 ++++++++++++++++++++
apps/encryption/tests/lib/MigrationTest.php | 356 +++++++++++++++++++++++
lib/private/encryption/manager.php | 42 ++-
lib/private/encryption/util.php | 10 +
lib/private/files/storage/wrapper/encryption.php | 11 +-
lib/private/server.php | 2 +-
settings/admin.php | 1 +
settings/templates/admin.php | 9 +-
tests/lib/encryption/managertest.php | 95 +++---
14 files changed, 915 insertions(+), 73 deletions(-)
diff --git a/apps/encryption/appinfo/app.php b/apps/encryption/appinfo/app.php
index 6bbf211..0e8ce56 100644
--- a/apps/encryption/appinfo/app.php
+++ b/apps/encryption/appinfo/app.php
@@ -24,6 +24,8 @@
namespace OCA\Encryption\AppInfo;
$app = new Application();
-$app->registerEncryptionModule();
-$app->registerHooks();
-$app->registerSettings();
+if (\OC::$server->getEncryptionManager()->isReady()) {
+ $app->registerEncryptionModule();
+ $app->registerHooks();
+ $app->registerSettings();
+}
diff --git a/apps/encryption/appinfo/application.php b/apps/encryption/appinfo/application.php
index 34845ec..6b67b6d 100644
--- a/apps/encryption/appinfo/application.php
+++ b/apps/encryption/appinfo/application.php
@@ -40,13 +40,10 @@ use OCP\IConfig;
class Application extends \OCP\AppFramework\App {
- /**
- * @var IManager
- */
+
+ /** @var IManager */
private $encryptionManager;
- /**
- * @var IConfig
- */
+ /** @var IConfig */
private $config;
/**
@@ -59,6 +56,10 @@ class Application extends \OCP\AppFramework\App {
$this->registerServices();
}
+ /**
+ * register hooks
+ */
+
public function registerHooks() {
if (!$this->config->getSystemValue('maintenance', false)) {
diff --git a/apps/encryption/appinfo/info.xml b/apps/encryption/appinfo/info.xml
index e4a7d79..53a2459 100644
--- a/apps/encryption/appinfo/info.xml
+++ b/apps/encryption/appinfo/info.xml
@@ -16,7 +16,7 @@
based on AES 128 or 256 bit keys. More information is available in
the Encryption documentation
</description>
-<name>Encryption</name>
+ <name>ownCloud Default Encryption Module</name>
<license>AGPL</license>
<author>Bjoern Schiessle, Clark Tomlinson</author>
<requiremin>8</requiremin>
diff --git a/apps/encryption/appinfo/register_command.php b/apps/encryption/appinfo/register_command.php
new file mode 100644
index 0000000..8a9df8e
--- /dev/null
+++ b/apps/encryption/appinfo/register_command.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Copyright (c) 2015 Thomas Müller <deepdiver at owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+use OCA\Encryption\Command\MigrateKeys;
+
+$userManager = OC::$server->getUserManager();
+$view = new \OC\Files\View();
+$config = \OC::$server->getConfig();
+$connection = \OC::$server->getDatabaseConnection();
+$application->add(new MigrateKeys($userManager, $view, $connection, $config));
diff --git a/apps/encryption/command/migratekeys.php b/apps/encryption/command/migratekeys.php
new file mode 100644
index 0000000..b814d69
--- /dev/null
+++ b/apps/encryption/command/migratekeys.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * Copyright (c) 2015 Thomas Müller <thomas.mueller at tmit.eu>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCA\Encryption\Command;
+
+use OC\DB\Connection;
+use OC\Files\View;
+use OC\User\Manager;
+use OCA\Encryption\Migration;
+use OCP\IConfig;
+use OCP\IUserBackend;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class MigrateKeys extends Command {
+
+ /** @var \OC\User\Manager */
+ private $userManager;
+
+ /** @var View */
+ private $view;
+ /** @var \OC\DB\Connection */
+ private $connection;
+ /** @var IConfig */
+ private $config;
+
+ /**
+ * @param Manager $userManager
+ * @param View $view
+ * @param Connection $connection
+ * @param IConfig $config
+ */
+ public function __construct(Manager $userManager,
+ View $view,
+ Connection $connection,
+ IConfig $config) {
+
+ $this->userManager = $userManager;
+ $this->view = $view;
+ $this->connection = $connection;
+ $this->config = $config;
+ parent::__construct();
+ }
+
+ protected function configure() {
+ $this
+ ->setName('encryption:migrate')
+ ->setDescription('initial migration to encryption 2.0')
+ ->addArgument(
+ 'user_id',
+ InputArgument::OPTIONAL | InputArgument::IS_ARRAY,
+ 'will migrate keys of the given user(s)'
+ );
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+
+ // perform system reorganization
+ $migration = new Migration($this->config, $this->view, $this->connection);
+
+ $users = $input->getArgument('user_id');
+ if (!empty($users)) {
+ foreach ($users as $user) {
+ if ($this->userManager->userExists($user)) {
+ $output->writeln("Migrating keys <info>$user</info>");
+ $migration->reorganizeFolderStructureForUser($user);
+ } else {
+ $output->writeln("<error>Unknown user $user</error>");
+ }
+ }
+ } else {
+ $output->writeln("Reorganize system folder structure");
+ $migration->reorganizeSystemFolderStructure();
+ $migration->updateDB();
+ foreach($this->userManager->getBackends() as $backend) {
+ $name = get_class($backend);
+
+ if ($backend instanceof IUserBackend) {
+ $name = $backend->getBackendName();
+ }
+
+ $output->writeln("Migrating keys for users on backend <info>$name</info>");
+
+ $limit = 500;
+ $offset = 0;
+ do {
+ $users = $backend->getUsers('', $limit, $offset);
+ foreach ($users as $user) {
+ $output->writeln(" <info>$user</info>");
+ $migration->reorganizeFolderStructureForUser($user);
+ }
+ $offset += $limit;
+ } while(count($users) >= $limit);
+ }
+ }
+
+ }
+}
diff --git a/apps/encryption/lib/migration.php b/apps/encryption/lib/migration.php
new file mode 100644
index 0000000..e4e5595
--- /dev/null
+++ b/apps/encryption/lib/migration.php
@@ -0,0 +1,319 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @copyright (C) 2015 ownCloud, Inc.
+ *
+ * @author Bjoern Schiessle <schiessle at owncloud.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library 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 along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Encryption;
+
+
+use OC\DB\Connection;
+use OC\Files\View;
+use OCP\IConfig;
+
+class Migration {
+
+ private $moduleId;
+ /** @var \OC\Files\View */
+ private $view;
+ /** @var \OC\DB\Connection */
+ private $connection;
+ /** @var IConfig */
+ private $config;
+
+ /**
+ * @param IConfig $config
+ * @param View $view
+ * @param Connection $connection
+ */
+ public function __construct(IConfig $config, View $view, Connection $connection) {
+ $this->view = $view;
+ $this->view->getUpdater()->disable();
+ $this->connection = $connection;
+ $this->moduleId = \OCA\Encryption\Crypto\Encryption::ID;
+ $this->config = $config;
+ }
+
+ public function __destruct() {
+ $this->view->deleteAll('files_encryption/public_keys');
+ $this->updateFileCache();
+ }
+
+ /**
+ * update file cache, copy unencrypted_size to the 'size' column
+ */
+ private function updateFileCache() {
+ $query = $this->connection->createQueryBuilder();
+ $query->update('`*PREFIX*filecache`')
+ ->set('`size`', '`unencrypted_size`')
+ ->where($query->expr()->eq('`encrypted`', ':encrypted'))
+ ->setParameter('encrypted', 1);
+ $query->execute();
+ }
+
+ /**
+ * iterate through users and reorganize the folder structure
+ */
+ public function reorganizeFolderStructure() {
+ $this->reorganizeSystemFolderStructure();
+
+ $limit = 500;
+ $offset = 0;
+ do {
+ $users = \OCP\User::getUsers('', $limit, $offset);
+ foreach ($users as $user) {
+ $this->reorganizeFolderStructureForUser($user);
+ }
+ $offset += $limit;
+ } while (count($users) >= $limit);
+ }
+
+ /**
+ * reorganize system wide folder structure
+ */
+ public function reorganizeSystemFolderStructure() {
+
+ $this->createPathForKeys('/files_encryption');
+
+ // backup system wide folders
+ $this->backupSystemWideKeys();
+
+ // rename system wide mount point
+ $this->renameFileKeys('', '/files_encryption/keys');
+
+ // rename system private keys
+ $this->renameSystemPrivateKeys();
+
+ $storage = $this->view->getMount('')->getStorage();
+ $storage->getScanner()->scan('files_encryption');
+ }
+
+
+ /**
+ * reorganize folder structure for user
+ *
+ * @param string $user
+ */
+ public function reorganizeFolderStructureForUser($user) {
+ // backup all keys
+ \OC_Util::tearDownFS();
+ \OC_Util::setupFS($user);
+ if ($this->backupUserKeys($user)) {
+ // rename users private key
+ $this->renameUsersPrivateKey($user);
+ $this->renameUsersPublicKey($user);
+ // rename file keys
+ $path = '/files_encryption/keys';
+ $this->renameFileKeys($user, $path);
+ $trashPath = '/files_trashbin/keys';
+ if (\OC_App::isEnabled('files_trashbin') && $this->view->is_dir($user . '/' . $trashPath)) {
+ $this->renameFileKeys($user, $trashPath, true);
+ $this->view->deleteAll($trashPath);
+ }
+ // delete old folders
+ $this->deleteOldKeys($user);
+ $this->view->getMount('/' . $user)->getStorage()->getScanner()->scan('files_encryption');
+ }
+ }
+
+ /**
+ * update database
+ */
+ public function updateDB() {
+
+ // delete left-over from old encryption which is no longer needed
+ $this->config->deleteAppValue('files_encryption', 'installed_version');
+ $this->config->deleteAppValue('files_encryption', 'ocsid');
+ $this->config->deleteAppValue('files_encryption', 'types');
+ $this->config->deleteAppValue('files_encryption', 'enabled');
+
+
+ $query = $this->connection->createQueryBuilder();
+ $query->update('`*PREFIX*appconfig`')
+ ->set('`appid`', ':newappid')
+ ->where($query->expr()->eq('`appid`', ':oldappid'))
+ ->setParameter('oldappid', 'files_encryption')
+ ->setParameter('newappid', 'encryption');
+ $query->execute();
+
+ $query = $this->connection->createQueryBuilder();
+ $query->update('`*PREFIX*preferences`')
+ ->set('`appid`', ':newappid')
+ ->where($query->expr()->eq('`appid`', ':oldappid'))
+ ->setParameter('oldappid', 'files_encryption')
+ ->setParameter('newappid', 'encryption');
+ $query->execute();
+ }
+
+ /**
+ * create backup of system-wide keys
+ */
+ private function backupSystemWideKeys() {
+ $backupDir = 'encryption_migration_backup_' . date("Y-m-d_H-i-s");
+ $this->view->mkdir($backupDir);
+ $this->view->copy('files_encryption', $backupDir . '/files_encryption');
+ }
+
+ /**
+ * create backup of user specific keys
+ *
+ * @param string $user
+ * @return bool
+ */
+ private function backupUserKeys($user) {
+ $encryptionDir = $user . '/files_encryption';
+ if ($this->view->is_dir($encryptionDir)) {
+ $backupDir = $user . '/encryption_migration_backup_' . date("Y-m-d_H-i-s");
+ $this->view->mkdir($backupDir);
+ $this->view->copy($encryptionDir, $backupDir);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * rename system-wide private keys
+ */
+ private function renameSystemPrivateKeys() {
+ $dh = $this->view->opendir('files_encryption');
+ $this->createPathForKeys('/files_encryption/' . $this->moduleId );
+ if (is_resource($dh)) {
+ while (($privateKey = readdir($dh)) !== false) {
+ if (!\OC\Files\Filesystem::isIgnoredDir($privateKey) ) {
+ if (!$this->view->is_dir('/files_encryption/' . $privateKey)) {
+ $this->view->rename('files_encryption/' . $privateKey, 'files_encryption/' . $this->moduleId . '/' . $privateKey);
+ $this->renameSystemPublicKey($privateKey);
+ }
+ }
+ }
+ closedir($dh);
+ }
+ }
+
+ /**
+ * rename system wide public key
+ *
+ * @param $privateKey private key for which we want to rename the corresponding public key
+ */
+ private function renameSystemPublicKey($privateKey) {
+ $publicKey = substr($privateKey,0 , strrpos($privateKey, '.privateKey')) . '.publicKey';
+ $this->view->rename('files_encryption/public_keys/' . $publicKey, 'files_encryption/' . $this->moduleId . '/' . $publicKey);
+ }
+
+ /**
+ * rename user-specific private keys
+ *
+ * @param string $user
+ */
+ private function renameUsersPrivateKey($user) {
+ $oldPrivateKey = $user . '/files_encryption/' . $user . '.privateKey';
+ $newPrivateKey = $user . '/files_encryption/' . $this->moduleId . '/' . $user . '.privateKey';
+ $this->createPathForKeys(dirname($newPrivateKey));
+
+ $this->view->rename($oldPrivateKey, $newPrivateKey);
+ }
+
+ /**
+ * rename user-specific public keys
+ *
+ * @param string $user
+ */
+ private function renameUsersPublicKey($user) {
+ $oldPublicKey = '/files_encryption/public_keys/' . $user . '.publicKey';
+ $newPublicKey = $user . '/files_encryption/' . $this->moduleId . '/' . $user . '.publicKey';
+ $this->createPathForKeys(dirname($newPublicKey));
+
+ $this->view->rename($oldPublicKey, $newPublicKey);
+ }
+
+ /**
+ * rename file keys
+ *
+ * @param string $user
+ * @param string $path
+ * @param bool $trash
+ */
+ private function renameFileKeys($user, $path, $trash = false) {
+
+ $dh = $this->view->opendir($user . '/' . $path);
+
+ if (is_resource($dh)) {
+ while (($file = readdir($dh)) !== false) {
+ if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
+ if ($this->view->is_dir($user . '/' . $path . '/' . $file)) {
+ $this->renameFileKeys($user, $path . '/' . $file, $trash);
+ } else {
+ $target = $this->getTargetDir($user, $path, $file, $trash);
+ $this->createPathForKeys(dirname($target));
+ $this->view->rename($user . '/' . $path . '/' . $file, $target);
+ }
+ }
+ }
+ closedir($dh);
+ }
+ }
+
+ /**
+ * generate target directory
+ *
+ * @param string $user
+ * @param string $filePath
+ * @param string $filename
+ * @param bool $trash
+ * @return string
+ */
+ private function getTargetDir($user, $filePath, $filename, $trash) {
+ if ($trash) {
+ $targetDir = $user . '/files_encryption/keys/files_trashbin/' . substr($filePath, strlen('/files_trashbin/keys/')) . '/' . $this->moduleId . '/' . $filename;
+ } else {
+ $targetDir = $user . '/files_encryption/keys/files/' . substr($filePath, strlen('/files_encryption/keys/')) . '/' . $this->moduleId . '/' . $filename;
+ }
+
+ return $targetDir;
+ }
+
+ /**
+ * delete old keys
+ *
+ * @param string $user
+ */
+ private function deleteOldKeys($user) {
+ $this->view->deleteAll($user . '/files_encryption/keyfiles');
+ $this->view->deleteAll($user . '/files_encryption/share-keys');
+ }
+
+ /**
+ * create directories for the keys recursively
+ *
+ * @param string $path
+ */
+ private function createPathForKeys($path) {
+ if (!$this->view->file_exists($path)) {
+ $sub_dirs = explode('/', $path);
+ $dir = '';
+ foreach ($sub_dirs as $sub_dir) {
+ $dir .= '/' . $sub_dir;
+ if (!$this->view->is_dir($dir)) {
+ $this->view->mkdir($dir);
+ }
+ }
+ }
+ }
+}
diff --git a/apps/encryption/tests/lib/MigrationTest.php b/apps/encryption/tests/lib/MigrationTest.php
new file mode 100644
index 0000000..f56ff5c
--- /dev/null
+++ b/apps/encryption/tests/lib/MigrationTest.php
@@ -0,0 +1,356 @@
+<?php
+ /**
+ * ownCloud
+ *
+ * @copyright (C) 2015 ownCloud, Inc.
+ *
+ * @author Bjoern Schiessle <schiessle at owncloud.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library 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 along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Encryption\Tests;
+
+use OCA\Encryption\Migration;
+
+class MigrationTest extends \Test\TestCase {
+
+ const TEST_ENCRYPTION_MIGRATION_USER1='test_encryption_user1';
+ const TEST_ENCRYPTION_MIGRATION_USER2='test_encryption_user2';
+ const TEST_ENCRYPTION_MIGRATION_USER3='test_encryption_user3';
+
+ /** @var \OC\Files\View */
+ private $view;
+ private $public_share_key_id = 'share_key_id';
+ private $recovery_key_id = 'recovery_key_id';
+ private $moduleId;
+
+ public static function setUpBeforeClass() {
+ parent::setUpBeforeClass();
+ \OC_User::createUser(self::TEST_ENCRYPTION_MIGRATION_USER1, 'foo');
+ \OC_User::createUser(self::TEST_ENCRYPTION_MIGRATION_USER2, 'foo');
+ \OC_User::createUser(self::TEST_ENCRYPTION_MIGRATION_USER3, 'foo');
+ }
+
+ public static function tearDownAfterClass() {
+ \OC_User::deleteUser(self::TEST_ENCRYPTION_MIGRATION_USER1);
+ \OC_User::deleteUser(self::TEST_ENCRYPTION_MIGRATION_USER2);
+ \OC_User::deleteUser(self::TEST_ENCRYPTION_MIGRATION_USER3);
+ parent::tearDownAfterClass();
+ }
+
+
+ public function setUp() {
+ $this->view = new \OC\Files\View();
+ $this->moduleId = \OCA\Encryption\Crypto\Encryption::ID;
+ }
+
+ protected function createDummyShareKeys($uid) {
+ $this->view->mkdir($uid . '/files_encryption/keys/folder1/folder2/folder3/file3');
+ $this->view->mkdir($uid . '/files_encryption/keys/folder1/folder2/file2');
+ $this->view->mkdir($uid . '/files_encryption/keys/folder1/file.1');
+ $this->view->mkdir($uid . '/files_encryption/keys/folder2/file.2.1');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/file.1/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/file.1/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/file.1/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder2/file.2.1/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder2/file.2.1/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder2/file.2.1/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data');
+ if ($this->public_share_key_id) {
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder2/file.2.1/' . $this->public_share_key_id . '.shareKey' , 'data');
+ }
+ if ($this->recovery_key_id) {
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder2/file.2.1/' . $this->recovery_key_id . '.shareKey' , 'data');
+ }
+ }
+
+ protected function createDummyUserKeys($uid) {
+ $this->view->mkdir($uid . '/files_encryption/');
+ $this->view->mkdir('/files_encryption/public_keys');
+ $this->view->file_put_contents($uid . '/files_encryption/' . $uid . '.privateKey', 'privateKey');
+ $this->view->file_put_contents('/files_encryption/public_keys/' . $uid . '.publicKey', 'publicKey');
+ }
+
+ protected function createDummyFileKeys($uid) {
+ $this->view->mkdir($uid . '/files_encryption/keys/folder1/folder2/folder3/file3');
+ $this->view->mkdir($uid . '/files_encryption/keys/folder1/folder2/file2');
+ $this->view->mkdir($uid . '/files_encryption/keys/folder1/file.1');
+ $this->view->mkdir($uid . '/files_encryption/keys/folder2/file.2.1');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/fileKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/file2/fileKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/file.1/fileKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_encryption/keys/folder2/file.2.1/fileKey' , 'data');
+ }
+
+ protected function createDummyFilesInTrash($uid) {
+ $this->view->mkdir($uid . '/files_trashbin/keys/file1.d5457864');
+ $this->view->mkdir($uid . '/files_trashbin/keys/folder1.d7437648723/file2');
+ $this->view->file_put_contents($uid . '/files_trashbin/keys/file1.d5457864/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_trashbin/keys/file1.d5457864/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_trashbin/keys/folder1.d7437648723/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data');
+
+ $this->view->file_put_contents($uid . '/files_trashbin/keys/file1.d5457864/fileKey' , 'data');
+ $this->view->file_put_contents($uid . '/files_trashbin/keys/folder1.d7437648723/file2/fileKey' , 'data');
+ }
+
+ protected function createDummySystemWideKeys() {
+ $this->view->mkdir('files_encryption');
+ $this->view->mkdir('files_encryption/public_keys');
+ $this->view->file_put_contents('files_encryption/systemwide_1.privateKey', 'data');
+ $this->view->file_put_contents('files_encryption/systemwide_2.privateKey', 'data');
+ $this->view->file_put_contents('files_encryption/public_keys/systemwide_1.publicKey', 'data');
+ $this->view->file_put_contents('files_encryption/public_keys/systemwide_2.publicKey', 'data');
+
+ }
+
+ public function testMigrateToNewFolderStructure() {
+ $this->createDummyUserKeys(self::TEST_ENCRYPTION_MIGRATION_USER1);
+ $this->createDummyUserKeys(self::TEST_ENCRYPTION_MIGRATION_USER2);
+ $this->createDummyUserKeys(self::TEST_ENCRYPTION_MIGRATION_USER3);
+
+ $this->createDummyShareKeys(self::TEST_ENCRYPTION_MIGRATION_USER1);
+ $this->createDummyShareKeys(self::TEST_ENCRYPTION_MIGRATION_USER2);
+ $this->createDummyShareKeys(self::TEST_ENCRYPTION_MIGRATION_USER3);
+
+ $this->createDummyFileKeys(self::TEST_ENCRYPTION_MIGRATION_USER1);
+ $this->createDummyFileKeys(self::TEST_ENCRYPTION_MIGRATION_USER2);
+ $this->createDummyFileKeys(self::TEST_ENCRYPTION_MIGRATION_USER3);
+
+ $this->createDummyFilesInTrash(self::TEST_ENCRYPTION_MIGRATION_USER2);
+
+ // no user for system wide mount points
+ $this->createDummyFileKeys('');
+ $this->createDummyShareKeys('');
+
+ $this->createDummySystemWideKeys();
+
+ $m = new Migration(\OC::$server->getConfig(), new \OC\Files\View(), \OC::$server->getDatabaseConnection());
+ $m->reorganizeFolderStructure();
+
+ $this->assertTrue(
+ $this->view->file_exists(
+ self::TEST_ENCRYPTION_MIGRATION_USER1 . '/files_encryption/' .
+ $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.publicKey')
+ );
+ $this->assertTrue(
+ $this->view->file_exists(
+ self::TEST_ENCRYPTION_MIGRATION_USER2 . '/files_encryption/' .
+ $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.publicKey')
+ );
+ $this->assertTrue(
+ $this->view->file_exists(
+ self::TEST_ENCRYPTION_MIGRATION_USER3 . '/files_encryption/' .
+ $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.publicKey')
+ );
+ $this->assertTrue(
+ $this->view->file_exists(
+ '/files_encryption/' . $this->moduleId . '/systemwide_1.publicKey')
+ );
+ $this->assertTrue(
+ $this->view->file_exists(
+ '/files_encryption/' . $this->moduleId . '/systemwide_2.publicKey')
+ );
+
+ $this->verifyNewKeyPath(self::TEST_ENCRYPTION_MIGRATION_USER1);
+ $this->verifyNewKeyPath(self::TEST_ENCRYPTION_MIGRATION_USER2);
+ $this->verifyNewKeyPath(self::TEST_ENCRYPTION_MIGRATION_USER3);
+ // system wide keys
+ $this->verifyNewKeyPath('');
+ // trash
+ $this->verifyFilesInTrash(self::TEST_ENCRYPTION_MIGRATION_USER2);
+
+ }
+
+ protected function verifyFilesInTrash($uid) {
+ // share keys
+ $this->assertTrue(
+ $this->view->file_exists($uid . '/files_encryption/keys/files_trashbin/file1.d5457864/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey')
+ );
+ $this->assertTrue(
+ $this->view->file_exists($uid . '/files_encryption/keys/files_trashbin/file1.d5457864/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey')
+ );
+ $this->assertTrue(
+ $this->view->file_exists($uid . '/files_encryption/keys/files_trashbin/folder1.d7437648723/file2/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey')
+ );
+
+ // file keys
+ $this->assertTrue(
+ $this->view->file_exists($uid . '/files_encryption/keys/files_trashbin/file1.d5457864/' . $this->moduleId . '/fileKey')
+ );
+
+ $this->assertTrue(
+ $this->view->file_exists($uid . '/files_encryption/keys/files_trashbin/file1.d5457864/' . $this->moduleId . '/fileKey')
+ );
+ $this->assertTrue(
+ $this->view->file_exists($uid . '/files_encryption/keys/files_trashbin/folder1.d7437648723/file2/' . $this->moduleId . '/fileKey')
+ );
+ }
+
+ protected function verifyNewKeyPath($uid) {
+ // private key
+ if ($uid !== '') {
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/' . $this->moduleId . '/'. $uid . '.privateKey'));
+ }
+ // file keys
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/folder3/file3/' . $this->moduleId . '/fileKey'));
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/file2/' . $this->moduleId . '/fileKey'));
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/file.1/' . $this->moduleId . '/fileKey'));
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder2/file.2.1/' .$this->moduleId . '/fileKey'));
+ // share keys
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/folder3/file3/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey'));
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/folder3/file3/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey'));
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/folder3/file3/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey'));
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/file2/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey'));
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/file2/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey'));
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/file2/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey'));
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/file.1/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey'));
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/file.1/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey'));
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/file.1/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey'));
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder2/file.2.1/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey'));
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder2/file.2.1/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey'));
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder2/file.2.1/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey'));
+ if ($this->public_share_key_id) {
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder2/file.2.1/' . $this->moduleId . '/' . $this->public_share_key_id . '.shareKey'));
+ }
+ if ($this->recovery_key_id) {
+ $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder2/file.2.1/' . $this->moduleId . '/' . $this->recovery_key_id . '.shareKey'));
+ }
+ }
+
+ private function prepareDB() {
+ $config = \OC::$server->getConfig();
+ $config->setAppValue('files_encryption', 'recoveryKeyId', 'recovery_id');
+ $config->setAppValue('files_encryption', 'publicShareKeyId', 'share_id');
+ $config->setAppValue('files_encryption', 'recoveryAdminEnabled', '1');
+ $config->setUserValue(self::TEST_ENCRYPTION_MIGRATION_USER1, 'files_encryption', 'recoverKeyEnabled', '1');
+
+ // delete default values set by the encryption app during initialization
+
+ /** @var \OC\DB\Connection $connection */
+ $connection = \OC::$server->getDatabaseConnection();
+ $query = $connection->createQueryBuilder();
+ $query->delete('`*PREFIX*appconfig`')
+ ->where($query->expr()->eq('`appid`', ':appid'))
+ ->setParameter('appid', 'encryption');
+ $query->execute();
+ $query = $connection->createQueryBuilder();
+ $query->delete('`*PREFIX*preferences`')
+ ->where($query->expr()->eq('`appid`', ':appid'))
+ ->setParameter('appid', 'encryption');
+ $query->execute();
+ }
+
+ public function testUpdateDB() {
+ $this->prepareDB();
+
+ $m = new Migration(\OC::$server->getConfig(), new \OC\Files\View(), \OC::$server->getDatabaseConnection());
+ $m->updateDB();
+
+ $this->verifyDB('`*PREFIX*appconfig`', 'files_encryption', 0);
+ $this->verifyDB('`*PREFIX*preferences`', 'files_encryption', 0);
+ $this->verifyDB('`*PREFIX*appconfig`', 'encryption', 3);
+ $this->verifyDB('`*PREFIX*preferences`', 'encryption', 1);
+
+ }
+
+ public function verifyDB($table, $appid, $expected) {
+ /** @var \OC\DB\Connection $connection */
+ $connection = \OC::$server->getDatabaseConnection();
+ $query = $connection->createQueryBuilder();
+ $query->select('`appid`')
+ ->from($table)
+ ->where($query->expr()->eq('`appid`', ':appid'))
+ ->setParameter('appid', $appid);
+ $result = $query->execute();
+ $values = $result->fetchAll();
+ $this->assertSame($expected,
+ count($values)
+ );
+ }
+
+ /**
+ * test update of the file cache
+ */
+ public function testUpdateFileCache() {
+ $this->prepareFileCache();
+ $m = new Migration(\OC::$server->getConfig(), new \OC\Files\View(), \OC::$server->getDatabaseConnection());
+ \Test_Helper::invokePrivate($m, 'updateFileCache');
+
+ // check results
+
+ /** @var \OC\DB\Connection $connection */
+ $connection = \OC::$server->getDatabaseConnection();
+ $query = $connection->createQueryBuilder();
+ $query->select('*')
+ ->from('`*PREFIX*filecache`');
+ $result = $query->execute();
+ $entries = $result->fetchAll();
+ foreach($entries as $entry) {
+ if ((int)$entry['encrypted'] === 1) {
+ $this->assertSame((int)$entry['unencrypted_size'], (int)$entry['size']);
+ } else {
+ $this->assertSame((int)$entry['unencrypted_size'] - 2, (int)$entry['size']);
+ }
+ }
+
+
+ }
+
+ public function prepareFileCache() {
+ /** @var \OC\DB\Connection $connection */
+ $connection = \OC::$server->getDatabaseConnection();
+ $query = $connection->createQueryBuilder();
+ $query->delete('`*PREFIX*filecache`');
+ $query->execute();
+ $query = $connection->createQueryBuilder();
+ $result = $query->select('`fileid`')
+ ->from('`*PREFIX*filecache`')
+ ->setMaxResults(1)->execute()->fetchAll();
+ $this->assertEmpty($result);
+ $query = $connection->createQueryBuilder();
+ $query->insert('`*PREFIX*filecache`')
+ ->values(
+ array(
+ '`storage`' => ':storage',
+ '`path_hash`' => ':path_hash',
+ '`encrypted`' => ':encrypted',
+ '`size`' => ':size',
+ '`unencrypted_size`' => ':unencrypted_size'
+ )
+ );
+ for ($i = 1; $i < 20; $i++) {
+ $query->setParameter('storage', 1)
+ ->setParameter('path_hash', $i)
+ ->setParameter('encrypted', $i % 2)
+ ->setParameter('size', $i)
+ ->setParameter('unencrypted_size', $i + 2);
+ $this->assertSame(1,
+ $query->execute()
+ );
+ }
+ $query = $connection->createQueryBuilder();
+ $result = $query->select('`fileid`')
+ ->from('`*PREFIX*filecache`')
+ ->execute()->fetchAll();
+ $this->assertSame(19, count($result));
+ }
+
+}
diff --git a/lib/private/encryption/manager.php b/lib/private/encryption/manager.php
index 74cad0a..45c98ba 100644
--- a/lib/private/encryption/manager.php
+++ b/lib/private/encryption/manager.php
@@ -22,24 +22,34 @@
namespace OC\Encryption;
+use OC\Files\Storage\Shared;
use OC\Files\Storage\Wrapper\Encryption;
+use OC\Files\View;
use OCP\Encryption\IEncryptionModule;
+use OCP\Encryption\IManager;
use OCP\Files\Mount\IMountPoint;
+use OCP\IConfig;
+use OCP\ILogger;
-class Manager implements \OCP\Encryption\IManager {
+class Manager implements IManager {
/** @var array */
protected $encryptionModules;
- /** @var \OCP\IConfig */
+ /** @var IConfig */
protected $config;
+ /** @var ILogger */
+ protected $logger;
+
/**
- * @param \OCP\IConfig $config
+ * @param IConfig $config
+ * @param ILogger $logger
*/
- public function __construct(\OCP\IConfig $config) {
+ public function __construct(IConfig $config, ILogger $logger) {
$this->encryptionModules = array();
$this->config = $config;
+ $this->logger = $logger;
}
/**
@@ -59,6 +69,24 @@ class Manager implements \OCP\Encryption\IManager {
}
/**
+ * check if new encryption is ready
+ *
+ * @return boolean
+ */
+ public function isReady() {
+ // check if we are still in transit between the old and the new encryption
+ $oldEncryption = $this->config->getAppValue('files_encryption', 'installed_version');
+ if (!empty($oldEncryption)) {
+ $warning = 'Installation is in transit between the old Encryption (ownCloud <= 8.0)
+ and the new encryption. Please enable the "ownCloud Default Encryption Module"
+ and run \'occ encryption:migrate\'';
+ $this->logger->warning($warning);
+ return false;
+ }
+ return true;
+ }
+
+ /**
* Registers an encryption module
*
* @param IEncryptionModule $module
@@ -185,10 +213,10 @@ class Manager implements \OCP\Encryption\IManager {
'mountPoint' => $mountPoint,
'mount' => $mount];
- if (!($storage instanceof \OC\Files\Storage\Shared)) {
+ if (!($storage instanceof Shared)) {
$manager = \OC::$server->getEncryptionManager();
- $util = new \OC\Encryption\Util(
- new \OC\Files\View(), \OC::$server->getUserManager(), \OC::$server->getConfig());
+ $util = new Util(
+ new View(), \OC::$server->getUserManager(), \OC::$server->getConfig());
$user = \OC::$server->getUserSession()->getUser();
$logger = \OC::$server->getLogger();
$uid = $user ? $user->getUID() : null;
diff --git a/lib/private/encryption/util.php b/lib/private/encryption/util.php
index e7cf607..2eed2f7 100644
--- a/lib/private/encryption/util.php
+++ b/lib/private/encryption/util.php
@@ -24,6 +24,7 @@ namespace OC\Encryption;
use OC\Encryption\Exceptions\EncryptionHeaderKeyExistsException;
use OC\Encryption\Exceptions\EncryptionHeaderToLargeException;
+use OC\Encryption\Exceptions\ModuleDoesNotExistsException;
use OC\Files\View;
use OCP\Encryption\IEncryptionModule;
use OCP\IConfig;
@@ -92,6 +93,7 @@ class Util {
*
* @param array $header
* @return string
+ * @throws ModuleDoesNotExistsException
*/
public function getEncryptionModuleId(array $header = null) {
$id = '';
@@ -99,6 +101,14 @@ class Util {
if (isset($header[$encryptionModuleKey])) {
$id = $header[$encryptionModuleKey];
+ } elseif (isset($header['cipher'])) {
+ if (class_exists('\OCA\Encryption\Crypto\Encryption')) {
+ // fall back to default encryption if the user migrated from
+ // ownCloud <= 8.0 with the old encryption
+ $id = \OCA\Encryption\Crypto\Encryption::ID;
+ } else {
+ throw new ModuleDoesNotExistsException('ownCloud default encryption module missing');
+ }
}
return $id;
diff --git a/lib/private/files/storage/wrapper/encryption.php b/lib/private/files/storage/wrapper/encryption.php
index 5697139..01bd861 100644
--- a/lib/private/files/storage/wrapper/encryption.php
+++ b/lib/private/files/storage/wrapper/encryption.php
@@ -154,7 +154,8 @@ class Encryption extends Wrapper {
* @return bool
*/
public function unlink($path) {
- if ($this->util->isExcluded($path)) {
+ $fullPath = $this->getFullPath($path);
+ if ($this->util->isExcluded($fullPath)) {
return $this->storage->unlink($path);
}
@@ -175,7 +176,8 @@ class Encryption extends Wrapper {
* @return bool
*/
public function rename($path1, $path2) {
- if ($this->util->isExcluded($path1)) {
+ $fullPath1 = $this->getFullPath($path1);
+ if ($this->util->isExcluded($fullPath1)) {
return $this->storage->rename($path1, $path2);
}
@@ -204,8 +206,9 @@ class Encryption extends Wrapper {
* @return bool
*/
public function copy($path1, $path2) {
- if ($this->util->isExcluded($path1)) {
- return $this->storage->rename($path1, $path2);
+ $fullPath1 = $this->getFullPath($path1);
+ if ($this->util->isExcluded($fullPath1)) {
+ return $this->storage->copy($path1, $path2);
}
$source = $this->getFullPath($path1);
diff --git a/lib/private/server.php b/lib/private/server.php
index 6df7722..e35da6a 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -84,7 +84,7 @@ class Server extends SimpleContainer implements IServerContainer {
});
$this->registerService('EncryptionManager', function (Server $c) {
- return new Encryption\Manager($c->getConfig());
+ return new Encryption\Manager($c->getConfig(), $c->getLogger());
});
$this->registerService('EncryptionFileHelper', function (Server $c) {
diff --git a/settings/admin.php b/settings/admin.php
index 976d0a5..43b21f4 100644
--- a/settings/admin.php
+++ b/settings/admin.php
@@ -82,6 +82,7 @@ $excludedGroupsList = $appConfig->getValue('core', 'shareapi_exclude_groups_list
$excludedGroupsList = explode(',', $excludedGroupsList); // FIXME: this should be JSON!
$template->assign('shareExcludedGroupsList', implode('|', $excludedGroupsList));
$template->assign('encryptionEnabled', \OC::$server->getEncryptionManager()->isEnabled());
+$template->assign('encryptionReady', \OC::$server->getEncryptionManager()->isReady());
$encryptionModules = \OC::$server->getEncryptionManager()->getEncryptionModules();
try {
$defaultEncryptionModule = \OC::$server->getEncryptionManager()->getDefaultEncryptionModule();
diff --git a/settings/templates/admin.php b/settings/templates/admin.php
index 4bc497d..299592b 100644
--- a/settings/templates/admin.php
+++ b/settings/templates/admin.php
@@ -307,8 +307,11 @@ if ($_['cronErrors']) {
<label for="encryptionEnabled"><?php p($l->t('Enable Server-Side-Encryption'));?></label><br/>
</p>
<div id='selectEncryptionModules' class="<?php if (!$_['encryptionEnabled']) { p('hidden'); }?>">
- <?php if (empty($_['encryptionModules'])): p('No encryption module loaded, please load a encryption module in the app menu');
- else: ?>
+ <?php if ($_['encryptionReady'] === false) {
+ p('Seems like you are in transit from the old encryption (ownCloud <= 8.0) to the new one. Please enable the "ownCloud Default Encryption Module" and run \'occ encryption:migrate\'');
+ } elseif (empty($_['encryptionModules'])) {
+ p('No encryption module loaded, please load a encryption module in the app menu');
+ } else { ?>
<h3>Select default encryption module:</h3>
<fieldset id='encryptionModules'>
<?php foreach ($_['encryptionModules'] as $id => $module): ?>
@@ -319,7 +322,7 @@ if ($_['cronErrors']) {
<label for="<?php p($id) ?>"><?php p($module['displayName']) ?></label><br />
<?php endforeach;?>
</fieldset>
- <?php endif; ?>
+ <?php } ?>
</div>
</div>
diff --git a/tests/lib/encryption/managertest.php b/tests/lib/encryption/managertest.php
index 4fcbc3b..f123f43 100644
--- a/tests/lib/encryption/managertest.php
+++ b/tests/lib/encryption/managertest.php
@@ -7,36 +7,45 @@ use Test\TestCase;
class ManagerTest extends TestCase {
+ /** @var Manager */
+ private $manager;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $config;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $logger;
+
+ public function setUp() {
+ parent::setUp();
+ $this->config = $this->getMock('\OCP\IConfig');
+ $this->logger = $this->getMock('\OCP\ILogger');
+ $this->manager = new Manager($this->config, $this->logger);
+
+ }
+
public function testManagerIsDisabled() {
- $config = $this->getMock('\OCP\IConfig');
- $m = new Manager($config);
- $this->assertFalse($m->isEnabled());
+ $this->assertFalse($this->manager->isEnabled());
}
public function testManagerIsDisabledIfEnabledButNoModules() {
- $config = $this->getMock('\OCP\IConfig');
- $config->expects($this->any())->method('getAppValue')->willReturn(true);
- $m = new Manager($config);
- $this->assertFalse($m->isEnabled());
+ $this->config->expects($this->any())->method('getAppValue')->willReturn(true);
+ $this->assertFalse($this->manager->isEnabled());
}
public function testManagerIsDisabledIfDisabledButModules() {
- $config = $this->getMock('\OCP\IConfig');
- $config->expects($this->any())->method('getAppValue')->willReturn(false);
+ $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('getDisplayName')->willReturn('TestDummyModule0');
- $m = new Manager($config);
- $m->registerEncryptionModule($em);
- $this->assertFalse($m->isEnabled());
+ $this->manager->registerEncryptionModule($em);
+ $this->assertFalse($this->manager->isEnabled());
}
public function testManagerIsEnabled() {
- $config = $this->getMock('\OCP\IConfig');
- $config->expects($this->any())->method('getSystemValue')->willReturn(true);
- $config->expects($this->any())->method('getAppValue')->willReturn('yes');
- $m = new Manager($config);
- $this->assertTrue($m->isEnabled());
+ $this->config->expects($this->any())->method('getSystemValue')->willReturn(true);
+ $this->config->expects($this->any())->method('getAppValue')->willReturn('yes');
+ $this->assertTrue($this->manager->isEnabled());
}
/**
@@ -44,30 +53,26 @@ class ManagerTest extends TestCase {
* @expectedExceptionMessage Id "0" already used by encryption module "TestDummyModule0"
*/
public function testModuleRegistration() {
- $config = $this->getMock('\OCP\IConfig');
- $config->expects($this->any())->method('getAppValue')->willReturn('yes');
+ $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('getDisplayName')->willReturn('TestDummyModule0');
- $m = new Manager($config);
- $m->registerEncryptionModule($em);
- $this->assertSame(1, count($m->getEncryptionModules()));
- $m->registerEncryptionModule($em);
+ $this->manager->registerEncryptionModule($em);
+ $this->assertSame(1, count($this->manager->getEncryptionModules()));
+ $this->manager->registerEncryptionModule($em);
}
public function testModuleUnRegistration() {
- $config = $this->getMock('\OCP\IConfig');
- $config->expects($this->any())->method('getAppValue')->willReturn(true);
+ $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('getDisplayName')->willReturn('TestDummyModule0');
- $m = new Manager($config);
- $m->registerEncryptionModule($em);
+ $this->manager->registerEncryptionModule($em);
$this->assertSame(1,
- count($m->getEncryptionModules())
+ count($this->manager->getEncryptionModules())
);
- $m->unregisterEncryptionModule($em);
- $this->assertEmpty($m->getEncryptionModules());
+ $this->manager->unregisterEncryptionModule($em);
+ $this->assertEmpty($this->manager->getEncryptionModules());
}
/**
@@ -75,40 +80,34 @@ class ManagerTest extends TestCase {
* @expectedExceptionMessage Module with id: unknown does not exists.
*/
public function testGetEncryptionModuleUnknown() {
- $config = $this->getMock('\OCP\IConfig');
- $config->expects($this->any())->method('getAppValue')->willReturn(true);
+ $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('getDisplayName')->willReturn('TestDummyModule0');
- $m = new Manager($config);
- $m->registerEncryptionModule($em);
- $this->assertSame(1, count($m->getEncryptionModules()));
- $m->getEncryptionModule('unknown');
+ $this->manager->registerEncryptionModule($em);
+ $this->assertSame(1, count($this->manager->getEncryptionModules()));
+ $this->manager->getEncryptionModule('unknown');
}
public function testGetEncryptionModule() {
- $config = $this->getMock('\OCP\IConfig');
- $config->expects($this->any())->method('getAppValue')->willReturn(true);
+ $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('getDisplayName')->willReturn('TestDummyModule0');
- $m = new Manager($config);
- $m->registerEncryptionModule($em);
- $this->assertSame(1, count($m->getEncryptionModules()));
- $en0 = $m->getEncryptionModule(0);
+ $this->manager->registerEncryptionModule($em);
+ $this->assertSame(1, count($this->manager->getEncryptionModules()));
+ $en0 = $this->manager->getEncryptionModule(0);
$this->assertEquals(0, $en0->getId());
}
public function testGetDefaultEncryptionModule() {
- $config = $this->getMock('\OCP\IConfig');
- $config->expects($this->any())->method('getAppValue')->willReturn(true);
+ $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('getDisplayName')->willReturn('TestDummyModule0');
- $m = new Manager($config);
- $m->registerEncryptionModule($em);
- $this->assertSame(1, count($m->getEncryptionModules()));
- $en0 = $m->getEncryptionModule(0);
+ $this->manager->registerEncryptionModule($em);
+ $this->assertSame(1, count($this->manager->getEncryptionModules()));
+ $en0 = $this->manager->getEncryptionModule(0);
$this->assertEquals(0, $en0->getId());
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud.git
More information about the Pkg-owncloud-commits
mailing list