diff options
author | Vincent Petry <vincent@nextcloud.com> | 2021-08-11 09:18:16 +0200 |
---|---|---|
committer | Vincent Petry <vincent@nextcloud.com> | 2021-08-26 10:44:49 +0200 |
commit | 60e44077b73b49a13b235f8e2d9e6e3b9f4efc6f (patch) | |
tree | f5f5d3b4933f8a1a02a053601d31775f304e85f4 /apps/encryption/lib | |
parent | 25e41354f3a4a95ba8e02fd5ef8851ddd36c5d5a (diff) | |
download | nextcloud-server-60e44077b73b49a13b235f8e2d9e6e3b9f4efc6f.tar.gz nextcloud-server-60e44077b73b49a13b235f8e2d9e6e3b9f4efc6f.zip |
Fix encrypted version to 0 when finding unencrypted file
Whenever the command is run and a "legacy cipher" seems to be detected
when the legacy option is disabled, it's highly likely that the file is
actually unencrypted but the database contains a encrypted version
higher than 0 for some reason.
The command now detects this case and automatically sets the encrypted
version to 0 so that the file can be read again.
Signed-off-by: Vincent Petry <vincent@nextcloud.com>
Diffstat (limited to 'apps/encryption/lib')
-rw-r--r-- | apps/encryption/lib/Command/FixEncryptedVersion.php | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/apps/encryption/lib/Command/FixEncryptedVersion.php b/apps/encryption/lib/Command/FixEncryptedVersion.php index da8a69cf464..d51f64c8ef9 100644 --- a/apps/encryption/lib/Command/FixEncryptedVersion.php +++ b/apps/encryption/lib/Command/FixEncryptedVersion.php @@ -23,6 +23,7 @@ namespace OCA\Encryption\Command; use OC\Files\View; +use OC\ServerNotAvailableException; use OCA\Encryption\Util; use OCP\Files\IRootFolder; use OCP\HintException; @@ -53,6 +54,9 @@ class FixEncryptedVersion extends Command { /** @var View */ private $view; + /** @var bool */ + private $supportLegacy; + public function __construct( IConfig $config, ILogger $logger, @@ -67,6 +71,8 @@ class FixEncryptedVersion extends Command { $this->userManager = $userManager; $this->util = $util; $this->view = $view; + $this->supportLegacy = false; + parent::__construct(); } @@ -95,6 +101,7 @@ class FixEncryptedVersion extends Command { */ protected function execute(InputInterface $input, OutputInterface $output): int { $skipSignatureCheck = $this->config->getSystemValue('encryption_skip_signature_check', false); + $this->supportLegacy = $this->config->getSystemValueBool('encryption.legacy_format_support', false); if ($skipSignatureCheck) { $output->writeln("<error>Repairing is not possible when \"encryption_skip_signature_check\" is set. Please disable this flag in the configuration.</error>\n"); @@ -187,6 +194,14 @@ class FixEncryptedVersion extends Command { \fclose($handle); return true; + } catch (ServerNotAvailableException $e) { + // not a "bad signature" error and likely "legacy cipher" exception + // this could mean that the file is maybe not encrypted but the encrypted version is set + if (!$this->supportLegacy && $ignoreCorrectEncVersionCall === true) { + $output->writeln("<info>Attempting to fix the path: \"$path\"</info>"); + return $this->correctEncryptedVersion($path, $output, true); + } + return false; } catch (HintException $e) { $this->logger->warning("Issue: " . $e->getMessage()); //If allowOnce is set to false, this becomes recursive. @@ -202,9 +217,10 @@ class FixEncryptedVersion extends Command { /** * @param string $path * @param OutputInterface $output + * @param bool $includeZero whether to try zero version for unencrypted file * @return bool */ - private function correctEncryptedVersion($path, OutputInterface $output): bool { + private function correctEncryptedVersion($path, OutputInterface $output, bool $includeZero = false): bool { $fileInfo = $this->view->getFileInfo($path); if (!$fileInfo) { $output->writeln("<warning>File info not found for file: \"$path\"</warning>"); @@ -231,6 +247,17 @@ class FixEncryptedVersion extends Command { // Save original encrypted version so we can restore it if decryption fails with all version $originalEncryptedVersion = $encryptedVersion; if ($encryptedVersion >= 0) { + if ($includeZero) { + // try with zero first + $cacheInfo = ['encryptedVersion' => 0, 'encrypted' => 0]; + $cache->put($fileCache->getPath(), $cacheInfo); + $output->writeln("<info>Set the encrypted version to 0 (unencrypted)</info>"); + if ($this->verifyFileContent($path, $output, false) === true) { + $output->writeln("<info>Fixed the file: \"$path\" with version 0 (unencrypted)</info>"); + return true; + } + } + //test by decrementing the value till 1 and if nothing works try incrementing $encryptedVersion--; while ($encryptedVersion > 0) { |