From cfd2e8cc2026222866dd78a77fecd8ed44532634 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 8 Apr 2022 11:40:05 +0200 Subject: [PATCH] Allow to autocomplete user and group ids in commands Signed-off-by: Joas Schilling --- core/Command/Group/AddUser.php | 26 ++++++++++++++++++++++++++ core/Command/Group/Delete.php | 14 ++++++++++++++ core/Command/Group/Info.php | 13 +++++++++++++ core/Command/Group/RemoveUser.php | 23 +++++++++++++++++++++++ core/Command/User/Delete.php | 18 ++++++++++++++++-- core/Command/User/Disable.php | 24 ++++++++++++++++++++++-- core/Command/User/Enable.php | 24 ++++++++++++++++++++++-- core/Command/User/Info.php | 13 +++++++++++++ core/Command/User/LastSeen.php | 18 ++++++++++++++++-- core/Command/User/ResetPassword.php | 18 ++++++++++++++++-- core/Command/User/Setting.php | 24 ++++++++++++++++++++++++ 11 files changed, 205 insertions(+), 10 deletions(-) diff --git a/core/Command/Group/AddUser.php b/core/Command/Group/AddUser.php index b5d0068acc6..141916953ab 100644 --- a/core/Command/Group/AddUser.php +++ b/core/Command/Group/AddUser.php @@ -24,8 +24,11 @@ namespace OC\Core\Command\Group; use OC\Core\Command\Base; +use OCP\IGroup; use OCP\IGroupManager; +use OCP\IUser; use OCP\IUserManager; +use Stecman\Component\Symfony\Console\BashCompletion\CompletionContext; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -75,4 +78,27 @@ class AddUser extends Base { $group->addUser($user); return 0; } + + /** + * @param string $argumentName + * @param CompletionContext $context + * @return string[] + */ + public function completeArgumentValues($argumentName, CompletionContext $context) { + if ($argumentName === 'group') { + return array_map(static fn (IGroup $group) => $group->getGID(), $this->groupManager->search($context->getCurrentWord())); + } + if ($argumentName === 'user') { + $groupId = $context->getWordAtIndex($context->getWordIndex() - 1); + $group = $this->groupManager->get($groupId); + if ($group === null) { + return []; + } + + $members = array_map(static fn (IUser $user) => $user->getUID(), $group->searchUsers($context->getCurrentWord())); + $users = array_map(static fn (IUser $user) => $user->getUID(), $this->userManager->search($context->getCurrentWord())); + return array_diff($users, $members); + } + return []; + } } diff --git a/core/Command/Group/Delete.php b/core/Command/Group/Delete.php index be97be83407..2596b461d17 100644 --- a/core/Command/Group/Delete.php +++ b/core/Command/Group/Delete.php @@ -27,7 +27,9 @@ declare(strict_types=1); namespace OC\Core\Command\Group; use OC\Core\Command\Base; +use OCP\IGroup; use OCP\IGroupManager; +use Stecman\Component\Symfony\Console\BashCompletion\CompletionContext; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -74,4 +76,16 @@ class Delete extends Base { } return 0; } + + /** + * @param string $argumentName + * @param CompletionContext $context + * @return string[] + */ + public function completeArgumentValues($argumentName, CompletionContext $context) { + if ($argumentName === 'groupid') { + return array_map(static fn (IGroup $group) => $group->getGID(), $this->groupManager->search($context->getCurrentWord())); + } + return []; + } } diff --git a/core/Command/Group/Info.php b/core/Command/Group/Info.php index 180055e83ea..5e9fa661130 100644 --- a/core/Command/Group/Info.php +++ b/core/Command/Group/Info.php @@ -28,6 +28,7 @@ namespace OC\Core\Command\Group; use OC\Core\Command\Base; use OCP\IGroup; use OCP\IGroupManager; +use Stecman\Component\Symfony\Console\BashCompletion\CompletionContext; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -79,4 +80,16 @@ class Info extends Base { return 0; } } + + /** + * @param string $argumentName + * @param CompletionContext $context + * @return string[] + */ + public function completeArgumentValues($argumentName, CompletionContext $context) { + if ($argumentName === 'groupid') { + return array_map(static fn (IGroup $group) => $group->getGID(), $this->groupManager->search($context->getCurrentWord())); + } + return []; + } } diff --git a/core/Command/Group/RemoveUser.php b/core/Command/Group/RemoveUser.php index 4af66480f28..2b9c4eaec52 100644 --- a/core/Command/Group/RemoveUser.php +++ b/core/Command/Group/RemoveUser.php @@ -24,8 +24,11 @@ namespace OC\Core\Command\Group; use OC\Core\Command\Base; +use OCP\IGroup; use OCP\IGroupManager; +use OCP\IUser; use OCP\IUserManager; +use Stecman\Component\Symfony\Console\BashCompletion\CompletionContext; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -75,4 +78,24 @@ class RemoveUser extends Base { $group->removeUser($user); return 0; } + + /** + * @param string $argumentName + * @param CompletionContext $context + * @return string[] + */ + public function completeArgumentValues($argumentName, CompletionContext $context) { + if ($argumentName === 'group') { + return array_map(static fn (IGroup $group) => $group->getGID(), $this->groupManager->search($context->getCurrentWord())); + } + if ($argumentName === 'user') { + $groupId = $context->getWordAtIndex($context->getWordIndex() - 1); + $group = $this->groupManager->get($groupId); + if ($group === null) { + return []; + } + return array_map(static fn (IUser $user) => $user->getUID(), $group->searchUsers($context->getCurrentWord())); + } + return []; + } } diff --git a/core/Command/User/Delete.php b/core/Command/User/Delete.php index 37e09ca69ca..9624f04fa18 100644 --- a/core/Command/User/Delete.php +++ b/core/Command/User/Delete.php @@ -24,13 +24,15 @@ */ namespace OC\Core\Command\User; +use OC\Core\Command\Base; +use OCP\IUser; use OCP\IUserManager; -use Symfony\Component\Console\Command\Command; +use Stecman\Component\Symfony\Console\BashCompletion\CompletionContext; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; -class Delete extends Command { +class Delete extends Base { /** @var IUserManager */ protected $userManager; @@ -68,4 +70,16 @@ class Delete extends Command { $output->writeln('The specified user could not be deleted. Please check the logs.'); return 1; } + + /** + * @param string $argumentName + * @param CompletionContext $context + * @return string[] + */ + public function completeArgumentValues($argumentName, CompletionContext $context) { + if ($argumentName === 'uid') { + return array_map(static fn (IUser $user) => $user->getUID(), $this->userManager->search($context->getCurrentWord())); + } + return []; + } } diff --git a/core/Command/User/Disable.php b/core/Command/User/Disable.php index e4f43e26f59..9120d28cc1f 100644 --- a/core/Command/User/Disable.php +++ b/core/Command/User/Disable.php @@ -23,13 +23,15 @@ */ namespace OC\Core\Command\User; +use OC\Core\Command\Base; +use OCP\IUser; use OCP\IUserManager; -use Symfony\Component\Console\Command\Command; +use Stecman\Component\Symfony\Console\BashCompletion\CompletionContext; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; -class Disable extends Command { +class Disable extends Base { /** @var IUserManager */ protected $userManager; @@ -63,4 +65,22 @@ class Disable extends Command { $output->writeln('The specified user is disabled'); return 0; } + + /** + * @param string $argumentName + * @param CompletionContext $context + * @return string[] + */ + public function completeArgumentValues($argumentName, CompletionContext $context) { + if ($argumentName === 'uid') { + return array_map( + static fn (IUser $user) => $user->getUID(), + array_filter( + $this->userManager->search($context->getCurrentWord()), + static fn (IUser $user) => $user->isEnabled() + ) + ); + } + return []; + } } diff --git a/core/Command/User/Enable.php b/core/Command/User/Enable.php index 80efec3bc3f..eb548a74d7e 100644 --- a/core/Command/User/Enable.php +++ b/core/Command/User/Enable.php @@ -23,13 +23,15 @@ */ namespace OC\Core\Command\User; +use OC\Core\Command\Base; +use OCP\IUser; use OCP\IUserManager; -use Symfony\Component\Console\Command\Command; +use Stecman\Component\Symfony\Console\BashCompletion\CompletionContext; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; -class Enable extends Command { +class Enable extends Base { /** @var IUserManager */ protected $userManager; @@ -63,4 +65,22 @@ class Enable extends Command { $output->writeln('The specified user is enabled'); return 0; } + + /** + * @param string $argumentName + * @param CompletionContext $context + * @return string[] + */ + public function completeArgumentValues($argumentName, CompletionContext $context) { + if ($argumentName === 'uid') { + return array_map( + static fn (IUser $user) => $user->getUID(), + array_filter( + $this->userManager->search($context->getCurrentWord()), + static fn (IUser $user) => !$user->isEnabled() + ) + ); + } + return []; + } } diff --git a/core/Command/User/Info.php b/core/Command/User/Info.php index 36bfa0b6d5b..a93f65b7dce 100644 --- a/core/Command/User/Info.php +++ b/core/Command/User/Info.php @@ -28,6 +28,7 @@ use OC\Core\Command\Base; use OCP\IGroupManager; use OCP\IUser; use OCP\IUserManager; +use Stecman\Component\Symfony\Console\BashCompletion\CompletionContext; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -110,4 +111,16 @@ class Info extends Base { 'quota' => $storage['quota'], ]; } + + /** + * @param string $argumentName + * @param CompletionContext $context + * @return string[] + */ + public function completeArgumentValues($argumentName, CompletionContext $context) { + if ($argumentName === 'user') { + return array_map(static fn (IUser $user) => $user->getUID(), $this->userManager->search($context->getCurrentWord())); + } + return []; + } } diff --git a/core/Command/User/LastSeen.php b/core/Command/User/LastSeen.php index e56ddd5087f..dc01ca549f3 100644 --- a/core/Command/User/LastSeen.php +++ b/core/Command/User/LastSeen.php @@ -25,13 +25,15 @@ */ namespace OC\Core\Command\User; +use OC\Core\Command\Base; +use OCP\IUser; use OCP\IUserManager; -use Symfony\Component\Console\Command\Command; +use Stecman\Component\Symfony\Console\BashCompletion\CompletionContext; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; -class LastSeen extends Command { +class LastSeen extends Base { /** @var IUserManager */ protected $userManager; @@ -73,4 +75,16 @@ class LastSeen extends Command { } return 0; } + + /** + * @param string $argumentName + * @param CompletionContext $context + * @return string[] + */ + public function completeArgumentValues($argumentName, CompletionContext $context) { + if ($argumentName === 'uid') { + return array_map(static fn (IUser $user) => $user->getUID(), $this->userManager->search($context->getCurrentWord())); + } + return []; + } } diff --git a/core/Command/User/ResetPassword.php b/core/Command/User/ResetPassword.php index 798f5dad585..174a9f4068d 100644 --- a/core/Command/User/ResetPassword.php +++ b/core/Command/User/ResetPassword.php @@ -27,8 +27,10 @@ */ namespace OC\Core\Command\User; +use OC\Core\Command\Base; +use OCP\IUser; use OCP\IUserManager; -use Symfony\Component\Console\Command\Command; +use Stecman\Component\Symfony\Console\BashCompletion\CompletionContext; use Symfony\Component\Console\Helper\QuestionHelper; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -37,7 +39,7 @@ use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ConfirmationQuestion; use Symfony\Component\Console\Question\Question; -class ResetPassword extends Command { +class ResetPassword extends Base { /** @var IUserManager */ protected $userManager; @@ -133,4 +135,16 @@ class ResetPassword extends Command { } return 0; } + + /** + * @param string $argumentName + * @param CompletionContext $context + * @return string[] + */ + public function completeArgumentValues($argumentName, CompletionContext $context) { + if ($argumentName === 'user') { + return array_map(static fn (IUser $user) => $user->getUID(), $this->userManager->search($context->getCurrentWord())); + } + return []; + } } diff --git a/core/Command/User/Setting.php b/core/Command/User/Setting.php index 87fb6905de9..3e4830127cd 100644 --- a/core/Command/User/Setting.php +++ b/core/Command/User/Setting.php @@ -29,6 +29,7 @@ use OC\Core\Command\Base; use OCP\IConfig; use OCP\IUser; use OCP\IUserManager; +use Stecman\Component\Symfony\Console\BashCompletion\CompletionContext; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -255,4 +256,27 @@ class Setting extends Base { return $settings; } + + /** + * @param string $argumentName + * @param CompletionContext $context + * @return string[] + */ + public function completeArgumentValues($argumentName, CompletionContext $context) { + if ($argumentName === 'uid') { + return array_map(static fn (IUser $user) => $user->getUID(), $this->userManager->search($context->getCurrentWord())); + } + if ($argumentName === 'app') { + $userId = $context->getWordAtIndex($context->getWordIndex() - 1); + $settings = $this->getUserSettings($userId, ''); + return array_keys($settings); + } + if ($argumentName === 'key') { + $userId = $context->getWordAtIndex($context->getWordIndex() - 2); + $app = $context->getWordAtIndex($context->getWordIndex() - 1); + $settings = $this->getUserSettings($userId, $app); + return array_keys($settings[$app]); + } + return []; + } } -- 2.39.5