From f5cdd27b22b85e9dfb80bf1b4a29d296f437a3f2 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 18 Nov 2015 15:59:50 +0100 Subject: Add files_external:list command to list configured external storages --- apps/files_external/appinfo/register_command.php | 34 ++++ apps/files_external/command/listcommand.php | 193 +++++++++++++++++++++++ 2 files changed, 227 insertions(+) create mode 100644 apps/files_external/appinfo/register_command.php create mode 100644 apps/files_external/command/listcommand.php diff --git a/apps/files_external/appinfo/register_command.php b/apps/files_external/appinfo/register_command.php new file mode 100644 index 00000000000..a436dc95005 --- /dev/null +++ b/apps/files_external/appinfo/register_command.php @@ -0,0 +1,34 @@ + + * + * @copyright Copyright (c) 2015, 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 + * + */ + + +use OCA\Files_External\Command\ListCommand; + +$userManager = OC::$server->getUserManager(); +$userSession = OC::$server->getUserSession(); + +$app = \OC_Mount_Config::$app; + +$globalStorageService = $app->getContainer()->query('\OCA\Files_external\Service\GlobalStoragesService'); +$userStorageService = $app->getContainer()->query('\OCA\Files_external\Service\UserStoragesService'); + +/** @var Symfony\Component\Console\Application $application */ +$application->add(new ListCommand($globalStorageService, $userStorageService, $userSession, $userManager)); diff --git a/apps/files_external/command/listcommand.php b/apps/files_external/command/listcommand.php new file mode 100644 index 00000000000..d7a6558c8b4 --- /dev/null +++ b/apps/files_external/command/listcommand.php @@ -0,0 +1,193 @@ + + * + * @copyright Copyright (c) 2015, 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 + * + */ + +namespace OCA\Files_External\Command; + +use OCA\Files_external\Lib\StorageConfig; +use OCA\Files_external\Service\GlobalStoragesService; +use OCA\Files_external\Service\UserStoragesService; +use OCP\Files\IRootFolder; +use OCP\IUserBackend; +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 ListCommand extends Command { + /** + * @var GlobalStoragesService + */ + private $globalService; + + /** + * @var UserStoragesService + */ + private $userService; + + /** + * @var IUserSession + */ + private $userSession; + + /** + * @var IUserManager + */ + private $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('json', null, InputOption::VALUE_NONE, 'use json output instead of a human-readable array'); + } + + protected function execute(InputInterface $input, OutputInterface $output) { + $userId = $input->getArgument('user_id'); + if (!empty($userId)) { + $user = $this->userManager->get($userId); + if (is_null($user)) { + $output->writeln("user $userId not found"); + return; + } + $this->userSession->setUser($user); + $storageService = $this->userService; + } else { + $storageService = $this->globalService; + } + + $mounts = $storageService->getAllStorages(); + + if (count($mounts) === 0) { + if ($userId) { + $output->writeln("No mounts configured by $userId"); + } else { + $output->writeln("No mounts admin configured"); + } + return; + } + + $headers = ['Mount ID', 'Mount Point', 'Storage', 'Authentication Type', 'Configuration', 'Options']; + + if (!$userId) { + $headers[] = 'Applicable Users'; + $headers[] = 'Applicable Groups'; + } + + if ($input->getOption('json')) { + $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()->getScheme(), + $config->getBackendOptions(), + $config->getMountOptions() + ]; + if (!$userId) { + $values[] = $config->getApplicableUsers(); + $values[] = $config->getApplicableGroups(); + } + + return array_combine($keys, $values); + }, $mounts); + $output->writeln(json_encode(array_values($pairs), JSON_PRETTY_PRINT)); + } else { + $defaultMountOptions = [ + 'encrypt' => true, + 'previews' => true, + 'filesystem_check_changes' => 1 + ]; + $rows = array_map(function (StorageConfig $config) use ($userId, $defaultMountOptions) { + $storageConfig = $config->getBackendOptions(); + $keys = array_keys($storageConfig); + $values = array_values($storageConfig); + + $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(); + } + } +} -- cgit v1.2.3 From 909b31ea58eb1a8edf80830f2d0e7d97c72a6307 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 23 Nov 2015 11:36:20 +0100 Subject: use common --output option --- apps/files_external/command/listcommand.php | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/apps/files_external/command/listcommand.php b/apps/files_external/command/listcommand.php index d7a6558c8b4..1c0a2d476fb 100644 --- a/apps/files_external/command/listcommand.php +++ b/apps/files_external/command/listcommand.php @@ -21,11 +21,10 @@ 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\Files\IRootFolder; -use OCP\IUserBackend; use OCP\IUserManager; use OCP\IUserSession; use Symfony\Component\Console\Command\Command; @@ -36,7 +35,7 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; -class ListCommand extends Command { +class ListCommand extends Base { /** * @var GlobalStoragesService */ @@ -73,8 +72,8 @@ class ListCommand extends Command { 'user_id', InputArgument::OPTIONAL, 'user id to list the personal mounts for, if no user is provided admin mounts will be listed' - ) - ->addOption('json', null, InputOption::VALUE_NONE, 'use json output instead of a human-readable array'); + ); + parent::configure(); } protected function execute(InputInterface $input, OutputInterface $output) { @@ -109,7 +108,8 @@ class ListCommand extends Command { $headers[] = 'Applicable Groups'; } - if ($input->getOption('json')) { + $outputType = $input->getOption('output'); + if ($outputType === self::OUTPUT_FORMAT_JSON || $outputType === self::OUTPUT_FORMAT_JSON_PRETTY) { $keys = array_map(function ($header) { return strtolower(str_replace(' ', '_', $header)); }, $headers); @@ -130,7 +130,11 @@ class ListCommand extends Command { return array_combine($keys, $values); }, $mounts); - $output->writeln(json_encode(array_values($pairs), JSON_PRETTY_PRINT)); + 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 { $defaultMountOptions = [ 'encrypt' => true, -- cgit v1.2.3 From 0795f7d71bdc5e7c1a444fd06cf76525e951850b Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 23 Nov 2015 12:24:24 +0100 Subject: hide passwords and secrets on default --- apps/files_external/command/listcommand.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apps/files_external/command/listcommand.php b/apps/files_external/command/listcommand.php index 1c0a2d476fb..c10ca1efeb7 100644 --- a/apps/files_external/command/listcommand.php +++ b/apps/files_external/command/listcommand.php @@ -72,6 +72,11 @@ class ListCommand extends Base { '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' ); parent::configure(); } @@ -90,6 +95,7 @@ class ListCommand extends Base { $storageService = $this->globalService; } + /** @var $mounts StorageConfig[] */ $mounts = $storageService->getAllStorages(); if (count($mounts) === 0) { @@ -108,6 +114,18 @@ class ListCommand extends Base { $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, '***'); + } + } + } + } + $outputType = $input->getOption('output'); if ($outputType === self::OUTPUT_FORMAT_JSON || $outputType === self::OUTPUT_FORMAT_JSON_PRETTY) { $keys = array_map(function ($header) { -- cgit v1.2.3 From ff72eac9270d7e6840371f1ac38a60d66286079b Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 23 Nov 2015 12:29:20 +0100 Subject: truncate long values on default --- apps/files_external/command/listcommand.php | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/apps/files_external/command/listcommand.php b/apps/files_external/command/listcommand.php index c10ca1efeb7..923939b4e34 100644 --- a/apps/files_external/command/listcommand.php +++ b/apps/files_external/command/listcommand.php @@ -77,6 +77,11 @@ class ListCommand extends Base { null, InputOption::VALUE_NONE, 'show passwords and secrets' + )->addOption( + 'full', + null, + InputOption::VALUE_NONE, + 'dont truncate long values in table output' ); parent::configure(); } @@ -154,16 +159,27 @@ class ListCommand extends Base { $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) { + $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); -- cgit v1.2.3 From 74dfc604d173b675b87e53a2d3b7e9e33415ae7a Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 23 Nov 2015 13:08:53 +0100 Subject: language fixes --- apps/files_external/command/listcommand.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/files_external/command/listcommand.php b/apps/files_external/command/listcommand.php index 923939b4e34..4c027ffcb8e 100644 --- a/apps/files_external/command/listcommand.php +++ b/apps/files_external/command/listcommand.php @@ -81,7 +81,7 @@ class ListCommand extends Base { 'full', null, InputOption::VALUE_NONE, - 'dont truncate long values in table output' + 'don\'t truncate long values in table output' ); parent::configure(); } @@ -107,7 +107,7 @@ class ListCommand extends Base { if ($userId) { $output->writeln("No mounts configured by $userId"); } else { - $output->writeln("No mounts admin configured"); + $output->writeln("No admin mounts configured"); } return; } -- cgit v1.2.3