add $encryptionModuleId to methods of Keys/IStorage

This commit is contained in:
Thomas Müller 2015-04-22 11:18:18 +02:00
parent 570718fb6b
commit fc4127dd62
13 changed files with 140 additions and 218 deletions

View File

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

View File

@ -23,6 +23,7 @@
namespace OCA\Encryption; namespace OCA\Encryption;
use OC\Encryption\Exceptions\DecryptionFailedException; use OC\Encryption\Exceptions\DecryptionFailedException;
use OCA\Encryption\Crypto\Encryption;
use OCA\Encryption\Exceptions\PrivateKeyMissingException; use OCA\Encryption\Exceptions\PrivateKeyMissingException;
use OCA\Encryption\Exceptions\PublicKeyMissingException; use OCA\Encryption\Exceptions\PublicKeyMissingException;
use OCA\Encryption\Crypto\Crypt; use OCA\Encryption\Crypto\Crypt;
@ -136,7 +137,8 @@ class KeyManager {
// Save public key // Save public key
$this->keyStorage->setSystemUserKey( $this->keyStorage->setSystemUserKey(
$this->publicShareKeyId . '.publicKey', $keyPair['publicKey']); $this->publicShareKeyId . '.publicKey', $keyPair['publicKey'],
Encryption::ID);
// Encrypt private key empty passphrase // Encrypt private key empty passphrase
$encryptedKey = $this->crypt->symmetricEncryptFileContent($keyPair['privateKey'], ''); $encryptedKey = $this->crypt->symmetricEncryptFileContent($keyPair['privateKey'], '');
@ -162,7 +164,7 @@ class KeyManager {
* @return string * @return string
*/ */
public function getRecoveryKey() { 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 * @return bool
*/ */
public function checkRecoveryPassword($password) { 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, $decryptedRecoveryKey = $this->crypt->decryptPrivateKey($recoveryKey,
$password); $password);
@ -217,7 +219,10 @@ class KeyManager {
*/ */
public function setRecoveryKey($password, $keyPair) { public function setRecoveryKey($password, $keyPair) {
// Save Public Key // 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'], $encryptedKey = $this->crypt->symmetricEncryptFileContent($keyPair['privateKey'],
$password); $password);
@ -236,7 +241,7 @@ class KeyManager {
* @return bool * @return bool
*/ */
public function setPublicKey($userId, $key) { 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) { public function setPrivateKey($userId, $key) {
return $this->keyStorage->setUserKey($userId, return $this->keyStorage->setUserKey($userId,
$this->privateKeyId, $this->privateKeyId,
$key); $key,
Encryption::ID);
} }
/** /**
@ -258,7 +264,7 @@ class KeyManager {
* @return boolean * @return boolean
*/ */
public function setFileKey($path, $key) { 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) { public function setShareKey($path, $uid, $key) {
$keyId = $uid . '.' . $this->shareKeyId; $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) { public function getPrivateKey($userId) {
$privateKey = $this->keyStorage->getUserKey($userId, $privateKey = $this->keyStorage->getUserKey($userId,
$this->privateKeyId); $this->privateKeyId, Encryption::ID);
if (strlen($privateKey) !== 0) { if (strlen($privateKey) !== 0) {
return $privateKey; return $privateKey;
@ -338,12 +344,12 @@ class KeyManager {
* @return string * @return string
*/ */
public function getFileKey($path, $uid) { 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)) { if (is_null($uid)) {
$uid = $this->getPublicShareKeyId(); $uid = $this->getPublicShareKeyId();
$shareKey = $this->getShareKey($path, $uid); $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); $privateKey = $this->crypt->decryptPrivateKey($privateKey);
} else { } else {
$shareKey = $this->getShareKey($path, $uid); $shareKey = $this->getShareKey($path, $uid);
@ -367,7 +373,7 @@ class KeyManager {
*/ */
public function getEncryptedFileKey($path) { public function getEncryptedFileKey($path) {
$encryptedFileKey = $this->keyStorage->getFileKey($path, $encryptedFileKey = $this->keyStorage->getFileKey($path,
$this->fileKeyId); $this->fileKeyId, Encryption::ID);
return $encryptedFileKey; return $encryptedFileKey;
} }
@ -380,7 +386,10 @@ class KeyManager {
* @return boolean * @return boolean
*/ */
public function deleteShareKey($path, $keyId) { 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) { public function getShareKey($path, $uid) {
$keyId = $uid . '.' . $this->shareKeyId; $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 * @throws PublicKeyMissingException
*/ */
public function getPublicKey($userId) { public function getPublicKey($userId) {
$publicKey = $this->keyStorage->getUserKey($userId, $this->publicKeyId); $publicKey = $this->keyStorage->getUserKey($userId, $this->publicKeyId, Encryption::ID);
if (strlen($publicKey) !== 0) { if (strlen($publicKey) !== 0) {
return $publicKey; return $publicKey;
@ -434,7 +443,7 @@ class KeyManager {
* @return string * @return string
*/ */
public function getPublicShareKey() { 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 * @return bool
*/ */
public function deletePublicKey($uid) { 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 * @return bool
*/ */
private function deletePrivateKey($uid) { private function deletePrivateKey($uid) {
return $this->keyStorage->deleteUserKey($uid, $this->privateKeyId); return $this->keyStorage->deleteUserKey($uid, $this->privateKeyId, Encryption::ID);
} }
public function deleteAllFileKeys($path) { 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 * @return string returns openssl key
*/ */
public function getSystemPrivateKey($keyId) { 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 * @return string returns openssl key
*/ */
public function setSystemPrivateKey($keyId, $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()); \OC::$server->getConfig());
$keyManager = new \OCA\Encryption\KeyManager( $keyManager = new \OCA\Encryption\KeyManager(
\OC::$server->getEncryptionKeyStorage(\OCA\Encryption\Crypto\Encryption::ID), \OC::$server->getEncryptionKeyStorage(),
$crypt, $crypt,
\OC::$server->getConfig(), \OC::$server->getConfig(),
$userSession, $userSession,

View File

@ -76,8 +76,8 @@ class DummyModule implements IEncryptionModule {
public function end($path) { public function end($path) {
if ($this->isWriteOperation) { if ($this->isWriteOperation) {
$storage = \OC::$server->getEncryptionKeyStorage($this->getId()); $storage = \OC::$server->getEncryptionKeyStorage();
$storage->setFileKey($path, 'fileKey', 'foo'); $storage->setFileKey($path, 'fileKey', 'foo', $this->getId());
} }
return ''; 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; namespace OC\Encryption\Keys;
use OC\Encryption\Util; use OC\Encryption\Util;
use OC\Files\Filesystem;
use OC\Files\View; use OC\Files\View;
use OCP\Encryption\Exceptions\GenericEncryptionException; use OCP\Encryption\Exceptions\GenericEncryptionException;
use OCP\Encryption\Keys\IStorage;
class Storage implements \OCP\Encryption\Keys\IStorage { class Storage implements IStorage {
/** @var View */ /** @var View */
private $view; private $view;
@ -40,152 +42,100 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
private $keyCache = array(); private $keyCache = array();
/** @var string */
private $encryptionModuleId;
/** /**
* @param string $encryptionModuleId * @param string $encryptionModuleId
* @param View $view * @param View $view
* @param Util $util * @param Util $util
*/ */
public function __construct($encryptionModuleId, View $view, Util $util) { public function __construct(View $view, Util $util) {
$this->view = $view; $this->view = $view;
$this->util = $util; $this->util = $util;
$this->encryptionModuleId = $encryptionModuleId;
$this->encryption_base_dir = '/files_encryption'; $this->encryption_base_dir = '/files_encryption';
$this->keys_base_dir = $this->encryption_base_dir .'/keys'; $this->keys_base_dir = $this->encryption_base_dir .'/keys';
} }
/** /**
* get user specific key * @inheritdoc
*
* @param string $uid ID if the user for whom we want the key
* @param string $keyId id of the key
*
* @return mixed key
*/ */
public function getUserKey($uid, $keyId) { public function getUserKey($uid, $keyId, $encryptionModuleId) {
$path = $this->constructUserKeyPath($keyId, $uid); $path = $this->constructUserKeyPath($encryptionModuleId, $keyId, $uid);
return $this->getKey($path); return $this->getKey($path);
} }
/** /**
* get file specific key * @inheritdoc
*
* @param string $path path to file
* @param string $keyId id of the key
*
* @return mixed key
*/ */
public function getFileKey($path, $keyId) { public function getFileKey($path, $keyId, $encryptionModuleId) {
$keyDir = $this->getFileKeyDir($path); $keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
return $this->getKey($keyDir . $keyId); return $this->getKey($keyDir . $keyId);
} }
/** /**
* get system-wide encryption keys not related to a specific user, * @inheritdoc
* e.g something like a key for public link shares
*
* @param string $keyId id of the key
*
* @return mixed key
*/ */
public function getSystemUserKey($keyId) { public function getSystemUserKey($keyId, $encryptionModuleId) {
$path = $this->constructUserKeyPath($keyId); $path = $this->constructUserKeyPath($encryptionModuleId, $keyId, null);
return $this->getKey($path); return $this->getKey($path);
} }
/** /**
* set user specific key * @inheritdoc
*
* @param string $uid ID if the user for whom we want the key
* @param string $keyId id of the key
* @param mixed $key
*/ */
public function setUserKey($uid, $keyId, $key) { public function setUserKey($uid, $keyId, $key, $encryptionModuleId) {
$path = $this->constructUserKeyPath($keyId, $uid); $path = $this->constructUserKeyPath($encryptionModuleId, $keyId, $uid);
return $this->setKey($path, $key); return $this->setKey($path, $key);
} }
/** /**
* set file specific key * @inheritdoc
*
* @param string $path path to file
* @param string $keyId id of the key
* @param boolean
*/ */
public function setFileKey($path, $keyId, $key) { public function setFileKey($path, $keyId, $key, $encryptionModuleId) {
$keyDir = $this->getFileKeyDir($path); $keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
return $this->setKey($keyDir . $keyId, $key); return $this->setKey($keyDir . $keyId, $key);
} }
/** /**
* set system-wide encryption keys not related to a specific user, * @inheritdoc
* e.g something like a key for public link shares
*
* @param string $keyId id of the key
* @param mixed $key
*
* @return mixed key
*/ */
public function setSystemUserKey($keyId, $key) { public function setSystemUserKey($keyId, $key, $encryptionModuleId) {
$path = $this->constructUserKeyPath($keyId); $path = $this->constructUserKeyPath($encryptionModuleId, $keyId, null);
return $this->setKey($path, $key); return $this->setKey($path, $key);
} }
/** /**
* delete user specific key * @inheritdoc
*
* @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
*/ */
public function deleteUserKey($uid, $keyId) { public function deleteUserKey($uid, $keyId, $encryptionModuleId) {
$path = $this->constructUserKeyPath($keyId, $uid); $path = $this->constructUserKeyPath($encryptionModuleId, $keyId, $uid);
return !$this->view->file_exists($path) || $this->view->unlink($path); return !$this->view->file_exists($path) || $this->view->unlink($path);
} }
/** /**
* delete file specific key * @inheritdoc
*
* @param string $path path to file
* @param string $keyId id of the key
*
* @return boolean False when the key could not be deleted
*/ */
public function deleteFileKey($path, $keyId) { public function deleteFileKey($path, $keyId, $encryptionModuleId) {
$keyDir = $this->getFileKeyDir($path); $keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
return !$this->view->file_exists($keyDir . $keyId) || $this->view->unlink($keyDir . $keyId); return !$this->view->file_exists($keyDir . $keyId) || $this->view->unlink($keyDir . $keyId);
} }
/** /**
* delete all file keys for a given file * @inheritdoc
*
* @param string $path to the file
* @return boolean False when the key could not be deleted
*/ */
public function deleteAllFileKeys($path) { public function deleteAllFileKeys($path, $encryptionModuleId) {
$keyDir = $this->getFileKeyDir($path); $keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
$path = dirname($keyDir); $path = dirname($keyDir);
return !$this->view->file_exists($path) || $this->view->deleteAll($path); return !$this->view->file_exists($path) || $this->view->deleteAll($path);
} }
/** /**
* delete system-wide encryption keys not related to a specific user, * @inheritdoc
* 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
*/ */
public function deleteSystemUserKey($keyId) { public function deleteSystemUserKey($keyId, $encryptionModuleId) {
$path = $this->constructUserKeyPath($keyId); $path = $this->constructUserKeyPath($encryptionModuleId, $keyId, null);
return !$this->view->file_exists($path) || $this->view->unlink($path); return !$this->view->file_exists($path) || $this->view->unlink($path);
} }
/** /**
* construct path to users key * construct path to users key
* *
@ -193,13 +143,13 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
* @param string $uid * @param string $uid
* @return string * @return string
*/ */
protected function constructUserKeyPath($keyId, $uid = null) { protected function constructUserKeyPath($encryptionModuleId, $keyId, $uid) {
if ($uid === null) { if ($uid === null) {
$path = $this->encryption_base_dir . '/' . $this->encryptionModuleId . '/' . $keyId; $path = $this->encryption_base_dir . '/' . $encryptionModuleId . '/' . $keyId;
} else { } else {
$path = '/' . $uid . $this->encryption_base_dir . '/' $path = '/' . $uid . $this->encryption_base_dir . '/'
. $this->encryptionModuleId . '/' . $uid . '.' . $keyId; . $encryptionModuleId . '/' . $uid . '.' . $keyId;
} }
return $path; return $path;
@ -256,7 +206,7 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
* @throws GenericEncryptionException * @throws GenericEncryptionException
* @internal param string $keyId * @internal param string $keyId
*/ */
private function getFileKeyDir($path) { private function getFileKeyDir($encryptionModuleId, $path) {
if ($this->view->is_dir($path)) { if ($this->view->is_dir($path)) {
throw new GenericEncryptionException("file was expected but directory was given: $path"); throw new GenericEncryptionException("file was expected but directory was given: $path");
@ -272,7 +222,7 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
$keyPath = '/' . $owner . $this->keys_base_dir . $filename . '/'; $keyPath = '/' . $owner . $this->keys_base_dir . $filename . '/';
} }
return \OC\Files\Filesystem::normalizePath($keyPath . $this->encryptionModuleId . '/', false); return Filesystem::normalizePath($keyPath . $encryptionModuleId . '/', false);
} }
/** /**

View File

@ -187,8 +187,9 @@ class Encryption extends Wrapper {
$encryptionModule = $this->getEncryptionModule($path); $encryptionModule = $this->getEncryptionModule($path);
if ($encryptionModule) { if ($encryptionModule) {
$keyStorage = $this->getKeyStorage($encryptionModule->getId()); $keyStorage = $this->getKeyStorage();
$keyStorage->deleteAllFileKeys($this->getFullPath($path)); $keyStorage->deleteAllFileKeys($this->getFullPath($path),
$encryptionModule->getId());
} }
return $this->storage->unlink($path); return $this->storage->unlink($path);
@ -436,8 +437,8 @@ class Encryption extends Wrapper {
* @param string $encryptionModuleId * @param string $encryptionModuleId
* @return \OCP\Encryption\Keys\IStorage * @return \OCP\Encryption\Keys\IStorage
*/ */
protected function getKeyStorage($encryptionModuleId) { protected function getKeyStorage() {
$keyStorage = \OC::$server->getEncryptionKeyStorage($encryptionModuleId); $keyStorage = \OC::$server->getEncryptionKeyStorage();
return $keyStorage; return $keyStorage;
} }

View File

@ -97,8 +97,16 @@ class Server extends SimpleContainer implements IServerContainer {
return new Encryption\File($util); return new Encryption\File($util);
}); });
$this->registerService('EncryptionKeyStorageFactory', function ($c) { $this->registerService('EncryptionKeyStorage', function (Server $c) {
return new Encryption\Keys\Factory(); $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) { $this->registerService('TagMapper', function(Server $c) {
return new TagMapper($c->getDatabaseConnection()); 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 * @return \OCP\Encryption\Keys\IStorage
*/ */
public function getEncryptionKeyStorage($encryptionModuleId) { public function getEncryptionKeyStorage() {
$view = new \OC\Files\View(); return $this->query('EncryptionKeyStorage');
$util = new \OC\Encryption\Util(
$view,
\OC::$server->getUserManager(),
\OC::$server->getGroupManager(),
\OC::$server->getConfig()
);
return $this->query('EncryptionKeyStorageFactory')->get($encryptionModuleId, $view, $util);
} }
/** /**

View File

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

View File

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

View File

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

View File

@ -48,8 +48,7 @@ class StorageTest extends TestCase {
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$this->storage = new Storage('encModule', $this->view, $this->util); $this->storage = new Storage($this->view, $this->util);
} }
public function testSetFileKey() { public function testSetFileKey() {
@ -69,7 +68,7 @@ class StorageTest extends TestCase {
->willReturn(strlen('key')); ->willReturn(strlen('key'));
$this->assertTrue( $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); ->willReturn(true);
$this->assertSame('key', $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')); ->willReturn(strlen('key'));
$this->assertTrue( $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); ->willReturn(true);
$this->assertSame('key', $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')); ->willReturn(strlen('key'));
$this->assertTrue( $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')); ->willReturn(strlen('key'));
$this->assertTrue( $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); ->willReturn(true);
$this->assertSame('key', $this->assertSame('key',
$this->storage->getSystemUserKey('shareKey_56884') $this->storage->getSystemUserKey('shareKey_56884', 'encModule')
); );
} }
@ -192,7 +191,7 @@ class StorageTest extends TestCase {
->willReturn(true); ->willReturn(true);
$this->assertSame('key', $this->assertSame('key',
$this->storage->getUserKey('user1', 'publicKey') $this->storage->getUserKey('user1', 'publicKey', 'encModule')
); );
} }
@ -207,7 +206,7 @@ class StorageTest extends TestCase {
->willReturn(true); ->willReturn(true);
$this->assertTrue( $this->assertTrue(
$this->storage->deleteUserKey('user1', 'publicKey') $this->storage->deleteUserKey('user1', 'publicKey', 'encModule')
); );
} }
@ -222,7 +221,7 @@ class StorageTest extends TestCase {
->willReturn(true); ->willReturn(true);
$this->assertTrue( $this->assertTrue(
$this->storage->deleteSystemUserKey('shareKey_56884') $this->storage->deleteSystemUserKey('shareKey_56884', 'encModule')
); );
} }
@ -246,7 +245,7 @@ class StorageTest extends TestCase {
->willReturn(true); ->willReturn(true);
$this->assertTrue( $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); ->willReturn(true);
$this->assertTrue( $this->assertTrue(
$this->storage->deleteFileKey('user1/files/foo.txt', 'fileKey') $this->storage->deleteFileKey('user1/files/foo.txt', 'fileKey', 'encModule')
); );
} }

View File

@ -112,7 +112,7 @@ class EncryptionWrapper extends \OC\Files\Storage\Wrapper\Encryption {
parent::__construct($parameters, $encryptionManager, $util, $logger, $fileHelper, $uid); parent::__construct($parameters, $encryptionManager, $util, $logger, $fileHelper, $uid);
} }
protected function getKeyStorage($encryptionModuleId) { protected function getKeyStorage() {
return $this->keyStore; return $this->keyStore;
} }