Преглед изворни кода

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
tags/v9.1.0beta1
Lukas Reschke пре 8 година
родитељ
комит
676041ba7e

+ 12
- 1
lib/private/files/storage/wrapper/encryption.php Прегледај датотеку

@@ -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

+ 42
- 0
tests/lib/files/storage/wrapper/encryption.php Прегледај датотеку

@@ -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…
Откажи
Сачувај