summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/encryption/lib/crypto/encryption.php18
-rw-r--r--apps/encryption/tests/lib/crypto/encryptionTest.php79
2 files changed, 94 insertions, 3 deletions
diff --git a/apps/encryption/lib/crypto/encryption.php b/apps/encryption/lib/crypto/encryption.php
index b66be26370f..7c633b7411f 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 00000000000..7f3a16a36b0
--- /dev/null
+++ b/apps/encryption/tests/lib/crypto/encryptionTest.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * ownCloud
+ *
+ * @copyright (C) 2015 ownCloud, Inc.
+ *
+ * @author Bjoern Schiessle <schiessle@owncloud.com>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+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