various fixes & start to unit test the encryption storage wrapper

This commit is contained in:
Thomas Müller 2015-03-30 13:23:10 +02:00
parent 3e6eb28ee3
commit a905f641b3
6 changed files with 91 additions and 36 deletions

View File

@ -23,7 +23,9 @@
namespace OCA\Encryption_Dummy; namespace OCA\Encryption_Dummy;
class DummyModule implements \OCP\Encryption\IEncryptionModule { use OCP\Encryption\IEncryptionModule;
class DummyModule implements IEncryptionModule {
/** @var boolean */ /** @var boolean */
protected $isWriteOperation; protected $isWriteOperation;
@ -103,17 +105,6 @@ class DummyModule implements \OCP\Encryption\IEncryptionModule {
return $data; return $data;
} }
/**
* update encrypted file, e.g. give additional users access to the file
*
* @param string $path path to the file which should be updated
* @param array $accessList who has access to the file contains the key 'users' and 'public'
* @return boolean
*/
public function update($path, $accessList) {
return true;
}
/** /**
* should the file be encrypted or not * should the file be encrypted or not
* *
@ -142,4 +133,15 @@ class DummyModule implements \OCP\Encryption\IEncryptionModule {
return 6126; return 6126;
} }
} /**
* update encrypted file, e.g. give additional users access to the file
*
* @param string $path path to the file which should be updated
* @param string $uid of the user who performs the operation
* @param array $accessList who has access to the file contains the key 'users' and 'public'
* @return boolean
*/
public function update($path, $uid, $accessList) {
return true;
}
}

View File

@ -26,4 +26,8 @@ namespace OC\Encryption\Exceptions;
class EncryptionHeaderKeyExistsException extends \Exception { class EncryptionHeaderKeyExistsException extends \Exception {
} }
class EncryptionHeaderToLargeException extends \Exception {
}

View File

@ -23,8 +23,9 @@
namespace OC\Encryption; namespace OC\Encryption;
use OC\Encryption\Exceptions\EncryptionHeaderToLargeException;
use OC\Encryption\Exceptions\EncryptionHeaderKeyExistsException; use OC\Encryption\Exceptions\EncryptionHeaderKeyExistsException;
use OC\Encryption\Exceptions\EncryptionHeaderToLargeException;
use OC\Files\View;
use OCP\Encryption\IEncryptionModule; use OCP\Encryption\IEncryptionModule;
use OCP\IConfig; use OCP\IConfig;
@ -50,13 +51,13 @@ class Util {
*/ */
protected $blockSize = 8192; protected $blockSize = 8192;
/** @var \OC\Files\View */ /** @var View */
protected $view; protected $view;
/** @var array */ /** @var array */
protected $ocHeaderKeys; protected $ocHeaderKeys;
/** @var \OC\User\Manager */ /** @var Manager */
protected $userManager; protected $userManager;
/** @var IConfig */ /** @var IConfig */
@ -93,7 +94,7 @@ class Util {
* @param array $header * @param array $header
* @return string * @return string
*/ */
public function getEncryptionModuleId(array $header) { public function getEncryptionModuleId(array $header = null) {
$id = ''; $id = '';
$encryptionModuleKey = self::HEADER_ENCRYPTION_MODULE_KEY; $encryptionModuleKey = self::HEADER_ENCRYPTION_MODULE_KEY;
@ -153,7 +154,7 @@ class Util {
$header .= self::HEADER_END; $header .= self::HEADER_END;
if (strlen($header) > $this->getHeaderSize()) { if (strlen($header) > $this->getHeaderSize()) {
throw new EncryptionHeaderToLargeException('max header size exceeded', EncryptionException::ENCRYPTION_HEADER_TO_LARGE); throw new EncryptionHeaderToLargeException('max header size exceeded');
} }
$paddedHeader = str_pad($header, $this->headerSize, self::HEADER_PADDING_CHAR, STR_PAD_RIGHT); $paddedHeader = str_pad($header, $this->headerSize, self::HEADER_PADDING_CHAR, STR_PAD_RIGHT);
@ -208,7 +209,7 @@ class Util {
* go recursively through a dir and collect all files and sub files. * go recursively through a dir and collect all files and sub files.
* *
* @param string $dir relative to the users files folder * @param string $dir relative to the users files folder
* @param strinf $mountPoint * @param string $mountPoint
* @return array with list of files relative to the users files folder * @return array with list of files relative to the users files folder
*/ */
public function getAllFiles($dir, $mountPoint = '') { public function getAllFiles($dir, $mountPoint = '') {
@ -285,19 +286,19 @@ class Util {
throw new \BadMethodCallException('path needs to be relative to the system wide data folder and point to a user specific file'); throw new \BadMethodCallException('path needs to be relative to the system wide data folder and point to a user specific file');
} }
$pathinfo = pathinfo($path); $pathInfo = pathinfo($path);
$partfile = false; $partFile = false;
$parentFolder = false; $parentFolder = false;
if (array_key_exists('extension', $pathinfo) && $pathinfo['extension'] === 'part') { if (array_key_exists('extension', $pathInfo) && $pathInfo['extension'] === 'part') {
// if the real file exists we check this file // if the real file exists we check this file
$filePath = $pathinfo['dirname'] . '/' . $pathinfo['filename']; $filePath = $pathInfo['dirname'] . '/' . $pathInfo['filename'];
if ($this->view->file_exists($filePath)) { if ($this->view->file_exists($filePath)) {
$pathToCheck = $pathinfo['dirname'] . '/' . $pathinfo['filename']; $pathToCheck = $pathInfo['dirname'] . '/' . $pathInfo['filename'];
} else { // otherwise we look for the parent } else { // otherwise we look for the parent
$pathToCheck = $pathinfo['dirname']; $pathToCheck = $pathInfo['dirname'];
$parentFolder = true; $parentFolder = true;
} }
$partfile = true; $partFile = true;
} else { } else {
$pathToCheck = $path; $pathToCheck = $path;
} }
@ -320,11 +321,11 @@ class Util {
$this->view->chroot('/'); $this->view->chroot('/');
if ($parentFolder) { if ($parentFolder) {
$ownerPath = $ownerPath . '/'. $pathinfo['filename']; $ownerPath = $ownerPath . '/'. $pathInfo['filename'];
} }
if ($partfile) { if ($partFile) {
$ownerPath = $ownerPath . '.' . $pathinfo['extension']; $ownerPath = $ownerPath . '.' . $pathInfo['extension'];
} }
return array( return array(

View File

@ -295,7 +295,9 @@ class Encryption extends Wrapper {
* read encryption module needed to read/write the file located at $path * read encryption module needed to read/write the file located at $path
* *
* @param string $path * @param string $path
* @return \OCP\Encryption\IEncryptionModule|null * @return null|\OCP\Encryption\IEncryptionModule
* @throws ModuleDoesNotExistsException
* @throws \Exception
*/ */
protected function getEncryptionModule($path) { protected function getEncryptionModule($path) {
$encryptionModule = null; $encryptionModule = null;
@ -305,7 +307,7 @@ class Encryption extends Wrapper {
try { try {
$encryptionModule = $this->encryptionManager->getEncryptionModule($encryptionModuleId); $encryptionModule = $this->encryptionManager->getEncryptionModule($encryptionModuleId);
} catch (ModuleDoesNotExistsException $e) { } catch (ModuleDoesNotExistsException $e) {
$this->logger->critical('Encryption module defined in "' . $path . '" mot loaded!'); $this->logger->critical('Encryption module defined in "' . $path . '" not loaded!');
throw $e; throw $e;
} }
} }

View File

@ -0,0 +1,50 @@
<?php
namespace Test\Files\Storage\Wrapper;
use OC\Files\View;
use OCA\Encryption_Dummy\DummyModule;
class Encryption extends \Test\Files\Storage\Storage {
/**
* @var \OC\Files\Storage\Temporary
*/
private $sourceStorage;
public function setUp() {
parent::setUp();
$encryptionManager = $this->getMockBuilder('\OC\Encryption\Manager')
->disableOriginalConstructor()
->setMethods(['getDefaultEncryptionModule', 'getEncryptionModule'])
->getMock();
$encryptionManager->expects($this->any())
->method('getDefaultEncryptionModule')
->willReturn(new DummyModule());
$util = new \OC\Encryption\Util(new View(), new \OC\User\Manager());
$logger = $this->getMock('\OC\Log');
$this->sourceStorage = new \OC\Files\Storage\Temporary(array());
$this->instance = new \OC\Files\Storage\Wrapper\Encryption([
'storage' => $this->sourceStorage,
'root' => 'foo',
'mountPoint' => '/'
],
$encryptionManager, $util, $logger
);
}
// public function testMkDirRooted() {
// $this->instance->mkdir('bar');
// $this->assertTrue($this->sourceStorage->is_dir('foo/bar'));
// }
//
// public function testFilePutContentsRooted() {
// $this->instance->file_put_contents('bar', 'asd');
// $this->assertEquals('asd', $this->sourceStorage->file_get_contents('foo/bar'));
// }
}

View File

@ -9,10 +9,6 @@
namespace Test\Files\Storage\Wrapper; namespace Test\Files\Storage\Wrapper;
class Jail extends \Test\Files\Storage\Storage { class Jail extends \Test\Files\Storage\Storage {
/**
* @var string tmpDir
*/
private $tmpDir;
/** /**
* @var \OC\Files\Storage\Temporary * @var \OC\Files\Storage\Temporary