Merge pull request #3841 from nextcloud/encyryption-trash-bin

Delete files on encryption error
This commit is contained in:
Björn Schießle 2017-03-15 09:07:07 +01:00 committed by GitHub
commit 5a998da206
4 changed files with 34 additions and 14 deletions

View File

@ -29,7 +29,6 @@ namespace OCA\Encryption\Crypto;
use OC\Encryption\Exceptions\DecryptionFailedException; use OC\Encryption\Exceptions\DecryptionFailedException;
use OC\Encryption\Exceptions\EncryptionFailedException; use OC\Encryption\Exceptions\EncryptionFailedException;
use OC\HintException;
use OCA\Encryption\Exceptions\MultiKeyDecryptException; use OCA\Encryption\Exceptions\MultiKeyDecryptException;
use OCA\Encryption\Exceptions\MultiKeyEncryptException; use OCA\Encryption\Exceptions\MultiKeyEncryptException;
use OCP\Encryption\Exceptions\GenericEncryptionException; use OCP\Encryption\Exceptions\GenericEncryptionException;
@ -476,12 +475,12 @@ class Crypt {
* @param string $data * @param string $data
* @param string $passPhrase * @param string $passPhrase
* @param string $expectedSignature * @param string $expectedSignature
* @throws HintException * @throws GenericEncryptionException
*/ */
private function checkSignature($data, $passPhrase, $expectedSignature) { private function checkSignature($data, $passPhrase, $expectedSignature) {
$signature = $this->createSignature($data, $passPhrase); $signature = $this->createSignature($data, $passPhrase);
if (!hash_equals($expectedSignature, $signature)) { if (!hash_equals($expectedSignature, $signature)) {
throw new HintException('Bad Signature', $this->l->t('Bad Signature')); throw new GenericEncryptionException('Bad Signature', $this->l->t('Bad Signature'));
} }
} }
@ -552,7 +551,7 @@ class Crypt {
* @param string $catFile * @param string $catFile
* @param string $cipher * @param string $cipher
* @return bool * @return bool
* @throws HintException * @throws GenericEncryptionException
*/ */
private function hasSignature($catFile, $cipher) { private function hasSignature($catFile, $cipher) {
$meta = substr($catFile, -93); $meta = substr($catFile, -93);
@ -560,7 +559,7 @@ class Crypt {
// enforce signature for the new 'CTR' ciphers // enforce signature for the new 'CTR' ciphers
if ($signaturePosition === false && strpos(strtolower($cipher), 'ctr') !== false) { if ($signaturePosition === false && strpos(strtolower($cipher), 'ctr') !== false) {
throw new HintException('Missing Signature', $this->l->t('Missing Signature')); throw new GenericEncryptionException('Missing Signature', $this->l->t('Missing Signature'));
} }
return ($signaturePosition !== false); return ($signaturePosition !== false);

View File

@ -247,7 +247,7 @@ class CryptTest extends TestCase {
/** /**
* @dataProvider dataTestHasSignatureFail * @dataProvider dataTestHasSignatureFail
* @expectedException \OC\HintException * @expectedException \OCP\Encryption\Exceptions\GenericEncryptionException
*/ */
public function testHasSignatureFail($cipher) { public function testHasSignatureFail($cipher) {
$data = 'encryptedContent00iv001234567890123456xx'; $data = 'encryptedContent00iv001234567890123456xx';

View File

@ -28,6 +28,8 @@ namespace OCA\Files_Trashbin;
use OC\Files\Filesystem; use OC\Files\Filesystem;
use OC\Files\Storage\Wrapper\Wrapper; use OC\Files\Storage\Wrapper\Wrapper;
use OC\Files\View; use OC\Files\View;
use OCP\Encryption\Exceptions\GenericEncryptionException;
use OCP\ILogger;
use OCP\IUserManager; use OCP\IUserManager;
class Storage extends Wrapper { class Storage extends Wrapper {
@ -55,15 +57,21 @@ class Storage extends Wrapper {
/** @var IUserManager */ /** @var IUserManager */
private $userManager; private $userManager;
/** @var ILogger */
private $logger;
/** /**
* Storage constructor. * Storage constructor.
* *
* @param array $parameters * @param array $parameters
* @param IUserManager|null $userManager * @param IUserManager|null $userManager
*/ */
public function __construct($parameters, IUserManager $userManager = null) { public function __construct($parameters,
IUserManager $userManager = null,
ILogger $logger = null) {
$this->mountPoint = $parameters['mountPoint']; $this->mountPoint = $parameters['mountPoint'];
$this->userManager = $userManager; $this->userManager = $userManager;
$this->logger = $logger;
parent::__construct($parameters); parent::__construct($parameters);
} }
@ -147,11 +155,20 @@ class Storage extends Wrapper {
* @return bool true if the operation succeeded, false otherwise * @return bool true if the operation succeeded, false otherwise
*/ */
public function unlink($path) { public function unlink($path) {
if (isset(self::$moveOutOfSharedFolder[$this->mountPoint . $path])) { try {
$result = $this->doDelete($path, 'unlink', true); if (isset(self::$moveOutOfSharedFolder[$this->mountPoint . $path])) {
unset(self::$moveOutOfSharedFolder[$this->mountPoint . $path]); $result = $this->doDelete($path, 'unlink', true);
} else { unset(self::$moveOutOfSharedFolder[$this->mountPoint . $path]);
$result = $this->doDelete($path, 'unlink'); } else {
$result = $this->doDelete($path, 'unlink');
}
} catch (GenericEncryptionException $e) {
// in case of a encryption exception we delete the file right away
$this->logger->info(
"Can't move file" . $path .
"to the trash bin, therefore it was deleted right away");
$result = $this->storage->unlink($path);
} }
return $result; return $result;
@ -251,7 +268,8 @@ class Storage extends Wrapper {
\OC\Files\Filesystem::addStorageWrapper('oc_trashbin', function ($mountPoint, $storage) { \OC\Files\Filesystem::addStorageWrapper('oc_trashbin', function ($mountPoint, $storage) {
return new \OCA\Files_Trashbin\Storage( return new \OCA\Files_Trashbin\Storage(
array('storage' => $storage, 'mountPoint' => $mountPoint), array('storage' => $storage, 'mountPoint' => $mountPoint),
\OC::$server->getUserManager() \OC::$server->getUserManager(),
\OC::$server->getLogger()
); );
}, 1); }, 1);
} }

View File

@ -31,6 +31,7 @@ namespace OCA\Files_Trashbin\Tests;
use OC\Files\Storage\Temporary; use OC\Files\Storage\Temporary;
use OC\Files\Filesystem; use OC\Files\Filesystem;
use OCP\ILogger;
/** /**
* Class Storage * Class Storage
@ -528,9 +529,11 @@ class StorageTest extends \Test\TestCase {
->disableOriginalConstructor()->getMock(); ->disableOriginalConstructor()->getMock();
$userManager->expects($this->any()) $userManager->expects($this->any())
->method('userExists')->willReturn($userExists); ->method('userExists')->willReturn($userExists);
$logger = $this->getMockBuilder(ILogger::class)->getMock();
$storage = new \OCA\Files_Trashbin\Storage( $storage = new \OCA\Files_Trashbin\Storage(
['mountPoint' => $mountPoint, 'storage' => $tmpStorage], ['mountPoint' => $mountPoint, 'storage' => $tmpStorage],
$userManager $userManager,
$logger
); );
$this->assertSame($expected, $this->assertSame($expected,