Merge pull request #12577 from owncloud/public-mount-api

Add a public api for apps to add mounts
This commit is contained in:
Lukas Reschke 2014-12-08 22:57:33 +01:00
commit 25a87d4058
26 changed files with 346 additions and 90 deletions

View File

@ -177,3 +177,5 @@ OC_Mount_Config::registerBackend('\OC\Files\Storage\SFTP', array(
'password' => '*'.$l->t('Password'), 'password' => '*'.$l->t('Password'),
'root' => '&'.$l->t('Root')))); 'root' => '&'.$l->t('Root'))));
$mountProvider = new \OCA\Files_External\Config\ConfigAdapter();
\OC::$server->getMountProviderCollection()->registerProvider($mountProvider);

View File

@ -103,22 +103,6 @@ class OC_Mount_Config {
* @param array $data * @param array $data
*/ */
public static function initMountPointsHook($data) { public static function initMountPointsHook($data) {
$mountPoints = self::getAbsoluteMountPoints($data['user']);
$loader = \OC\Files\Filesystem::getLoader();
$manager = \OC\Files\Filesystem::getMountManager();
foreach ($mountPoints as $mountPoint => $options) {
if (isset($options['options']['objectstore'])) {
$objectClass = $options['options']['objectstore']['class'];
$options['options']['objectstore'] = new $objectClass($options['options']['objectstore']);
}
if (isset($options['personal']) && $options['personal']) {
$mount = new \OCA\Files_External\PersonalMount($options['class'], $mountPoint, $options['options'], $loader);
} else{
$mount = new \OC\Files\Mount\Mount($options['class'], $mountPoint, $options['options'], $loader);
}
$manager->addMount($mount);
}
if ($data['user']) { if ($data['user']) {
$user = \OC::$server->getUserManager()->get($data['user']); $user = \OC::$server->getUserManager()->get($data['user']);
if (!$user) { if (!$user) {

View File

@ -0,0 +1,44 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCA\Files_External\Config;
use OC\Files\Mount\MountPoint;
use OCP\Files\Storage\IStorageFactory;
use OCA\Files_External\PersonalMount;
use OCP\Files\Config\IMountProvider;
use OCP\IUser;
/**
* Make the old files_external config work with the new public mount config api
*/
class ConfigAdapter implements IMountProvider {
/**
* Get all mountpoints applicable for the user
*
* @param \OCP\IUser $user
* @param \OCP\Files\Storage\IStorageFactory $loader
* @return \OCP\Files\Mount\IMountPoint[]
*/
public function getMountsForUser(IUser $user, IStorageFactory $loader) {
$mountPoints = \OC_Mount_Config::getAbsoluteMountPoints($user->getUID());
$mounts = array();
foreach ($mountPoints as $mountPoint => $options) {
if (isset($options['options']['objectstore'])) {
$objectClass = $options['options']['objectstore']['class'];
$options['options']['objectstore'] = new $objectClass($options['options']['objectstore']);
}
if (isset($options['personal']) && $options['personal']) {
$mounts[] = new PersonalMount($options['class'], $mountPoint, $options['options'], $loader);
} else {
$mounts[] = new MountPoint($options['class'], $mountPoint, $options['options'], $loader);
}
}
return $mounts;
}
}

View File

@ -8,13 +8,13 @@
namespace OCA\Files_External; namespace OCA\Files_External;
use OC\Files\Mount\Mount; use OC\Files\Mount\MountPoint;
use OC\Files\Mount\MoveableMount; use OC\Files\Mount\MoveableMount;
/** /**
* Person mount points can be moved by the user * Person mount points can be moved by the user
*/ */
class PersonalMount extends Mount implements MoveableMount { class PersonalMount extends MountPoint implements MoveableMount {
/** /**
* Move the mount point to $target * Move the mount point to $target
* *

View File

@ -24,7 +24,7 @@ class Manager {
private $mountManager; private $mountManager;
/** /**
* @var \OC\Files\Storage\Loader * @var \OC\Files\Storage\StorageFactory
*/ */
private $storageLoader; private $storageLoader;
@ -37,10 +37,10 @@ class Manager {
* @param \OCP\IDBConnection $connection * @param \OCP\IDBConnection $connection
* @param \OC\Files\Mount\Manager $mountManager * @param \OC\Files\Mount\Manager $mountManager
* @param \OC\User\Session $userSession * @param \OC\User\Session $userSession
* @param \OC\Files\Storage\Loader $storageLoader * @param \OC\Files\Storage\StorageFactory $storageLoader
*/ */
public function __construct(\OCP\IDBConnection $connection, \OC\Files\Mount\Manager $mountManager, public function __construct(\OCP\IDBConnection $connection, \OC\Files\Mount\Manager $mountManager,
\OC\Files\Storage\Loader $storageLoader, \OC\User\Session $userSession) { \OC\Files\Storage\StorageFactory $storageLoader, \OC\User\Session $userSession) {
$this->connection = $connection; $this->connection = $connection;
$this->mountManager = $mountManager; $this->mountManager = $mountManager;
$this->userSession = $userSession; $this->userSession = $userSession;

View File

@ -8,9 +8,10 @@
namespace OCA\Files_Sharing\External; namespace OCA\Files_Sharing\External;
use OC\Files\Mount\MountPoint;
use OC\Files\Mount\MoveableMount; use OC\Files\Mount\MoveableMount;
class Mount extends \OC\Files\Mount\Mount implements MoveableMount { class Mount extends MountPoint implements MoveableMount {
/** /**
* @var \OCA\Files_Sharing\External\Manager * @var \OCA\Files_Sharing\External\Manager
@ -22,7 +23,7 @@ class Mount extends \OC\Files\Mount\Mount implements MoveableMount {
* @param string $mountpoint * @param string $mountpoint
* @param array $options * @param array $options
* @param \OCA\Files_Sharing\External\Manager $manager * @param \OCA\Files_Sharing\External\Manager $manager
* @param \OC\Files\Storage\Loader $loader * @param \OC\Files\Storage\StorageFactory $loader
*/ */
public function __construct($storage, $mountpoint, $options, $manager, $loader = null) { public function __construct($storage, $mountpoint, $options, $manager, $loader = null) {
parent::__construct($storage, $mountpoint, $options, $loader); parent::__construct($storage, $mountpoint, $options, $loader);

View File

@ -8,13 +8,13 @@
namespace OCA\Files_Sharing; namespace OCA\Files_Sharing;
use OC\Files\Mount\Mount; use OC\Files\Mount\MountPoint;
use OC\Files\Mount\MoveableMount; use OC\Files\Mount\MoveableMount;
/** /**
* Shared mount points can be moved by the user * Shared mount points can be moved by the user
*/ */
class SharedMount extends Mount implements MoveableMount { class SharedMount extends MountPoint implements MoveableMount {
/** /**
* @var \OC\Files\Storage\Shared $storage * @var \OC\Files\Storage\Shared $storage
*/ */

View File

@ -0,0 +1,55 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC\Files\Config;
use OCP\Files\Config\IMountProviderCollection;
use OCP\Files\Config\IMountProvider;
use OCP\Files\Storage\IStorageFactory;
use OCP\IUser;
class MountProviderCollection implements IMountProviderCollection {
/**
* @var \OCP\Files\Config\IMountProvider[]
*/
private $providers = array();
/**
* @var \OCP\Files\Storage\IStorageFactory
*/
private $loader;
/**
* @param \OCP\Files\Storage\IStorageFactory $loader
*/
public function __construct(IStorageFactory $loader) {
$this->loader = $loader;
}
/**
* Get all configured mount points for the user
*
* @param \OCP\IUser $user
* @return \OCP\Files\Mount\IMountPoint[]
*/
public function getMountsForUser(IUser $user) {
$loader = $this->loader;
return array_reduce($this->providers, function ($mounts, IMountProvider $provider) use ($user, $loader) {
return array_merge($mounts, $provider->getMountsForUser($user, $loader));
}, array());
}
/**
* Add a provider for mount points
*
* @param \OCP\Files\Config\IMountProvider $provider
*/
public function registerProvider(IMountProvider $provider) {
$this->providers[] = $provider;
}
}

View File

@ -30,7 +30,7 @@
namespace OC\Files; namespace OC\Files;
use OC\Files\Storage\Loader; use OC\Files\Storage\StorageFactory;
class Filesystem { class Filesystem {
@ -165,7 +165,7 @@ class Filesystem {
const signal_param_users = 'users'; const signal_param_users = 'users';
/** /**
* @var \OC\Files\Storage\Loader $loader * @var \OC\Files\Storage\StorageFactory $loader
*/ */
private static $loader; private static $loader;
@ -183,7 +183,7 @@ class Filesystem {
public static function getLoader() { public static function getLoader() {
if (!self::$loader) { if (!self::$loader) {
self::$loader = new Loader(); self::$loader = new StorageFactory();
} }
return self::$loader; return self::$loader;
} }
@ -250,7 +250,7 @@ class Filesystem {
/** /**
* @param string $id * @param string $id
* @return Mount\Mount[] * @return Mount\MountPoint[]
*/ */
public static function getMountByStorageId($id) { public static function getMountByStorageId($id) {
if (!self::$mounts) { if (!self::$mounts) {
@ -261,7 +261,7 @@ class Filesystem {
/** /**
* @param int $id * @param int $id
* @return Mount\Mount[] * @return Mount\MountPoint[]
*/ */
public static function getMountByNumericId($id) { public static function getMountByNumericId($id) {
if (!self::$mounts) { if (!self::$mounts) {
@ -370,6 +370,11 @@ class Filesystem {
self::mountCacheDir($user); self::mountCacheDir($user);
// Chance to mount for other storages // Chance to mount for other storages
if($userObject) {
$mountConfigManager = \OC::$server->getMountProviderCollection();
$mounts = $mountConfigManager->getMountsForUser($userObject);
array_walk($mounts, array(self::$mounts, 'addMount'));
}
\OC_Hook::emit('OC_Filesystem', 'post_initMountPoints', array('user' => $user, 'user_dir' => $root)); \OC_Hook::emit('OC_Filesystem', 'post_initMountPoints', array('user' => $user, 'user_dir' => $root));
} }
@ -447,7 +452,7 @@ class Filesystem {
if (!self::$mounts) { if (!self::$mounts) {
\OC_Util::setupFS(); \OC_Util::setupFS();
} }
$mount = new Mount\Mount($class, $mountpoint, $arguments, self::getLoader()); $mount = new Mount\MountPoint($class, $mountpoint, $arguments, self::getLoader());
self::$mounts->addMount($mount); self::$mounts->addMount($mount);
} }

View File

@ -12,14 +12,14 @@ use \OC\Files\Filesystem;
class Manager { class Manager {
/** /**
* @var Mount[] * @var MountPoint[]
*/ */
private $mounts = array(); private $mounts = array();
/** /**
* @param Mount $mount * @param MountPoint $mount
*/ */
public function addMount(Mount $mount) { public function addMount(MountPoint $mount) {
$this->mounts[$mount->getMountPoint()] = $mount; $this->mounts[$mount->getMountPoint()] = $mount;
} }
@ -47,7 +47,7 @@ class Manager {
* Find the mount for $path * Find the mount for $path
* *
* @param string $path * @param string $path
* @return Mount * @return MountPoint
*/ */
public function find($path) { public function find($path) {
\OC_Util::setupFS(); \OC_Util::setupFS();
@ -75,7 +75,7 @@ class Manager {
* Find all mounts in $path * Find all mounts in $path
* *
* @param string $path * @param string $path
* @return Mount[] * @return MountPoint[]
*/ */
public function findIn($path) { public function findIn($path) {
\OC_Util::setupFS(); \OC_Util::setupFS();
@ -99,7 +99,7 @@ class Manager {
* Find mounts by storage id * Find mounts by storage id
* *
* @param string $id * @param string $id
* @return Mount[] * @return MountPoint[]
*/ */
public function findByStorageId($id) { public function findByStorageId($id) {
\OC_Util::setupFS(); \OC_Util::setupFS();
@ -116,7 +116,7 @@ class Manager {
} }
/** /**
* @return Mount[] * @return MountPoint[]
*/ */
public function getAll() { public function getAll() {
return $this->mounts; return $this->mounts;
@ -126,7 +126,7 @@ class Manager {
* Find mounts by numeric storage id * Find mounts by numeric storage id
* *
* @param int $id * @param int $id
* @return Mount[] * @return MountPoint[]
*/ */
public function findByNumericId($id) { public function findByNumericId($id) {
$storageId = \OC\Files\Cache\Storage::getStorageId($id); $storageId = \OC\Files\Cache\Storage::getStorageId($id);

View File

@ -9,10 +9,11 @@
namespace OC\Files\Mount; namespace OC\Files\Mount;
use \OC\Files\Filesystem; use \OC\Files\Filesystem;
use OC\Files\Storage\Loader; use OC\Files\Storage\StorageFactory;
use OC\Files\Storage\Storage; use OC\Files\Storage\Storage;
use OCP\Files\Mount\IMountPoint;
class Mount { class MountPoint implements IMountPoint {
/** /**
* @var \OC\Files\Storage\Storage $storage * @var \OC\Files\Storage\Storage $storage
*/ */
@ -23,7 +24,7 @@ class Mount {
protected $mountPoint; protected $mountPoint;
/** /**
* @var \OC\Files\Storage\Loader $loader * @var \OC\Files\Storage\StorageFactory $loader
*/ */
private $loader; private $loader;
@ -31,14 +32,14 @@ class Mount {
* @param string|\OC\Files\Storage\Storage $storage * @param string|\OC\Files\Storage\Storage $storage
* @param string $mountpoint * @param string $mountpoint
* @param array $arguments (optional)\ * @param array $arguments (optional)\
* @param \OC\Files\Storage\Loader $loader * @param \OCP\Files\Storage\IStorageFactory $loader
*/ */
public function __construct($storage, $mountpoint, $arguments = null, $loader = null) { public function __construct($storage, $mountpoint, $arguments = null, $loader = null) {
if (is_null($arguments)) { if (is_null($arguments)) {
$arguments = array(); $arguments = array();
} }
if (is_null($loader)) { if (is_null($loader)) {
$this->loader = new Loader(); $this->loader = new StorageFactory();
} else { } else {
$this->loader = $loader; $this->loader = $loader;
} }
@ -67,15 +68,6 @@ class Mount {
return $this->mountPoint; return $this->mountPoint;
} }
/**
* get name of the mount point
*
* @return string
*/
public function getMountPointName() {
return basename(rtrim($this->mountPoint, '/'));
}
/** /**
* @param string $mountPoint new mount point * @param string $mountPoint new mount point
*/ */
@ -91,7 +83,7 @@ class Mount {
private function createStorage() { private function createStorage() {
if (class_exists($this->class)) { if (class_exists($this->class)) {
try { try {
return $this->loader->load($this->mountPoint, $this->class, $this->arguments); return $this->loader->getInstance($this->mountPoint, $this->class, $this->arguments);
} catch (\Exception $exception) { } catch (\Exception $exception) {
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!

View File

@ -301,7 +301,7 @@ class Folder extends Node implements \OCP\Files\Folder {
$nodes = array(); $nodes = array();
foreach ($mounts as $mount) { foreach ($mounts as $mount) {
/** /**
* @var \OC\Files\Mount\Mount $mount * @var \OC\Files\Mount\MountPoint $mount
*/ */
if ($mount->getStorage()) { if ($mount->getStorage()) {
$cache = $mount->getStorage()->getCache(); $cache = $mount->getStorage()->getCache();

View File

@ -10,7 +10,7 @@ namespace OC\Files\Node;
use OC\Files\Cache\Cache; use OC\Files\Cache\Cache;
use OC\Files\Mount\Manager; use OC\Files\Mount\Manager;
use OC\Files\Mount\Mount; use OC\Files\Mount\MountPoint;
use OCP\Files\NotFoundException; use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException; use OCP\Files\NotPermittedException;
use OC\Hooks\Emitter; use OC\Hooks\Emitter;
@ -106,13 +106,13 @@ class Root extends Folder implements Emitter {
* @param array $arguments * @param array $arguments
*/ */
public function mount($storage, $mountPoint, $arguments = array()) { public function mount($storage, $mountPoint, $arguments = array()) {
$mount = new Mount($storage, $mountPoint, $arguments); $mount = new MountPoint($storage, $mountPoint, $arguments);
$this->mountManager->addMount($mount); $this->mountManager->addMount($mount);
} }
/** /**
* @param string $mountPoint * @param string $mountPoint
* @return \OC\Files\Mount\Mount * @return \OC\Files\Mount\MountPoint
*/ */
public function getMount($mountPoint) { public function getMount($mountPoint) {
return $this->mountManager->find($mountPoint); return $this->mountManager->find($mountPoint);
@ -120,7 +120,7 @@ class Root extends Folder implements Emitter {
/** /**
* @param string $mountPoint * @param string $mountPoint
* @return \OC\Files\Mount\Mount[] * @return \OC\Files\Mount\MountPoint[]
*/ */
public function getMountsIn($mountPoint) { public function getMountsIn($mountPoint) {
return $this->mountManager->findIn($mountPoint); return $this->mountManager->findIn($mountPoint);
@ -128,7 +128,7 @@ class Root extends Folder implements Emitter {
/** /**
* @param string $storageId * @param string $storageId
* @return \OC\Files\Mount\Mount[] * @return \OC\Files\Mount\MountPoint[]
*/ */
public function getMountByStorageId($storageId) { public function getMountByStorageId($storageId) {
return $this->mountManager->findByStorageId($storageId); return $this->mountManager->findByStorageId($storageId);
@ -136,14 +136,14 @@ class Root extends Folder implements Emitter {
/** /**
* @param int $numericId * @param int $numericId
* @return Mount[] * @return MountPoint[]
*/ */
public function getMountByNumericStorageId($numericId) { public function getMountByNumericStorageId($numericId) {
return $this->mountManager->findByNumericId($numericId); return $this->mountManager->findByNumericId($numericId);
} }
/** /**
* @param \OC\Files\Mount\Mount $mount * @param \OC\Files\Mount\MountPoint $mount
*/ */
public function unMount($mount) { public function unMount($mount) {
$this->mountManager->remove($mount); $this->mountManager->remove($mount);

View File

@ -8,7 +8,9 @@
namespace OC\Files\Storage; namespace OC\Files\Storage;
class Loader { use OCP\Files\Storage\IStorageFactory;
class StorageFactory implements IStorageFactory {
/** /**
* @var callable[] $storageWrappers * @var callable[] $storageWrappers
*/ */
@ -19,6 +21,7 @@ class Loader {
* *
* $callback should be a function of type (string $mountPoint, Storage $storage) => Storage * $callback should be a function of type (string $mountPoint, Storage $storage) => Storage
* *
* @param string $wrapperName
* @param callable $callback * @param callable $callback
*/ */
public function addStorageWrapper($wrapperName, $callback) { public function addStorageWrapper($wrapperName, $callback) {
@ -26,15 +29,21 @@ class Loader {
} }
/** /**
* Create an instance of a storage and apply the registered storage wrappers
*
* @param string|boolean $mountPoint * @param string|boolean $mountPoint
* @param string $class * @param string $class
* @param array $arguments
* @return \OCP\Files\Storage
*/ */
public function load($mountPoint, $class, $arguments) { public function getInstance($mountPoint, $class, $arguments) {
return $this->wrap($mountPoint, new $class($arguments)); return $this->wrap($mountPoint, new $class($arguments));
} }
/** /**
* @param string|boolean $mountPoint * @param string|boolean $mountPoint
* @param \OCP\Files\Storage $storage
* @return \OCP\Files\Storage
*/ */
public function wrap($mountPoint, $storage) { public function wrap($mountPoint, $storage) {
foreach ($this->storageWrappers as $wrapper) { foreach ($this->storageWrappers as $wrapper) {

View File

@ -53,7 +53,7 @@ class Scanner extends PublicEmitter {
* get all storages for $dir * get all storages for $dir
* *
* @param string $dir * @param string $dir
* @return \OC\Files\Mount\Mount[] * @return \OC\Files\Mount\MountPoint[]
*/ */
protected function getMounts($dir) { protected function getMounts($dir) {
//TODO: move to the node based fileapi once that's done //TODO: move to the node based fileapi once that's done
@ -72,7 +72,7 @@ class Scanner extends PublicEmitter {
/** /**
* attach listeners to the scanner * attach listeners to the scanner
* *
* @param \OC\Files\Mount\Mount $mount * @param \OC\Files\Mount\MountPoint $mount
*/ */
protected function attachListener($mount) { protected function attachListener($mount) {
$scanner = $mount->getStorage()->getScanner(); $scanner = $mount->getStorage()->getScanner();

View File

@ -465,7 +465,7 @@ class View {
if ($internalPath1 === '' and $mount instanceof MoveableMount) { if ($internalPath1 === '' and $mount instanceof MoveableMount) {
if ($this->isTargetAllowed($absolutePath2)) { if ($this->isTargetAllowed($absolutePath2)) {
/** /**
* @var \OC\Files\Mount\Mount | \OC\Files\Mount\MoveableMount $mount * @var \OC\Files\Mount\MountPoint | \OC\Files\Mount\MoveableMount $mount
*/ */
$sourceMountPoint = $mount->getMountPoint(); $sourceMountPoint = $mount->getMountPoint();
$result = $mount->moveMount($absolutePath2); $result = $mount->moveMount($absolutePath2);
@ -1227,7 +1227,7 @@ class View {
$mounts = array_reverse($mounts); $mounts = array_reverse($mounts);
foreach ($mounts as $mount) { foreach ($mounts as $mount) {
/** /**
* @var \OC\Files\Mount\Mount $mount * @var \OC\Files\Mount\MountPoint $mount
*/ */
if ($mount->getStorage()) { if ($mount->getStorage()) {
$cache = $mount->getStorage()->getCache(); $cache = $mount->getStorage()->getCache();

View File

@ -9,6 +9,7 @@ use OC\Cache\UserCache;
use OC\Diagnostics\NullQueryLogger; use OC\Diagnostics\NullQueryLogger;
use OC\Diagnostics\EventLogger; use OC\Diagnostics\EventLogger;
use OC\Diagnostics\QueryLogger; use OC\Diagnostics\QueryLogger;
use OC\Files\Config\StorageManager;
use OC\Security\CertificateManager; use OC\Security\CertificateManager;
use OC\DB\ConnectionWrapper; use OC\DB\ConnectionWrapper;
use OC\Files\Node\Root; use OC\Files\Node\Root;
@ -268,6 +269,10 @@ class Server extends SimpleContainer implements IServerContainer {
$groupManager = $c->getGroupManager(); $groupManager = $c->getGroupManager();
return new \OC\App\AppManager($userSession, $appConfig, $groupManager); return new \OC\App\AppManager($userSession, $appConfig, $groupManager);
}); });
$this->registerService('MountConfigManager', function () {
$loader = \OC\Files\Filesystem::getLoader();
return new \OC\Files\Config\MountProviderCollection($loader);
});
} }
/** /**
@ -665,4 +670,11 @@ class Server extends SimpleContainer implements IServerContainer {
function getWebRoot() { function getWebRoot() {
return $this->webRoot; return $this->webRoot;
} }
/**
* @return \OCP\Files\Config\IMountProviderCollection
*/
function getMountProviderCollection(){
return $this->query('MountConfigManager');
}
} }

View File

@ -0,0 +1,26 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCP\Files\Config;
use OCP\Files\Storage\IStorageFactory;
use OCP\IUser;
/**
* Provides
*/
interface IMountProvider {
/**
* Get all mountpoints applicable for the user
*
* @param \OCP\IUser $user
* @param \OCP\Files\Storage\IStorageFactory $loader
* @return \OCP\Files\Mount\IMountPoint[]
*/
public function getMountsForUser(IUser $user, IStorageFactory $loader);
}

View File

@ -0,0 +1,31 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCP\Files\Config;
use OCP\IUser;
/**
* Manages the different mount providers
*/
interface IMountProviderCollection {
/**
* Get all configured mount points for the user
*
* @param \OCP\IUser $user
* @return \OCP\Files\Mount\IMountPoint[]
*/
public function getMountsForUser(IUser $user);
/**
* Add a provider for mount points
*
* @param \OCP\Files\Config\IMountProvider $provider
*/
public function registerProvider(IMountProvider $provider);
}

View File

@ -0,0 +1,58 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCP\Files\Mount;
/**
* A storage mounted to folder on the filesystem
*/
interface IMountPoint {
/**
* get complete path to the mount point
*
* @return string
*/
public function getMountPoint();
/**
* Set the mountpoint
*
* @param string $mountPoint new mount point
*/
public function setMountPoint($mountPoint);
/**
* Get the storage that is mounted
*
* @return \OC\Files\Storage\Storage
*/
public function getStorage();
/**
* Get the id of the storages
*
* @return string
*/
public function getStorageId();
/**
* Get the path relative to the mountpoint
*
* @param string $path absolute path to a file or folder
* @return string
*/
public function getInternalPath($path);
/**
* Apply a storage wrapper to the mounted storage
*
* @param callable $wrapper
*/
public function wrapStorage($wrapper);
}

View File

@ -0,0 +1,32 @@
<?php
/**
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCP\Files\Storage;
/**
* Creates storage instances and manages and applies storage wrappers
*/
interface IStorageFactory {
/**
* allow modifier storage behaviour by adding wrappers around storages
*
* $callback should be a function of type (string $mountPoint, Storage $storage) => Storage
*
* @param string $wrapperName
* @param callable $callback
*/
public function addStorageWrapper($wrapperName, $callback);
/**
* @param string|boolean $mountPoint
* @param string $class
* @param array $arguments
* @return \OCP\Files\Storage
*/
public function getInstance($mountPoint, $class, $arguments);
}

View File

@ -305,4 +305,9 @@ interface IServerContainer {
* @return string * @return string
*/ */
function getWebRoot(); function getWebRoot();
/**
* @return \OCP\Files\Config\IMountProviderCollection
*/
function getMountProviderCollection();
} }

View File

@ -30,33 +30,33 @@ class Manager extends \Test\TestCase {
public function testFind() { public function testFind() {
$this->assertNull($this->manager->find('/')); $this->assertNull($this->manager->find('/'));
$rootMount = new \OC\Files\Mount\Mount(new Temporary(array()), '/'); $rootMount = new \OC\Files\Mount\MountPoint(new Temporary(array()), '/');
$this->manager->addMount($rootMount); $this->manager->addMount($rootMount);
$this->assertEquals($rootMount, $this->manager->find('/')); $this->assertEquals($rootMount, $this->manager->find('/'));
$this->assertEquals($rootMount, $this->manager->find('/foo/bar')); $this->assertEquals($rootMount, $this->manager->find('/foo/bar'));
$storage = new Temporary(array()); $storage = new Temporary(array());
$mount1 = new \OC\Files\Mount\Mount($storage, '/foo'); $mount1 = new \OC\Files\Mount\MountPoint($storage, '/foo');
$this->manager->addMount($mount1); $this->manager->addMount($mount1);
$this->assertEquals($rootMount, $this->manager->find('/')); $this->assertEquals($rootMount, $this->manager->find('/'));
$this->assertEquals($mount1, $this->manager->find('/foo/bar')); $this->assertEquals($mount1, $this->manager->find('/foo/bar'));
$this->assertEquals(1, count($this->manager->findIn('/'))); $this->assertEquals(1, count($this->manager->findIn('/')));
$mount2 = new \OC\Files\Mount\Mount(new Temporary(array()), '/bar'); $mount2 = new \OC\Files\Mount\MountPoint(new Temporary(array()), '/bar');
$this->manager->addMount($mount2); $this->manager->addMount($mount2);
$this->assertEquals(2, count($this->manager->findIn('/'))); $this->assertEquals(2, count($this->manager->findIn('/')));
$id = $mount1->getStorageId(); $id = $mount1->getStorageId();
$this->assertEquals(array($mount1), $this->manager->findByStorageId($id)); $this->assertEquals(array($mount1), $this->manager->findByStorageId($id));
$mount3 = new \OC\Files\Mount\Mount($storage, '/foo/bar'); $mount3 = new \OC\Files\Mount\MountPoint($storage, '/foo/bar');
$this->manager->addMount($mount3); $this->manager->addMount($mount3);
$this->assertEquals(array($mount1, $mount3), $this->manager->findByStorageId($id)); $this->assertEquals(array($mount1, $mount3), $this->manager->findByStorageId($id));
} }
public function testLong() { public function testLong() {
$storage = new LongId(array()); $storage = new LongId(array());
$mount = new \OC\Files\Mount\Mount($storage, '/foo'); $mount = new \OC\Files\Mount\MountPoint($storage, '/foo');
$this->manager->addMount($mount); $this->manager->addMount($mount);
$id = $mount->getStorageId(); $id = $mount->getStorageId();

View File

@ -9,7 +9,7 @@
namespace Test\Files\Mount; namespace Test\Files\Mount;
use OC\Files\Storage\Loader; use OC\Files\Storage\StorageFactory;
use OC\Files\Storage\Wrapper\Wrapper; use OC\Files\Storage\Wrapper\Wrapper;
class Mount extends \Test\TestCase { class Mount extends \Test\TestCase {
@ -17,12 +17,12 @@ class Mount extends \Test\TestCase {
$storage = $this->getMockBuilder('\OC\Files\Storage\Temporary') $storage = $this->getMockBuilder('\OC\Files\Storage\Temporary')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$mount = new \OC\Files\Mount\Mount($storage, '/foo'); $mount = new \OC\Files\Mount\MountPoint($storage, '/foo');
$this->assertInstanceOf('\OC\Files\Storage\Temporary', $mount->getStorage()); $this->assertInstanceOf('\OC\Files\Storage\Temporary', $mount->getStorage());
} }
public function testFromStorageClassname() { public function testFromStorageClassname() {
$mount = new \OC\Files\Mount\Mount('\OC\Files\Storage\Temporary', '/foo'); $mount = new \OC\Files\Mount\MountPoint('\OC\Files\Storage\Temporary', '/foo');
$this->assertInstanceOf('\OC\Files\Storage\Temporary', $mount->getStorage()); $this->assertInstanceOf('\OC\Files\Storage\Temporary', $mount->getStorage());
} }
@ -34,13 +34,13 @@ class Mount extends \Test\TestCase {
return new Wrapper(array('storage' => $storage)); return new Wrapper(array('storage' => $storage));
}; };
$loader = new Loader(); $loader = new StorageFactory();
$loader->addStorageWrapper('test_wrapper', $wrapper); $loader->addStorageWrapper('test_wrapper', $wrapper);
$storage = $this->getMockBuilder('\OC\Files\Storage\Temporary') $storage = $this->getMockBuilder('\OC\Files\Storage\Temporary')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$mount = new \OC\Files\Mount\Mount($storage, '/foo', array(), $loader); $mount = new \OC\Files\Mount\MountPoint($storage, '/foo', array(), $loader);
$this->assertInstanceOf('\OC\Files\Storage\Wrapper\Wrapper', $mount->getStorage()); $this->assertInstanceOf('\OC\Files\Storage\Wrapper\Wrapper', $mount->getStorage());
} }
} }

View File

@ -10,7 +10,7 @@ namespace Test\Files\Node;
use OC\Files\Cache\Cache; use OC\Files\Cache\Cache;
use OC\Files\FileInfo; use OC\Files\FileInfo;
use OC\Files\Mount\Mount; use OC\Files\Mount\MountPoint;
use OC\Files\Node\Node; use OC\Files\Node\Node;
use OCP\Files\NotFoundException; use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException; use OCP\Files\NotPermittedException;
@ -419,7 +419,7 @@ class Folder extends \Test\TestCase {
$cache = $this->getMock('\OC\Files\Cache\Cache', array(), array('')); $cache = $this->getMock('\OC\Files\Cache\Cache', array(), array(''));
$subCache = $this->getMock('\OC\Files\Cache\Cache', array(), array('')); $subCache = $this->getMock('\OC\Files\Cache\Cache', array(), array(''));
$subStorage = $this->getMock('\OC\Files\Storage\Storage'); $subStorage = $this->getMock('\OC\Files\Storage\Storage');
$subMount = $this->getMock('\OC\Files\Mount\Mount', array(), array(null, '')); $subMount = $this->getMock('\OC\Files\Mount\MountPoint', array(), array(null, ''));
$subMount->expects($this->once()) $subMount->expects($this->once())
->method('getStorage') ->method('getStorage')
@ -487,7 +487,7 @@ class Folder extends \Test\TestCase {
->method('getUser') ->method('getUser')
->will($this->returnValue($this->user)); ->will($this->returnValue($this->user));
$storage = $this->getMock('\OC\Files\Storage\Storage'); $storage = $this->getMock('\OC\Files\Storage\Storage');
$mount = new Mount($storage, '/bar'); $mount = new MountPoint($storage, '/bar');
$cache = $this->getMock('\OC\Files\Cache\Cache', array(), array('')); $cache = $this->getMock('\OC\Files\Cache\Cache', array(), array(''));
$view->expects($this->once()) $view->expects($this->once())
@ -530,7 +530,7 @@ class Folder extends \Test\TestCase {
->method('getUser') ->method('getUser')
->will($this->returnValue($this->user)); ->will($this->returnValue($this->user));
$storage = $this->getMock('\OC\Files\Storage\Storage'); $storage = $this->getMock('\OC\Files\Storage\Storage');
$mount = new Mount($storage, '/bar'); $mount = new MountPoint($storage, '/bar');
$cache = $this->getMock('\OC\Files\Cache\Cache', array(), array('')); $cache = $this->getMock('\OC\Files\Cache\Cache', array(), array(''));
$storage->expects($this->once()) $storage->expects($this->once())
@ -568,8 +568,8 @@ class Folder extends \Test\TestCase {
->method('getUser') ->method('getUser')
->will($this->returnValue($this->user)); ->will($this->returnValue($this->user));
$storage = $this->getMock('\OC\Files\Storage\Storage'); $storage = $this->getMock('\OC\Files\Storage\Storage');
$mount1 = new Mount($storage, '/bar'); $mount1 = new MountPoint($storage, '/bar');
$mount2 = new Mount($storage, '/bar/foo/asd'); $mount2 = new MountPoint($storage, '/bar/foo/asd');
$cache = $this->getMock('\OC\Files\Cache\Cache', array(), array('')); $cache = $this->getMock('\OC\Files\Cache\Cache', array(), array(''));
$view->expects($this->any()) $view->expects($this->any())

View File

@ -9,17 +9,17 @@
namespace Test\Files\Utils; namespace Test\Files\Utils;
use OC\Files\Filesystem; use OC\Files\Filesystem;
use OC\Files\Mount\Mount; use OC\Files\Mount\MountPoint;
use OC\Files\Storage\Temporary; use OC\Files\Storage\Temporary;
class TestScanner extends \OC\Files\Utils\Scanner { class TestScanner extends \OC\Files\Utils\Scanner {
/** /**
* @var \OC\Files\Mount\Mount[] $mounts * @var \OC\Files\Mount\MountPoint[] $mounts
*/ */
private $mounts = array(); private $mounts = array();
/** /**
* @param \OC\Files\Mount\Mount $mount * @param \OC\Files\Mount\MountPoint $mount
*/ */
public function addMount($mount) { public function addMount($mount) {
$this->mounts[] = $mount; $this->mounts[] = $mount;
@ -56,7 +56,7 @@ class Scanner extends \Test\TestCase {
public function testReuseExistingRoot() { public function testReuseExistingRoot() {
$storage = new Temporary(array()); $storage = new Temporary(array());
$mount = new Mount($storage, ''); $mount = new MountPoint($storage, '');
Filesystem::getMountManager()->addMount($mount); Filesystem::getMountManager()->addMount($mount);
$cache = $storage->getCache(); $cache = $storage->getCache();
@ -78,7 +78,7 @@ class Scanner extends \Test\TestCase {
public function testReuseExistingFile() { public function testReuseExistingFile() {
$storage = new Temporary(array()); $storage = new Temporary(array());
$mount = new Mount($storage, ''); $mount = new MountPoint($storage, '');
Filesystem::getMountManager()->addMount($mount); Filesystem::getMountManager()->addMount($mount);
$cache = $storage->getCache(); $cache = $storage->getCache();
@ -105,7 +105,7 @@ class Scanner extends \Test\TestCase {
$propagator = $this->getMock('\OC\Files\Cache\ChangePropagator', array('propagateChanges'), array(), '', false); $propagator = $this->getMock('\OC\Files\Cache\ChangePropagator', array('propagateChanges'), array(), '', false);
$storage = new Temporary(array()); $storage = new Temporary(array());
$mount = new Mount($storage, '/foo'); $mount = new MountPoint($storage, '/foo');
Filesystem::getMountManager()->addMount($mount); Filesystem::getMountManager()->addMount($mount);
$cache = $storage->getCache(); $cache = $storage->getCache();