Merge pull request #13717 from owncloud/storage-donotwrapnullstorage
Prevent wrapping null storage
This commit is contained in:
commit
752b94d363
|
@ -41,6 +41,14 @@ class MountPoint implements IMountPoint {
|
||||||
*/
|
*/
|
||||||
private $loader;
|
private $loader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specified whether the storage is invalid after failing to
|
||||||
|
* instantiate it.
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private $invalidStorage = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string|\OC\Files\Storage\Storage $storage
|
* @param string|\OC\Files\Storage\Storage $storage
|
||||||
* @param string $mountpoint
|
* @param string $mountpoint
|
||||||
|
@ -99,10 +107,15 @@ class MountPoint implements IMountPoint {
|
||||||
* @return \OC\Files\Storage\Storage
|
* @return \OC\Files\Storage\Storage
|
||||||
*/
|
*/
|
||||||
private function createStorage() {
|
private function createStorage() {
|
||||||
|
if ($this->invalidStorage) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
if (class_exists($this->class)) {
|
if (class_exists($this->class)) {
|
||||||
try {
|
try {
|
||||||
return $this->loader->getInstance($this->mountPoint, $this->class, $this->arguments);
|
return $this->loader->getInstance($this->mountPoint, $this->class, $this->arguments);
|
||||||
} catch (\Exception $exception) {
|
} catch (\Exception $exception) {
|
||||||
|
$this->invalidStorage = true;
|
||||||
if ($this->mountPoint === '/') {
|
if ($this->mountPoint === '/') {
|
||||||
// the root storage could not be initialized, show the user!
|
// the root storage could not be initialized, show the user!
|
||||||
throw new \Exception('The root storage could not be initialized. Please contact your local administrator.', $exception->getCode(), $exception);
|
throw new \Exception('The root storage could not be initialized. Please contact your local administrator.', $exception->getCode(), $exception);
|
||||||
|
@ -113,6 +126,7 @@ class MountPoint implements IMountPoint {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
\OC_Log::write('core', 'storage backend ' . $this->class . ' not found', \OC_Log::ERROR);
|
\OC_Log::write('core', 'storage backend ' . $this->class . ' not found', \OC_Log::ERROR);
|
||||||
|
$this->invalidStorage = true;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -137,6 +151,7 @@ class MountPoint implements IMountPoint {
|
||||||
if (is_null($storage)) {
|
if (is_null($storage)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->storage = $storage;
|
$this->storage = $storage;
|
||||||
}
|
}
|
||||||
$this->storageId = $this->storage->getId();
|
$this->storageId = $this->storage->getId();
|
||||||
|
@ -177,7 +192,11 @@ class MountPoint implements IMountPoint {
|
||||||
* @param callable $wrapper
|
* @param callable $wrapper
|
||||||
*/
|
*/
|
||||||
public function wrapStorage($wrapper) {
|
public function wrapStorage($wrapper) {
|
||||||
$this->storage = $wrapper($this->mountPoint, $this->getStorage());
|
$storage = $this->getStorage();
|
||||||
|
// storage can be null if it couldn't be initialized
|
||||||
|
if ($storage != null) {
|
||||||
|
$this->storage = $wrapper($this->mountPoint, $storage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com>
|
||||||
|
* This file is licensed under the Affero General Public License version 3 or
|
||||||
|
* later.
|
||||||
|
* See the COPYING-README file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Test\Files\Mount;
|
||||||
|
|
||||||
|
class MountPoint extends \Test\TestCase {
|
||||||
|
|
||||||
|
public function testGetStorage() {
|
||||||
|
$storage = $this->getMock('\OCP\Files\Storage');
|
||||||
|
$storage->expects($this->once())
|
||||||
|
->method('getId')
|
||||||
|
->will($this->returnValue(123));
|
||||||
|
|
||||||
|
$loader = $this->getMock('\OCP\Files\Storage\IStorageFactory');
|
||||||
|
$loader->expects($this->once())
|
||||||
|
->method('getInstance')
|
||||||
|
->will($this->returnValue($storage));
|
||||||
|
|
||||||
|
$mountPoint = new \OC\Files\Mount\MountPoint(
|
||||||
|
// just use this because a real class is needed
|
||||||
|
'\Test\Files\Mount\MountPoint',
|
||||||
|
'/mountpoint',
|
||||||
|
null,
|
||||||
|
$loader
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals($storage, $mountPoint->getStorage());
|
||||||
|
$this->assertEquals(123, $mountPoint->getStorageId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInvalidStorage() {
|
||||||
|
$loader = $this->getMock('\OCP\Files\Storage\IStorageFactory');
|
||||||
|
$loader->expects($this->once())
|
||||||
|
->method('getInstance')
|
||||||
|
->will($this->throwException(new \Exception('Test storage init exception')));
|
||||||
|
|
||||||
|
$called = false;
|
||||||
|
$wrapper = function($mountPoint, $storage) use ($called) {
|
||||||
|
$called = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
$mountPoint = new \OC\Files\Mount\MountPoint(
|
||||||
|
// just use this because a real class is needed
|
||||||
|
'\Test\Files\Mount\MountPoint',
|
||||||
|
'/mountpoint',
|
||||||
|
null,
|
||||||
|
$loader
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertNull($mountPoint->getStorage());
|
||||||
|
// call it again to make sure the init code only ran once
|
||||||
|
$this->assertNull($mountPoint->getStorage());
|
||||||
|
|
||||||
|
$this->assertNull($mountPoint->getStorageId());
|
||||||
|
|
||||||
|
// wrapping doesn't fail
|
||||||
|
$mountPoint->wrapStorage($wrapper);
|
||||||
|
|
||||||
|
$this->assertNull($mountPoint->getStorage());
|
||||||
|
|
||||||
|
// storage wrapper never called
|
||||||
|
$this->assertFalse($called);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue