diff --git a/apps/encryption/lib/Command/FixEncryptedVersion.php b/apps/encryption/lib/Command/FixEncryptedVersion.php index d4c5eddbfe5ab..568c600643a43 100644 --- a/apps/encryption/lib/Command/FixEncryptedVersion.php +++ b/apps/encryption/lib/Command/FixEncryptedVersion.php @@ -29,10 +29,12 @@ use OCP\HintException; use OCP\IConfig; use OCP\ILogger; +use OCP\IUser; use OCP\IUserManager; use Symfony\Component\Console\Command\Command; 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 FixEncryptedVersion extends Command { @@ -84,13 +86,18 @@ protected function configure(): void { ->setDescription('Fix the encrypted version if the encrypted file(s) are not downloadable.') ->addArgument( 'user', - InputArgument::REQUIRED, + InputArgument::OPTIONAL, 'The id of the user whose files need fixing' )->addOption( 'path', 'p', - InputArgument::OPTIONAL, + InputOption::VALUE_REQUIRED, 'Limit files to fix with path, e.g., --path="/Music/Artist". If path indicates a directory, all the files inside directory will be fixed.' + )->addOption( + 'all', + null, + InputOption::VALUE_NONE, + 'Run the fix for all users on the system, mutually exclusive with specifying a user id.' ); } @@ -108,22 +115,40 @@ protected function execute(InputInterface $input, OutputInterface $output): int return 1; } - $user = (string)$input->getArgument('user'); - $pathToWalk = "/$user/files"; - + $user = $input->getArgument('user'); + $all = $input->getOption('all'); $pathOption = \trim(($input->getOption('path') ?? ''), '/'); - if ($pathOption !== "") { - $pathToWalk = "$pathToWalk/$pathOption"; - } - if ($user === '') { - $output->writeln("No user id provided.\n"); + if ($user) { + if ($all) { + $output->writeln("Specifying a user id and --all are mutually exclusive"); + return 1; + } + + if ($this->userManager->get($user) === null) { + $output->writeln("User id $user does not exist. Please provide a valid user id"); + return 1; + } + + return $this->runForUser($user, $pathOption, $output); + } elseif ($all) { + $result = 0; + $this->userManager->callForSeenUsers(function(IUser $user) use ($pathOption, $output, &$result) { + $output->writeln("Processing files for " . $user->getUID()); + $result = $this->runForUser($user->getUID(), $pathOption, $output); + return $result === 0; + }); + return $result; + } else { + $output->writeln("Either a user id or --all needs to be provided"); return 1; } + } - if ($this->userManager->get($user) === null) { - $output->writeln("User id $user does not exist. Please provide a valid user id"); - return 1; + private function runForUser(string $user, string $pathOption, OutputInterface $output): int { + $pathToWalk = "/$user/files"; + if ($pathOption !== "") { + $pathToWalk = "$pathToWalk/$pathOption"; } return $this->walkPathOfUser($user, $pathToWalk, $output); } diff --git a/apps/encryption/tests/Command/FixEncryptedVersionTest.php b/apps/encryption/tests/Command/FixEncryptedVersionTest.php index ee9ad1ac89fa2..5c938b4350d6a 100644 --- a/apps/encryption/tests/Command/FixEncryptedVersionTest.php +++ b/apps/encryption/tests/Command/FixEncryptedVersionTest.php @@ -344,7 +344,7 @@ public function testExecuteWithNoUser() { $output = $this->commandTester->getDisplay(); - $this->assertStringContainsString('No user id provided', $output); + $this->assertStringContainsString('Either a user id or --all needs to be provided', $output); } public function testExecuteWithBadUser() {