Ensure that stored version is at least 1 for cross-storage copy
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
This commit is contained in:
parent
631ae2f0f4
commit
676041ba7e
2 changed files with 54 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
*
|
||||
|
|
Loading…
Reference in a new issue