From 25e8efc04d2ded8524c0534e0ea6390087b1ba57 Mon Sep 17 00:00:00 2001 From: Erik van Velzen Date: Wed, 9 Mar 2022 10:35:24 +0100 Subject: [PATCH] AmazonS3: allow not implemented versioning In case the S3 implementation does not implement versioning, set it to false. Versioning was introduced in Nexcloud in commit 09ffac5e6dd5355c9aaf49c098942fa1e4fbed25 This is needed for compatibility with the Storj gateway. Signed-off-by: Erik van Velzen --- apps/files_external/lib/Lib/Storage/AmazonS3.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/apps/files_external/lib/Lib/Storage/AmazonS3.php b/apps/files_external/lib/Lib/Storage/AmazonS3.php index 2c01a803840d0..cfd78689fa4dc 100644 --- a/apps/files_external/lib/Lib/Storage/AmazonS3.php +++ b/apps/files_external/lib/Lib/Storage/AmazonS3.php @@ -732,8 +732,7 @@ public function versioningEnabled(): bool { if ($this->versioningEnabled === null) { $cached = $this->memCache->get('versioning-enabled::' . $this->getBucket()); if ($cached === null) { - $result = $this->getConnection()->getBucketVersioning(['Bucket' => $this->getBucket()]); - $this->versioningEnabled = $result->get('Status') === 'Enabled'; + $this->versioningEnabled = $this->getVersioningStatusFromBucket(); $this->memCache->set('versioning-enabled::' . $this->getBucket(), $this->versioningEnabled, 60); } else { $this->versioningEnabled = $cached; @@ -742,6 +741,19 @@ public function versioningEnabled(): bool { return $this->versioningEnabled; } + protected function getVersioningStatusFromBucket(): bool { + try { + $result = $this->getConnection()->getBucketVersioning(['Bucket' => $this->getBucket()]); + return $result->get('Status') === 'Enabled'; + } catch (S3Exception $s3Exception) { + // This is needed for compatibility with Storj gateway which does not support versioning yet + if ($s3Exception->getAwsErrorCode() === 'NotImplemented') { + return false; + } + throw $s3Exception; + } + } + public function hasUpdated($path, $time) { // for files we can get the proper mtime if ($path !== '' && $object = $this->headObject($path)) {