make sure that we update the unencrypted size for the versions

This commit is contained in:
Björn Schießle 2015-11-04 10:15:28 +01:00
parent 7fe047425f
commit 6d0a324144
2 changed files with 109 additions and 1 deletions

View File

@ -480,6 +480,7 @@ class Encryption extends Wrapper {
* @param bool $preserveMtime
* @param bool $isRename
* @return bool
* @throws \Exception
*/
private function copyBetweenStorage(Storage $sourceStorage, $sourceInternalPath, $targetInternalPath, $preserveMtime, $isRename) {
@ -487,7 +488,18 @@ class Encryption extends Wrapper {
// key from the original file. Just create a 1:1 copy and done
if ($this->isVersion($targetInternalPath) ||
$this->isVersion($sourceInternalPath)) {
return $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath);
$result = $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath);
if ($result) {
$info = $this->getCache('', $sourceStorage)->get($sourceInternalPath);
// make sure that we update the unencrypted size for the version
if (isset($info['encrypted']) && $info['encrypted'] === true) {
$this->updateUnencryptedSize(
$this->getFullPath($targetInternalPath),
$info['size']
);
}
}
return $result;
}
// first copy the keys that we reuse the existing file key on the target location

View File

@ -559,6 +559,102 @@ class Encryption extends \Test\Files\Storage\Storage {
$this->assertFalse(false);
}
/**
* @dataProvider dataTestCopyBetweenStorageVersions
*
* @param string $sourceInternalPath
* @param string $targetInternalPath
* @param bool $copyResult
* @param bool $encrypted
*/
public function testCopyBetweenStorageVersions($sourceInternalPath, $targetInternalPath, $copyResult, $encrypted) {
$sourceStorage = $this->getMockBuilder('OCP\Files\Storage')
->disableOriginalConstructor()
->getMock();
$targetStorage = $this->getMockBuilder('OCP\Files\Storage')
->disableOriginalConstructor()
->getMock();
$cache = $this->getMockBuilder('\OC\Files\Cache\Cache')
->disableOriginalConstructor()->getMock();
$mountPoint = '/mountPoint';
/** @var \OC\Files\Storage\Wrapper\Encryption |\PHPUnit_Framework_MockObject_MockObject $instance */
$instance = $this->getMockBuilder('\OC\Files\Storage\Wrapper\Encryption')
->setConstructorArgs(
[
[
'storage' => $targetStorage,
'root' => 'foo',
'mountPoint' => $mountPoint,
'mount' => $this->mount
],
$this->encryptionManager,
$this->util,
$this->logger,
$this->file,
null,
$this->keyStore,
$this->update,
$this->mountManager
]
)
->setMethods(['updateUnencryptedSize', 'getCache'])
->getMock();
$targetStorage->expects($this->once())->method('copyFromStorage')
->with($sourceStorage, $sourceInternalPath, $targetInternalPath)
->willReturn($copyResult);
if ($copyResult) {
$instance->expects($this->once())->method('getCache')
->with('', $sourceStorage)
->willReturn($cache);
$cache->expects($this->once())->method('get')
->with($sourceInternalPath)
->willReturn(['encrypted' => $encrypted, 'size' => 42]);
if ($encrypted) {
$instance->expects($this->once())->method('updateUnencryptedSize')
->with($mountPoint . $targetInternalPath, 42);
} else {
$instance->expects($this->never())->method('updateUnencryptedSize');
}
} else {
$instance->expects($this->never())->method('updateUnencryptedSize');
}
$result = $this->invokePrivate(
$instance,
'copyBetweenStorage',
[
$sourceStorage,
$sourceInternalPath,
$targetInternalPath,
false,
false
]
);
$this->assertSame($copyResult, $result);
}
public function dataTestCopyBetweenStorageVersions() {
return [
['/files/foo.txt', '/files_versions/foo.txt.768743', true, true],
['/files/foo.txt', '/files_versions/foo.txt.768743', true, false],
['/files/foo.txt', '/files_versions/foo.txt.768743', false, true],
['/files/foo.txt', '/files_versions/foo.txt.768743', false, false],
['/files_versions/foo.txt.6487634', '/files/foo.txt', true, true],
['/files_versions/foo.txt.6487634', '/files/foo.txt', true, false],
['/files_versions/foo.txt.6487634', '/files/foo.txt', false, true],
['/files_versions/foo.txt.6487634', '/files/foo.txt', false, false],
];
}
/**
* @dataProvider dataTestIsVersion
* @param string $path