From f81aa8041dc22528be7d3022be39512610a8f8dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Thu, 9 Nov 2023 11:08:11 +0100 Subject: [PATCH] fix: Validate that we have a proper distributed cache configured MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- apps/dav/lib/Upload/ChunkingV2Plugin.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/dav/lib/Upload/ChunkingV2Plugin.php b/apps/dav/lib/Upload/ChunkingV2Plugin.php index 97ae51fbe380b..29017155d458e 100644 --- a/apps/dav/lib/Upload/ChunkingV2Plugin.php +++ b/apps/dav/lib/Upload/ChunkingV2Plugin.php @@ -30,6 +30,8 @@ use OC\Files\Filesystem; use OC\Files\ObjectStore\ObjectStoreStorage; use OC\Files\View; +use OC\Memcache\Memcached; +use OC\Memcache\Redis; use OC_Hook; use OCA\DAV\Connector\Sabre\Directory; use OCA\DAV\Connector\Sabre\File; @@ -40,6 +42,7 @@ use OCP\Files\StorageInvalidException; use OCP\ICache; use OCP\ICacheFactory; +use OCP\IConfig; use OCP\Lock\ILockingProvider; use Sabre\DAV\Exception\BadRequest; use Sabre\DAV\Exception\InsufficientStorage; @@ -272,6 +275,11 @@ public function beforeDelete(RequestInterface $request, ResponseInterface $respo * @throws StorageInvalidException */ private function checkPrerequisites(bool $checkUploadMetadata = true): void { + $distributedCacheConfig = \OCP\Server::get(IConfig::class)->getSystemValue('memcache.distributed', null); + + if ($distributedCacheConfig === null || (!$this->cache instanceof Redis && !$this->cache instanceof Memcached)) { + throw new BadRequest('Skipping chunking v2 since no proper distributed cache is available'); + } if (!$this->uploadFolder instanceof UploadFolder || empty($this->server->httpRequest->getHeader(self::DESTINATION_HEADER))) { throw new BadRequest('Skipping chunked file writing as the destination header was not passed'); } @@ -284,7 +292,7 @@ private function checkPrerequisites(bool $checkUploadMetadata = true): void { if ($checkUploadMetadata) { if ($this->uploadId === null || $this->uploadPath === null) { - throw new PreconditionFailed('Missing metadata for chunked upload'); + throw new PreconditionFailed('Missing metadata for chunked upload. The distributed cache does not hold the information of previous requests.'); } } }