From 6e447b67241f561a0ea02561d9e3098ad2e8267a Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Wed, 16 Jul 2014 13:30:58 +0200 Subject: update keys recursively if a folder was moved --- apps/files_encryption/hooks/hooks.php | 59 ++++++++++++++++++++--------------- apps/files_encryption/tests/share.php | 48 ++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 26 deletions(-) diff --git a/apps/files_encryption/hooks/hooks.php b/apps/files_encryption/hooks/hooks.php index 8f3ae21fd56..943e7dfcf50 100644 --- a/apps/files_encryption/hooks/hooks.php +++ b/apps/files_encryption/hooks/hooks.php @@ -289,7 +289,7 @@ class Hooks { } /** - * @brief + * update share keys if a file was shared */ public static function postShared($params) { @@ -299,29 +299,39 @@ class Hooks { if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') { - $view = new \OC\Files\View('/'); - $session = new \OCA\Encryption\Session($view); - $userId = \OCP\User::getUser(); - $util = new Util($view, $userId); $path = \OC\Files\Filesystem::getPath($params['fileSource']); - $sharingEnabled = \OCP\Share::isEnabled(); + self::updateKeyfiles($path, $params['itemType']); + } + } - $mountManager = \OC\Files\Filesystem::getMountManager(); - $mount = $mountManager->find('/' . $userId . '/files' . $path); - $mountPoint = $mount->getMountPoint(); + /** + * update keyfiles and share keys recursively + * + * @param string $path to the file/folder + * @param string $type 'file' or 'folder' + */ + private static function updateKeyfiles($path, $type) { + $view = new \OC\Files\View('/'); + $userId = \OCP\User::getUser(); + $session = new \OCA\Encryption\Session($view); + $util = new Util($view, $userId); + $sharingEnabled = \OCP\Share::isEnabled(); - // if a folder was shared, get a list of all (sub-)folders - if ($params['itemType'] === 'folder') { - $allFiles = $util->getAllFiles($path, $mountPoint); - } else { - $allFiles = array($path); - } + $mountManager = \OC\Files\Filesystem::getMountManager(); + $mount = $mountManager->find('/' . $userId . '/files' . $path); + $mountPoint = $mount->getMountPoint(); - foreach ($allFiles as $path) { - $usersSharing = $util->getSharingUsersArray($sharingEnabled, $path); - $util->setSharedFileKeyfiles($session, $usersSharing, $path); - } + // if a folder was shared, get a list of all (sub-)folders + if ($type === 'folder') { + $allFiles = $util->getAllFiles($path, $mountPoint); + } else { + $allFiles = array($path); + } + + foreach ($allFiles as $path) { + $usersSharing = $util->getSharingUsersArray($sharingEnabled, $path); + $util->setSharedFileKeyfiles($session, $usersSharing, $path); } } @@ -420,7 +430,6 @@ class Hooks { \OC_FileProxy::$enabled = false; $view = new \OC\Files\View('/'); - $session = new \OCA\Encryption\Session($view); $userId = \OCP\User::getUser(); $util = new Util($view, $userId); @@ -428,6 +437,7 @@ class Hooks { isset(self::$renamedFiles[$params['oldpath']]['path'])) { $ownerOld = self::$renamedFiles[$params['oldpath']]['uid']; $pathOld = self::$renamedFiles[$params['oldpath']]['path']; + unset(self::$renamedFiles[$params['oldpath']]); } else { \OCP\Util::writeLog('Encryption library', "can't get path and owner from the file before it was renamed", \OCP\Util::DEBUG); return false; @@ -462,6 +472,7 @@ class Hooks { // handle share keys if (!$view->is_dir($oldKeyfilePath)) { + $type = 'file'; $oldKeyfilePath .= '.key'; $newKeyfilePath .= '.key'; @@ -473,6 +484,7 @@ class Hooks { } } else { + $type = "folder"; // handle share-keys folders $view->rename($oldShareKeyPath, $newShareKeyPath); } @@ -482,14 +494,9 @@ class Hooks { $view->rename($oldKeyfilePath, $newKeyfilePath); } - // update share keys - $sharingEnabled = \OCP\Share::isEnabled(); - - // get users - $usersSharing = $util->getSharingUsersArray($sharingEnabled, $pathNew); // update sharing-keys - $util->setSharedFileKeyfiles($session, $usersSharing, $pathNew); + self::updateKeyfiles($params['newpath'], $type); \OC_FileProxy::$enabled = $proxyStatus; } diff --git a/apps/files_encryption/tests/share.php b/apps/files_encryption/tests/share.php index 05365a0f6d0..7bbea6488bc 100755 --- a/apps/files_encryption/tests/share.php +++ b/apps/files_encryption/tests/share.php @@ -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'); + } + } -- cgit v1.2.3 From 78b13de4bf2bf2bd1cd06c707d02f5f84d55ece4 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Wed, 16 Jul 2014 16:04:56 +0200 Subject: check that the file proxies are enabled after each test --- apps/files_encryption/tests/crypt.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/files_encryption/tests/crypt.php b/apps/files_encryption/tests/crypt.php index 4c4b285d92b..a1a51c749b0 100755 --- a/apps/files_encryption/tests/crypt.php +++ b/apps/files_encryption/tests/crypt.php @@ -94,6 +94,8 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } else { OC_App::disable('files_trashbin'); } + + $this->assertTrue(\OC_FileProxy::$enabled); } public static function tearDownAfterClass() { -- cgit v1.2.3