diff options
Diffstat (limited to 'apps/encryption/tests/MigrationTest.php')
-rw-r--r-- | apps/encryption/tests/MigrationTest.php | 582 |
1 files changed, 582 insertions, 0 deletions
diff --git a/apps/encryption/tests/MigrationTest.php b/apps/encryption/tests/MigrationTest.php new file mode 100644 index 00000000000..c77693d24a6 --- /dev/null +++ b/apps/encryption/tests/MigrationTest.php @@ -0,0 +1,582 @@ +<?php +/** + * @author Björn Schießle <schiessle@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Robin Appelman <icewind@owncloud.com> + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\Encryption\Tests; + +use OCA\Encryption\Migration; +use OCP\ILogger; + +class MigrationTest extends \Test\TestCase { + + const TEST_ENCRYPTION_MIGRATION_USER1='test_encryption_user1'; + const TEST_ENCRYPTION_MIGRATION_USER2='test_encryption_user2'; + const TEST_ENCRYPTION_MIGRATION_USER3='test_encryption_user3'; + + /** @var \OC\Files\View */ + private $view; + private $public_share_key_id = 'share_key_id'; + private $recovery_key_id = 'recovery_key_id'; + private $moduleId; + + /** @var \PHPUnit_Framework_MockObject_MockObject | ILogger */ + private $logger; + + public static function setUpBeforeClass() { + parent::setUpBeforeClass(); + \OC::$server->getUserManager()->createUser(self::TEST_ENCRYPTION_MIGRATION_USER1, 'foo'); + \OC::$server->getUserManager()->createUser(self::TEST_ENCRYPTION_MIGRATION_USER2, 'foo'); + \OC::$server->getUserManager()->createUser(self::TEST_ENCRYPTION_MIGRATION_USER3, 'foo'); + } + + public static function tearDownAfterClass() { + $user = \OC::$server->getUserManager()->get(self::TEST_ENCRYPTION_MIGRATION_USER1); + if ($user !== null) { $user->delete(); } + $user = \OC::$server->getUserManager()->get(self::TEST_ENCRYPTION_MIGRATION_USER2); + if ($user !== null) { $user->delete(); } + $user = \OC::$server->getUserManager()->get(self::TEST_ENCRYPTION_MIGRATION_USER3); + if ($user !== null) { $user->delete(); } + parent::tearDownAfterClass(); + } + + + public function setUp() { + $this->logger = $this->getMockBuilder('\OCP\ILogger')->disableOriginalConstructor()->getMock(); + $this->view = new \OC\Files\View(); + $this->moduleId = \OCA\Encryption\Crypto\Encryption::ID; + } + + /** + * @param string $uid + */ + protected function createDummyShareKeys($uid) { + $this->loginAsUser($uid); + + $this->view->mkdir($uid . '/files_encryption/keys/folder1/folder2/folder3/file3'); + $this->view->mkdir($uid . '/files_encryption/keys/folder1/folder2/file2'); + $this->view->mkdir($uid . '/files_encryption/keys/folder1/file.1'); + $this->view->mkdir($uid . '/files_encryption/keys/folder2/file.2.1'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/file.1/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/file.1/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/file.1/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder2/file.2.1/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder2/file.2.1/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder2/file.2.1/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data'); + if ($this->public_share_key_id) { + $this->view->file_put_contents($uid . '/files_encryption/keys/folder2/file.2.1/' . $this->public_share_key_id . '.shareKey' , 'data'); + } + if ($this->recovery_key_id) { + $this->view->file_put_contents($uid . '/files_encryption/keys/folder2/file.2.1/' . $this->recovery_key_id . '.shareKey' , 'data'); + } + } + + /** + * @param string $uid + */ + protected function createDummyUserKeys($uid) { + $this->loginAsUser($uid); + + $this->view->mkdir($uid . '/files_encryption/'); + $this->view->mkdir('/files_encryption/public_keys'); + $this->view->file_put_contents($uid . '/files_encryption/' . $uid . '.privateKey', 'privateKey'); + $this->view->file_put_contents('/files_encryption/public_keys/' . $uid . '.publicKey', 'publicKey'); + } + + /** + * @param string $uid + */ + protected function createDummyFileKeys($uid) { + $this->loginAsUser($uid); + + $this->view->mkdir($uid . '/files_encryption/keys/folder1/folder2/folder3/file3'); + $this->view->mkdir($uid . '/files_encryption/keys/folder1/folder2/file2'); + $this->view->mkdir($uid . '/files_encryption/keys/folder1/file.1'); + $this->view->mkdir($uid . '/files_encryption/keys/folder2/file.2.1'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/fileKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/folder2/file2/fileKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder1/file.1/fileKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keys/folder2/file.2.1/fileKey' , 'data'); + } + + /** + * @param string $uid + */ + protected function createDummyFiles($uid) { + $this->loginAsUser($uid); + + $this->view->mkdir($uid . '/files/folder1/folder2/folder3/file3'); + $this->view->mkdir($uid . '/files/folder1/folder2/file2'); + $this->view->mkdir($uid . '/files/folder1/file.1'); + $this->view->mkdir($uid . '/files/folder2/file.2.1'); + $this->view->file_put_contents($uid . '/files/folder1/folder2/folder3/file3/fileKey' , 'data'); + $this->view->file_put_contents($uid . '/files/folder1/folder2/file2/fileKey' , 'data'); + $this->view->file_put_contents($uid . '/files/folder1/file.1/fileKey' , 'data'); + $this->view->file_put_contents($uid . '/files/folder2/file.2.1/fileKey' , 'data'); + } + + /** + * @param string $uid + */ + protected function createDummyFilesInTrash($uid) { + $this->loginAsUser($uid); + + $this->view->mkdir($uid . '/files_trashbin/keys/file1.d5457864'); + $this->view->mkdir($uid . '/files_trashbin/keys/folder1.d7437648723/file2'); + $this->view->file_put_contents($uid . '/files_trashbin/keys/file1.d5457864/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_trashbin/keys/file1.d5457864/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_trashbin/keys/folder1.d7437648723/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data'); + + $this->view->file_put_contents($uid . '/files_trashbin/keys/file1.d5457864/fileKey' , 'data'); + $this->view->file_put_contents($uid . '/files_trashbin/keys/folder1.d7437648723/file2/fileKey' , 'data'); + + // create the files itself + $this->view->mkdir($uid . '/files_trashbin/folder1.d7437648723'); + $this->view->file_put_contents($uid . '/files_trashbin/file1.d5457864' , 'data'); + $this->view->file_put_contents($uid . '/files_trashbin/folder1.d7437648723/file2' , 'data'); + } + + protected function createDummySystemWideKeys() { + $this->view->mkdir('files_encryption'); + $this->view->mkdir('files_encryption/public_keys'); + $this->view->file_put_contents('files_encryption/systemwide_1.privateKey', 'data'); + $this->view->file_put_contents('files_encryption/systemwide_2.privateKey', 'data'); + $this->view->file_put_contents('files_encryption/public_keys/systemwide_1.publicKey', 'data'); + $this->view->file_put_contents('files_encryption/public_keys/systemwide_2.publicKey', 'data'); + } + + public function testMigrateToNewFolderStructure() { + $this->createDummyUserKeys(self::TEST_ENCRYPTION_MIGRATION_USER1); + $this->createDummyUserKeys(self::TEST_ENCRYPTION_MIGRATION_USER2); + $this->createDummyUserKeys(self::TEST_ENCRYPTION_MIGRATION_USER3); + + $this->createDummyShareKeys(self::TEST_ENCRYPTION_MIGRATION_USER1); + $this->createDummyShareKeys(self::TEST_ENCRYPTION_MIGRATION_USER2); + $this->createDummyShareKeys(self::TEST_ENCRYPTION_MIGRATION_USER3); + + $this->createDummyFileKeys(self::TEST_ENCRYPTION_MIGRATION_USER1); + $this->createDummyFileKeys(self::TEST_ENCRYPTION_MIGRATION_USER2); + $this->createDummyFileKeys(self::TEST_ENCRYPTION_MIGRATION_USER3); + + $this->createDummyFiles(self::TEST_ENCRYPTION_MIGRATION_USER1); + $this->createDummyFiles(self::TEST_ENCRYPTION_MIGRATION_USER2); + $this->createDummyFiles(self::TEST_ENCRYPTION_MIGRATION_USER3); + + $this->createDummyFilesInTrash(self::TEST_ENCRYPTION_MIGRATION_USER2); + + // no user for system wide mount points + $this->createDummyFileKeys(''); + $this->createDummyShareKeys(''); + + $this->createDummySystemWideKeys(); + + /** @var \PHPUnit_Framework_MockObject_MockObject|\OCA\Encryption\Migration $m */ + $m = $this->getMockBuilder('OCA\Encryption\Migration') + ->setConstructorArgs( + [ + \OC::$server->getConfig(), + new \OC\Files\View(), + \OC::$server->getDatabaseConnection(), + $this->logger + ] + )->setMethods(['getSystemMountPoints'])->getMock(); + + $m->expects($this->any())->method('getSystemMountPoints') + ->will($this->returnValue([['mountpoint' => 'folder1'], ['mountpoint' => 'folder2']])); + + $m->reorganizeFolderStructure(); + // even if it runs twice folder should always move only once + $m->reorganizeFolderStructure(); + + $this->loginAsUser(self::TEST_ENCRYPTION_MIGRATION_USER1); + + $this->assertTrue( + $this->view->file_exists( + self::TEST_ENCRYPTION_MIGRATION_USER1 . '/files_encryption/' . + $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.publicKey') + ); + + $this->loginAsUser(self::TEST_ENCRYPTION_MIGRATION_USER2); + + $this->assertTrue( + $this->view->file_exists( + self::TEST_ENCRYPTION_MIGRATION_USER2 . '/files_encryption/' . + $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.publicKey') + ); + + $this->loginAsUser(self::TEST_ENCRYPTION_MIGRATION_USER3); + + $this->assertTrue( + $this->view->file_exists( + self::TEST_ENCRYPTION_MIGRATION_USER3 . '/files_encryption/' . + $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.publicKey') + ); + + $this->loginAsUser(self::TEST_ENCRYPTION_MIGRATION_USER1); + + $this->assertTrue( + $this->view->file_exists( + '/files_encryption/' . $this->moduleId . '/systemwide_1.publicKey') + ); + $this->assertTrue( + $this->view->file_exists( + '/files_encryption/' . $this->moduleId . '/systemwide_2.publicKey') + ); + + $this->verifyNewKeyPath(self::TEST_ENCRYPTION_MIGRATION_USER1); + $this->verifyNewKeyPath(self::TEST_ENCRYPTION_MIGRATION_USER2); + $this->verifyNewKeyPath(self::TEST_ENCRYPTION_MIGRATION_USER3); + // system wide keys + $this->verifyNewKeyPath(''); + // trash + $this->verifyFilesInTrash(self::TEST_ENCRYPTION_MIGRATION_USER2); + + } + + /** + * @param string $uid + */ + protected function verifyFilesInTrash($uid) { + $this->loginAsUser($uid); + + // share keys + $this->assertTrue( + $this->view->file_exists($uid . '/files_encryption/keys/files_trashbin/file1.d5457864/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey') + ); + $this->assertTrue( + $this->view->file_exists($uid . '/files_encryption/keys/files_trashbin/file1.d5457864/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey') + ); + $this->assertTrue( + $this->view->file_exists($uid . '/files_encryption/keys/files_trashbin/folder1.d7437648723/file2/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey') + ); + + // file keys + $this->assertTrue( + $this->view->file_exists($uid . '/files_encryption/keys/files_trashbin/file1.d5457864/' . $this->moduleId . '/fileKey') + ); + + $this->assertTrue( + $this->view->file_exists($uid . '/files_encryption/keys/files_trashbin/file1.d5457864/' . $this->moduleId . '/fileKey') + ); + $this->assertTrue( + $this->view->file_exists($uid . '/files_encryption/keys/files_trashbin/folder1.d7437648723/file2/' . $this->moduleId . '/fileKey') + ); + } + + /** + * @param string $uid + */ + protected function verifyNewKeyPath($uid) { + // private key + if ($uid !== '') { + $this->loginAsUser($uid); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/' . $this->moduleId . '/'. $uid . '.privateKey')); + } + // file keys + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/folder3/file3/' . $this->moduleId . '/fileKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/file2/' . $this->moduleId . '/fileKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/file.1/' . $this->moduleId . '/fileKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder2/file.2.1/' .$this->moduleId . '/fileKey')); + // share keys + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/folder3/file3/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/folder3/file3/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/folder3/file3/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/file2/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/file2/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/folder2/file2/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/file.1/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/file.1/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder1/file.1/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder2/file.2.1/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder2/file.2.1/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder2/file.2.1/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey')); + if ($this->public_share_key_id) { + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder2/file.2.1/' . $this->moduleId . '/' . $this->public_share_key_id . '.shareKey')); + } + if ($this->recovery_key_id) { + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/files/folder2/file.2.1/' . $this->moduleId . '/' . $this->recovery_key_id . '.shareKey')); + } + } + + private function prepareDB() { + $config = \OC::$server->getConfig(); + $config->setAppValue('files_encryption', 'recoveryKeyId', 'recovery_id'); + $config->setAppValue('files_encryption', 'publicShareKeyId', 'share_id'); + $config->setAppValue('files_encryption', 'recoveryAdminEnabled', '1'); + $config->setUserValue(self::TEST_ENCRYPTION_MIGRATION_USER1, 'files_encryption', 'recoverKeyEnabled', '1'); + + //$this->invokePrivate($config, 'cache', [[]]); + $cache = $this->invokePrivate(\OC::$server->getAppConfig(), 'cache'); + unset($cache['encryption']); + unset($cache['files_encryption']); + $this->invokePrivate(\OC::$server->getAppConfig(), 'cache', [$cache]); + + // delete default values set by the encryption app during initialization + + /** @var \OCP\IDBConnection $connection */ + $connection = \OC::$server->getDatabaseConnection(); + $query = $connection->getQueryBuilder(); + $query->delete('appconfig') + ->where($query->expr()->eq('appid', $query->createParameter('appid'))) + ->setParameter('appid', 'encryption'); + $query->execute(); + $query = $connection->getQueryBuilder(); + $query->delete('preferences') + ->where($query->expr()->eq('appid', $query->createParameter('appid'))) + ->setParameter('appid', 'encryption'); + $query->execute(); + } + + public function testUpdateDB() { + $this->prepareDB(); + + $m = new Migration(\OC::$server->getConfig(), new \OC\Files\View(), \OC::$server->getDatabaseConnection(), $this->logger); + $this->invokePrivate($m, 'installedVersion', ['0.7']); + $m->updateDB(); + + $this->verifyDB('appconfig', 'files_encryption', 0); + $this->verifyDB('preferences', 'files_encryption', 0); + $this->verifyDB('appconfig', 'encryption', 3); + $this->verifyDB('preferences', 'encryption', 1); + + } + + /** + * test update db if the db already contain some existing new values + */ + public function testUpdateDBExistingNewConfig() { + $this->prepareDB(); + $config = \OC::$server->getConfig(); + $config->setAppValue('encryption', 'publicShareKeyId', 'wrong_share_id'); + $config->setUserValue(self::TEST_ENCRYPTION_MIGRATION_USER1, 'encryption', 'recoverKeyEnabled', '9'); + + $m = new Migration(\OC::$server->getConfig(), new \OC\Files\View(), \OC::$server->getDatabaseConnection(), $this->logger); + $this->invokePrivate($m, 'installedVersion', ['0.7']); + $m->updateDB(); + + $this->verifyDB('appconfig', 'files_encryption', 0); + $this->verifyDB('preferences', 'files_encryption', 0); + $this->verifyDB('appconfig', 'encryption', 3); + $this->verifyDB('preferences', 'encryption', 1); + + // check if the existing values where overwritten correctly + /** @var \OC\DB\Connection $connection */ + $connection = \OC::$server->getDatabaseConnection(); + $query = $connection->getQueryBuilder(); + $query->select('configvalue') + ->from('appconfig') + ->where($query->expr()->andX( + $query->expr()->eq('appid', $query->createParameter('appid')), + $query->expr()->eq('configkey', $query->createParameter('configkey')) + )) + ->setParameter('appid', 'encryption') + ->setParameter('configkey', 'publicShareKeyId'); + $result = $query->execute(); + $value = $result->fetch(); + $this->assertTrue(isset($value['configvalue'])); + $this->assertSame('share_id', $value['configvalue']); + + $query = $connection->getQueryBuilder(); + $query->select('configvalue') + ->from('preferences') + ->where($query->expr()->andX( + $query->expr()->eq('appid', $query->createParameter('appid')), + $query->expr()->eq('configkey', $query->createParameter('configkey')), + $query->expr()->eq('userid', $query->createParameter('userid')) + )) + ->setParameter('appid', 'encryption') + ->setParameter('configkey', 'recoverKeyEnabled') + ->setParameter('userid', self::TEST_ENCRYPTION_MIGRATION_USER1); + $result = $query->execute(); + $value = $result->fetch(); + $this->assertTrue(isset($value['configvalue'])); + $this->assertSame('1', $value['configvalue']); + + } + + /** + * @param string $table + * @param string $appid + * @param integer $expected + */ + public function verifyDB($table, $appid, $expected) { + /** @var \OCP\IDBConnection $connection */ + $connection = \OC::$server->getDatabaseConnection(); + $query = $connection->getQueryBuilder(); + $query->select('appid') + ->from($table) + ->where($query->expr()->eq('appid', $query->createParameter('appid'))) + ->setParameter('appid', $appid); + $result = $query->execute(); + $values = $result->fetchAll(); + $this->assertSame($expected, + count($values) + ); + } + + /** + * test update of the file cache + */ + public function testUpdateFileCache() { + $this->prepareFileCache(); + $m = new Migration(\OC::$server->getConfig(), new \OC\Files\View(), \OC::$server->getDatabaseConnection(), $this->logger); + $this->invokePrivate($m, 'installedVersion', ['0.7']); + self::invokePrivate($m, 'updateFileCache'); + + // check results + + /** @var \OCP\IDBConnection $connection */ + $connection = \OC::$server->getDatabaseConnection(); + $query = $connection->getQueryBuilder(); + $query->select('*') + ->from('filecache'); + $result = $query->execute(); + $entries = $result->fetchAll(); + foreach($entries as $entry) { + if ((int)$entry['encrypted'] === 1) { + $this->assertSame((int)$entry['unencrypted_size'], (int)$entry['size']); + } else { + $this->assertSame((int)$entry['unencrypted_size'] - 2, (int)$entry['size']); + } + } + + + } + + public function prepareFileCache() { + /** @var \OCP\IDBConnection $connection */ + $connection = \OC::$server->getDatabaseConnection(); + $query = $connection->getQueryBuilder(); + $query->delete('filecache'); + $query->execute(); + $query = $connection->getQueryBuilder(); + $result = $query->select('fileid') + ->from('filecache') + ->setMaxResults(1)->execute()->fetchAll(); + $this->assertEmpty($result); + $query = $connection->getQueryBuilder(); + $query->insert('filecache') + ->values( + array( + 'storage' => $query->createParameter('storage'), + 'path_hash' => $query->createParameter('path_hash'), + 'encrypted' => $query->createParameter('encrypted'), + 'size' => $query->createParameter('size'), + 'unencrypted_size' => $query->createParameter('unencrypted_size'), + ) + ); + for ($i = 1; $i < 20; $i++) { + $query->setParameter('storage', 1) + ->setParameter('path_hash', $i) + ->setParameter('encrypted', $i % 2) + ->setParameter('size', $i) + ->setParameter('unencrypted_size', $i + 2); + $this->assertSame(1, + $query->execute() + ); + } + $query = $connection->getQueryBuilder(); + $result = $query->select('fileid') + ->from('filecache') + ->execute()->fetchAll(); + $this->assertSame(19, count($result)); + } + + /** + * @dataProvider dataTestGetTargetDir + */ + public function testGetTargetDir($user, $keyPath, $filename, $trash, $systemMounts, $expected) { + + $view = $this->getMockBuilder('\OC\Files\View') + ->disableOriginalConstructor()->getMock(); + $view->expects($this->any())->method('file_exists')->willReturn(true); + + $m = $this->getMockBuilder('OCA\Encryption\Migration') + ->setConstructorArgs( + [ + \OC::$server->getConfig(), + $view, + \OC::$server->getDatabaseConnection(), + $this->logger + ] + )->setMethods(['getSystemMountPoints'])->getMock(); + + $m->expects($this->any())->method('getSystemMountPoints') + ->willReturn($systemMounts); + + $this->assertSame($expected, + $this->invokePrivate($m, 'getTargetDir', [$user, $keyPath, $filename, $trash]) + ); + } + + public function dataTestGetTargetDir() { + return [ + [ + 'user1', + '/files_encryption/keys/foo/bar.txt', + 'user1.shareKey', + false, + [], + 'user1/files_encryption/keys/files/foo/bar.txt/OC_DEFAULT_MODULE/user1.shareKey' + ], + [ + 'user1', + '/files_trashbin/keys/foo/bar.txt', + 'user1.shareKey', + true, + [], + 'user1/files_encryption/keys/files_trashbin/foo/bar.txt/OC_DEFAULT_MODULE/user1.shareKey' + ], + [ + '', + '/files_encryption/keys/foo/bar.txt', + 'user1.shareKey', + false, + [['mountpoint' => 'foo']], + '/files_encryption/keys/files/foo/bar.txt/OC_DEFAULT_MODULE/user1.shareKey' + ], + [ + '', + '/files_encryption/keys/foo/bar.txt', + 'user1.shareKey', + false, + [['mountpoint' => 'foobar']], + false + ], + [ + '', + '/files_encryption/keys/foobar/bar.txt', + 'user1.shareKey', + false, + [['mountpoint' => 'foo']], + false + ] + ]; + } + +} |