use OCA\Files_External\Config\ConfigAdapter;
-OC::$CLASSPATH['OC_Mount_Config'] = 'files_external/lib/config.php';
-
require_once __DIR__ . '/../3rdparty/autoload.php';
// register Application object singleton
-\OC_Mount_Config::$app = \OC::$server->query(\OCA\Files_External\AppInfo\Application::class);
-\OC_Mount_Config::$app->registerListeners();
+\OCA\Files_External\MountConfig::$app = \OC::$server->query(\OCA\Files_External\AppInfo\Application::class);
+\OCA\Files_External\MountConfig::$app->registerListeners();
-$appContainer = \OC_Mount_Config::$app->getContainer();
+$appContainer = \OCA\Files_External\MountConfig::$app->getContainer();
\OCA\Files\App::getNavigationManager()->add(function () {
$l = \OC::$server->getL10N('files_external');
/**
* @var $this \OCP\Route\IRouter
**/
-\OC_Mount_Config::$app->registerRoutes(
+\OCA\Files_External\MountConfig::$app->registerRoutes(
$this,
[
'resources' => [
this.id = id;
this.backendOptions = {};
};
-// Keep this in sync with \OC_Mount_Config::STATUS_*
+// Keep this in sync with \OCA\Files_External\MountConfig::STATUS_*
StorageConfig.Status = {
IN_PROGRESS: -1,
SUCCESS: 0,
$backend = $storage->getBackend();
// update status (can be time-consuming)
$storage->setStatus(
- \OC_Mount_Config::getBackendStatus(
+ \OCA\Files_External\MountConfig::getBackendStatus(
$backend->getStorageClass(),
$storage->getBackendOptions(),
false
*/
private function prepareStorageConfig(StorageConfig &$storage, IUser $user) {
foreach ($storage->getBackendOptions() as $option => $value) {
- $storage->setBackendOption($option, \OC_Mount_Config::substitutePlaceholdersInConfig($value, $user->getUID()));
+ $storage->setBackendOption($option, \OCA\Files_External\MountConfig::substitutePlaceholdersInConfig($value, $user->getUID()));
}
$objectStore = $storage->getBackendOption('objectstore');
$entries = [];
$user = $this->userSession->getUser()->getUID();
- $mounts = \OC_Mount_Config::getAbsoluteMountPoints($user);
+ $mounts = \OCA\Files_External\MountConfig::getAbsoluteMountPoints($user);
foreach ($mounts as $mountPoint => $mount) {
$entries[] = $this->formatMount($mountPoint, $mount);
}
$backend = $storage->getBackend();
// update status (can be time-consuming)
$storage->setStatus(
- \OC_Mount_Config::getBackendStatus(
+ \OCA\Files_External\MountConfig::getBackendStatus(
$backend->getStorageClass(),
$storage->getBackendOptions(),
false,
use OCA\Files_External\Lib\MissingDependency;
/**
- * Legacy compatibility for OC_Mount_Config::registerBackend()
+ * Legacy compatibility for OCA\Files_External\MountConfig::registerBackend()
*/
class LegacyBackend extends Backend {
use LegacyDependencyCheckPolyfill {
--- /dev/null
+<?php
+/**
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ *
+ * @author Andreas Fischer <bantu@owncloud.com>
+ * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
+ * @author Bart Visscher <bartv@thisnet.nl>
+ * @author Björn Schießle <bjoern@schiessle.org>
+ * @author Christoph Wurst <christoph@winzerhof-wurst.at>
+ * @author Frank Karlitschek <frank@karlitschek.de>
+ * @author Jesús Macias <jmacias@solidgear.es>
+ * @author Joas Schilling <coding@schilljs.com>
+ * @author Juan Pablo Villafáñez <jvillafanez@solidgear.es>
+ * @author Julius Härtl <jus@bitgrid.net>
+ * @author Lukas Reschke <lukas@statuscode.ch>
+ * @author Michael Gapczynski <GapczynskiM@gmail.com>
+ * @author Morris Jobke <hey@morrisjobke.de>
+ * @author Philipp Kapfer <philipp.kapfer@gmx.at>
+ * @author Robin Appelman <robin@icewind.nl>
+ * @author Robin McCorkell <robin@mccorkell.me.uk>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ * @author Vincent Petry <pvince81@owncloud.com>
+ *
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_External;
+
+use OCA\Files_External\AppInfo\Application;
+use OCA\Files_External\Config\IConfigHandler;
+use OCA\Files_External\Config\UserContext;
+use OCA\Files_External\Config\UserPlaceholderHandler;
+use OCA\Files_External\Lib\Auth\Builtin;
+use OCA\Files_External\Lib\Backend\Backend;
+use OCA\Files_External\Lib\Backend\LegacyBackend;
+use OCA\Files_External\Lib\StorageConfig;
+use OCA\Files_External\Service\BackendService;
+use OCA\Files_External\Service\GlobalStoragesService;
+use OCA\Files_External\Service\UserGlobalStoragesService;
+use OCA\Files_External\Service\UserStoragesService;
+use OCP\Files\StorageNotAvailableException;
+use OCP\IUserManager;
+use phpseclib\Crypt\AES;
+
+/**
+ * Class to configure mount.json globally and for users
+ */
+class MountConfig {
+ // TODO: make this class non-static and give it a proper namespace
+
+ public const MOUNT_TYPE_GLOBAL = 'global';
+ public const MOUNT_TYPE_GROUP = 'group';
+ public const MOUNT_TYPE_USER = 'user';
+ public const MOUNT_TYPE_PERSONAL = 'personal';
+
+ // whether to skip backend test (for unit tests, as this static class is not mockable)
+ public static $skipTest = false;
+
+ /** @var Application */
+ public static $app;
+
+ /**
+ * @param string $class
+ * @param array $definition
+ * @return bool
+ * @deprecated 8.2.0 use \OCA\Files_External\Service\BackendService::registerBackend()
+ */
+ public static function registerBackend($class, $definition) {
+ $backendService = self::$app->getContainer()->query(BackendService::class);
+ $auth = self::$app->getContainer()->query(Builtin::class);
+
+ $backendService->registerBackend(new LegacyBackend($class, $definition, $auth));
+
+ return true;
+ }
+
+ /**
+ * Returns the mount points for the given user.
+ * The mount point is relative to the data directory.
+ *
+ * @param string $uid user
+ * @return array of mount point string as key, mountpoint config as value
+ *
+ * @deprecated 8.2.0 use UserGlobalStoragesService::getStorages() and UserStoragesService::getStorages()
+ */
+ public static function getAbsoluteMountPoints($uid) {
+ $mountPoints = [];
+
+ $userGlobalStoragesService = self::$app->getContainer()->query(UserGlobalStoragesService::class);
+ $userStoragesService = self::$app->getContainer()->query(UserStoragesService::class);
+ $user = self::$app->getContainer()->query(IUserManager::class)->get($uid);
+
+ $userGlobalStoragesService->setUser($user);
+ $userStoragesService->setUser($user);
+
+ foreach ($userGlobalStoragesService->getStorages() as $storage) {
+ /** @var \OCA\Files_External\Lib\StorageConfig $storage */
+ $mountPoint = '/'.$uid.'/files'.$storage->getMountPoint();
+ $mountEntry = self::prepareMountPointEntry($storage, false);
+ foreach ($mountEntry['options'] as &$option) {
+ $option = self::substitutePlaceholdersInConfig($option, $uid);
+ }
+ $mountPoints[$mountPoint] = $mountEntry;
+ }
+
+ foreach ($userStoragesService->getStorages() as $storage) {
+ $mountPoint = '/'.$uid.'/files'.$storage->getMountPoint();
+ $mountEntry = self::prepareMountPointEntry($storage, true);
+ foreach ($mountEntry['options'] as &$option) {
+ $option = self::substitutePlaceholdersInConfig($option, $uid);
+ }
+ $mountPoints[$mountPoint] = $mountEntry;
+ }
+
+ $userGlobalStoragesService->resetUser();
+ $userStoragesService->resetUser();
+
+ return $mountPoints;
+ }
+
+ /**
+ * Get the system mount points
+ *
+ * @return array
+ *
+ * @deprecated 8.2.0 use GlobalStoragesService::getStorages()
+ */
+ public static function getSystemMountPoints() {
+ $mountPoints = [];
+ $service = self::$app->getContainer()->query(GlobalStoragesService::class);
+
+ foreach ($service->getStorages() as $storage) {
+ $mountPoints[] = self::prepareMountPointEntry($storage, false);
+ }
+
+ return $mountPoints;
+ }
+
+ /**
+ * Get the personal mount points of the current user
+ *
+ * @return array
+ *
+ * @deprecated 8.2.0 use UserStoragesService::getStorages()
+ */
+ public static function getPersonalMountPoints() {
+ $mountPoints = [];
+ $service = self::$app->getContainer()->query(UserStoragesService::class);
+
+ foreach ($service->getStorages() as $storage) {
+ $mountPoints[] = self::prepareMountPointEntry($storage, true);
+ }
+
+ return $mountPoints;
+ }
+
+ /**
+ * Convert a StorageConfig to the legacy mountPoints array format
+ * There's a lot of extra information in here, to satisfy all of the legacy functions
+ *
+ * @param StorageConfig $storage
+ * @param bool $isPersonal
+ * @return array
+ */
+ private static function prepareMountPointEntry(StorageConfig $storage, $isPersonal) {
+ $mountEntry = [];
+
+ $mountEntry['mountpoint'] = substr($storage->getMountPoint(), 1); // remove leading slash
+ $mountEntry['class'] = $storage->getBackend()->getIdentifier();
+ $mountEntry['backend'] = $storage->getBackend()->getText();
+ $mountEntry['authMechanism'] = $storage->getAuthMechanism()->getIdentifier();
+ $mountEntry['personal'] = $isPersonal;
+ $mountEntry['options'] = self::decryptPasswords($storage->getBackendOptions());
+ $mountEntry['mountOptions'] = $storage->getMountOptions();
+ $mountEntry['priority'] = $storage->getPriority();
+ $mountEntry['applicable'] = [
+ 'groups' => $storage->getApplicableGroups(),
+ 'users' => $storage->getApplicableUsers(),
+ ];
+ // if mountpoint is applicable to all users the old API expects ['all']
+ if (empty($mountEntry['applicable']['groups']) && empty($mountEntry['applicable']['users'])) {
+ $mountEntry['applicable']['users'] = ['all'];
+ }
+
+ $mountEntry['id'] = $storage->getId();
+
+ return $mountEntry;
+ }
+
+ /**
+ * fill in the correct values for $user
+ *
+ * @param string $user user value
+ * @param string|array $input
+ * @return string
+ * @deprecated use self::substitutePlaceholdersInConfig($input)
+ */
+ public static function setUserVars($user, $input) {
+ $handler = self::$app->getContainer()->query(UserPlaceholderHandler::class);
+ return $handler->handle($input);
+ }
+
+ /**
+ * @param mixed $input
+ * @param string|null $userId
+ * @return mixed
+ * @throws \OCP\AppFramework\QueryException
+ * @since 16.0.0
+ */
+ public static function substitutePlaceholdersInConfig($input, string $userId = null) {
+ /** @var BackendService $backendService */
+ $backendService = self::$app->getContainer()->query(BackendService::class);
+ /** @var IConfigHandler[] $handlers */
+ $handlers = $backendService->getConfigHandlers();
+ foreach ($handlers as $handler) {
+ if ($handler instanceof UserContext && $userId !== null) {
+ $handler->setUserId($userId);
+ }
+ $input = $handler->handle($input);
+ }
+ return $input;
+ }
+
+ /**
+ * Test connecting using the given backend configuration
+ *
+ * @param string $class backend class name
+ * @param array $options backend configuration options
+ * @param boolean $isPersonal
+ * @return int see self::STATUS_*
+ * @throws Exception
+ */
+ public static function getBackendStatus($class, $options, $isPersonal, $testOnly = true) {
+ if (self::$skipTest) {
+ return StorageNotAvailableException::STATUS_SUCCESS;
+ }
+ foreach ($options as $key => &$option) {
+ if ($key === 'password') {
+ // no replacements in passwords
+ continue;
+ }
+ $option = self::substitutePlaceholdersInConfig($option);
+ }
+ if (class_exists($class)) {
+ try {
+ /** @var \OC\Files\Storage\Common $storage */
+ $storage = new $class($options);
+
+ try {
+ $result = $storage->test($isPersonal, $testOnly);
+ $storage->setAvailability($result);
+ if ($result) {
+ return StorageNotAvailableException::STATUS_SUCCESS;
+ }
+ } catch (\Exception $e) {
+ $storage->setAvailability(false);
+ throw $e;
+ }
+ } catch (Exception $exception) {
+ \OC::$server->getLogger()->logException($exception, ['app' => 'files_external']);
+ throw $exception;
+ }
+ }
+ return StorageNotAvailableException::STATUS_ERROR;
+ }
+
+ /**
+ * Read the mount points in the config file into an array
+ *
+ * @param string|null $user If not null, personal for $user, otherwise system
+ * @return array
+ */
+ public static function readData($user = null) {
+ if (isset($user)) {
+ $jsonFile = \OC::$server->getUserManager()->get($user)->getHome() . '/mount.json';
+ } else {
+ $config = \OC::$server->getConfig();
+ $datadir = $config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/');
+ $jsonFile = $config->getSystemValue('mount_file', $datadir . '/mount.json');
+ }
+ if (is_file($jsonFile)) {
+ $mountPoints = json_decode(file_get_contents($jsonFile), true);
+ if (is_array($mountPoints)) {
+ return $mountPoints;
+ }
+ }
+ return [];
+ }
+
+ /**
+ * Get backend dependency message
+ * TODO: move into AppFramework along with templates
+ *
+ * @param Backend[] $backends
+ * @return string
+ */
+ public static function dependencyMessage($backends) {
+ $l = \OC::$server->getL10N('files_external');
+ $message = '';
+ $dependencyGroups = [];
+
+ foreach ($backends as $backend) {
+ foreach ($backend->checkDependencies() as $dependency) {
+ if ($message = $dependency->getMessage()) {
+ $message .= '<p>' . $message . '</p>';
+ } else {
+ $dependencyGroups[$dependency->getDependency()][] = $backend;
+ }
+ }
+ }
+
+ foreach ($dependencyGroups as $module => $dependants) {
+ $backends = implode(', ', array_map(function ($backend) {
+ return '"' . $backend->getText() . '"';
+ }, $dependants));
+ $message .= '<p>' . MountConfig::getSingleDependencyMessage($l, $module, $backends) . '</p>';
+ }
+
+ return $message;
+ }
+
+ /**
+ * Returns a dependency missing message
+ *
+ * @param \OCP\IL10N $l
+ * @param string $module
+ * @param string $backend
+ * @return string
+ */
+ private static function getSingleDependencyMessage(\OCP\IL10N $l, $module, $backend) {
+ switch (strtolower($module)) {
+ case 'curl':
+ return (string)$l->t('The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.', [$backend]);
+ case 'ftp':
+ return (string)$l->t('The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.', [$backend]);
+ default:
+ return (string)$l->t('"%1$s" is not installed. Mounting of %2$s is not possible. Please ask your system administrator to install it.', [$module, $backend]);
+ }
+ }
+
+ /**
+ * Encrypt passwords in the given config options
+ *
+ * @param array $options mount options
+ * @return array updated options
+ */
+ public static function encryptPasswords($options) {
+ if (isset($options['password'])) {
+ $options['password_encrypted'] = self::encryptPassword($options['password']);
+ // do not unset the password, we want to keep the keys order
+ // on load... because that's how the UI currently works
+ $options['password'] = '';
+ }
+ return $options;
+ }
+
+ /**
+ * Decrypt passwords in the given config options
+ *
+ * @param array $options mount options
+ * @return array updated options
+ */
+ public static function decryptPasswords($options) {
+ // note: legacy options might still have the unencrypted password in the "password" field
+ if (isset($options['password_encrypted'])) {
+ $options['password'] = self::decryptPassword($options['password_encrypted']);
+ unset($options['password_encrypted']);
+ }
+ return $options;
+ }
+
+ /**
+ * Encrypt a single password
+ *
+ * @param string $password plain text password
+ * @return string encrypted password
+ */
+ private static function encryptPassword($password) {
+ $cipher = self::getCipher();
+ $iv = \OC::$server->getSecureRandom()->generate(16);
+ $cipher->setIV($iv);
+ return base64_encode($iv . $cipher->encrypt($password));
+ }
+
+ /**
+ * Decrypts a single password
+ *
+ * @param string $encryptedPassword encrypted password
+ * @return string plain text password
+ */
+ private static function decryptPassword($encryptedPassword) {
+ $cipher = self::getCipher();
+ $binaryPassword = base64_decode($encryptedPassword);
+ $iv = substr($binaryPassword, 0, 16);
+ $cipher->setIV($iv);
+ $binaryPassword = substr($binaryPassword, 16);
+ return $cipher->decrypt($binaryPassword);
+ }
+
+ /**
+ * Returns the encryption cipher
+ *
+ * @return AES
+ */
+ private static function getCipher() {
+ $cipher = new AES(AES::MODE_CBC);
+ $cipher->setKey(\OC::$server->getConfig()->getSystemValue('passwordsalt', null));
+ return $cipher;
+ }
+
+ /**
+ * Computes a hash based on the given configuration.
+ * This is mostly used to find out whether configurations
+ * are the same.
+ *
+ * @param array $config
+ * @return string
+ */
+ public static function makeConfigHash($config) {
+ $data = json_encode(
+ [
+ 'c' => $config['backend'],
+ 'a' => $config['authMechanism'],
+ 'm' => $config['mountpoint'],
+ 'o' => $config['options'],
+ 'p' => isset($config['priority']) ? $config['priority'] : -1,
+ 'mo' => isset($config['mountOptions']) ? $config['mountOptions'] : [],
+ ]
+ );
+ return hash('md5', $data);
+ }
+}
$this->triggerApplicableHooks(
$signal,
$storage->getMountPoint(),
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
['all']
);
return;
$this->triggerApplicableHooks(
$signal,
$storage->getMountPoint(),
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
$applicableUsers
);
$this->triggerApplicableHooks(
$signal,
$storage->getMountPoint(),
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
$applicableGroups
);
}
$this->triggerApplicableHooks(
Filesystem::signal_delete_mount,
$oldStorage->getMountPoint(),
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
['all']
);
}
$this->triggerApplicableHooks(
Filesystem::signal_delete_mount,
$oldStorage->getMountPoint(),
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
$userDeletions
);
$this->triggerApplicableHooks(
Filesystem::signal_delete_mount,
$oldStorage->getMountPoint(),
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
$groupDeletions
);
$this->triggerApplicableHooks(
Filesystem::signal_create_mount,
$newStorage->getMountPoint(),
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
$userAdditions
);
$this->triggerApplicableHooks(
Filesystem::signal_create_mount,
$newStorage->getMountPoint(),
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
$groupAdditions
);
$this->triggerApplicableHooks(
Filesystem::signal_create_mount,
$newStorage->getMountPoint(),
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
['all']
);
}
$storageOptions['priority'] = $backend->getPriority();
}
$storageConfig->setPriority($storageOptions['priority']);
- if ($mountType === \OC_Mount_Config::MOUNT_TYPE_USER) {
+ if ($mountType === \OCA\Files_External\MountConfig::MOUNT_TYPE_USER) {
$applicableUsers = $storageConfig->getApplicableUsers();
if ($applicable !== 'all') {
$applicableUsers[] = $applicable;
$storageConfig->setApplicableUsers($applicableUsers);
}
- } elseif ($mountType === \OC_Mount_Config::MOUNT_TYPE_GROUP) {
+ } elseif ($mountType === \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP) {
$applicableGroups = $storageConfig->getApplicableGroups();
$applicableGroups[] = $applicable;
$storageConfig->setApplicableGroups($applicableGroups);
$relativeMountPath = rtrim($parts[2], '/');
// note: we cannot do this after the loop because the decrypted config
// options might be needed for the config hash
- $storageOptions['options'] = \OC_Mount_Config::decryptPasswords($storageOptions['options']);
+ $storageOptions['options'] = \OCA\Files_External\MountConfig::decryptPasswords($storageOptions['options']);
if (!isset($storageOptions['backend'])) {
$storageOptions['backend'] = $storageOptions['class']; // legacy compat
}
// but at this point we don't know the max-id, so use
// first group it by config hash
$storageOptions['mountpoint'] = $rootMountPath;
- $configId = \OC_Mount_Config::makeConfigHash($storageOptions);
+ $configId = \OCA\Files_External\MountConfig::makeConfigHash($storageOptions);
if (isset($storagesWithConfigHash[$configId])) {
$currentStorage = $storagesWithConfigHash[$configId];
}
protected function readLegacyConfig() {
// read user config
$user = $this->userSession->getUser()->getUID();
- return \OC_Mount_Config::readData($user);
+ return \OCA\Files_External\MountConfig::readData($user);
}
}
$this->triggerApplicableHooks(
$signal,
$storage->getMountPoint(),
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
[$user]
);
}
'storages' => $this->globalStoragesService->getStorages(),
'backends' => $this->backendService->getAvailableBackends(),
'authMechanisms' => $this->backendService->getAuthMechanisms(),
- 'dependencies' => \OC_Mount_Config::dependencyMessage($this->backendService->getBackends()),
+ 'dependencies' => \OCA\Files_External\MountConfig::dependencyMessage($this->backendService->getBackends()),
'allowUserMounting' => $this->backendService->isUserMountingAllowed(),
'globalCredentials' => $this->globalAuth->getAuth(''),
'globalCredentialsUid' => '',
'storages' => $this->userGlobalStoragesService->getStorages(),
'backends' => $this->backendService->getAvailableBackends(),
'authMechanisms' => $this->backendService->getAuthMechanisms(),
- 'dependencies' => \OC_Mount_Config::dependencyMessage($this->backendService->getBackends()),
+ 'dependencies' => \OCA\Files_External\MountConfig::dependencyMessage($this->backendService->getBackends()),
'allowUserMounting' => $this->backendService->isUserMountingAllowed(),
'globalCredentials' => $this->globalAuth->getAuth($uid),
'globalCredentialsUid' => $uid,
+++ /dev/null
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Andreas Fischer <bantu@owncloud.com>
- * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
- * @author Bart Visscher <bartv@thisnet.nl>
- * @author Björn Schießle <bjoern@schiessle.org>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Frank Karlitschek <frank@karlitschek.de>
- * @author Jesús Macias <jmacias@solidgear.es>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Juan Pablo Villafáñez <jvillafanez@solidgear.es>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Michael Gapczynski <GapczynskiM@gmail.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Philipp Kapfer <philipp.kapfer@gmx.at>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Robin McCorkell <robin@mccorkell.me.uk>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-use OCA\Files_External\AppInfo\Application;
-use OCA\Files_External\Config\IConfigHandler;
-use OCA\Files_External\Config\UserContext;
-use OCA\Files_External\Config\UserPlaceholderHandler;
-use OCA\Files_External\Lib\Auth\Builtin;
-use OCA\Files_External\Lib\Backend\Backend;
-use OCA\Files_External\Lib\Backend\LegacyBackend;
-use OCA\Files_External\Lib\StorageConfig;
-use OCA\Files_External\Service\BackendService;
-use OCA\Files_External\Service\GlobalStoragesService;
-use OCA\Files_External\Service\UserGlobalStoragesService;
-use OCA\Files_External\Service\UserStoragesService;
-use OCP\Files\StorageNotAvailableException;
-use OCP\IUserManager;
-use phpseclib\Crypt\AES;
-
-/**
- * Class to configure mount.json globally and for users
- */
-class OC_Mount_Config {
- // TODO: make this class non-static and give it a proper namespace
-
- public const MOUNT_TYPE_GLOBAL = 'global';
- public const MOUNT_TYPE_GROUP = 'group';
- public const MOUNT_TYPE_USER = 'user';
- public const MOUNT_TYPE_PERSONAL = 'personal';
-
- // whether to skip backend test (for unit tests, as this static class is not mockable)
- public static $skipTest = false;
-
- /** @var Application */
- public static $app;
-
- /**
- * @param string $class
- * @param array $definition
- * @return bool
- * @deprecated 8.2.0 use \OCA\Files_External\Service\BackendService::registerBackend()
- */
- public static function registerBackend($class, $definition) {
- $backendService = self::$app->getContainer()->query(BackendService::class);
- $auth = self::$app->getContainer()->query(Builtin::class);
-
- $backendService->registerBackend(new LegacyBackend($class, $definition, $auth));
-
- return true;
- }
-
- /**
- * Returns the mount points for the given user.
- * The mount point is relative to the data directory.
- *
- * @param string $uid user
- * @return array of mount point string as key, mountpoint config as value
- *
- * @deprecated 8.2.0 use UserGlobalStoragesService::getStorages() and UserStoragesService::getStorages()
- */
- public static function getAbsoluteMountPoints($uid) {
- $mountPoints = [];
-
- $userGlobalStoragesService = self::$app->getContainer()->query(UserGlobalStoragesService::class);
- $userStoragesService = self::$app->getContainer()->query(UserStoragesService::class);
- $user = self::$app->getContainer()->query(IUserManager::class)->get($uid);
-
- $userGlobalStoragesService->setUser($user);
- $userStoragesService->setUser($user);
-
- foreach ($userGlobalStoragesService->getStorages() as $storage) {
- /** @var \OCA\Files_External\Lib\StorageConfig $storage */
- $mountPoint = '/'.$uid.'/files'.$storage->getMountPoint();
- $mountEntry = self::prepareMountPointEntry($storage, false);
- foreach ($mountEntry['options'] as &$option) {
- $option = self::substitutePlaceholdersInConfig($option, $uid);
- }
- $mountPoints[$mountPoint] = $mountEntry;
- }
-
- foreach ($userStoragesService->getStorages() as $storage) {
- $mountPoint = '/'.$uid.'/files'.$storage->getMountPoint();
- $mountEntry = self::prepareMountPointEntry($storage, true);
- foreach ($mountEntry['options'] as &$option) {
- $option = self::substitutePlaceholdersInConfig($option, $uid);
- }
- $mountPoints[$mountPoint] = $mountEntry;
- }
-
- $userGlobalStoragesService->resetUser();
- $userStoragesService->resetUser();
-
- return $mountPoints;
- }
-
- /**
- * Get the system mount points
- *
- * @return array
- *
- * @deprecated 8.2.0 use GlobalStoragesService::getStorages()
- */
- public static function getSystemMountPoints() {
- $mountPoints = [];
- $service = self::$app->getContainer()->query(GlobalStoragesService::class);
-
- foreach ($service->getStorages() as $storage) {
- $mountPoints[] = self::prepareMountPointEntry($storage, false);
- }
-
- return $mountPoints;
- }
-
- /**
- * Get the personal mount points of the current user
- *
- * @return array
- *
- * @deprecated 8.2.0 use UserStoragesService::getStorages()
- */
- public static function getPersonalMountPoints() {
- $mountPoints = [];
- $service = self::$app->getContainer()->query(UserStoragesService::class);
-
- foreach ($service->getStorages() as $storage) {
- $mountPoints[] = self::prepareMountPointEntry($storage, true);
- }
-
- return $mountPoints;
- }
-
- /**
- * Convert a StorageConfig to the legacy mountPoints array format
- * There's a lot of extra information in here, to satisfy all of the legacy functions
- *
- * @param StorageConfig $storage
- * @param bool $isPersonal
- * @return array
- */
- private static function prepareMountPointEntry(StorageConfig $storage, $isPersonal) {
- $mountEntry = [];
-
- $mountEntry['mountpoint'] = substr($storage->getMountPoint(), 1); // remove leading slash
- $mountEntry['class'] = $storage->getBackend()->getIdentifier();
- $mountEntry['backend'] = $storage->getBackend()->getText();
- $mountEntry['authMechanism'] = $storage->getAuthMechanism()->getIdentifier();
- $mountEntry['personal'] = $isPersonal;
- $mountEntry['options'] = self::decryptPasswords($storage->getBackendOptions());
- $mountEntry['mountOptions'] = $storage->getMountOptions();
- $mountEntry['priority'] = $storage->getPriority();
- $mountEntry['applicable'] = [
- 'groups' => $storage->getApplicableGroups(),
- 'users' => $storage->getApplicableUsers(),
- ];
- // if mountpoint is applicable to all users the old API expects ['all']
- if (empty($mountEntry['applicable']['groups']) && empty($mountEntry['applicable']['users'])) {
- $mountEntry['applicable']['users'] = ['all'];
- }
-
- $mountEntry['id'] = $storage->getId();
-
- return $mountEntry;
- }
-
- /**
- * fill in the correct values for $user
- *
- * @param string $user user value
- * @param string|array $input
- * @return string
- * @deprecated use self::substitutePlaceholdersInConfig($input)
- */
- public static function setUserVars($user, $input) {
- $handler = self::$app->getContainer()->query(UserPlaceholderHandler::class);
- return $handler->handle($input);
- }
-
- /**
- * @param mixed $input
- * @param string|null $userId
- * @return mixed
- * @throws \OCP\AppFramework\QueryException
- * @since 16.0.0
- */
- public static function substitutePlaceholdersInConfig($input, string $userId = null) {
- /** @var BackendService $backendService */
- $backendService = self::$app->getContainer()->query(BackendService::class);
- /** @var IConfigHandler[] $handlers */
- $handlers = $backendService->getConfigHandlers();
- foreach ($handlers as $handler) {
- if ($handler instanceof UserContext && $userId !== null) {
- $handler->setUserId($userId);
- }
- $input = $handler->handle($input);
- }
- return $input;
- }
-
- /**
- * Test connecting using the given backend configuration
- *
- * @param string $class backend class name
- * @param array $options backend configuration options
- * @param boolean $isPersonal
- * @return int see self::STATUS_*
- * @throws Exception
- */
- public static function getBackendStatus($class, $options, $isPersonal, $testOnly = true) {
- if (self::$skipTest) {
- return StorageNotAvailableException::STATUS_SUCCESS;
- }
- foreach ($options as $key => &$option) {
- if ($key === 'password') {
- // no replacements in passwords
- continue;
- }
- $option = self::substitutePlaceholdersInConfig($option);
- }
- if (class_exists($class)) {
- try {
- /** @var \OC\Files\Storage\Common $storage */
- $storage = new $class($options);
-
- try {
- $result = $storage->test($isPersonal, $testOnly);
- $storage->setAvailability($result);
- if ($result) {
- return StorageNotAvailableException::STATUS_SUCCESS;
- }
- } catch (\Exception $e) {
- $storage->setAvailability(false);
- throw $e;
- }
- } catch (Exception $exception) {
- \OC::$server->getLogger()->logException($exception, ['app' => 'files_external']);
- throw $exception;
- }
- }
- return StorageNotAvailableException::STATUS_ERROR;
- }
-
- /**
- * Read the mount points in the config file into an array
- *
- * @param string|null $user If not null, personal for $user, otherwise system
- * @return array
- */
- public static function readData($user = null) {
- if (isset($user)) {
- $jsonFile = \OC::$server->getUserManager()->get($user)->getHome() . '/mount.json';
- } else {
- $config = \OC::$server->getConfig();
- $datadir = $config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/');
- $jsonFile = $config->getSystemValue('mount_file', $datadir . '/mount.json');
- }
- if (is_file($jsonFile)) {
- $mountPoints = json_decode(file_get_contents($jsonFile), true);
- if (is_array($mountPoints)) {
- return $mountPoints;
- }
- }
- return [];
- }
-
- /**
- * Get backend dependency message
- * TODO: move into AppFramework along with templates
- *
- * @param Backend[] $backends
- * @return string
- */
- public static function dependencyMessage($backends) {
- $l = \OC::$server->getL10N('files_external');
- $message = '';
- $dependencyGroups = [];
-
- foreach ($backends as $backend) {
- foreach ($backend->checkDependencies() as $dependency) {
- if ($message = $dependency->getMessage()) {
- $message .= '<p>' . $message . '</p>';
- } else {
- $dependencyGroups[$dependency->getDependency()][] = $backend;
- }
- }
- }
-
- foreach ($dependencyGroups as $module => $dependants) {
- $backends = implode(', ', array_map(function ($backend) {
- return '"' . $backend->getText() . '"';
- }, $dependants));
- $message .= '<p>' . OC_Mount_Config::getSingleDependencyMessage($l, $module, $backends) . '</p>';
- }
-
- return $message;
- }
-
- /**
- * Returns a dependency missing message
- *
- * @param \OCP\IL10N $l
- * @param string $module
- * @param string $backend
- * @return string
- */
- private static function getSingleDependencyMessage(\OCP\IL10N $l, $module, $backend) {
- switch (strtolower($module)) {
- case 'curl':
- return (string)$l->t('The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.', [$backend]);
- case 'ftp':
- return (string)$l->t('The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.', [$backend]);
- default:
- return (string)$l->t('"%1$s" is not installed. Mounting of %2$s is not possible. Please ask your system administrator to install it.', [$module, $backend]);
- }
- }
-
- /**
- * Encrypt passwords in the given config options
- *
- * @param array $options mount options
- * @return array updated options
- */
- public static function encryptPasswords($options) {
- if (isset($options['password'])) {
- $options['password_encrypted'] = self::encryptPassword($options['password']);
- // do not unset the password, we want to keep the keys order
- // on load... because that's how the UI currently works
- $options['password'] = '';
- }
- return $options;
- }
-
- /**
- * Decrypt passwords in the given config options
- *
- * @param array $options mount options
- * @return array updated options
- */
- public static function decryptPasswords($options) {
- // note: legacy options might still have the unencrypted password in the "password" field
- if (isset($options['password_encrypted'])) {
- $options['password'] = self::decryptPassword($options['password_encrypted']);
- unset($options['password_encrypted']);
- }
- return $options;
- }
-
- /**
- * Encrypt a single password
- *
- * @param string $password plain text password
- * @return string encrypted password
- */
- private static function encryptPassword($password) {
- $cipher = self::getCipher();
- $iv = \OC::$server->getSecureRandom()->generate(16);
- $cipher->setIV($iv);
- return base64_encode($iv . $cipher->encrypt($password));
- }
-
- /**
- * Decrypts a single password
- *
- * @param string $encryptedPassword encrypted password
- * @return string plain text password
- */
- private static function decryptPassword($encryptedPassword) {
- $cipher = self::getCipher();
- $binaryPassword = base64_decode($encryptedPassword);
- $iv = substr($binaryPassword, 0, 16);
- $cipher->setIV($iv);
- $binaryPassword = substr($binaryPassword, 16);
- return $cipher->decrypt($binaryPassword);
- }
-
- /**
- * Returns the encryption cipher
- *
- * @return AES
- */
- private static function getCipher() {
- $cipher = new AES(AES::MODE_CBC);
- $cipher->setKey(\OC::$server->getConfig()->getSystemValue('passwordsalt', null));
- return $cipher;
- }
-
- /**
- * Computes a hash based on the given configuration.
- * This is mostly used to find out whether configurations
- * are the same.
- *
- * @param array $config
- * @return string
- */
- public static function makeConfigHash($config) {
- $data = json_encode(
- [
- 'c' => $config['backend'],
- 'a' => $config['authMechanism'],
- 'm' => $config['mountpoint'],
- 'o' => $config['options'],
- 'p' => isset($config['priority']) ? $config['priority'] : -1,
- 'mo' => isset($config['mountOptions']) ? $config['mountOptions'] : [],
- ]
- );
- return hash('md5', $data);
- }
-}
protected $service;
protected function setUp(): void {
- \OC_Mount_Config::$skipTest = true;
+ \OCA\Files_External\MountConfig::$skipTest = true;
}
protected function tearDown(): void {
- \OC_Mount_Config::$skipTest = false;
+ \OCA\Files_External\MountConfig::$skipTest = false;
}
/**
[
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'all'
],
],
[
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user1',
],
],
[
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group1',
],
],
[
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user1',
],
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user2',
],
],
[
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group1'
],
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group2'
],
],
[
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user1',
],
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user2',
],
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group1'
],
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group2'
],
],
// delete the "all entry"
[
Filesystem::signal_delete_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'all',
],
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user1',
],
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user2',
],
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group1'
],
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group2'
],
],
[
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user2',
],
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group2'
],
],
[
[
Filesystem::signal_delete_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user2',
],
[
Filesystem::signal_delete_mount,
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group2'
],
],
[
[
Filesystem::signal_delete_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user1',
],
[
Filesystem::signal_delete_mount,
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group1'
],
// create the "all" entry
[
Filesystem::signal_create_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'all'
],
],
}
}
-
+
public function testHooksRenameMountPoint() {
$storage = $this->makeTestStorageData();
$storage->setApplicableUsers(['user1', 'user2']);
[
Filesystem::signal_delete_mount,
'/mountpoint',
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user1',
],
[
Filesystem::signal_delete_mount,
'/mountpoint',
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user2',
],
[
Filesystem::signal_delete_mount,
'/mountpoint',
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group1',
],
[
Filesystem::signal_delete_mount,
'/mountpoint',
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group2',
],
// creates new one
[
Filesystem::signal_create_mount,
'/renamedMountpoint',
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user1',
],
[
Filesystem::signal_create_mount,
'/renamedMountpoint',
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user2',
],
[
Filesystem::signal_create_mount,
'/renamedMountpoint',
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group1',
],
[
Filesystem::signal_create_mount,
'/renamedMountpoint',
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group2',
],
];
[
[
Filesystem::signal_delete_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user1',
],
[
Filesystem::signal_delete_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'user2',
],
[
Filesystem::signal_delete_mount,
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group1'
],
[
Filesystem::signal_delete_mount,
- \OC_Mount_Config::MOUNT_TYPE_GROUP,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_GROUP,
'group2'
],
],
[
[
Filesystem::signal_delete_mount,
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
'all',
],
],
'datadirectory',
\OC::$SERVERROOT . '/data/'
);
- \OC_Mount_Config::$skipTest = true;
+ \OCA\Files_External\MountConfig::$skipTest = true;
$this->mountCache = $this->createMock(IUserMountCache::class);
}
});
- \OC_Mount_Config::$app = $this->getMockBuilder('\OCA\Files_External\Appinfo\Application')
+ \OCA\Files_External\MountConfig::$app = $this->getMockBuilder('\OCA\Files_External\Appinfo\Application')
->disableOriginalConstructor()
->getMock();
- \OC_Mount_Config::$app->method('getContainer')
+ \OCA\Files_External\MountConfig::$app->method('getContainer')
->willReturn($containerMock);
}
protected function tearDown(): void {
- \OC_Mount_Config::$skipTest = false;
+ \OCA\Files_External\MountConfig::$skipTest = false;
self::$hookCalls = [];
if ($this->dbConfig) {
$this->dbConfig->clean();
current(self::$hookCalls),
Filesystem::signal_create_mount,
$storage->getMountPoint(),
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
$this->userId
);
self::$hookCalls[1],
Filesystem::signal_delete_mount,
'/mountpoint',
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
$this->userId
);
}
self::$hookCalls[0],
Filesystem::signal_delete_mount,
'/mountpoint',
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
$this->userId
);
$this->assertHookCall(
self::$hookCalls[1],
Filesystem::signal_create_mount,
'/renamedMountpoint',
- \OC_Mount_Config::MOUNT_TYPE_USER,
+ \OCA\Files_External\MountConfig::MOUNT_TYPE_USER,
$this->userId
);
}
-
+
public function testGetAdminStorage() {
$this->expectException(\OCA\Files_External\NotFoundException::class);
'storages' => ['a', 'b', 'c'],
'backends' => ['d', 'e', 'f'],
'authMechanisms' => ['g', 'h', 'i'],
- 'dependencies' => \OC_Mount_Config::dependencyMessage($this->backendService->getBackends()),
+ 'dependencies' => \OCA\Files_External\MountConfig::dependencyMessage($this->backendService->getBackends()),
'allowUserMounting' => true,
'globalCredentials' => 'asdf:asdf',
'globalCredentialsUid' => '',
// check if it is a group mount
if (\OCP\App::isEnabled("files_external")) {
- $mounts = \OC_Mount_Config::getSystemMountPoints();
+ $mounts = \OCA\Files_External\MountConfig::getSystemMountPoints();
foreach ($mounts as $mount) {
if ($mount['mountpoint'] == substr($ownerPath, 1, strlen($mount['mountpoint']))) {
$mountedFor = $this->util->getUserWithAccessToMountPoint($mount['applicable']['users'], $mount['applicable']['groups']);
*/
public function isSystemWideMountPoint($path, $uid) {
if (\OCP\App::isEnabled("files_external")) {
- $mounts = \OC_Mount_Config::getSystemMountPoints();
+ $mounts = \OCA\Files_External\MountConfig::getSystemMountPoints();
foreach ($mounts as $mount) {
if (strpos($path, '/files/' . $mount['mountpoint']) === 0) {
if ($this->isMountPointApplicableToUser($mount, $uid)) {
'storeKeyPair',
'setupUser',
- // files_external: OC_Mount_Config
+ // files_external: OCA\Files_External\MountConfig
'getBackendStatus',
// files_external: UserStoragesController