Skip to content

Commit

Permalink
Merge pull request #24966 from nextcloud/jknockaert-patch-1
Browse files Browse the repository at this point in the history
avoid fread on directories and unencrypted files
  • Loading branch information
LukasReschke authored Apr 6, 2021
2 parents 2056b76 + 40fde94 commit 4b4971a
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 17 deletions.
25 changes: 12 additions & 13 deletions lib/private/Files/Storage/Wrapper/Encryption.php
Original file line number Diff line number Diff line change
Expand Up @@ -925,21 +925,20 @@ protected function getHeader($path) {
$path = $realFile;
}

$firstBlock = $this->readFirstBlock($path);
$result = $this->parseRawHeader($firstBlock);
$result = [];

// first check if it is an encrypted file at all
// We would do query to filecache only if we know that entry in filecache exists

$info = $this->getCache()->get($path);
if (isset($info['encrypted']) && $info['encrypted'] === true) {
$firstBlock = $this->readFirstBlock($path);
$result = $this->parseRawHeader($firstBlock);

// if the header doesn't contain a encryption module we check if it is a
// legacy file. If true, we add the default encryption module
if (!isset($result[Util::HEADER_ENCRYPTION_MODULE_KEY])) {
if (!empty($result)) {
// if the header doesn't contain a encryption module we check if it is a
// legacy file. If true, we add the default encryption module
if (!isset($result[Util::HEADER_ENCRYPTION_MODULE_KEY]) && (!empty($result) || $exists)) {
$result[Util::HEADER_ENCRYPTION_MODULE_KEY] = 'OC_DEFAULT_MODULE';
} elseif ($exists) {
// if the header was empty we have to check first if it is a encrypted file at all
// We would do query to filecache only if we know that entry in filecache exists
$info = $this->getCache()->get($path);
if (isset($info['encrypted']) && $info['encrypted'] === true) {
$result[Util::HEADER_ENCRYPTION_MODULE_KEY] = 'OC_DEFAULT_MODULE';
}
}
}

Expand Down
18 changes: 14 additions & 4 deletions tests/lib/Files/Storage/Wrapper/EncryptionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,14 @@ public function testGetHeader($path, $strippedPathExists, $strippedPath) {
$this->arrayCache
]
)->getMock();

$cache = $this->getMockBuilder('\OC\Files\Cache\Cache')
->disableOriginalConstructor()->getMock();
$cache->expects($this->any())
->method('get')
->willReturnCallback(function ($path) {
return ['encrypted' => true, 'path' => $path];
});

$instance = $this->getMockBuilder('\OC\Files\Storage\Wrapper\Encryption')
->setConstructorArgs(
Expand All @@ -597,9 +605,11 @@ public function testGetHeader($path, $strippedPathExists, $strippedPath) {
$this->encryptionManager, $util, $this->logger, $this->file, null, $this->keyStore, $this->update, $this->mountManager, $this->arrayCache
]
)
->setMethods(['readFirstBlock', 'parseRawHeader'])
->setMethods(['getCache','readFirstBlock', 'parseRawHeader'])
->getMock();


$instance->expects($this->once())->method('getCache')->willReturn($cache);

$instance->expects($this->once())->method(('parseRawHeader'))
->willReturn([Util::HEADER_ENCRYPTION_MODULE_KEY => 'OC_DEFAULT_MODULE']);

Expand Down Expand Up @@ -677,8 +687,8 @@ public function testGetHeaderAddLegacyModule($header, $isEncrypted, $exists, $ex
->setMethods(['readFirstBlock', 'parseRawHeader', 'getCache'])
->getMock();

$instance->expects($this->once())->method(('parseRawHeader'))->willReturn($header);
$instance->expects($this->any())->method('getCache')->willReturn($cache);
$instance->expects($this->any())->method(('parseRawHeader'))->willReturn($header);
$instance->expects($this->once())->method('getCache')->willReturn($cache);

$result = $this->invokePrivate($instance, 'getHeader', ['test.txt']);
$this->assertSameSize($expected, $result);
Expand Down

0 comments on commit 4b4971a

Please sign in to comment.