aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2014-07-17 13:17:07 +0200
committerVincent Petry <pvince81@owncloud.com>2014-07-17 13:17:07 +0200
commit55e6e277718243b2ed001dce6045e6379155bc9b (patch)
tree056017772f8243eb1b337d16763640d6bfafd5e8
parent3e4304e536a20495e3f208deeeb9d81784047369 (diff)
parent78b13de4bf2bf2bd1cd06c707d02f5f84d55ece4 (diff)
downloadnextcloud-server-55e6e277718243b2ed001dce6045e6379155bc9b.tar.gz
nextcloud-server-55e6e277718243b2ed001dce6045e6379155bc9b.zip
Merge pull request #9668 from owncloud/enc_fix_folder_move
[encryption] update keys recursively if a folder was moved
-rw-r--r--apps/files_encryption/hooks/hooks.php59
-rwxr-xr-xapps/files_encryption/tests/crypt.php2
-rwxr-xr-xapps/files_encryption/tests/share.php48
3 files changed, 83 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/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() {
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');
+ }
+
}