* * SPDX-License-Identifier: AGPL-3.0-or-later * */ namespace OCA\GroupFolders\Command; use OCA\GroupFolders\Folder\FolderManager; use OCA\GroupFolders\Mount\MountProvider; use OCP\Constants; use OCP\Files\IRootFolder; use OCP\IGroupManager; 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 Group extends FolderCommand { public const PERMISSION_VALUES = [ 'read' => Constants::PERMISSION_READ, 'write' => Constants::PERMISSION_UPDATE | Constants::PERMISSION_CREATE, 'share' => Constants::PERMISSION_SHARE, 'delete' => Constants::PERMISSION_DELETE, ]; private IGroupManager $groupManager; public function __construct(FolderManager $folderManager, IRootFolder $rootFolder, IGroupManager $groupManager, MountProvider $mountProvider) { parent::__construct($folderManager, $rootFolder, $mountProvider); $this->groupManager = $groupManager; } protected function configure() { $this ->setName('groupfolders:group') ->setDescription('Edit the groups that have access to a group folder') ->addArgument('folder_id', InputArgument::REQUIRED, 'Id of the folder to configure') ->addArgument('group', InputArgument::REQUIRED, 'The group to configure') ->addArgument('permissions', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'The permissions to set for the group, leave empty for read only') ->addOption('delete', 'd', InputOption::VALUE_NONE, 'Remove access for the group'); parent::configure(); } protected function execute(InputInterface $input, OutputInterface $output) { $folder = $this->getFolder($input, $output); if ($folder === false) { return -1; } $groupString = $input->getArgument('group'); $group = $this->groupManager->get($groupString); if ($input->getOption('delete')) { $this->folderManager->removeApplicableGroup($folder['id'], $groupString); return 0; } elseif ($group) { $permissionsString = $input->getArgument('permissions'); $permissions = $this->getNewPermissions($permissionsString); if ($permissions) { if (!isset($folder['groups'][$groupString])) { $this->folderManager->addApplicableGroup($folder['id'], $groupString); } $this->folderManager->setGroupPermissions($folder['id'], $groupString, $permissions); return 0; } $output->writeln('Unable to parse permissions input: ' . implode(' ', $permissionsString) . ''); return -1; } $output->writeln('group not found: ' . $groupString . ''); return -1; } private function getNewPermissions(array $input): int { $permissions = 1; $values = self::PERMISSION_VALUES; foreach ($input as $permissionsString) { if (isset($values[$permissionsString])) { $permissions |= self::PERMISSION_VALUES[$permissionsString]; } else { return 0; } } return $permissions; } }