]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix: Validate that we have a proper distributed cache configured 41354/head
authorJulius Härtl <jus@bitgrid.net>
Thu, 9 Nov 2023 10:08:11 +0000 (11:08 +0100)
committerJulius Härtl <jus@bitgrid.net>
Thu, 9 Nov 2023 10:08:11 +0000 (11:08 +0100)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
apps/dav/lib/Upload/ChunkingV2Plugin.php

index 97ae51fbe380b8013ed3eb3b3a13e1b676fed5f8..29017155d458e5767575c633ee62d4c259933c7d 100644 (file)
@@ -30,6 +30,8 @@ use InvalidArgumentException;
 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\Storage\IChunkedFileWrite;
 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 @@ class ChunkingV2Plugin extends ServerPlugin {
         * @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 @@ class ChunkingV2Plugin extends ServerPlugin {
 
                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.');
                        }
                }
        }