diff options
Diffstat (limited to 'apps/files_external/command')
-rw-r--r-- | apps/files_external/command/applicable.php | 157 | ||||
-rw-r--r-- | apps/files_external/command/backends.php | 112 | ||||
-rw-r--r-- | apps/files_external/command/config.php | 120 | ||||
-rw-r--r-- | apps/files_external/command/create.php | 226 | ||||
-rw-r--r-- | apps/files_external/command/delete.php | 114 | ||||
-rw-r--r-- | apps/files_external/command/export.php | 56 | ||||
-rw-r--r-- | apps/files_external/command/import.php | 227 | ||||
-rw-r--r-- | apps/files_external/command/listcommand.php | 248 | ||||
-rw-r--r-- | apps/files_external/command/option.php | 85 | ||||
-rw-r--r-- | apps/files_external/command/verify.php | 145 |
10 files changed, 0 insertions, 1490 deletions
diff --git a/apps/files_external/command/applicable.php b/apps/files_external/command/applicable.php deleted file mode 100644 index 7e6c99d2915..00000000000 --- a/apps/files_external/command/applicable.php +++ /dev/null @@ -1,157 +0,0 @@ -<?php -/** - * @author Robin Appelman <icewind@owncloud.com> - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @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\Command; - -use OC\Core\Command\Base; -use OCA\Files_external\Lib\StorageConfig; -use OCA\Files_external\NotFoundException; -use OCA\Files_external\Service\GlobalStoragesService; -use OCP\IGroupManager; -use OCP\IUserManager; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Helper\TableHelper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -class Applicable extends Base { - /** - * @var GlobalStoragesService - */ - protected $globalService; - - /** - * @var IUserManager - */ - private $userManager; - - /** - * @var IGroupManager - */ - private $groupManager; - - function __construct( - GlobalStoragesService $globalService, - IUserManager $userManager, - IGroupManager $groupManager - ) { - parent::__construct(); - $this->globalService = $globalService; - $this->userManager = $userManager; - $this->groupManager = $groupManager; - } - - protected function configure() { - $this - ->setName('files_external:applicable') - ->setDescription('Manage applicable users and groups for a mount') - ->addArgument( - 'mount_id', - InputArgument::REQUIRED, - 'The id of the mount to edit' - )->addOption( - 'add-user', - null, - InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, - 'user to add as applicable' - )->addOption( - 'remove-user', - null, - InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, - 'user to remove as applicable' - )->addOption( - 'add-group', - null, - InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, - 'group to add as applicable' - )->addOption( - 'remove-group', - null, - InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, - 'group to remove as applicable' - )->addOption( - 'remove-all', - null, - InputOption::VALUE_NONE, - 'Set the mount to be globally applicable' - ); - parent::configure(); - } - - protected function execute(InputInterface $input, OutputInterface $output) { - $mountId = $input->getArgument('mount_id'); - try { - $mount = $this->globalService->getStorage($mountId); - } catch (NotFoundException $e) { - $output->writeln('<error>Mount with id "' . $mountId . ' not found, check "occ files_external:list" to get available mounts</error>'); - return 404; - } - - if ($mount->getType() === StorageConfig::MOUNT_TYPE_PERSONAl) { - $output->writeln('<error>Can\'t change applicables on personal mounts</error>'); - return 1; - } - - $addUsers = $input->getOption('add-user'); - $removeUsers = $input->getOption('remove-user'); - $addGroups = $input->getOption('add-group'); - $removeGroups = $input->getOption('remove-group'); - - $applicableUsers = $mount->getApplicableUsers(); - $applicableGroups = $mount->getApplicableGroups(); - - if ((count($addUsers) + count($removeUsers) + count($addGroups) + count($removeGroups) > 0) || $input->getOption('remove-all')) { - foreach ($addUsers as $addUser) { - if (!$this->userManager->userExists($addUser)) { - $output->writeln('<error>User "' . $addUser . '" not found</error>'); - return 404; - } - } - foreach ($addGroups as $addGroup) { - if (!$this->groupManager->groupExists($addGroup)) { - $output->writeln('<error>Group "' . $addGroup . '" not found</error>'); - return 404; - } - } - - if ($input->getOption('remove-all')) { - $applicableUsers = []; - $applicableGroups = []; - } else { - $applicableUsers = array_unique(array_merge($applicableUsers, $addUsers)); - $applicableUsers = array_values(array_diff($applicableUsers, $removeUsers)); - $applicableGroups = array_unique(array_merge($applicableGroups, $addGroups)); - $applicableGroups = array_values(array_diff($applicableGroups, $removeGroups)); - } - $mount->setApplicableUsers($applicableUsers); - $mount->setApplicableGroups($applicableGroups); - $this->globalService->updateStorage($mount); - } - - $this->writeArrayInOutputFormat($input, $output, [ - 'users' => $applicableUsers, - 'groups' => $applicableGroups - ]); - } -} diff --git a/apps/files_external/command/backends.php b/apps/files_external/command/backends.php deleted file mode 100644 index 260ea210397..00000000000 --- a/apps/files_external/command/backends.php +++ /dev/null @@ -1,112 +0,0 @@ -<?php -/** - * @author Robin Appelman <icewind@owncloud.com> - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @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\Command; - -use OC\Core\Command\Base; -use OCA\Files_External\Lib\Auth\AuthMechanism; -use OCA\Files_External\Lib\Backend\Backend; -use OCA\Files_External\Lib\DefinitionParameter; -use OCA\Files_External\Service\BackendService; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Helper\TableHelper; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\Input; -use Symfony\Component\Console\Output\OutputInterface; - -class Backends extends Base { - /** @var BackendService */ - private $backendService; - - function __construct(BackendService $backendService - ) { - parent::__construct(); - - $this->backendService = $backendService; - } - - protected function configure() { - $this - ->setName('files_external:backends') - ->setDescription('Show available authentication and storage backends') - ->addArgument( - 'type', - InputArgument::OPTIONAL, - 'only show backends of a certain type. Possible values are "authentication" or "storage"' - )->addArgument( - 'backend', - InputArgument::OPTIONAL, - 'only show information of a specific backend' - ); - parent::configure(); - } - - protected function execute(InputInterface $input, OutputInterface $output) { - $authBackends = $this->backendService->getAuthMechanisms(); - $storageBackends = $this->backendService->getBackends(); - - $data = [ - 'authentication' => array_map([$this, 'serializeAuthBackend'], $authBackends), - 'storage' => array_map([$this, 'serializeAuthBackend'], $storageBackends) - ]; - - $type = $input->getArgument('type'); - $backend = $input->getArgument('backend'); - if ($type) { - if (!isset($data[$type])) { - $output->writeln('<error>Invalid type "' . $type . '". Possible values are "authentication" or "storage"</error>'); - return 1; - } - $data = $data[$type]; - - if ($backend) { - if (!isset($data[$backend])) { - $output->writeln('<error>Unknown backend "' . $backend . '" of type "' . $type . '"</error>'); - return 1; - } - $data = $data[$backend]; - } - } - - $this->writeArrayInOutputFormat($input, $output, $data); - } - - private function serializeAuthBackend(\JsonSerializable $backend) { - $data = $backend->jsonSerialize(); - $result = [ - 'name' => $data['name'], - 'identifier' => $data['identifier'], - 'configuration' => array_map(function (DefinitionParameter $parameter) { - return $parameter->getTypeName(); - }, $data['configuration']) - ]; - if ($backend instanceof Backend) { - $result['storage_class'] = $backend->getStorageClass(); - $authBackends = $this->backendService->getAuthMechanismsByScheme(array_keys($backend->getAuthSchemes())); - $result['supported_authentication_backends'] = array_keys($authBackends); - } - return $result; - } -} diff --git a/apps/files_external/command/config.php b/apps/files_external/command/config.php deleted file mode 100644 index 1403c24b345..00000000000 --- a/apps/files_external/command/config.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php -/** - * @author Robin Appelman <icewind@owncloud.com> - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @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\Command; - -use OC\Core\Command\Base; -use OCA\Files_external\Lib\StorageConfig; -use OCA\Files_external\NotFoundException; -use OCA\Files_external\Service\GlobalStoragesService; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Helper\TableHelper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -class Config extends Base { - /** - * @var GlobalStoragesService - */ - protected $globalService; - - function __construct(GlobalStoragesService $globalService) { - parent::__construct(); - $this->globalService = $globalService; - } - - protected function configure() { - $this - ->setName('files_external:config') - ->setDescription('Manage backend configuration for a mount') - ->addArgument( - 'mount_id', - InputArgument::REQUIRED, - 'The id of the mount to edit' - )->addArgument( - 'key', - InputArgument::REQUIRED, - 'key of the config option to set/get' - )->addArgument( - 'value', - InputArgument::OPTIONAL, - 'value to set the config option to, when no value is provided the existing value will be printed' - ); - parent::configure(); - } - - protected function execute(InputInterface $input, OutputInterface $output) { - $mountId = $input->getArgument('mount_id'); - $key = $input->getArgument('key'); - try { - $mount = $this->globalService->getStorage($mountId); - } catch (NotFoundException $e) { - $output->writeln('<error>Mount with id "' . $mountId . ' not found, check "occ files_external:list" to get available mounts"</error>'); - return 404; - } - - $value = $input->getArgument('value'); - if ($value) { - $this->setOption($mount, $key, $value, $output); - } else { - $this->getOption($mount, $key, $output); - } - } - - /** - * @param StorageConfig $mount - * @param string $key - * @param OutputInterface $output - */ - protected function getOption(StorageConfig $mount, $key, OutputInterface $output) { - if ($key === 'mountpoint' || $key === 'mount_point') { - $value = $mount->getMountPoint(); - } else { - $value = $mount->getBackendOption($key); - } - if (!is_string($value)) { // show bools and objects correctly - $value = json_encode($value); - } - $output->writeln($value); - } - - /** - * @param StorageConfig $mount - * @param string $key - * @param string $value - * @param OutputInterface $output - */ - protected function setOption(StorageConfig $mount, $key, $value, OutputInterface $output) { - $decoded = json_decode($value, true); - if (!is_null($decoded)) { - $value = $decoded; - } - if ($key === 'mountpoint' || $key === 'mount_point') { - $mount->setMountPoint($value); - } else { - $mount->setBackendOption($key, $value); - } - $this->globalService->updateStorage($mount); - } -} diff --git a/apps/files_external/command/create.php b/apps/files_external/command/create.php deleted file mode 100644 index 315b23f9d3c..00000000000 --- a/apps/files_external/command/create.php +++ /dev/null @@ -1,226 +0,0 @@ -<?php -/** - * @author Robin Appelman <icewind@owncloud.com> - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @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\Command; - -use OC\Core\Command\Base; -use OC\Files\Filesystem; -use OC\User\NoUserException; -use OCA\Files_External\Lib\Auth\AuthMechanism; -use OCA\Files_External\Lib\Backend\Backend; -use OCA\Files_External\Lib\DefinitionParameter; -use OCA\Files_external\Lib\StorageConfig; -use OCA\Files_External\Service\BackendService; -use OCA\Files_external\Service\GlobalStoragesService; -use OCA\Files_external\Service\ImportLegacyStoragesService; -use OCA\Files_external\Service\UserStoragesService; -use OCP\IUserManager; -use OCP\IUserSession; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Helper\TableHelper; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\Input; -use Symfony\Component\Console\Output\OutputInterface; - -class Create extends Base { - /** - * @var GlobalStoragesService - */ - private $globalService; - - /** - * @var UserStoragesService - */ - private $userService; - - /** - * @var IUserManager - */ - private $userManager; - - /** @var BackendService */ - private $backendService; - - /** @var IUserSession */ - private $userSession; - - function __construct(GlobalStoragesService $globalService, - UserStoragesService $userService, - IUserManager $userManager, - IUserSession $userSession, - BackendService $backendService - ) { - parent::__construct(); - $this->globalService = $globalService; - $this->userService = $userService; - $this->userManager = $userManager; - $this->userSession = $userSession; - $this->backendService = $backendService; - } - - protected function configure() { - $this - ->setName('files_external:create') - ->setDescription('Create a new mount configuration') - ->addOption( - 'user', - null, - InputOption::VALUE_OPTIONAL, - 'user to add the mount configuration for, if not set the mount will be added as system mount' - ) - ->addArgument( - 'mount_point', - InputArgument::REQUIRED, - 'mount point for the new mount' - ) - ->addArgument( - 'storage_backend', - InputArgument::REQUIRED, - 'storage backend identifier for the new mount, see `occ files_external:backends` for possible values' - ) - ->addArgument( - 'authentication_backend', - InputArgument::REQUIRED, - 'authentication backend identifier for the new mount, see `occ files_external:backends` for possible values' - ) - ->addOption( - 'config', - 'c', - InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, - 'Mount configuration option in key=value format' - ) - ->addOption( - 'dry', - null, - InputOption::VALUE_NONE, - 'Don\'t save the created mount, only list the new mount' - ); - parent::configure(); - } - - protected function execute(InputInterface $input, OutputInterface $output) { - $user = $input->getOption('user'); - $mountPoint = $input->getArgument('mount_point'); - $storageIdentifier = $input->getArgument('storage_backend'); - $authIdentifier = $input->getArgument('authentication_backend'); - $configInput = $input->getOption('config'); - - $storageBackend = $this->backendService->getBackend($storageIdentifier); - $authBackend = $this->backendService->getAuthMechanism($authIdentifier); - - if (!Filesystem::isValidPath($mountPoint)) { - $output->writeln('<error>Invalid mountpoint "' . $mountPoint . '"</error>'); - return 1; - } - if (is_null($storageBackend)) { - $output->writeln('<error>Storage backend with identifier "' . $storageIdentifier . '" not found (see `occ files_external:backends` for possible values)</error>'); - return 404; - } - if (is_null($authBackend)) { - $output->writeln('<error>Authentication backend with identifier "' . $authIdentifier . '" not found (see `occ files_external:backends` for possible values)</error>'); - return 404; - } - $supportedSchemes = array_keys($storageBackend->getAuthSchemes()); - if (!in_array($authBackend->getScheme(), $supportedSchemes)) { - $output->writeln('<error>Authentication backend "' . $authIdentifier . '" not valid for storage backend "' . $storageIdentifier . '" (see `occ files_external:backends storage ' . $storageIdentifier . '` for possible values)</error>'); - return 1; - } - - $config = []; - foreach ($configInput as $configOption) { - if (!strpos($configOption, '=')) { - $output->writeln('<error>Invalid mount configuration option "' . $configOption . '"</error>'); - return 1; - } - list($key, $value) = explode('=', $configOption, 2); - if (!$this->validateParam($key, $value, $storageBackend, $authBackend)) { - $output->writeln('<error>Unknown configuration for backends "' . $key . '"</error>'); - return 1; - } - $config[$key] = $value; - } - - $mount = new StorageConfig(); - $mount->setMountPoint($mountPoint); - $mount->setBackend($storageBackend); - $mount->setAuthMechanism($authBackend); - $mount->setBackendOptions($config); - - if ($user) { - if (!$this->userManager->userExists($user)) { - $output->writeln('<error>User "' . $user . '" not found</error>'); - return 1; - } - $mount->setApplicableUsers([$user]); - } - - if ($input->getOption('dry')) { - $this->showMount($user, $mount, $input, $output); - } else { - $this->getStorageService($user)->addStorage($mount); - if ($input->getOption('output') === self::OUTPUT_FORMAT_PLAIN) { - $output->writeln('<info>Storage created with id ' . $mount->getId() . '</info>'); - } else { - $output->writeln($mount->getId()); - } - } - return 0; - } - - private function validateParam($key, &$value, Backend $storageBackend, AuthMechanism $authBackend) { - $params = array_merge($storageBackend->getParameters(), $authBackend->getParameters()); - foreach ($params as $param) { - /** @var DefinitionParameter $param */ - if ($param->getName() === $key) { - if ($param->getType() === DefinitionParameter::VALUE_BOOLEAN) { - $value = ($value === 'true'); - } - return true; - } - } - return false; - } - - private function showMount($user, StorageConfig $mount, InputInterface $input, OutputInterface $output) { - $listCommand = new ListCommand($this->globalService, $this->userService, $this->userSession, $this->userManager); - $listInput = new ArrayInput([], $listCommand->getDefinition()); - $listInput->setOption('output', $input->getOption('output')); - $listInput->setOption('show-password', true); - $listCommand->listMounts($user, [$mount], $listInput, $output); - } - - protected function getStorageService($userId) { - if (!empty($userId)) { - $user = $this->userManager->get($userId); - if (is_null($user)) { - throw new NoUserException("user $userId not found"); - } - $this->userSession->setUser($user); - return $this->userService; - } else { - return $this->globalService; - } - } -} diff --git a/apps/files_external/command/delete.php b/apps/files_external/command/delete.php deleted file mode 100644 index bdbfcf8bb55..00000000000 --- a/apps/files_external/command/delete.php +++ /dev/null @@ -1,114 +0,0 @@ -<?php -/** - * @author Robin Appelman <icewind@owncloud.com> - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @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\Command; - -use OC\Core\Command\Base; -use OCA\Files_external\Lib\StorageConfig; -use OCA\Files_external\NotFoundException; -use OCA\Files_external\Service\GlobalStoragesService; -use OCA\Files_external\Service\UserStoragesService; -use OCP\IUserManager; -use OCP\IUserSession; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Helper\TableHelper; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Question\ConfirmationQuestion; - -class Delete extends Base { - /** - * @var GlobalStoragesService - */ - protected $globalService; - - /** - * @var UserStoragesService - */ - protected $userService; - - /** - * @var IUserSession - */ - protected $userSession; - - /** - * @var IUserManager - */ - protected $userManager; - - function __construct(GlobalStoragesService $globalService, UserStoragesService $userService, IUserSession $userSession, IUserManager $userManager) { - parent::__construct(); - $this->globalService = $globalService; - $this->userService = $userService; - $this->userSession = $userSession; - $this->userManager = $userManager; - } - - protected function configure() { - $this - ->setName('files_external:delete') - ->setDescription('Delete an external mount') - ->addArgument( - 'mount_id', - InputArgument::REQUIRED, - 'The id of the mount to edit' - )->addOption( - 'yes', - 'y', - InputOption::VALUE_NONE, - 'Skip confirmation' - ); - parent::configure(); - } - - protected function execute(InputInterface $input, OutputInterface $output) { - $mountId = $input->getArgument('mount_id'); - try { - $mount = $this->globalService->getStorage($mountId); - } catch (NotFoundException $e) { - $output->writeln('<error>Mount with id "' . $mountId . ' not found, check "occ files_external:list" to get available mounts"</error>'); - return 404; - } - - $noConfirm = $input->getOption('yes'); - - if (!$noConfirm) { - $listCommand = new ListCommand($this->globalService, $this->userService, $this->userSession, $this->userManager); - $listInput = new ArrayInput([], $listCommand->getDefinition()); - $listInput->setOption('output', $input->getOption('output')); - $listCommand->listMounts(null, [$mount], $listInput, $output); - - $questionHelper = $this->getHelper('question'); - $question = new ConfirmationQuestion('Delete this mount? [y/N] ', false); - - if (!$questionHelper->ask($input, $output, $question)) { - return; - } - } - - $this->globalService->removeStorage($mountId); - } -} diff --git a/apps/files_external/command/export.php b/apps/files_external/command/export.php deleted file mode 100644 index 09c5ea8a9df..00000000000 --- a/apps/files_external/command/export.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php -/** - * @author Robin Appelman <icewind@owncloud.com> - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @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\Command; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Helper\TableHelper; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\Input; -use Symfony\Component\Console\Output\OutputInterface; - -class Export extends ListCommand { - - protected function configure() { - $this - ->setName('files_external:export') - ->setDescription('Export mount configurations') - ->addArgument( - 'user_id', - InputArgument::OPTIONAL, - 'user id to export the personal mounts for, if no user is provided admin mounts will be exported' - ); - } - - protected function execute(InputInterface $input, OutputInterface $output) { - $listCommand = new ListCommand($this->globalService, $this->userService, $this->userSession, $this->userManager); - $listInput = new ArrayInput([], $listCommand->getDefinition()); - $listInput->setArgument('user_id', $input->getArgument('user_id')); - $listInput->setOption('output', 'json_pretty'); - $listInput->setOption('show-password', true); - $listInput->setOption('full', true); - $listCommand->execute($listInput, $output); - } -} diff --git a/apps/files_external/command/import.php b/apps/files_external/command/import.php deleted file mode 100644 index 97bb9a937f0..00000000000 --- a/apps/files_external/command/import.php +++ /dev/null @@ -1,227 +0,0 @@ -<?php -/** - * @author Robin Appelman <icewind@owncloud.com> - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @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\Command; - -use OC\Core\Command\Base; -use OC\User\NoUserException; -use OCA\Files_external\Lib\StorageConfig; -use OCA\Files_External\Service\BackendService; -use OCA\Files_external\Service\GlobalStoragesService; -use OCA\Files_external\Service\ImportLegacyStoragesService; -use OCA\Files_external\Service\UserStoragesService; -use OCP\IUserManager; -use OCP\IUserSession; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Helper\TableHelper; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\Input; -use Symfony\Component\Console\Output\OutputInterface; - -class Import extends Base { - /** - * @var GlobalStoragesService - */ - private $globalService; - - /** - * @var UserStoragesService - */ - private $userService; - - /** - * @var IUserSession - */ - private $userSession; - - /** - * @var IUserManager - */ - private $userManager; - - /** @var ImportLegacyStoragesService */ - private $importLegacyStorageService; - - /** @var BackendService */ - private $backendService; - - function __construct(GlobalStoragesService $globalService, - UserStoragesService $userService, - IUserSession $userSession, - IUserManager $userManager, - ImportLegacyStoragesService $importLegacyStorageService, - BackendService $backendService - ) { - parent::__construct(); - $this->globalService = $globalService; - $this->userService = $userService; - $this->userSession = $userSession; - $this->userManager = $userManager; - $this->importLegacyStorageService = $importLegacyStorageService; - $this->backendService = $backendService; - } - - protected function configure() { - $this - ->setName('files_external:import') - ->setDescription('Import mount configurations') - ->addOption( - 'user', - null, - InputOption::VALUE_OPTIONAL, - 'user to add the mount configurations for, if not set the mount will be added as system mount' - ) - ->addArgument( - 'path', - InputArgument::REQUIRED, - 'path to a json file containing the mounts to import, use "-" to read from stdin' - ) - ->addOption( - 'dry', - null, - InputOption::VALUE_NONE, - 'Don\'t save the imported mounts, only list the new mounts' - ); - parent::configure(); - } - - protected function execute(InputInterface $input, OutputInterface $output) { - $user = $input->getOption('user'); - $path = $input->getArgument('path'); - if ($path === '-') { - $json = file_get_contents('php://stdin'); - } else { - if (!file_exists($path)) { - $output->writeln('<error>File not found: ' . $path . '</error>'); - return 1; - } - $json = file_get_contents($path); - } - if (!is_string($json) || strlen($json) < 2) { - $output->writeln('<error>Error while reading json</error>'); - return 1; - } - $data = json_decode($json, true); - if (!is_array($data)) { - $output->writeln('<error>Error while parsing json</error>'); - return 1; - } - - $isLegacy = isset($data['user']) || isset($data['group']); - if ($isLegacy) { - $this->importLegacyStorageService->setData($data); - $mounts = $this->importLegacyStorageService->getAllStorages(); - foreach ($mounts as $mount) { - if ($mount->getBackendOption('password') === false) { - $output->writeln('<error>Failed to decrypt password</error>'); - return 1; - } - } - } else { - if (!isset($data[0])) { //normalize to an array of mounts - $data = [$data]; - } - $mounts = array_map([$this, 'parseData'], $data); - } - - if ($user) { - // ensure applicables are correct for personal mounts - foreach ($mounts as $mount) { - $mount->setApplicableGroups([]); - $mount->setApplicableUsers([$user]); - } - } - - $storageService = $this->getStorageService($user); - - $existingMounts = $storageService->getAllStorages(); - - foreach ($mounts as $mount) { - foreach ($existingMounts as $existingMount) { - if ( - $existingMount->getMountPoint() === $mount->getMountPoint() && - $existingMount->getApplicableGroups() === $mount->getApplicableGroups() && - $existingMount->getApplicableUsers() == $mount->getApplicableUsers() && - $existingMount->getBackendOptions() == $mount->getBackendOptions() - ) { - $output->writeln("<error>Duplicate mount (" . $mount->getMountPoint() . ")</error>"); - return 1; - } - } - } - - if ($input->getOption('dry')) { - if (count($mounts) === 0) { - $output->writeln('<error>No mounts to be imported</error>'); - return 1; - } - $listCommand = new ListCommand($this->globalService, $this->userService, $this->userSession, $this->userManager); - $listInput = new ArrayInput([], $listCommand->getDefinition()); - $listInput->setOption('output', $input->getOption('output')); - $listInput->setOption('show-password', true); - $listCommand->listMounts($user, $mounts, $listInput, $output); - } else { - foreach ($mounts as $mount) { - $storageService->addStorage($mount); - } - } - return 0; - } - - private function parseData(array $data) { - $mount = new StorageConfig($data['mount_id']); - $mount->setMountPoint($data['mount_point']); - $mount->setBackend($this->getBackendByClass($data['storage'])); - $authBackend = $this->backendService->getAuthMechanism($data['authentication_type']); - $mount->setAuthMechanism($authBackend); - $mount->setBackendOptions($data['configuration']); - $mount->setMountOptions($data['options']); - $mount->setApplicableUsers(isset($data['applicable_users']) ? $data['applicable_users'] : []); - $mount->setApplicableGroups(isset($data['applicable_groups']) ? $data['applicable_groups'] : []); - return $mount; - } - - private function getBackendByClass($className) { - $backends = $this->backendService->getBackends(); - foreach ($backends as $backend) { - if ($backend->getStorageClass() === $className) { - return $backend; - } - } - } - - protected function getStorageService($userId) { - if (!empty($userId)) { - $user = $this->userManager->get($userId); - if (is_null($user)) { - throw new NoUserException("user $userId not found"); - } - $this->userSession->setUser($user); - return $this->userService; - } else { - return $this->globalService; - } - } -} diff --git a/apps/files_external/command/listcommand.php b/apps/files_external/command/listcommand.php deleted file mode 100644 index 5a0794be4c5..00000000000 --- a/apps/files_external/command/listcommand.php +++ /dev/null @@ -1,248 +0,0 @@ -<?php -/** - * @author Robin Appelman <icewind@owncloud.com> - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @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\Command; - -use OC\Core\Command\Base; -use OC\User\NoUserException; -use OCA\Files_external\Lib\StorageConfig; -use OCA\Files_external\Service\GlobalStoragesService; -use OCA\Files_external\Service\UserStoragesService; -use OCP\IUserManager; -use OCP\IUserSession; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -class ListCommand extends Base { - /** - * @var GlobalStoragesService - */ - protected $globalService; - - /** - * @var UserStoragesService - */ - protected $userService; - - /** - * @var IUserSession - */ - protected $userSession; - - /** - * @var IUserManager - */ - protected $userManager; - - function __construct(GlobalStoragesService $globalService, UserStoragesService $userService, IUserSession $userSession, IUserManager $userManager) { - parent::__construct(); - $this->globalService = $globalService; - $this->userService = $userService; - $this->userSession = $userSession; - $this->userManager = $userManager; - } - - protected function configure() { - $this - ->setName('files_external:list') - ->setDescription('List configured mounts') - ->addArgument( - 'user_id', - InputArgument::OPTIONAL, - 'user id to list the personal mounts for, if no user is provided admin mounts will be listed' - )->addOption( - 'show-password', - null, - InputOption::VALUE_NONE, - 'show passwords and secrets' - )->addOption( - 'full', - null, - InputOption::VALUE_NONE, - 'don\'t truncate long values in table output' - ); - parent::configure(); - } - - protected function execute(InputInterface $input, OutputInterface $output) { - $userId = $input->getArgument('user_id'); - $storageService = $this->getStorageService($userId); - - /** @var $mounts StorageConfig[] */ - $mounts = $storageService->getAllStorages(); - - $this->listMounts($userId, $mounts, $input, $output); - } - - /** - * @param $userId $userId - * @param StorageConfig[] $mounts - * @param InputInterface $input - * @param OutputInterface $output - */ - public function listMounts($userId, array $mounts, InputInterface $input, OutputInterface $output){ - $outputType = $input->getOption('output'); - if (count($mounts) === 0) { - if ($outputType === self::OUTPUT_FORMAT_JSON || $outputType === self::OUTPUT_FORMAT_JSON_PRETTY) { - $output->writeln('[]'); - } else { - if ($userId) { - $output->writeln("<info>No mounts configured by $userId</info>"); - } else { - $output->writeln("<info>No admin mounts configured</info>"); - } - } - return; - } - - $headers = ['Mount ID', 'Mount Point', 'Storage', 'Authentication Type', 'Configuration', 'Options']; - - if (!$userId) { - $headers[] = 'Applicable Users'; - $headers[] = 'Applicable Groups'; - } - - if (!$input->getOption('show-password')) { - $hideKeys = ['password', 'refresh_token', 'token', 'client_secret', 'public_key', 'private_key']; - foreach ($mounts as $mount) { - $config = $mount->getBackendOptions(); - foreach ($config as $key => $value) { - if (in_array($key, $hideKeys)) { - $mount->setBackendOption($key, '***'); - } - } - } - } - - if ($outputType === self::OUTPUT_FORMAT_JSON || $outputType === self::OUTPUT_FORMAT_JSON_PRETTY) { - $keys = array_map(function ($header) { - return strtolower(str_replace(' ', '_', $header)); - }, $headers); - - $pairs = array_map(function (StorageConfig $config) use ($keys, $userId) { - $values = [ - $config->getId(), - $config->getMountPoint(), - $config->getBackend()->getStorageClass(), - $config->getAuthMechanism()->getIdentifier(), - $config->getBackendOptions(), - $config->getMountOptions() - ]; - if (!$userId) { - $values[] = $config->getApplicableUsers(); - $values[] = $config->getApplicableGroups(); - } - - return array_combine($keys, $values); - }, $mounts); - if ($outputType === self::OUTPUT_FORMAT_JSON) { - $output->writeln(json_encode(array_values($pairs))); - } else { - $output->writeln(json_encode(array_values($pairs), JSON_PRETTY_PRINT)); - } - } else { - $full = $input->getOption('full'); - $defaultMountOptions = [ - 'encrypt' => true, - 'previews' => true, - 'filesystem_check_changes' => 1 - ]; - $rows = array_map(function (StorageConfig $config) use ($userId, $defaultMountOptions, $full) { - $storageConfig = $config->getBackendOptions(); - $keys = array_keys($storageConfig); - $values = array_values($storageConfig); - - if (!$full) { - $values = array_map(function ($value) { - if (is_string($value) && strlen($value) > 32) { - return substr($value, 0, 6) . '...' . substr($value, -6, 6); - } else { - return $value; - } - }, $values); - } - - $configStrings = array_map(function ($key, $value) { - return $key . ': ' . json_encode($value); - }, $keys, $values); - $configString = implode(', ', $configStrings); - - $mountOptions = $config->getMountOptions(); - // hide defaults - foreach ($mountOptions as $key => $value) { - if ($value === $defaultMountOptions[$key]) { - unset($mountOptions[$key]); - } - } - $keys = array_keys($mountOptions); - $values = array_values($mountOptions); - - $optionsStrings = array_map(function ($key, $value) { - return $key . ': ' . json_encode($value); - }, $keys, $values); - $optionsString = implode(', ', $optionsStrings); - - $values = [ - $config->getId(), - $config->getMountPoint(), - $config->getBackend()->getText(), - $config->getAuthMechanism()->getText(), - $configString, - $optionsString - ]; - - if (!$userId) { - $applicableUsers = implode(', ', $config->getApplicableUsers()); - $applicableGroups = implode(', ', $config->getApplicableGroups()); - if ($applicableUsers === '' && $applicableGroups === '') { - $applicableUsers = 'All'; - } - $values[] = $applicableUsers; - $values[] = $applicableGroups; - } - - return $values; - }, $mounts); - - $table = new Table($output); - $table->setHeaders($headers); - $table->setRows($rows); - $table->render(); - } - } - - protected function getStorageService($userId) { - if (!empty($userId)) { - $user = $this->userManager->get($userId); - if (is_null($user)) { - throw new NoUserException("user $userId not found"); - } - $this->userSession->setUser($user); - return $this->userService; - } else { - return $this->globalService; - } - } -} diff --git a/apps/files_external/command/option.php b/apps/files_external/command/option.php deleted file mode 100644 index 292005134cb..00000000000 --- a/apps/files_external/command/option.php +++ /dev/null @@ -1,85 +0,0 @@ -<?php -/** - * @author Robin Appelman <icewind@owncloud.com> - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @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\Command; - -use OC\Core\Command\Base; -use OCA\Files_external\Lib\StorageConfig; -use OCA\Files_external\Service\GlobalStoragesService; -use OCA\Files_external\Service\UserStoragesService; -use OCP\IUserManager; -use OCP\IUserSession; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Helper\TableHelper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -class Option extends Config { - protected function configure() { - $this - ->setName('files_external:option') - ->setDescription('Manage mount options for a mount') - ->addArgument( - 'mount_id', - InputArgument::REQUIRED, - 'The id of the mount to edit' - )->addArgument( - 'key', - InputArgument::REQUIRED, - 'key of the mount option to set/get' - )->addArgument( - 'value', - InputArgument::OPTIONAL, - 'value to set the mount option to, when no value is provided the existing value will be printed' - ); - } - - /** - * @param StorageConfig $mount - * @param string $key - * @param OutputInterface $output - */ - protected function getOption(StorageConfig $mount, $key, OutputInterface $output) { - $value = $mount->getMountOption($key); - if (!is_string($value)) { // show bools and objects correctly - $value = json_encode($value); - } - $output->writeln($value); - } - - /** - * @param StorageConfig $mount - * @param string $key - * @param string $value - * @param OutputInterface $output - */ - protected function setOption(StorageConfig $mount, $key, $value, OutputInterface $output) { - $decoded = json_decode($value, true); - if (!is_null($decoded)) { - $value = $decoded; - } - $mount->setMountOption($key, $value); - $this->globalService->updateStorage($mount); - } -} diff --git a/apps/files_external/command/verify.php b/apps/files_external/command/verify.php deleted file mode 100644 index f985cb401af..00000000000 --- a/apps/files_external/command/verify.php +++ /dev/null @@ -1,145 +0,0 @@ -<?php -/** - * @author Robin Appelman <icewind@owncloud.com> - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @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\Command; - -use OC\Core\Command\Base; -use OCA\Files_External\Lib\Auth\AuthMechanism; -use OCA\Files_External\Lib\Backend\Backend; -use OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException; -use OCA\Files_external\Lib\StorageConfig; -use OCA\Files_external\NotFoundException; -use OCA\Files_external\Service\GlobalStoragesService; -use OCP\Files\StorageNotAvailableException; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Helper\TableHelper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -class Verify extends Base { - /** - * @var GlobalStoragesService - */ - protected $globalService; - - function __construct(GlobalStoragesService $globalService) { - parent::__construct(); - $this->globalService = $globalService; - } - - protected function configure() { - $this - ->setName('files_external:verify') - ->setDescription('Verify mount configuration') - ->addArgument( - 'mount_id', - InputArgument::REQUIRED, - 'The id of the mount to check' - )->addOption( - 'config', - 'c', - InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, - 'Additional config option to set before checking in key=value pairs, required for certain auth backends such as login credentails' - ); - parent::configure(); - } - - protected function execute(InputInterface $input, OutputInterface $output) { - $mountId = $input->getArgument('mount_id'); - $configInput = $input->getOption('config'); - - try { - $mount = $this->globalService->getStorage($mountId); - } catch (NotFoundException $e) { - $output->writeln('<error>Mount with id "' . $mountId . ' not found, check "occ files_external:list" to get available mounts"</error>'); - return 404; - } - - $this->updateStorageStatus($mount, $configInput, $output); - - $this->writeArrayInOutputFormat($input, $output, [ - 'status' => StorageNotAvailableException::getStateCodeName($mount->getStatus()), - 'code' => $mount->getStatus(), - 'message' => $mount->getStatusMessage() - ]); - } - - private function manipulateStorageConfig(StorageConfig $storage) { - /** @var AuthMechanism */ - $authMechanism = $storage->getAuthMechanism(); - $authMechanism->manipulateStorageConfig($storage); - /** @var Backend */ - $backend = $storage->getBackend(); - $backend->manipulateStorageConfig($storage); - } - - private function updateStorageStatus(StorageConfig &$storage, $configInput, OutputInterface $output) { - try { - try { - $this->manipulateStorageConfig($storage); - } catch (InsufficientDataForMeaningfulAnswerException $e) { - if (count($configInput) === 0) { // extra config options might solve the error - throw $e; - } - } - - foreach ($configInput as $configOption) { - if (!strpos($configOption, '=')) { - $output->writeln('<error>Invalid mount configuration option "' . $configOption . '"</error>'); - return; - } - list($key, $value) = explode('=', $configOption, 2); - $storage->setBackendOption($key, $value); - } - - /** @var Backend */ - $backend = $storage->getBackend(); - // update status (can be time-consuming) - $storage->setStatus( - \OC_Mount_Config::getBackendStatus( - $backend->getStorageClass(), - $storage->getBackendOptions(), - false - ) - ); - } catch (InsufficientDataForMeaningfulAnswerException $e) { - $status = $e->getCode() ? $e->getCode() : StorageNotAvailableException::STATUS_INDETERMINATE; - $storage->setStatus( - $status, - $e->getMessage() - ); - } catch (StorageNotAvailableException $e) { - $storage->setStatus( - $e->getCode(), - $e->getMessage() - ); - } catch (\Exception $e) { - // FIXME: convert storage exceptions to StorageNotAvailableException - $storage->setStatus( - StorageNotAvailableException::STATUS_ERROR, - get_class($e) . ': ' . $e->getMessage() - ); - } - } -} |