From 33b90d28f826f4f47c34ea4e51b0eb8dae7b9afa Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 27 Dec 2022 15:32:59 +0100 Subject: [PATCH] fix moving files of encrypted local storage to unencrypted local storage for example when moving encrypted files to a groupfolder Signed-off-by: Robin Appelman --- lib/private/Files/Storage/Local.php | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/private/Files/Storage/Local.php b/lib/private/Files/Storage/Local.php index 9daa351782517..b021d40d335bb 100644 --- a/lib/private/Files/Storage/Local.php +++ b/lib/private/Files/Storage/Local.php @@ -44,6 +44,7 @@ namespace OC\Files\Storage; use OC\Files\Filesystem; +use OC\Files\Storage\Wrapper\Encryption; use OC\Files\Storage\Wrapper\Jail; use OCP\Constants; use OCP\Files\ForbiddenException; @@ -543,6 +544,16 @@ private function calculateEtag(string $path, array $stat): string { } } + private function canDoCrossStorageMove(IStorage $sourceStorage) { + return $sourceStorage->instanceOfStorage(Local::class) + // Don't treat ACLStorageWrapper like local storage where copy can be done directly. + // Instead, use the slower recursive copying in php from Common::copyFromStorage with + // more permissions checks. + && !$sourceStorage->instanceOfStorage('OCA\GroupFolders\ACL\ACLStorageWrapper') + // when moving encrypted files we have to handle keys and the target might not be encrypted + && !$sourceStorage->instanceOfStorage(Encryption::class); + } + /** * @param IStorage $sourceStorage * @param string $sourceInternalPath @@ -551,10 +562,7 @@ private function calculateEtag(string $path, array $stat): string { * @return bool */ public function copyFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath, $preserveMtime = false) { - // Don't treat ACLStorageWrapper like local storage where copy can be done directly. - // Instead use the slower recursive copying in php from Common::copyFromStorage with - // more permissions checks. - if ($sourceStorage->instanceOfStorage(Local::class) && !$sourceStorage->instanceOfStorage('OCA\GroupFolders\ACL\ACLStorageWrapper')) { + if ($this->canDoCrossStorageMove($sourceStorage)) { if ($sourceStorage->instanceOfStorage(Jail::class)) { /** * @var \OC\Files\Storage\Wrapper\Jail $sourceStorage @@ -578,7 +586,7 @@ public function copyFromStorage(IStorage $sourceStorage, $sourceInternalPath, $t * @return bool */ public function moveFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) { - if ($sourceStorage->instanceOfStorage(Local::class)) { + if ($this->canDoCrossStorageMove($sourceStorage)) { if ($sourceStorage->instanceOfStorage(Jail::class)) { /** * @var \OC\Files\Storage\Wrapper\Jail $sourceStorage