fix reading newly written encrypted files before their cache entry is written

Signed-off-by: Robin Appelman <robin@icewind.nl>
pull/34724/head
Robin Appelman 4 years ago
parent 8434259b1b
commit e9b87c73fa
No known key found for this signature in database
GPG Key ID: 42B69D8A64526EFB
  1. 16
      lib/private/Files/Storage/Wrapper/Encryption.php

@ -45,6 +45,7 @@ use OC\Files\Mount\Manager;
use OC\Files\ObjectStore\ObjectStoreStorage;
use OC\Files\Storage\LocalTempFileTrait;
use OC\Memcache\ArrayCache;
use OCP\Cache\CappedMemoryCache;
use OCP\Encryption\Exceptions\GenericEncryptionException;
use OCP\Encryption\IFile;
use OCP\Encryption\IManager;
@ -95,6 +96,9 @@ class Encryption extends Wrapper {
/** @var ArrayCache */
private $arrayCache;
/** @var CappedMemoryCache<bool> */
private CappedMemoryCache $encryptedPaths;
/**
* @param array $parameters
*/
@ -122,6 +126,7 @@ class Encryption extends Wrapper {
$this->update = $update;
$this->mountManager = $mountManager;
$this->arrayCache = $arrayCache;
$this->encryptedPaths = new CappedMemoryCache();
parent::__construct($parameters);
}
@ -461,6 +466,7 @@ class Encryption extends Wrapper {
}
if ($shouldEncrypt === true && $encryptionModule !== null) {
$this->encryptedPaths->set($this->util->stripPartialFileExtension($path), true);
$headerSize = $this->getHeaderSize($path);
$source = $this->storage->fopen($path, $mode);
if (!is_resource($source)) {
@ -970,11 +976,13 @@ class Encryption extends Wrapper {
$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
$isEncrypted = $this->encryptedPaths->get($realFile);
if (is_null($isEncrypted)) {
$info = $this->getCache()->get($path);
$isEncrypted = isset($info['encrypted']) && $info['encrypted'] === true;
}
$info = $this->getCache()->get($path);
if (isset($info['encrypted']) && $info['encrypted'] === true) {
if ($isEncrypted) {
$firstBlock = $this->readFirstBlock($path);
$result = $this->parseRawHeader($firstBlock);

Loading…
Cancel
Save