]> source.dussan.org Git - nextcloud-server.git/commitdiff
update keys recursively if a folder was moved
authorBjoern Schiessle <schiessle@owncloud.com>
Wed, 16 Jul 2014 11:30:58 +0000 (13:30 +0200)
committerBjoern Schiessle <schiessle@owncloud.com>
Thu, 17 Jul 2014 09:22:22 +0000 (11:22 +0200)
apps/files_encryption/hooks/hooks.php
apps/files_encryption/tests/share.php

index 8f3ae21fd56830b58cb630780d66196ae24abbba..943e7dfcf50ffeda6f17761309d50b5a09e8b0d6 100644 (file)
@@ -289,7 +289,7 @@ class Hooks {
        }\r
 \r
        /**\r
-        * @brief\r
+        * update share keys if a file was shared\r
         */\r
        public static function postShared($params) {\r
 \r
@@ -299,29 +299,39 @@ class Hooks {
 \r
                if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {\r
 \r
-                       $view = new \OC\Files\View('/');\r
-                       $session = new \OCA\Encryption\Session($view);\r
-                       $userId = \OCP\User::getUser();\r
-                       $util = new Util($view, $userId);\r
                        $path = \OC\Files\Filesystem::getPath($params['fileSource']);\r
 \r
-                       $sharingEnabled = \OCP\Share::isEnabled();\r
+                       self::updateKeyfiles($path, $params['itemType']);\r
+               }\r
+       }\r
 \r
-                       $mountManager = \OC\Files\Filesystem::getMountManager();\r
-                       $mount = $mountManager->find('/' . $userId . '/files' . $path);\r
-                       $mountPoint = $mount->getMountPoint();\r
+       /**\r
+        * update keyfiles and share keys recursively\r
+        *\r
+        * @param string $path to the file/folder\r
+        * @param string $type 'file' or 'folder'\r
+        */\r
+       private static function updateKeyfiles($path, $type) {\r
+               $view = new \OC\Files\View('/');\r
+               $userId = \OCP\User::getUser();\r
+               $session = new \OCA\Encryption\Session($view);\r
+               $util = new Util($view, $userId);\r
+               $sharingEnabled = \OCP\Share::isEnabled();\r
 \r
-                       // if a folder was shared, get a list of all (sub-)folders\r
-                       if ($params['itemType'] === 'folder') {\r
-                               $allFiles = $util->getAllFiles($path, $mountPoint);\r
-                       } else {\r
-                               $allFiles = array($path);\r
-                       }\r
+               $mountManager = \OC\Files\Filesystem::getMountManager();\r
+               $mount = $mountManager->find('/' . $userId . '/files' . $path);\r
+               $mountPoint = $mount->getMountPoint();\r
 \r
-                       foreach ($allFiles as $path) {\r
-                               $usersSharing = $util->getSharingUsersArray($sharingEnabled, $path);\r
-                               $util->setSharedFileKeyfiles($session, $usersSharing, $path);\r
-                       }\r
+               // if a folder was shared, get a list of all (sub-)folders\r
+               if ($type === 'folder') {\r
+                       $allFiles = $util->getAllFiles($path, $mountPoint);\r
+               } else {\r
+                       $allFiles = array($path);\r
+               }\r
+\r
+               foreach ($allFiles as $path) {\r
+                       $usersSharing = $util->getSharingUsersArray($sharingEnabled, $path);\r
+                       $util->setSharedFileKeyfiles($session, $usersSharing, $path);\r
                }\r
        }\r
 \r
@@ -420,7 +430,6 @@ class Hooks {
                \OC_FileProxy::$enabled = false;\r
 \r
                $view = new \OC\Files\View('/');\r
-               $session = new \OCA\Encryption\Session($view);\r
                $userId = \OCP\User::getUser();\r
                $util = new Util($view, $userId);\r
 \r
@@ -428,6 +437,7 @@ class Hooks {
                                isset(self::$renamedFiles[$params['oldpath']]['path'])) {\r
                        $ownerOld = self::$renamedFiles[$params['oldpath']]['uid'];\r
                        $pathOld = self::$renamedFiles[$params['oldpath']]['path'];\r
+                       unset(self::$renamedFiles[$params['oldpath']]);\r
                } else {\r
                        \OCP\Util::writeLog('Encryption library', "can't get path and owner from the file before it was renamed", \OCP\Util::DEBUG);\r
                        return false;\r
@@ -462,6 +472,7 @@ class Hooks {
 \r
                // handle share keys\r
                if (!$view->is_dir($oldKeyfilePath)) {\r
+                       $type = 'file';\r
                        $oldKeyfilePath .= '.key';\r
                        $newKeyfilePath .= '.key';\r
 \r
@@ -473,6 +484,7 @@ class Hooks {
                        }\r
 \r
                } else {\r
+                       $type = "folder";\r
                        // handle share-keys folders\r
                        $view->rename($oldShareKeyPath, $newShareKeyPath);\r
                }\r
@@ -482,14 +494,9 @@ class Hooks {
                        $view->rename($oldKeyfilePath, $newKeyfilePath);\r
                }\r
 \r
-               // update share keys\r
-               $sharingEnabled = \OCP\Share::isEnabled();\r
-\r
-               // get users\r
-               $usersSharing = $util->getSharingUsersArray($sharingEnabled, $pathNew);\r
 \r
                // update sharing-keys\r
-               $util->setSharedFileKeyfiles($session, $usersSharing, $pathNew);\r
+               self::updateKeyfiles($params['newpath'], $type);\r
 \r
                \OC_FileProxy::$enabled = $proxyStatus;\r
        }\r
index 05365a0f6d0aa2fb29112a186ee4bb9d21f107f3..7bbea6488bc42b43f8e14205a8ccc7b8693a15c6 100755 (executable)
@@ -1015,4 +1015,52 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
                $this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
        }
 
+       /**
+        * test if additional share keys are added if we move a folder to a shared parent
+        * @medium
+        */
+       function testMoveFolder() {
+
+               $view = new \OC\Files\View('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
+
+               $filename = '/tmp-' . uniqid();
+               $folder = '/folder' . uniqid();
+
+               \OC\Files\Filesystem::mkdir($folder);
+
+               // Save long data as encrypted file using stream wrapper
+               $cryptedFile = \OC\Files\Filesystem::file_put_contents($folder . $filename, $this->dataShort);
+
+               // Test that data was successfully written
+               $this->assertTrue(is_int($cryptedFile));
+
+               // Get file decrypted contents
+               $decrypt = \OC\Files\Filesystem::file_get_contents($folder . $filename);
+
+               $this->assertEquals($this->dataShort, $decrypt);
+
+               $newFolder = '/newfolder/subfolder' . uniqid();
+               \OC\Files\Filesystem::mkdir('/newfolder');
+
+               // get the file info from previous created file
+               $fileInfo = \OC\Files\Filesystem::getFileInfo('/newfolder');
+               $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo);
+
+               // share the folder
+               \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, OCP\PERMISSION_ALL);
+
+               \OC\Files\Filesystem::rename($folder, $newFolder);
+
+               // Get file decrypted contents
+               $newDecrypt = \OC\Files\Filesystem::file_get_contents($newFolder . $filename);
+               $this->assertEquals($this->dataShort, $newDecrypt);
+
+               // check if additional share key for user2 exists
+               $this->assertTrue($view->file_exists('files_encryption/share-keys' . $newFolder . '/' . $filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
+
+               // tear down
+               \OC\Files\Filesystem::unlink($newFolder);
+               \OC\Files\Filesystem::unlink('/newfolder');
+       }
+
 }