Merge pull request #39707 from nextcloud/bugfix/39706/local-ext-storage-unavailable-mode

This commit is contained in:
Simon L 2023-09-04 12:05:36 +02:00 committed by GitHub
commit 489a57e9a3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 0 deletions

View file

@ -26,8 +26,10 @@ namespace OCA\Files_External\Lib\Backend;
use OCA\Files_External\Lib\Auth\AuthMechanism;
use OCA\Files_External\Lib\Auth\NullMechanism;
use OCA\Files_External\Lib\DefinitionParameter;
use OCA\Files_External\Lib\StorageConfig;
use OCA\Files_External\Service\BackendService;
use OCP\IL10N;
use OCP\IUser;
class Local extends Backend {
public function __construct(IL10N $l, NullMechanism $legacyAuth) {
@ -45,4 +47,8 @@ class Local extends Backend {
->setLegacyAuthMechanism($legacyAuth)
;
}
public function manipulateStorageConfig(StorageConfig &$storage, IUser $user = null): void {
$storage->setBackendOption('isExternal', true);
}
}

View file

@ -51,6 +51,7 @@ use OCP\Files\ForbiddenException;
use OCP\Files\GenericFileException;
use OCP\Files\IMimeTypeDetector;
use OCP\Files\Storage\IStorage;
use OCP\Files\StorageNotAvailableException;
use OCP\IConfig;
use OCP\Util;
use Psr\Log\LoggerInterface;
@ -95,6 +96,12 @@ class Local extends \OC\Files\Storage\Common {
// support Write-Once-Read-Many file systems
$this->unlinkOnTruncate = $this->config->getSystemValueBool('localstorage.unlink_on_truncate', false);
if (isset($arguments['isExternal']) && $arguments['isExternal'] && !$this->stat('')) {
// data dir not accessible or available, can happen when using an external storage of type Local
// on an unmounted system mount point
throw new StorageNotAvailableException('Local storage path does not exist "' . $this->getSourcePath('') . '"');
}
}
public function __destruct() {

View file

@ -139,4 +139,15 @@ class LocalTest extends Storage {
umask($oldMask);
$this->assertTrue($this->instance->isUpdatable('test.txt'));
}
public function testUnavailableExternal() {
$this->expectException(\OCP\Files\StorageNotAvailableException::class);
$this->instance = new \OC\Files\Storage\Local(['datadir' => $this->tmpDir . '/unexist', 'isExternal' => true]);
}
public function testUnavailableNonExternal() {
$this->instance = new \OC\Files\Storage\Local(['datadir' => $this->tmpDir . '/unexist']);
// no exception thrown
$this->assertNotNull($this->instance);
}
}