Merge pull request #23293 from owncloud/backport-23108

[stable9] Ensure that stored version is at least 1 for cross-storage copy
This commit is contained in:
Thomas Müller 2016-03-21 09:48:15 +01:00
commit fefaa1fd87
2 changed files with 54 additions and 1 deletions

View File

@ -634,7 +634,18 @@ class Encryption extends Wrapper {
'encrypted' => (bool)$isEncrypted,
];
if($isEncrypted === 1) {
$cacheInformation['encryptedVersion'] = $sourceStorage->getCache()->get($sourceInternalPath)['encryptedVersion'];
$encryptedVersion = $sourceStorage->getCache()->get($sourceInternalPath)['encryptedVersion'];
// In case of a move operation from an unencrypted to an encrypted
// storage the old encrypted version would stay with "0" while the
// correct value would be "1". Thus we manually set the value to "1"
// for those cases.
// See also https://github.com/owncloud/core/issues/23078
if($encryptedVersion === 0) {
$encryptedVersion = 1;
}
$cacheInformation['encryptedVersion'] = $encryptedVersion;
}
// in case of a rename we need to manipulate the source cache because

View File

@ -672,6 +672,48 @@ class Encryption extends Storage {
];
}
public function testCopyBetweenStorageMinimumEncryptedVersion() {
$storage2 = $this->getMockBuilder('OCP\Files\Storage')
->disableOriginalConstructor()
->getMock();
$sourceInternalPath = $targetInternalPath = 'file.txt';
$preserveMtime = $isRename = false;
$storage2->expects($this->any())
->method('fopen')
->willReturnCallback(function($path, $mode) {
$temp = \OC::$server->getTempManager();
return fopen($temp->getTemporaryFile(), $mode);
});
$cache = $this->getMock('\OCP\Files\Cache\ICache');
$cache->expects($this->once())
->method('get')
->with($sourceInternalPath)
->willReturn(['encryptedVersion' => 0]);
$storage2->expects($this->once())
->method('getCache')
->willReturn($cache);
$this->encryptionManager->expects($this->any())
->method('isEnabled')
->willReturn(true);
global $mockedMountPointEncryptionEnabled;
$mockedMountPointEncryptionEnabled = true;
$expectedCachePut = [
'encrypted' => true,
];
$expectedCachePut['encryptedVersion'] = 1;
$this->cache->expects($this->once())
->method('put')
->with($sourceInternalPath, $expectedCachePut);
$this->invokePrivate($this->instance, 'copyBetweenStorage', [$storage2, $sourceInternalPath, $targetInternalPath, $preserveMtime, $isRename]);
$this->assertFalse(false);
}
/**
* @dataProvider dataCopyBetweenStorage
*