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/share-copy-source-mounts^2
parent
8ef6c6c7bc
commit
93ed965cbb
@ -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']], |
||||
]; |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue