Commit 25a87d40 authored by Lukas Reschke's avatar Lukas Reschke
Browse files

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

Add a public api for apps to add mounts
parents f219f5a7 a369d781
......@@ -177,3 +177,5 @@ OC_Mount_Config::registerBackend('\OC\Files\Storage\SFTP', array(
'password' => '*'.$l->t('Password'),
'root' => '&'.$l->t('Root'))));
$mountProvider = new \OCA\Files_External\Config\ConfigAdapter();
\OC::$server->getMountProviderCollection()->registerProvider($mountProvider);
......@@ -103,22 +103,6 @@ class OC_Mount_Config {
* @param array $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']) {
$user = \OC::$server->getUserManager()->get($data['user']);
if (!$user) {
......
<?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;
}
}
......@@ -8,13 +8,13 @@
namespace OCA\Files_External;
use OC\Files\Mount\Mount;
use OC\Files\Mount\MountPoint;
use OC\Files\Mount\MoveableMount;
/**
* 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
*
......
......@@ -24,7 +24,7 @@ class Manager {
private $mountManager;
/**
* @var \OC\Files\Storage\Loader
* @var \OC\Files\Storage\StorageFactory
*/
private $storageLoader;
......@@ -37,10 +37,10 @@ class Manager {
* @param \OCP\IDBConnection $connection
* @param \OC\Files\Mount\Manager $mountManager
* @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,
\OC\Files\Storage\Loader $storageLoader, \OC\User\Session $userSession) {
\OC\Files\Storage\StorageFactory $storageLoader, \OC\User\Session $userSession) {
$this->connection = $connection;
$this->mountManager = $mountManager;
$this->userSession = $userSession;
......
......@@ -8,9 +8,10 @@
namespace OCA\Files_Sharing\External;
use OC\Files\Mount\MountPoint;
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
......@@ -22,7 +23,7 @@ class Mount extends \OC\Files\Mount\Mount implements MoveableMount {
* @param string $mountpoint
* @param array $options
* @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) {
parent::__construct($storage, $mountpoint, $options, $loader);
......
......@@ -8,13 +8,13 @@
namespace OCA\Files_Sharing;
use OC\Files\Mount\Mount;
use OC\Files\Mount\MountPoint;
use OC\Files\Mount\MoveableMount;
/**
* 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
*/
......
<?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;
}
}
......@@ -30,7 +30,7 @@
namespace OC\Files;
use OC\Files\Storage\Loader;
use OC\Files\Storage\StorageFactory;
class Filesystem {
......@@ -165,7 +165,7 @@ class Filesystem {
const signal_param_users = 'users';
/**
* @var \OC\Files\Storage\Loader $loader
* @var \OC\Files\Storage\StorageFactory $loader
*/
private static $loader;
......@@ -183,7 +183,7 @@ class Filesystem {
public static function getLoader() {
if (!self::$loader) {
self::$loader = new Loader();
self::$loader = new StorageFactory();
}
return self::$loader;
}
......@@ -250,7 +250,7 @@ class Filesystem {
/**
* @param string $id
* @return Mount\Mount[]
* @return Mount\MountPoint[]
*/
public static function getMountByStorageId($id) {
if (!self::$mounts) {
......@@ -261,7 +261,7 @@ class Filesystem {
/**
* @param int $id
* @return Mount\Mount[]
* @return Mount\MountPoint[]
*/
public static function getMountByNumericId($id) {
if (!self::$mounts) {
......@@ -370,6 +370,11 @@ class Filesystem {
self::mountCacheDir($user);
// 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));
}
......@@ -447,7 +452,7 @@ class Filesystem {
if (!self::$mounts) {
\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);
}
......
......@@ -12,14 +12,14 @@ use \OC\Files\Filesystem;
class Manager {
/**
* @var Mount[]
* @var MountPoint[]
*/
private $mounts = array();
/**
* @param Mount $mount
* @param MountPoint $mount
*/
public function addMount(Mount $mount) {
public function addMount(MountPoint $mount) {
$this->mounts[$mount->getMountPoint()] = $mount;
}
......@@ -47,7 +47,7 @@ class Manager {
* Find the mount for $path
*
* @param string $path
* @return Mount
* @return MountPoint
*/
public function find($path) {
\OC_Util::setupFS();
......@@ -75,7 +75,7 @@ class Manager {
* Find all mounts in $path
*
* @param string $path
* @return Mount[]
* @return MountPoint[]
*/
public function findIn($path) {
\OC_Util::setupFS();
......@@ -99,7 +99,7 @@ class Manager {
* Find mounts by storage id
*
* @param string $id
* @return Mount[]
* @return MountPoint[]
*/
public function findByStorageId($id) {
\OC_Util::setupFS();
......@@ -116,7 +116,7 @@ class Manager {
}
/**
* @return Mount[]
* @return MountPoint[]
*/
public function getAll() {
return $this->mounts;
......@@ -126,7 +126,7 @@ class Manager {
* Find mounts by numeric storage id
*
* @param int $id
* @return Mount[]
* @return MountPoint[]
*/
public function findByNumericId($id) {
$storageId = \OC\Files\Cache\Storage::getStorageId($id);
......
......@@ -9,10 +9,11 @@
namespace OC\Files\Mount;
use \OC\Files\Filesystem;
use OC\Files\Storage\Loader;
use OC\Files\Storage\StorageFactory;
use OC\Files\Storage\Storage;
use OCP\Files\Mount\IMountPoint;
class Mount {
class MountPoint implements IMountPoint {
/**
* @var \OC\Files\Storage\Storage $storage
*/
......@@ -23,7 +24,7 @@ class Mount {
protected $mountPoint;
/**
* @var \OC\Files\Storage\Loader $loader
* @var \OC\Files\Storage\StorageFactory $loader
*/
private $loader;
......@@ -31,14 +32,14 @@ class Mount {
* @param string|\OC\Files\Storage\Storage $storage
* @param string $mountpoint
* @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) {
if (is_null($arguments)) {
$arguments = array();
}
if (is_null($loader)) {
$this->loader = new Loader();
$this->loader = new StorageFactory();
} else {
$this->loader = $loader;
}
......@@ -67,15 +68,6 @@ class Mount {
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
*/
......@@ -91,7 +83,7 @@ class Mount {
private function createStorage() {
if (class_exists($this->class)) {
try {
return $this->loader->load($this->mountPoint, $this->class, $this->arguments);
return $this->loader->getInstance($this->mountPoint, $this->class, $this->arguments);
} catch (\Exception $exception) {
if ($this->mountPoint === '/') {
// the root storage could not be initialized, show the user!
......
......@@ -301,7 +301,7 @@ class Folder extends Node implements \OCP\Files\Folder {
$nodes = array();
foreach ($mounts as $mount) {
/**
* @var \OC\Files\Mount\Mount $mount
* @var \OC\Files\Mount\MountPoint $mount
*/
if ($mount->getStorage()) {
$cache = $mount->getStorage()->getCache();
......
......@@ -10,7 +10,7 @@ namespace OC\Files\Node;
use OC\Files\Cache\Cache;
use OC\Files\Mount\Manager;
use OC\Files\Mount\Mount;
use OC\Files\Mount\MountPoint;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OC\Hooks\Emitter;
......@@ -106,13 +106,13 @@ class Root extends Folder implements Emitter {
* @param array $arguments
*/
public function mount($storage, $mountPoint, $arguments = array()) {
$mount = new Mount($storage, $mountPoint, $arguments);
$mount = new MountPoint($storage, $mountPoint, $arguments);
$this->mountManager->addMount($mount);
}
/**
* @param string $mountPoint
* @return \OC\Files\Mount\Mount
* @return \OC\Files\Mount\MountPoint
*/
public function getMount($mountPoint) {
return $this->mountManager->find($mountPoint);
......@@ -120,7 +120,7 @@ class Root extends Folder implements Emitter {
/**
* @param string $mountPoint
* @return \OC\Files\Mount\Mount[]
* @return \OC\Files\Mount\MountPoint[]
*/
public function getMountsIn($mountPoint) {
return $this->mountManager->findIn($mountPoint);
......@@ -128,7 +128,7 @@ class Root extends Folder implements Emitter {
/**
* @param string $storageId
* @return \OC\Files\Mount\Mount[]
* @return \OC\Files\Mount\MountPoint[]
*/
public function getMountByStorageId($storageId) {
return $this->mountManager->findByStorageId($storageId);
......@@ -136,14 +136,14 @@ class Root extends Folder implements Emitter {
/**
* @param int $numericId
* @return Mount[]
* @return MountPoint[]
*/
public function getMountByNumericStorageId($numericId) {
return $this->mountManager->findByNumericId($numericId);
}
/**
* @param \OC\Files\Mount\Mount $mount
* @param \OC\Files\Mount\MountPoint $mount
*/
public function unMount($mount) {
$this->mountManager->remove($mount);
......
......@@ -8,7 +8,9 @@
namespace OC\Files\Storage;
class Loader {
use OCP\Files\Storage\IStorageFactory;
class StorageFactory implements IStorageFactory {
/**
* @var callable[] $storageWrappers
*/
......@@ -19,6 +21,7 @@ class Loader {
*
* $callback should be a function of type (string $mountPoint, Storage $storage) => Storage
*
* @param string $wrapperName
* @param callable $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 $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));
}
/**
* @param string|boolean $mountPoint
* @param \OCP\Files\Storage $storage
* @return \OCP\Files\Storage
*/
public function wrap($mountPoint, $storage) {
foreach ($this->storageWrappers as $wrapper) {
......
......@@ -53,7 +53,7 @@ class Scanner extends PublicEmitter {
* get all storages for $dir
*
* @param string $dir
* @return \OC\Files\Mount\Mount[]
* @return \OC\Files\Mount\MountPoint[]
*/
protected function getMounts($dir) {
//TODO: move to the node based fileapi once that's done
......@@ -72,7 +72,7 @@ class Scanner extends PublicEmitter {
/**
* attach listeners to the scanner
*
* @param \OC\Files\Mount\Mount $mount
* @param \OC\Files\Mount\MountPoint $mount
*/
protected function attachListener($mount) {
$scanner = $mount->getStorage()->getScanner();
......
......@@ -465,7 +465,7 @@ class View {
if ($internalPath1 === '' and $mount instanceof MoveableMount) {
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();
$result = $mount->moveMount($absolutePath2);
......@@ -1227,7 +1227,7 @@ class View {
$mounts = array_reverse($mounts);
foreach ($mounts as $mount) {
/**
* @var \OC\Files\Mount\Mount $mount
* @var \OC\Files\Mount\MountPoint $mount
*/
if ($mount->getStorage()) {
$cache = $mount->getStorage()->getCache();
......
......@@ -9,6 +9,7 @@ use OC\Cache\UserCache;
use OC\Diagnostics\NullQueryLogger;
use OC\Diagnostics\EventLogger;
use OC\Diagnostics\QueryLogger;
use OC\Files\Config\StorageManager;
use OC\Security\CertificateManager;
use OC\DB\ConnectionWrapper;
use OC\Files\Node\Root;
......@@ -268,6 +269,10 @@ class Server extends SimpleContainer implements IServerContainer {
$groupManager = $c->getGroupManager();
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() {
return $this->webRoot;
}
/**
* @return \OCP\Files\Config\IMountProviderCollection
*/
function getMountProviderCollection(){
return $this->query('MountConfigManager');
}
}
<?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);
}
<?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 {