Merge pull request #15799 from owncloud/fix-enc-folder-move

Fix enc folder move
This commit is contained in:
Thomas Müller 2015-04-22 16:04:29 +02:00
commit 750f0bc489
14 changed files with 168 additions and 267 deletions

View File

@ -24,8 +24,10 @@
namespace OCA\Encryption\AppInfo;
use OC\Files\Filesystem;
use OC\Files\View;
use OCA\Encryption\Controller\RecoveryController;
use OCA\Encryption\Controller\SettingsController;
use OCA\Encryption\Controller\StatusController;
use OCA\Encryption\Crypto\Crypt;
use OCA\Encryption\Crypto\Encryption;
use OCA\Encryption\HookManager;
@ -126,11 +128,11 @@ class Application extends \OCP\AppFramework\App {
function (IAppContainer $c) {
$server = $c->getServer();
return new KeyManager($server->getEncryptionKeyStorage(\OCA\Encryption\Crypto\Encryption::ID),
return new KeyManager($server->getEncryptionKeyStorage(),
$c->query('Crypt'),
$server->getConfig(),
$server->getUserSession(),
new \OCA\Encryption\Session($server->getSession()),
new Session($server->getSession()),
$server->getLogger(),
$c->query('Util')
);
@ -146,14 +148,14 @@ class Application extends \OCP\AppFramework\App {
$server->getSecureRandom(),
$c->query('KeyManager'),
$server->getConfig(),
$server->getEncryptionKeyStorage(\OCA\Encryption\Crypto\Encryption::ID),
$server->getEncryptionKeyStorage(),
$server->getEncryptionFilesHelper(),
new \OC\Files\View());
new View());
});
$container->registerService('RecoveryController', function (IAppContainer $c) {
$server = $c->getServer();
return new \OCA\Encryption\Controller\RecoveryController(
return new RecoveryController(
$c->getAppName(),
$server->getRequest(),
$server->getConfig(),
@ -163,7 +165,7 @@ class Application extends \OCP\AppFramework\App {
$container->registerService('StatusController', function (IAppContainer $c) {
$server = $c->getServer();
return new \OCA\Encryption\Controller\StatusController(
return new StatusController(
$c->getAppName(),
$server->getRequest(),
$server->getL10N($c->getAppName()),
@ -173,7 +175,7 @@ class Application extends \OCP\AppFramework\App {
$container->registerService('SettingsController', function (IAppContainer $c) {
$server = $c->getServer();
return new \OCA\Encryption\Controller\SettingsController(
return new SettingsController(
$c->getAppName(),
$server->getRequest(),
$server->getL10N($c->getAppName()),

View File

@ -23,6 +23,7 @@
namespace OCA\Encryption;
use OC\Encryption\Exceptions\DecryptionFailedException;
use OCA\Encryption\Crypto\Encryption;
use OCA\Encryption\Exceptions\PrivateKeyMissingException;
use OCA\Encryption\Exceptions\PublicKeyMissingException;
use OCA\Encryption\Crypto\Crypt;
@ -136,7 +137,8 @@ class KeyManager {
// Save public key
$this->keyStorage->setSystemUserKey(
$this->publicShareKeyId . '.publicKey', $keyPair['publicKey']);
$this->publicShareKeyId . '.publicKey', $keyPair['publicKey'],
Encryption::ID);
// Encrypt private key empty passphrase
$encryptedKey = $this->crypt->symmetricEncryptFileContent($keyPair['privateKey'], '');
@ -162,7 +164,7 @@ class KeyManager {
* @return string
*/
public function getRecoveryKey() {
return $this->keyStorage->getSystemUserKey($this->recoveryKeyId . '.publicKey');
return $this->keyStorage->getSystemUserKey($this->recoveryKeyId . '.publicKey', Encryption::ID);
}
/**
@ -179,7 +181,7 @@ class KeyManager {
* @return bool
*/
public function checkRecoveryPassword($password) {
$recoveryKey = $this->keyStorage->getSystemUserKey($this->recoveryKeyId . '.privateKey');
$recoveryKey = $this->keyStorage->getSystemUserKey($this->recoveryKeyId . '.privateKey', Encryption::ID);
$decryptedRecoveryKey = $this->crypt->decryptPrivateKey($recoveryKey,
$password);
@ -217,7 +219,10 @@ class KeyManager {
*/
public function setRecoveryKey($password, $keyPair) {
// Save Public Key
$this->keyStorage->setSystemUserKey($this->getRecoveryKeyId(). '.publicKey', $keyPair['publicKey']);
$this->keyStorage->setSystemUserKey($this->getRecoveryKeyId().
'.publicKey',
$keyPair['publicKey'],
Encryption::ID);
$encryptedKey = $this->crypt->symmetricEncryptFileContent($keyPair['privateKey'],
$password);
@ -236,7 +241,7 @@ class KeyManager {
* @return bool
*/
public function setPublicKey($userId, $key) {
return $this->keyStorage->setUserKey($userId, $this->publicKeyId, $key);
return $this->keyStorage->setUserKey($userId, $this->publicKeyId, $key, Encryption::ID);
}
/**
@ -247,7 +252,8 @@ class KeyManager {
public function setPrivateKey($userId, $key) {
return $this->keyStorage->setUserKey($userId,
$this->privateKeyId,
$key);
$key,
Encryption::ID);
}
/**
@ -258,7 +264,7 @@ class KeyManager {
* @return boolean
*/
public function setFileKey($path, $key) {
return $this->keyStorage->setFileKey($path, $this->fileKeyId, $key);
return $this->keyStorage->setFileKey($path, $this->fileKeyId, $key, Encryption::ID);
}
/**
@ -284,7 +290,7 @@ class KeyManager {
*/
public function setShareKey($path, $uid, $key) {
$keyId = $uid . '.' . $this->shareKeyId;
return $this->keyStorage->setFileKey($path, $keyId, $key);
return $this->keyStorage->setFileKey($path, $keyId, $key, Encryption::ID);
}
/**
@ -324,7 +330,7 @@ class KeyManager {
*/
public function getPrivateKey($userId) {
$privateKey = $this->keyStorage->getUserKey($userId,
$this->privateKeyId);
$this->privateKeyId, Encryption::ID);
if (strlen($privateKey) !== 0) {
return $privateKey;
@ -338,12 +344,12 @@ class KeyManager {
* @return string
*/
public function getFileKey($path, $uid) {
$encryptedFileKey = $this->keyStorage->getFileKey($path, $this->fileKeyId);
$encryptedFileKey = $this->keyStorage->getFileKey($path, $this->fileKeyId, Encryption::ID);
if (is_null($uid)) {
$uid = $this->getPublicShareKeyId();
$shareKey = $this->getShareKey($path, $uid);
$privateKey = $this->keyStorage->getSystemUserKey($this->publicShareKeyId . '.privateKey');
$privateKey = $this->keyStorage->getSystemUserKey($this->publicShareKeyId . '.privateKey', Encryption::ID);
$privateKey = $this->crypt->decryptPrivateKey($privateKey);
} else {
$shareKey = $this->getShareKey($path, $uid);
@ -367,7 +373,7 @@ class KeyManager {
*/
public function getEncryptedFileKey($path) {
$encryptedFileKey = $this->keyStorage->getFileKey($path,
$this->fileKeyId);
$this->fileKeyId, Encryption::ID);
return $encryptedFileKey;
}
@ -380,7 +386,10 @@ class KeyManager {
* @return boolean
*/
public function deleteShareKey($path, $keyId) {
return $this->keyStorage->deleteFileKey($path, $keyId . '.' . $this->shareKeyId);
return $this->keyStorage->deleteFileKey(
$path,
$keyId . '.' . $this->shareKeyId,
Encryption::ID);
}
@ -391,7 +400,7 @@ class KeyManager {
*/
public function getShareKey($path, $uid) {
$keyId = $uid . '.' . $this->shareKeyId;
return $this->keyStorage->getFileKey($path, $keyId);
return $this->keyStorage->getFileKey($path, $keyId, Encryption::ID);
}
/**
@ -416,7 +425,7 @@ class KeyManager {
* @throws PublicKeyMissingException
*/
public function getPublicKey($userId) {
$publicKey = $this->keyStorage->getUserKey($userId, $this->publicKeyId);
$publicKey = $this->keyStorage->getUserKey($userId, $this->publicKeyId, Encryption::ID);
if (strlen($publicKey) !== 0) {
return $publicKey;
@ -434,7 +443,7 @@ class KeyManager {
* @return string
*/
public function getPublicShareKey() {
return $this->keyStorage->getSystemUserKey($this->publicShareKeyId . '.publicKey');
return $this->keyStorage->getSystemUserKey($this->publicShareKeyId . '.publicKey', Encryption::ID);
}
/**
@ -460,7 +469,7 @@ class KeyManager {
* @return bool
*/
public function deletePublicKey($uid) {
return $this->keyStorage->deleteUserKey($uid, $this->publicKeyId);
return $this->keyStorage->deleteUserKey($uid, $this->publicKeyId, Encryption::ID);
}
/**
@ -468,11 +477,11 @@ class KeyManager {
* @return bool
*/
private function deletePrivateKey($uid) {
return $this->keyStorage->deleteUserKey($uid, $this->privateKeyId);
return $this->keyStorage->deleteUserKey($uid, $this->privateKeyId, Encryption::ID);
}
public function deleteAllFileKeys($path) {
return $this->keyStorage->deleteAllFileKeys($path);
return $this->keyStorage->deleteAllFileKeys($path, Encryption::ID);
}
/**
@ -500,7 +509,7 @@ class KeyManager {
* @return string returns openssl key
*/
public function getSystemPrivateKey($keyId) {
return $this->keyStorage->getSystemUserKey($keyId . '.' . $this->privateKeyId);
return $this->keyStorage->getSystemUserKey($keyId . '.' . $this->privateKeyId, Encryption::ID);
}
/**
@ -509,7 +518,10 @@ class KeyManager {
* @return string returns openssl key
*/
public function setSystemPrivateKey($keyId, $key) {
return $this->keyStorage->setSystemUserKey($keyId . '.' . $this->privateKeyId, $key);
return $this->keyStorage->setSystemUserKey(
$keyId . '.' . $this->privateKeyId,
$key,
Encryption::ID);
}
/**

View File

@ -38,7 +38,7 @@ $util = new \OCA\Encryption\Util(
\OC::$server->getConfig());
$keyManager = new \OCA\Encryption\KeyManager(
\OC::$server->getEncryptionKeyStorage(\OCA\Encryption\Crypto\Encryption::ID),
\OC::$server->getEncryptionKeyStorage(),
$crypt,
\OC::$server->getConfig(),
$userSession,

View File

@ -76,8 +76,8 @@ class DummyModule implements IEncryptionModule {
public function end($path) {
if ($this->isWriteOperation) {
$storage = \OC::$server->getEncryptionKeyStorage($this->getId());
$storage->setFileKey($path, 'fileKey', 'foo');
$storage = \OC::$server->getEncryptionKeyStorage();
$storage->setFileKey($path, 'fileKey', 'foo', $this->getId());
}
return '';
}

View File

@ -1,50 +0,0 @@
<?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\Encryption\Keys;
use OC\Encryption\Util;
use OC\Files\View;
use OC\User;
/**
* Factory provides KeyStorage for different encryption modules
*/
class Factory {
/** @var array */
protected $instances = array();
/**
* get a KeyStorage instance
*
* @param string $encryptionModuleId
* @param View $view
* @param Util $util
* @return Storage
*/
public function get($encryptionModuleId,View $view, Util $util) {
if (!isset($this->instances[$encryptionModuleId])) {
$this->instances[$encryptionModuleId] = new Storage($encryptionModuleId, $view, $util);
}
return $this->instances[$encryptionModuleId];
}
}

View File

@ -23,10 +23,12 @@
namespace OC\Encryption\Keys;
use OC\Encryption\Util;
use OC\Files\Filesystem;
use OC\Files\View;
use OCP\Encryption\Exceptions\GenericEncryptionException;
use OCP\Encryption\Keys\IStorage;
class Storage implements \OCP\Encryption\Keys\IStorage {
class Storage implements IStorage {
/** @var View */
private $view;
@ -35,171 +37,123 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
private $util;
// base dir where all the file related keys are stored
/** @var string */
private $keys_base_dir;
private $encryption_base_dir;
private $keyCache = array();
/** @var string */
private $encryptionModuleId;
private $encryption_base_dir;
/** @var array */
private $keyCache = [];
/**
* @param string $encryptionModuleId
* @param View $view
* @param Util $util
*/
public function __construct($encryptionModuleId, View $view, Util $util) {
public function __construct(View $view, Util $util) {
$this->view = $view;
$this->util = $util;
$this->encryptionModuleId = $encryptionModuleId;
$this->encryption_base_dir = '/files_encryption';
$this->keys_base_dir = $this->encryption_base_dir .'/keys';
}
/**
* get user specific key
*
* @param string $uid ID if the user for whom we want the key
* @param string $keyId id of the key
*
* @return mixed key
* @inheritdoc
*/
public function getUserKey($uid, $keyId) {
$path = $this->constructUserKeyPath($keyId, $uid);
public function getUserKey($uid, $keyId, $encryptionModuleId) {
$path = $this->constructUserKeyPath($encryptionModuleId, $keyId, $uid);
return $this->getKey($path);
}
/**
* get file specific key
*
* @param string $path path to file
* @param string $keyId id of the key
*
* @return mixed key
* @inheritdoc
*/
public function getFileKey($path, $keyId) {
$keyDir = $this->getFileKeyDir($path);
public function getFileKey($path, $keyId, $encryptionModuleId) {
$keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
return $this->getKey($keyDir . $keyId);
}
/**
* get system-wide encryption keys not related to a specific user,
* e.g something like a key for public link shares
*
* @param string $keyId id of the key
*
* @return mixed key
* @inheritdoc
*/
public function getSystemUserKey($keyId) {
$path = $this->constructUserKeyPath($keyId);
public function getSystemUserKey($keyId, $encryptionModuleId) {
$path = $this->constructUserKeyPath($encryptionModuleId, $keyId, null);
return $this->getKey($path);
}
/**
* set user specific key
*
* @param string $uid ID if the user for whom we want the key
* @param string $keyId id of the key
* @param mixed $key
* @inheritdoc
*/
public function setUserKey($uid, $keyId, $key) {
$path = $this->constructUserKeyPath($keyId, $uid);
public function setUserKey($uid, $keyId, $key, $encryptionModuleId) {
$path = $this->constructUserKeyPath($encryptionModuleId, $keyId, $uid);
return $this->setKey($path, $key);
}
/**
* set file specific key
*
* @param string $path path to file
* @param string $keyId id of the key
* @param boolean
* @inheritdoc
*/
public function setFileKey($path, $keyId, $key) {
$keyDir = $this->getFileKeyDir($path);
public function setFileKey($path, $keyId, $key, $encryptionModuleId) {
$keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
return $this->setKey($keyDir . $keyId, $key);
}
/**
* set system-wide encryption keys not related to a specific user,
* e.g something like a key for public link shares
*
* @param string $keyId id of the key
* @param mixed $key
*
* @return mixed key
* @inheritdoc
*/
public function setSystemUserKey($keyId, $key) {
$path = $this->constructUserKeyPath($keyId);
public function setSystemUserKey($keyId, $key, $encryptionModuleId) {
$path = $this->constructUserKeyPath($encryptionModuleId, $keyId, null);
return $this->setKey($path, $key);
}
/**
* delete user specific key
*
* @param string $uid ID if the user for whom we want to delete the key
* @param string $keyId id of the key
*
* @return boolean False when the key could not be deleted
* @inheritdoc
*/
public function deleteUserKey($uid, $keyId) {
$path = $this->constructUserKeyPath($keyId, $uid);
public function deleteUserKey($uid, $keyId, $encryptionModuleId) {
$path = $this->constructUserKeyPath($encryptionModuleId, $keyId, $uid);
return !$this->view->file_exists($path) || $this->view->unlink($path);
}
/**
* delete file specific key
*
* @param string $path path to file
* @param string $keyId id of the key
*
* @return boolean False when the key could not be deleted
* @inheritdoc
*/
public function deleteFileKey($path, $keyId) {
$keyDir = $this->getFileKeyDir($path);
public function deleteFileKey($path, $keyId, $encryptionModuleId) {
$keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
return !$this->view->file_exists($keyDir . $keyId) || $this->view->unlink($keyDir . $keyId);
}
/**
* delete all file keys for a given file
*
* @param string $path to the file
* @return boolean False when the key could not be deleted
* @inheritdoc
*/
public function deleteAllFileKeys($path) {
$keyDir = $this->getFileKeyDir($path);
public function deleteAllFileKeys($path, $encryptionModuleId) {
$keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
$path = dirname($keyDir);
return !$this->view->file_exists($path) || $this->view->deleteAll($path);
}
/**
* delete system-wide encryption keys not related to a specific user,
* e.g something like a key for public link shares
*
* @param string $keyId id of the key
*
* @return boolean False when the key could not be deleted
* @inheritdoc
*/
public function deleteSystemUserKey($keyId) {
$path = $this->constructUserKeyPath($keyId);
public function deleteSystemUserKey($keyId, $encryptionModuleId) {
$path = $this->constructUserKeyPath($encryptionModuleId, $keyId, null);
return !$this->view->file_exists($path) || $this->view->unlink($path);
}
/**
* construct path to users key
*
* @param string $encryptionModuleId
* @param string $keyId
* @param string $uid
* @return string
*/
protected function constructUserKeyPath($keyId, $uid = null) {
protected function constructUserKeyPath($encryptionModuleId, $keyId, $uid) {
if ($uid === null) {
$path = $this->encryption_base_dir . '/' . $this->encryptionModuleId . '/' . $keyId;
$path = $this->encryption_base_dir . '/' . $encryptionModuleId . '/' . $keyId;
} else {
$path = '/' . $uid . $this->encryption_base_dir . '/'
. $this->encryptionModuleId . '/' . $uid . '.' . $keyId;
. $encryptionModuleId . '/' . $uid . '.' . $keyId;
}
return $path;
@ -251,12 +205,13 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
/**
* get path to key folder for a given file
*
* @param string $encryptionModuleId
* @param string $path path to the file, relative to data/
* @return string
* @throws GenericEncryptionException
* @internal param string $keyId
*/
private function getFileKeyDir($path) {
private function getFileKeyDir($encryptionModuleId, $path) {
if ($this->view->is_dir($path)) {
throw new GenericEncryptionException("file was expected but directory was given: $path");
@ -272,7 +227,7 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
$keyPath = '/' . $owner . $this->keys_base_dir . $filename . '/';
}
return \OC\Files\Filesystem::normalizePath($keyPath . $this->encryptionModuleId . '/', false);
return Filesystem::normalizePath($keyPath . $encryptionModuleId . '/', false);
}
/**
@ -280,8 +235,6 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
*
* @param string $source
* @param string $target
* @param string $owner
* @param bool $systemWide
*/
public function renameKeys($source, $target) {
@ -308,8 +261,6 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
*
* @param string $source
* @param string $target
* @param string $owner
* @param bool $systemWide
*/
public function copyKeys($source, $target) {
@ -332,7 +283,7 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
}
/**
* Make preparations to filesystem for saving a keyfile
* Make preparations to filesystem for saving a key file
*
* @param string $path relative to the views root
*/

View File

@ -221,7 +221,8 @@ class Manager implements IManager {
$logger = \OC::$server->getLogger();
$uid = $user ? $user->getUID() : null;
$fileHelper = \OC::$server->getEncryptionFilesHelper();
return new Encryption($parameters, $manager, $util, $logger, $fileHelper, $uid);
$keyStorage = \OC::$server->getEncryptionKeyStorage();
return new Encryption($parameters, $manager, $util, $logger, $fileHelper, $uid, $keyStorage);
} else {
return $storage;
}

View File

@ -56,6 +56,9 @@ class Encryption extends Wrapper {
/** @var IMountPoint */
private $mount;
/** @var \OCP\Encryption\Keys\IStorage */
private $keyStorage;
/**
* @param array $parameters
* @param \OC\Encryption\Manager $encryptionManager
@ -70,7 +73,8 @@ class Encryption extends Wrapper {
\OC\Encryption\Util $util = null,
\OC\Log $logger = null,
File $fileHelper = null,
$uid = null
$uid = null,
$keyStorage = null
) {
$this->mountPoint = $parameters['mountPoint'];
@ -80,6 +84,7 @@ class Encryption extends Wrapper {
$this->logger = $logger;
$this->uid = $uid;
$this->fileHelper = $fileHelper;
$this->keyStorage = $keyStorage;
$this->unencryptedSize = array();
parent::__construct($parameters);
}
@ -187,8 +192,8 @@ class Encryption extends Wrapper {
$encryptionModule = $this->getEncryptionModule($path);
if ($encryptionModule) {
$keyStorage = $this->getKeyStorage($encryptionModule->getId());
$keyStorage->deleteAllFileKeys($this->getFullPath($path));
$this->keyStorage->deleteAllFileKeys($this->getFullPath($path),
$encryptionModule->getId());
}
return $this->storage->unlink($path);
@ -214,11 +219,7 @@ class Encryption extends Wrapper {
if (isset($this->unencryptedSize[$source])) {
$this->unencryptedSize[$target] = $this->unencryptedSize[$source];
}
$encryptionModule = $this->getEncryptionModule($path2);
if ($encryptionModule) {
$keyStorage = $this->getKeyStorage($encryptionModule->getId());
$keyStorage->renameKeys($source, $target);
}
$this->keyStorage->renameKeys($source, $target);
}
return $result;
@ -243,8 +244,7 @@ class Encryption extends Wrapper {
$target = $this->getFullPath($path2);
$encryptionModule = $this->getEncryptionModule($path2);
if ($encryptionModule) {
$keyStorage = $this->getKeyStorage($encryptionModule->getId());
$keyStorage->copyKeys($source, $target);
$this->keyStorage->copyKeys($source, $target);
}
}
@ -431,14 +431,4 @@ class Encryption extends Wrapper {
public function updateUnencryptedSize($path, $unencryptedSize) {
$this->unencryptedSize[$path] = $unencryptedSize;
}
/**
* @param string $encryptionModuleId
* @return \OCP\Encryption\Keys\IStorage
*/
protected function getKeyStorage($encryptionModuleId) {
$keyStorage = \OC::$server->getEncryptionKeyStorage($encryptionModuleId);
return $keyStorage;
}
}

View File

@ -97,8 +97,16 @@ class Server extends SimpleContainer implements IServerContainer {
return new Encryption\File($util);
});
$this->registerService('EncryptionKeyStorageFactory', function ($c) {
return new Encryption\Keys\Factory();
$this->registerService('EncryptionKeyStorage', function (Server $c) {
$view = new \OC\Files\View();
$util = new \OC\Encryption\Util(
$view,
$c->getUserManager(),
$c->getGroupManager(),
$c->getConfig()
);
return new Encryption\Keys\Storage($view, $util);
});
$this->registerService('TagMapper', function(Server $c) {
return new TagMapper($c->getDatabaseConnection());
@ -436,19 +444,10 @@ class Server extends SimpleContainer implements IServerContainer {
}
/**
* @param string $encryptionModuleId encryption module ID
*
* @return \OCP\Encryption\Keys\IStorage
*/
public function getEncryptionKeyStorage($encryptionModuleId) {
$view = new \OC\Files\View();
$util = new \OC\Encryption\Util(
$view,
\OC::$server->getUserManager(),
\OC::$server->getGroupManager(),
\OC::$server->getConfig()
);
return $this->query('EncryptionKeyStorageFactory')->get($encryptionModuleId, $view, $util);
public function getEncryptionKeyStorage() {
return $this->query('EncryptionKeyStorage');
}
/**

View File

@ -35,33 +35,36 @@ interface IStorage {
*
* @param string $uid ID if the user for whom we want the key
* @param string $keyId id of the key
* @param string $encryptionModuleId
*
* @return mixed key
* @since 8.1.0
*/
public function getUserKey($uid, $keyId);
public function getUserKey($uid, $keyId, $encryptionModuleId);
/**
* get file specific key
*
* @param string $path path to file
* @param string $keyId id of the key
* @param string $encryptionModuleId
*
* @return mixed key
* @since 8.1.0
*/
public function getFileKey($path, $keyId);
public function getFileKey($path, $keyId, $encryptionModuleId);
/**
* get system-wide encryption keys not related to a specific user,
* e.g something like a key for public link shares
*
* @param string $keyId id of the key
* @param string $encryptionModuleId
*
* @return mixed key
* @since 8.1.0
*/
public function getSystemUserKey($keyId);
public function getSystemUserKey($keyId, $encryptionModuleId);
/**
* set user specific key
@ -69,19 +72,21 @@ interface IStorage {
* @param string $uid ID if the user for whom we want the key
* @param string $keyId id of the key
* @param mixed $key
* @param string $encryptionModuleId
* @since 8.1.0
*/
public function setUserKey($uid, $keyId, $key);
public function setUserKey($uid, $keyId, $key, $encryptionModuleId);
/**
* set file specific key
*
* @param string $path path to file
* @param string $keyId id of the key
* @param boolean
* @param mixed $key
* @param string $encryptionModuleId
* @since 8.1.0
*/
public function setFileKey($path, $keyId, $key);
public function setFileKey($path, $keyId, $key, $encryptionModuleId);
/**
* set system-wide encryption keys not related to a specific user,
@ -89,53 +94,59 @@ interface IStorage {
*
* @param string $keyId id of the key
* @param mixed $key
* @param string $encryptionModuleId
*
* @return mixed key
* @since 8.1.0
*/
public function setSystemUserKey($keyId, $key);
public function setSystemUserKey($keyId, $key, $encryptionModuleId);
/**
* delete user specific key
*
* @param string $uid ID if the user for whom we want to delete the key
* @param string $keyId id of the key
* @param string $encryptionModuleId
*
* @return boolean False when the key could not be deleted
* @since 8.1.0
*/
public function deleteUserKey($uid, $keyId);
public function deleteUserKey($uid, $keyId, $encryptionModuleId);
/**
* delete file specific key
*
* @param string $path path to file
* @param string $keyId id of the key
* @param string $encryptionModuleId
*
* @return boolean False when the key could not be deleted
* @since 8.1.0
*/
public function deleteFileKey($path, $keyId);
public function deleteFileKey($path, $keyId, $encryptionModuleId);
/**
* delete all file keys for a given file
*
* @param string $path to the file
* @param string $encryptionModuleId
*
* @return boolean False when the keys could not be deleted
* @since 8.1.0
*/
public function deleteAllFileKeys($path);
public function deleteAllFileKeys($path, $encryptionModuleId);
/**
* delete system-wide encryption keys not related to a specific user,
* e.g something like a key for public link shares
*
* @param string $keyId id of the key
* @param string $encryptionModuleId
*
* @return boolean False when the key could not be deleted
* @since 8.1.0
*/
public function deleteSystemUserKey($keyId);
public function deleteSystemUserKey($keyId, $encryptionModuleId);
/**
* copy keys if a file was renamed

View File

@ -211,12 +211,10 @@ interface IServerContainer {
public function getEncryptionFilesHelper();
/**
* @param string $encryptionModuleId encryption module ID
*
* @return \OCP\Encryption\Keys\IStorage
* @since 8.1.0
*/
public function getEncryptionKeyStorage($encryptionModuleId);
public function getEncryptionKeyStorage();
/**
* Returns the URL generator

View File

@ -83,7 +83,7 @@ class Controller {
\OC::$server->getLogger(),
\OC::$server->getUserSession(),
\OC::$server->getConfig());
$keyStorage = \OC::$server->getEncryptionKeyStorage(\OCA\Encryption\Crypto\Encryption::ID);
$keyStorage = \OC::$server->getEncryptionKeyStorage();
$util = new \OCA\Encryption\Util(
new \OC\Files\View(),
$crypt,

View File

@ -48,8 +48,7 @@ class StorageTest extends TestCase {
->disableOriginalConstructor()
->getMock();
$this->storage = new Storage('encModule', $this->view, $this->util);
$this->storage = new Storage($this->view, $this->util);
}
public function testSetFileKey() {
@ -69,7 +68,7 @@ class StorageTest extends TestCase {
->willReturn(strlen('key'));
$this->assertTrue(
$this->storage->setFileKey('user1/files/foo.txt', 'fileKey', 'key')
$this->storage->setFileKey('user1/files/foo.txt', 'fileKey', 'key', 'encModule')
);
}
@ -93,7 +92,7 @@ class StorageTest extends TestCase {
->willReturn(true);
$this->assertSame('key',
$this->storage->getFileKey('user1/files/foo.txt', 'fileKey')
$this->storage->getFileKey('user1/files/foo.txt', 'fileKey', 'encModule')
);
}
@ -114,7 +113,7 @@ class StorageTest extends TestCase {
->willReturn(strlen('key'));
$this->assertTrue(
$this->storage->setFileKey('user1/files/foo.txt', 'fileKey', 'key')
$this->storage->setFileKey('user1/files/foo.txt', 'fileKey', 'key', 'encModule')
);
}
@ -138,7 +137,7 @@ class StorageTest extends TestCase {
->willReturn(true);
$this->assertSame('key',
$this->storage->getFileKey('user1/files/foo.txt', 'fileKey')
$this->storage->getFileKey('user1/files/foo.txt', 'fileKey', 'encModule')
);
}
@ -150,7 +149,7 @@ class StorageTest extends TestCase {
->willReturn(strlen('key'));
$this->assertTrue(
$this->storage->setSystemUserKey('shareKey_56884', 'key')
$this->storage->setSystemUserKey('shareKey_56884', 'key', 'encModule')
);
}
@ -162,7 +161,7 @@ class StorageTest extends TestCase {
->willReturn(strlen('key'));
$this->assertTrue(
$this->storage->setUserKey('user1', 'publicKey', 'key')
$this->storage->setUserKey('user1', 'publicKey', 'key', 'encModule')
);
}
@ -177,7 +176,7 @@ class StorageTest extends TestCase {
->willReturn(true);
$this->assertSame('key',
$this->storage->getSystemUserKey('shareKey_56884')
$this->storage->getSystemUserKey('shareKey_56884', 'encModule')
);
}
@ -192,7 +191,7 @@ class StorageTest extends TestCase {
->willReturn(true);
$this->assertSame('key',
$this->storage->getUserKey('user1', 'publicKey')
$this->storage->getUserKey('user1', 'publicKey', 'encModule')
);
}
@ -207,7 +206,7 @@ class StorageTest extends TestCase {
->willReturn(true);
$this->assertTrue(
$this->storage->deleteUserKey('user1', 'publicKey')
$this->storage->deleteUserKey('user1', 'publicKey', 'encModule')
);
}
@ -222,7 +221,7 @@ class StorageTest extends TestCase {
->willReturn(true);
$this->assertTrue(
$this->storage->deleteSystemUserKey('shareKey_56884')
$this->storage->deleteSystemUserKey('shareKey_56884', 'encModule')
);
}
@ -246,7 +245,7 @@ class StorageTest extends TestCase {
->willReturn(true);
$this->assertTrue(
$this->storage->deleteFileKey('user1/files/foo.txt', 'fileKey')
$this->storage->deleteFileKey('user1/files/foo.txt', 'fileKey', 'encModule')
);
}
@ -270,7 +269,7 @@ class StorageTest extends TestCase {
->willReturn(true);
$this->assertTrue(
$this->storage->deleteFileKey('user1/files/foo.txt', 'fileKey')
$this->storage->deleteFileKey('user1/files/foo.txt', 'fileKey', 'encModule')
);
}

View File

@ -12,6 +12,11 @@ class Encryption extends \Test\Files\Storage\Storage {
*/
private $sourceStorage;
/**
* @var \OC\Encryption\Keys\Storage | \PHPUnit_Framework_MockObject_MockObject
*/
private $keyStore;
public function setUp() {
parent::setUp();
@ -54,20 +59,20 @@ class Encryption extends \Test\Files\Storage\Storage {
$logger = $this->getMock('\OC\Log');
$this->sourceStorage = new Temporary(array());
$keyStore = $this->getMockBuilder('\OC\Encryption\Keys\Storage')
$this->keyStore = $this->getMockBuilder('\OC\Encryption\Keys\Storage')
->disableOriginalConstructor()->getMock();
$mount = $this->getMockBuilder('\OC\Files\Mount\MountPoint')
->disableOriginalConstructor()
->setMethods(['getOption'])
->getMock();
$mount->expects($this->any())->method('getOption')->willReturn(true);
$this->instance = new EncryptionWrapper([
$this->instance = new \OC\Files\Storage\Wrapper\Encryption([
'storage' => $this->sourceStorage,
'root' => 'foo',
'mountPoint' => '/',
'mount' => $mount
],
$encryptionManager, $util, $logger, $file, null, $keyStore
$encryptionManager, $util, $logger, $file, null, $this->keyStore
);
}
@ -91,29 +96,12 @@ class Encryption extends \Test\Files\Storage\Storage {
$encryptionModule->expects($this->any())->method('getUnencryptedBlockSize')->willReturn(8192);
return $encryptionModule;
}
}
//
// FIXME: this is too bad and needs adjustment
//
class EncryptionWrapper extends \OC\Files\Storage\Wrapper\Encryption {
private $keyStore;
public function __construct(
$parameters,
\OC\Encryption\Manager $encryptionManager = null,
\OC\Encryption\Util $util = null,
\OC\Log $logger = null,
\OC\Encryption\File $fileHelper = null,
$uid = null,
$keyStore = null
) {
$this->keyStore = $keyStore;
parent::__construct($parameters, $encryptionManager, $util, $logger, $fileHelper, $uid);
public function testRename() {
$this->keyStore
->expects($this->once())
->method('renameKeys');
$this->instance->mkdir('folder');
$this->instance->rename('folder', 'flodder');
}
protected function getKeyStorage($encryptionModuleId) {
return $this->keyStore;
}
}