]> source.dussan.org Git - nextcloud-server.git/commitdiff
allow running encryption:fix-encrypted-version for all users 35865/head
authorRobin Appelman <robin@icewind.nl>
Tue, 29 Nov 2022 16:48:17 +0000 (17:48 +0100)
committerVincent Petry <vincent@nextcloud.com>
Thu, 22 Dec 2022 10:08:50 +0000 (11:08 +0100)
Signed-off-by: Robin Appelman <robin@icewind.nl>
apps/encryption/lib/Command/FixEncryptedVersion.php
apps/encryption/tests/Command/FixEncryptedVersionTest.php

index d4c5eddbfe5ab845ecb8552c1c8fb7ac31b72301..568c600643a434c43a3db56d8e4deb406e22d4e6 100644 (file)
@@ -29,10 +29,12 @@ use OCP\Files\IRootFolder;
 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 @@ class FixEncryptedVersion extends Command {
                        ->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 @@ class FixEncryptedVersion extends Command {
                        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("<error>No user id provided.</error>\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("<error>User id $user does not exist. Please provide a valid user id</error>");
+                               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("<error>User id $user does not exist. Please provide a valid user id</error>");
-                       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);
        }
index ee9ad1ac89fa2df5bba7cd290107cca964cd5a0f..5c938b4350d6a8f3c67cdd28d30b73e9657e5589 100644 (file)
@@ -344,7 +344,7 @@ The file \"/$this->userId/files/sub/hello.txt\" is: OK", $output);
 
                $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() {