diff --git a/apps/encryption/lib/Crypto/EncryptAll.php b/apps/encryption/lib/Crypto/EncryptAll.php index c2619dc8ef..ee13fee9ee 100644 --- a/apps/encryption/lib/Crypto/EncryptAll.php +++ b/apps/encryption/lib/Crypto/EncryptAll.php @@ -295,6 +295,12 @@ class EncryptAll { */ protected function encryptFile($path) { + // skip already encrypted files + $fileInfo = $this->rootView->getFileInfo($path); + if ($fileInfo !== false && $fileInfo->isEncrypted()) { + return true; + } + $source = $path; $target = $path . '.encrypted.' . time(); diff --git a/apps/encryption/tests/Crypto/EncryptAllTest.php b/apps/encryption/tests/Crypto/EncryptAllTest.php index a39bf7befb..647b951a0a 100644 --- a/apps/encryption/tests/Crypto/EncryptAllTest.php +++ b/apps/encryption/tests/Crypto/EncryptAllTest.php @@ -33,6 +33,7 @@ use OCA\Encryption\Crypto\EncryptAll; use OCA\Encryption\KeyManager; use OCA\Encryption\Users\Setup; use OCA\Encryption\Util; +use OCP\Files\FileInfo; use OCP\IConfig; use OCP\IL10N; use OCP\IUserManager; @@ -354,4 +355,36 @@ class EncryptAllTest extends TestCase { $this->assertSame($password, $userPasswords['user1']); } + /** + * @dataProvider dataTestEncryptFile + * @param $isEncrypted + */ + public function testEncryptFile($isEncrypted) { + $fileInfo = $this->createMock(FileInfo::class); + $fileInfo->expects($this->any())->method('isEncrypted') + ->willReturn($isEncrypted); + $this->view->expects($this->any())->method('getFileInfo') + ->willReturn($fileInfo); + + + if($isEncrypted) { + $this->view->expects($this->never())->method('copy'); + $this->view->expects($this->never())->method('rename'); + } else { + $this->view->expects($this->once())->method('copy'); + $this->view->expects($this->once())->method('rename'); + } + + $this->assertTrue( + $this->invokePrivate($this->encryptAll, 'encryptFile', ['foo.txt']) + ); + } + + public function dataTestEncryptFile() { + return [ + [true], + [false], + ]; + } + }