From e8fa3a2370585e3e04d5215d86e26b7c116c01ae Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Thu, 2 Apr 2015 15:29:10 +0200 Subject: [PATCH] fix versions download and previews --- apps/encryption/lib/crypto/encryption.php | 18 ++++- .../tests/lib/crypto/encryptionTest.php | 79 +++++++++++++++++++ 2 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 apps/encryption/tests/lib/crypto/encryptionTest.php diff --git a/apps/encryption/lib/crypto/encryption.php b/apps/encryption/lib/crypto/encryption.php index b66be26370..7c633b7411 100644 --- a/apps/encryption/lib/crypto/encryption.php +++ b/apps/encryption/lib/crypto/encryption.php @@ -100,13 +100,13 @@ class Encryption implements IEncryptionModule { $this->cipher = $this->crypt->getCipher(); } - $this->path = $path; + $this->path = $this->getPathToRealFile($path); $this->accessList = $accessList; $this->user = $user; $this->writeCache = ''; $this->isWriteOperation = false; - $this->fileKey = $this->keyManager->getFileKey($path, $this->user); + $this->fileKey = $this->keyManager->getFileKey($this->path, $this->user); return array('cipher' => $this->cipher); } @@ -135,7 +135,7 @@ class Encryption implements IEncryptionModule { $publicKeys = $this->keyManager->addSystemKeys($this->accessList, $publicKeys); $encryptedKeyfiles = $this->crypt->multiKeyEncrypt($this->fileKey, $publicKeys); - $this->keyManager->setAllFileKeys($path, $encryptedKeyfiles); + $this->keyManager->setAllFileKeys($this->path, $encryptedKeyfiles); } return $result; } @@ -313,4 +313,16 @@ class Encryption implements IEncryptionModule { public function getUnencryptedBlockSize() { return 6126; } + + protected function getPathToRealFile($path) { + $realPath = $path; + $parts = explode('/', $path); + if ($parts[2] === 'files_versions') { + $realPath = '/' . $parts[1] . '/files/' . implode('/', array_slice($parts, 3)); + $length = strrpos($realPath, '.'); + $realPath = substr($realPath, 0, $length); + } + + return $realPath; + } } diff --git a/apps/encryption/tests/lib/crypto/encryptionTest.php b/apps/encryption/tests/lib/crypto/encryptionTest.php new file mode 100644 index 0000000000..7f3a16a36b --- /dev/null +++ b/apps/encryption/tests/lib/crypto/encryptionTest.php @@ -0,0 +1,79 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see . + */ + +namespace OCA\Encryption\Tests\Crypto; + +use Test\TestCase; +use OCA\Encryption\Crypto\Encryption; + +class EncryptionTest extends TestCase { + + /** @var Encryption */ + private $instance; + + /** @var \PHPUnit_Framework_MockObject_MockObject */ + private $keyManagerMock; + + /** @var \PHPUnit_Framework_MockObject_MockObject */ + private $cryptMock; + + /** @var \PHPUnit_Framework_MockObject_MockObject */ + private $utilMock; + + public function setUp() { + parent::setUp(); + + $this->cryptMock = $this->getMockBuilder('OCA\Encryption\Crypto\Crypt') + ->disableOriginalConstructor() + ->getMock(); + $this->utilMock = $this->getMockBuilder('OCA\Encryption\Util') + ->disableOriginalConstructor() + ->getMock(); + $this->keyManagerMock = $this->getMockBuilder('OCA\Encryption\KeyManager') + ->disableOriginalConstructor() + ->getMock(); + + $this->instance = new Encryption($this->cryptMock, $this->keyManagerMock, $this->utilMock); + } + + /** + * @dataProvider dataProviderForTestGetPathToRealFile + */ + public function testGetPathToRealFile($path, $expected) { + $result = \Test_Helper::invokePrivate($this->instance, 'getPathToRealFile', array($path)); + $this->assertSame($expected, + \Test_Helper::invokePrivate($this->instance, 'getPathToRealFile', array($path)) + ); + } + + public function dataProviderForTestGetPathToRealFile() { + return array( + array('/user/files/foo/bar.txt', '/user/files/foo/bar.txt'), + array('/user/files/foo.txt', '/user/files/foo.txt'), + array('/user/files_versions/foo.txt.v543534', '/user/files/foo.txt'), + array('/user/files_versions/foo/bar.txt.v5454', '/user/files/foo/bar.txt'), + ); + } + + +} \ No newline at end of file