summaryrefslogtreecommitdiffstats
path: root/apps/encryption/lib
diff options
context:
space:
mode:
authorVincent Petry <vincent@nextcloud.com>2021-08-11 09:18:16 +0200
committerVincent Petry <vincent@nextcloud.com>2021-08-26 10:44:49 +0200
commit60e44077b73b49a13b235f8e2d9e6e3b9f4efc6f (patch)
treef5f5d3b4933f8a1a02a053601d31775f304e85f4 /apps/encryption/lib
parent25e41354f3a4a95ba8e02fd5ef8851ddd36c5d5a (diff)
downloadnextcloud-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.php29
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) {