Browse Source
fix creation of versions of encrypted files on external storages
fix creation of versions of encrypted files on external storages
in order to create a 1:1 copy of a file if a version gets created we need to store this information on copyBetweenStorage(). This allows us to by-pass the encryption wrapper if we read the source file.remotes/origin/fetchallappconfig
12 changed files with 310 additions and 130 deletions
-
3lib/base.php
-
4lib/private/Server.php
-
124lib/private/encryption/encryptionwrapper.php
-
19lib/private/encryption/manager.php
-
50lib/private/encryption/util.php
-
21lib/private/files/storage/wrapper/encryption.php
-
101tests/lib/encryption/encryptionwrappertest.php
-
6tests/lib/encryption/managertest.php
-
45tests/lib/encryption/utiltest.php
-
44tests/lib/files/storage/wrapper/encryption.php
-
7tests/lib/files/stream/encryption.php
-
16tests/lib/traits/encryptiontrait.php
@ -0,0 +1,124 @@ |
|||
<?php |
|||
/** |
|||
* @author Björn Schießle <schiessle@owncloud.com> |
|||
* |
|||
* @copyright Copyright (c) 2016, 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; |
|||
|
|||
|
|||
use OC\Memcache\ArrayCache; |
|||
use OC\Files\Filesystem; |
|||
use OC\Files\Storage\Wrapper\Encryption; |
|||
use OCP\Files\Mount\IMountPoint; |
|||
use OC\Files\View; |
|||
use OCP\Files\Storage; |
|||
use OCP\ILogger; |
|||
|
|||
/** |
|||
* Class EncryptionWrapper |
|||
* |
|||
* applies the encryption storage wrapper |
|||
* |
|||
* @package OC\Encryption |
|||
*/ |
|||
class EncryptionWrapper { |
|||
|
|||
/** @var ArrayCache */ |
|||
private $arrayCache; |
|||
|
|||
/** @var Manager */ |
|||
private $manager; |
|||
|
|||
/** @var ILogger */ |
|||
private $logger; |
|||
|
|||
/** |
|||
* EncryptionWrapper constructor. |
|||
* |
|||
* @param ArrayCache $arrayCache |
|||
* @param Manager $manager |
|||
* @param ILogger $logger |
|||
*/ |
|||
public function __construct(ArrayCache $arrayCache, |
|||
Manager $manager, |
|||
ILogger $logger |
|||
) { |
|||
$this->arrayCache = $arrayCache; |
|||
$this->manager = $manager; |
|||
$this->logger = $logger; |
|||
} |
|||
|
|||
/** |
|||
* Wraps the given storage when it is not a shared storage |
|||
* |
|||
* @param string $mountPoint |
|||
* @param Storage $storage |
|||
* @param IMountPoint $mount |
|||
* @return Encryption|Storage |
|||
*/ |
|||
public function wrapStorage($mountPoint, Storage $storage, IMountPoint $mount) { |
|||
$parameters = [ |
|||
'storage' => $storage, |
|||
'mountPoint' => $mountPoint, |
|||
'mount' => $mount |
|||
]; |
|||
|
|||
if (!$storage->instanceOfStorage('OC\Files\Storage\Shared') |
|||
&& !$storage->instanceOfStorage('OCA\Files_Sharing\External\Storage') |
|||
&& !$storage->instanceOfStorage('OC\Files\Storage\OwnCloud')) { |
|||
|
|||
$user = \OC::$server->getUserSession()->getUser(); |
|||
$mountManager = Filesystem::getMountManager(); |
|||
$uid = $user ? $user->getUID() : null; |
|||
$fileHelper = \OC::$server->getEncryptionFilesHelper(); |
|||
$keyStorage = \OC::$server->getEncryptionKeyStorage(); |
|||
|
|||
$util = new Util( |
|||
new View(), |
|||
\OC::$server->getUserManager(), |
|||
\OC::$server->getGroupManager(), |
|||
\OC::$server->getConfig() |
|||
); |
|||
$update = new Update( |
|||
new View(), |
|||
$util, |
|||
Filesystem::getMountManager(), |
|||
$this->manager, |
|||
$fileHelper, |
|||
$uid |
|||
); |
|||
return new Encryption( |
|||
$parameters, |
|||
$this->manager, |
|||
$util, |
|||
$this->logger, |
|||
$fileHelper, |
|||
$uid, |
|||
$keyStorage, |
|||
$update, |
|||
$mountManager, |
|||
$this->arrayCache |
|||
); |
|||
} else { |
|||
return $storage; |
|||
} |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,101 @@ |
|||
<?php |
|||
/** |
|||
* @author Björn Schießle <schiessle@owncloud.com> |
|||
* |
|||
* @copyright Copyright (c) 2016, 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 Test\Encryption; |
|||
|
|||
|
|||
use OC\Encryption\EncryptionWrapper; |
|||
use Test\TestCase; |
|||
|
|||
class EncryptionWrapperTest extends TestCase { |
|||
|
|||
/** @var EncryptionWrapper */ |
|||
private $instance; |
|||
|
|||
/** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\ILogger */ |
|||
private $logger; |
|||
|
|||
/** @var \PHPUnit_Framework_MockObject_MockObject | \OC\Encryption\Manager */ |
|||
private $manager; |
|||
|
|||
/** @var \PHPUnit_Framework_MockObject_MockObject | \OC\Memcache\ArrayCache */ |
|||
private $arrayCache; |
|||
|
|||
public function setUp() { |
|||
parent::setUp(); |
|||
|
|||
$this->arrayCache = $this->getMock('OC\Memcache\ArrayCache'); |
|||
$this->manager = $this->getMockBuilder('OC\Encryption\Manager') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$this->logger = $this->getMock('OCP\ILogger'); |
|||
|
|||
$this->instance = new EncryptionWrapper($this->arrayCache, $this->manager, $this->logger); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @dataProvider provideWrapStorage |
|||
*/ |
|||
public function testWrapStorage($expectedWrapped, $wrappedStorages) { |
|||
$storage = $this->getMockBuilder('OC\Files\Storage\Storage') |
|||
->disableOriginalConstructor() |
|||
->getMock(); |
|||
|
|||
foreach ($wrappedStorages as $wrapper) { |
|||
$storage->expects($this->any()) |
|||
->method('instanceOfStorage') |
|||
->willReturnMap([ |
|||
[$wrapper, true], |
|||
]); |
|||
} |
|||
|
|||
$mount = $this->getMockBuilder('OCP\Files\Mount\IMountPoint') |
|||
->disableOriginalConstructor() |
|||
->getMock(); |
|||
|
|||
$returnedStorage = $this->instance->wrapStorage('mountPoint', $storage, $mount); |
|||
|
|||
$this->assertEquals( |
|||
$expectedWrapped, |
|||
$returnedStorage->instanceOfStorage('OC\Files\Storage\Wrapper\Encryption'), |
|||
'Asserted that the storage is (not) wrapped with encryption' |
|||
); |
|||
} |
|||
|
|||
public function provideWrapStorage() { |
|||
return [ |
|||
// Wrap when not wrapped or not wrapped with storage
|
|||
[true, []], |
|||
[true, ['OCA\Files_Trashbin\Storage']], |
|||
|
|||
// Do not wrap shared storages
|
|||
[false, ['OC\Files\Storage\Shared']], |
|||
[false, ['OCA\Files_Sharing\External\Storage']], |
|||
[false, ['OC\Files\Storage\OwnCloud']], |
|||
[false, ['OC\Files\Storage\Shared', 'OCA\Files_Sharing\External\Storage']], |
|||
[false, ['OC\Files\Storage\Shared', 'OC\Files\Storage\OwnCloud']], |
|||
[false, ['OCA\Files_Sharing\External\Storage', 'OC\Files\Storage\OwnCloud']], |
|||
[false, ['OC\Files\Storage\Shared', 'OCA\Files_Sharing\External\Storage', 'OC\Files\Storage\OwnCloud']], |
|||
]; |
|||
} |
|||
|
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue