]> source.dussan.org Git - nextcloud-server.git/commitdiff
added tests for the delete hooks if the trash bin is disabled
authorBjoern Schiessle <schiessle@owncloud.com>
Fri, 31 Jan 2014 22:37:21 +0000 (23:37 +0100)
committerBjoern Schiessle <schiessle@owncloud.com>
Sat, 1 Feb 2014 19:08:23 +0000 (20:08 +0100)
apps/files_encryption/tests/hooks.php [new file with mode: 0644]
apps/files_encryption/tests/proxy.php
apps/files_encryption/tests/share.php

diff --git a/apps/files_encryption/tests/hooks.php b/apps/files_encryption/tests/hooks.php
new file mode 100644 (file)
index 0000000..c26cba6
--- /dev/null
@@ -0,0 +1,271 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Bjoern Schiessle
+ * @copyright 2014 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/>.
+ *
+ */
+
+require_once __DIR__ . '/../../../lib/base.php';
+require_once __DIR__ . '/../lib/crypt.php';
+require_once __DIR__ . '/../lib/keymanager.php';
+require_once __DIR__ . '/../lib/stream.php';
+require_once __DIR__ . '/../lib/util.php';
+require_once __DIR__ . '/../appinfo/app.php';
+require_once __DIR__ . '/util.php';
+
+use OCA\Encryption;
+
+/**
+ * Class Test_Encryption_Hooks
+ * @brief this class provide basic hook app tests
+ */
+class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase {
+
+       const TEST_ENCRYPTION_HOOKS_USER1 = "test-proxy-user1";
+       const TEST_ENCRYPTION_HOOKS_USER2 = "test-proxy-user2";
+
+       /**
+        * @var \OC_FilesystemView
+        */
+       public $user1View;     // view on /data/user1/files
+       public $user2View;     // view on /data/user2/files
+       public $rootView; // view on /data/user
+       public $data;
+       public $filename;
+
+       public static function setUpBeforeClass() {
+               // reset backend
+               \OC_User::clearBackends();
+               \OC_User::useBackend('database');
+
+               \OC_Hook::clear('OC_Filesystem');
+               \OC_Hook::clear('OC_User');
+
+               // clear share hooks
+               \OC_Hook::clear('OCP\\Share');
+               \OC::registerShareHooks();
+               \OCP\Util::connectHook('OC_Filesystem', 'setup', '\OC\Files\Storage\Shared', 'setup');
+
+               // Filesystem related hooks
+               \OCA\Encryption\Helper::registerFilesystemHooks();
+
+               // Sharing related hooks
+               \OCA\Encryption\Helper::registerShareHooks();
+
+               // clear and register proxies
+               \OC_FileProxy::clearProxies();
+               \OC_FileProxy::register(new OCA\Encryption\Proxy());
+
+               // create test user
+               \Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1, true);
+               \Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2, true);
+       }
+
+       function setUp() {
+               // set user id
+               \Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1);
+               \OC_User::setUserId(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1);
+
+               // init filesystem view
+               $this->user1View = new \OC_FilesystemView('/'. \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1 . '/files');
+               $this->user2View = new \OC_FilesystemView('/'. \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '/files');
+               $this->rootView = new \OC_FilesystemView('/');
+
+               // init short data
+               $this->data = 'hats';
+               $this->filename = 'enc_hooks_tests-' . uniqid() . '.txt';
+
+       }
+
+       public static function tearDownAfterClass() {
+               // cleanup test user
+               \OC_User::deleteUser(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1);
+               \OC_User::deleteUser(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2);
+       }
+
+       function testDeleteHooks() {
+
+               // remember files_trashbin state
+               $stateFilesTrashbin = OC_App::isEnabled('files_trashbin');
+
+               // we want to tests with app files_trashbin disabled
+               \OC_App::disable('files_trashbin');
+
+               // make sure that the trash bin is disabled
+               $this->assertFalse(\OC_APP::isEnabled('files_trashbin'));
+
+               $this->user1View->file_put_contents($this->filename, $this->data);
+
+               // check if all keys are generated
+               $this->assertTrue($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/'
+                       . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
+               $this->assertTrue($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' . $this->filename . '.key'));
+
+
+               \Test_Encryption_Util::logoutHelper();
+               \Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2);
+               \OC_User::setUserId(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2);
+
+
+               $this->user2View->file_put_contents($this->filename, $this->data);
+
+               // check if all keys are generated
+               $this->assertTrue($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/share-keys/'
+                       . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
+               $this->assertTrue($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keyfiles/' . $this->filename . '.key'));
+
+
+               // create a dummy file that we can delete something outside of data/user/files
+               // in this case no share or file keys should be deleted
+               $this->rootView->file_put_contents(self::TEST_ENCRYPTION_HOOKS_USER2 . "/" . $this->filename, $this->data);
+
+               // delete dummy file outside of data/user/files
+               $this->rootView->unlink(self::TEST_ENCRYPTION_HOOKS_USER2 . "/" . $this->filename);
+
+               // all keys should still exist
+               $this->assertTrue($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/share-keys/'
+                       . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
+               $this->assertTrue($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keyfiles/' . $this->filename . '.key'));
+
+
+               // delete the file in data/user/files
+               // now the correspondig share and file keys from user2 should be deleted
+               $this->user2View->unlink($this->filename);
+
+               // check if keys from user2 are really deleted
+               $this->assertFalse($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/share-keys/'
+                       . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
+               $this->assertFalse($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keyfiles/' . $this->filename . '.key'));
+
+               // but user1 keys should still exist
+               $this->assertTrue($this->rootView->file_exists(
+                               self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/'
+                               . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
+               $this->assertTrue($this->rootView->file_exists(
+                               self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' . $this->filename . '.key'));
+
+               if ($stateFilesTrashbin) {
+                       OC_App::enable('files_trashbin');
+               }
+               else {
+                       OC_App::disable('files_trashbin');
+               }
+       }
+
+       function testDeleteHooksForSharedFiles() {
+
+               \Test_Encryption_Util::logoutHelper();
+               \Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1);
+               \OC_User::setUserId(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1);
+
+               // remember files_trashbin state
+               $stateFilesTrashbin = OC_App::isEnabled('files_trashbin');
+
+               // we want to tests with app files_trashbin disabled
+               \OC_App::disable('files_trashbin');
+
+               // make sure that the trash bin is disabled
+               $this->assertFalse(\OC_APP::isEnabled('files_trashbin'));
+
+               $this->user1View->file_put_contents($this->filename, $this->data);
+
+               // check if all keys are generated
+               $this->assertTrue($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/'
+                       . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
+               $this->assertTrue($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' . $this->filename . '.key'));
+
+               // get the file info from previous created file
+               $fileInfo = $this->user1View->getFileInfo($this->filename);
+
+               // check if we have a valid file info
+               $this->assertTrue(is_array($fileInfo));
+
+               // share the file with user2
+               \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_HOOKS_USER2, OCP\PERMISSION_ALL);
+
+               // check if new share key exists
+               $this->assertTrue($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/'
+                       . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
+
+               \Test_Encryption_Util::logoutHelper();
+               \Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2);
+               \OC_User::setUserId(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2);
+
+               // user2 has a local file with the same name
+               $this->user2View->file_put_contents($this->filename, $this->data);
+
+               // check if all keys are generated
+               $this->assertTrue($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/share-keys/'
+                       . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
+               $this->assertTrue($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keyfiles/' . $this->filename . '.key'));
+
+               // delete the Shared file from user1 in data/user2/files/Shared
+               $this->user2View->unlink('/Shared/' . $this->filename);
+
+               // now keys from user1s home should be gone
+               $this->assertFalse($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/'
+                       . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
+               $this->assertFalse($this->rootView->file_exists(
+                               self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/'
+                               . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
+               $this->assertFalse($this->rootView->file_exists(
+                       self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' . $this->filename . '.key'));
+
+               // but user2 keys should still exist
+               $this->assertTrue($this->rootView->file_exists(
+                               self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/share-keys/'
+                               . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
+               $this->assertTrue($this->rootView->file_exists(
+                               self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keyfiles/' . $this->filename . '.key'));
+
+               // cleanup
+
+               $this->user2View->unlink($this->filename);
+
+               \Test_Encryption_Util::logoutHelper();
+               \Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1);
+               \OC_User::setUserId(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1);
+
+               // unshare the file
+               \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_HOOKS_USER2);
+
+               $this->user1View->unlink($this->filename);
+
+               if ($stateFilesTrashbin) {
+                       OC_App::enable('files_trashbin');
+               }
+               else {
+                       OC_App::disable('files_trashbin');
+               }
+       }
+
+}
index c3006274d6de2dbc6f5fb8f3c1832f222e7b83ea..51cc0b795e38bdd3d7c9aede64417d3b3ede5d87 100644 (file)
@@ -112,54 +112,4 @@ class Test_Encryption_Proxy extends \PHPUnit_Framework_TestCase {
 
        }
 
-       function testPreUnlinkWithoutTrash() {
-
-               // remember files_trashbin state
-               $stateFilesTrashbin = OC_App::isEnabled('files_trashbin');
-
-               // we want to tests with app files_trashbin enabled
-               \OC_App::disable('files_trashbin');
-
-               $this->view->file_put_contents($this->filename, $this->data);
-
-               // create a dummy file that we can delete something outside of data/user/files
-               $this->rootView->file_put_contents("dummy.txt", $this->data);
-
-               // check if all keys are generated
-               $this->assertTrue($this->rootView->file_exists(
-                       '/files_encryption/share-keys/'
-                       . $this->filename . '.' . \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '.shareKey'));
-               $this->assertTrue($this->rootView->file_exists(
-                       '/files_encryption/keyfiles/' . $this->filename . '.key'));
-
-
-               // delete dummy file outside of data/user/files
-               $this->rootView->unlink("dummy.txt");
-
-               // all keys should still exist
-               $this->assertTrue($this->rootView->file_exists(
-                       '/files_encryption/share-keys/'
-                       . $this->filename . '.' . \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '.shareKey'));
-               $this->assertTrue($this->rootView->file_exists(
-                       '/files_encryption/keyfiles/' . $this->filename . '.key'));
-
-
-               // delete the file in data/user/files
-               $this->view->unlink($this->filename);
-
-               // now also the keys should be gone
-               $this->assertFalse($this->rootView->file_exists(
-                       '/files_encryption/share-keys/'
-                       . $this->filename . '.' . \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '.shareKey'));
-               $this->assertFalse($this->rootView->file_exists(
-                       '/files_encryption/keyfiles/' . $this->filename . '.key'));
-
-               if ($stateFilesTrashbin) {
-                       OC_App::enable('files_trashbin');
-               }
-               else {
-                       OC_App::disable('files_trashbin');
-               }
-       }
-
 }
index e55427620a6e55ca7cef0d4baa8a4e3f8eb9e39f..acf408a07f07c20c9900f8eb6bbda727653df5ec 100755 (executable)
@@ -194,8 +194,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
                                . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
 
                        // cleanup
-                       $this->view->unlink(
-                               '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
+                       $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/');
+                       $this->view->unlink($this->filename);
+                       $this->view->chroot('/');
 
                        // check if share key not exists
                        $this->assertFalse($this->view->file_exists(
@@ -265,8 +266,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
                                . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
 
                        // cleanup
-                       $this->view->unlink(
-                               '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
+                       $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/');
+                       $this->view->unlink($this->filename);
+                       $this->view->chroot('/');
 
                        // check if share key not exists
                        $this->assertFalse($this->view->file_exists(
@@ -352,7 +354,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
                                . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
 
                        // cleanup
-                       $this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1);
+                       $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files');
+                       $this->view->unlink($this->folder1);
+                       $this->view->chroot('/');
 
                        // check if share key not exists
                        $this->assertFalse($this->view->file_exists(
@@ -482,9 +486,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
                                . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
 
                        // cleanup
-                       $this->view->unlink(
-                               '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1 . $this->subfolder
-                               . $this->subsubfolder . '/' . $this->filename);
+                       $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files');
+                       $this->view->unlink($this->folder1 . $this->subfolder . $this->subsubfolder . '/' . $this->filename);
+                       $this->view->chroot('/');
 
                        // check if share key not exists
                        $this->assertFalse($this->view->file_exists(
@@ -559,7 +563,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
                        . $this->filename . '.' . $publicShareKeyId . '.shareKey'));
 
                // cleanup
-               $this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
+               $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/');
+               $this->view->unlink($this->filename);
+               $this->view->chroot('/');
 
                // check if share key not exists
                $this->assertFalse($this->view->file_exists(
@@ -636,7 +642,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
                        . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey'));
 
                // cleanup
-               $this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
+               $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/');
+               $this->view->unlink($this->filename);
+               $this->view->chroot('/');
 
                // check if share key not exists
                $this->assertFalse($this->view->file_exists(
@@ -731,8 +739,10 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
                        . $this->filename . '.' . $recoveryKeyId . '.shareKey'));
 
                // cleanup
-               $this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
-               $this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->folder1);
+               $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/');
+               $this->view->unlink($this->filename);
+               $this->view->unlink($this->folder1);
+               $this->view->chroot('/');
 
                // check if share key for recovery not exists
                $this->assertFalse($this->view->file_exists(
@@ -828,8 +838,10 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
                $this->assertEquals($this->dataShort, $retrievedCryptedFile2);
 
                // cleanup
-               $this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1);
-               $this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
+               $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/');
+               $this->view->unlink($this->folder1);
+               $this->view->unlink($this->filename);
+               $this->view->chroot('/');
 
                // check if share key for user and recovery exists
                $this->assertFalse($this->view->file_exists(
@@ -930,7 +942,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
                        . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey'));
 
                // cleanup
-               $this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
+               $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/');
+               $this->view->unlink($this->filename);
+               $this->view->chroot('/');
        }
 
 }