]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix rename of shared files
authorBjoern Schiessle <schiessle@owncloud.com>
Thu, 19 Dec 2013 16:29:38 +0000 (17:29 +0100)
committerBjoern Schiessle <schiessle@owncloud.com>
Thu, 19 Dec 2013 16:29:38 +0000 (17:29 +0100)
apps/files_encryption/hooks/hooks.php
apps/files_encryption/lib/helper.php

index 7b13ae2a1d0daa042bad494a4297538278b9910c..3e453e210f38c81861eee0004c0e8c39b4c1bc51 100644 (file)
@@ -30,6 +30,9 @@ use OC\Files\Filesystem;
  */\r
 class Hooks {\r
 \r
+       // file for which we want to rename the keys after the rename operation was successful\r
+       private static $renamedFiles = array();\r
+\r
        /**\r
         * @brief Startup encryption backend upon user login\r
         * @note This method should never be called for users using client side encryption\r
@@ -479,6 +482,18 @@ class Hooks {
                }\r
        }\r
 \r
+       /**\r
+        * @brief mark file as renamed so that we know the original source after the file was renamed\r
+        * @param string $path\r
+        */\r
+       public static function preRename($params) {\r
+               $util = new Util(new \OC_FilesystemView('/'), \OCP\User::getUser());\r
+               list($ownerOld, $pathOld) = $util->getUidAndFilename($params['oldpath']);\r
+               self::$renamedFiles[$params['oldpath']] = array(\r
+                       'uid' => $ownerOld,\r
+                       'path' => $pathOld);\r
+       }\r
+\r
        /**\r
         * @brief after a file is renamed, rename its keyfile and share-keys also fix the file size and fix also the sharing\r
         * @param array with oldpath and newpath\r
@@ -501,19 +516,25 @@ class Hooks {
                $userId = \OCP\User::getUser();\r
                $util = new Util($view, $userId);\r
 \r
+               $ownerOld = self::$renamedFiles[$params['oldpath']]['uid'];\r
+               $pathOld = self::$renamedFiles[$params['oldpath']]['path'];\r
+               list($ownerNew, $pathNew) = $util->getUidAndFilename($params['newpath']);\r
+\r
                // Format paths to be relative to user files dir\r
-               if ($util->isSystemWideMountPoint($params['oldpath'])) {\r
-                       $baseDir = 'files_encryption/';\r
-                       $oldKeyfilePath = $baseDir . 'keyfiles/' . $params['oldpath'];\r
+               if ($util->isSystemWideMountPoint($pathOld)) {\r
+                       $oldKeyfilePath = 'files_encryption/keyfiles/' . $pathOld;\r
+                       $oldShareKeyPath = 'files_encryption/share-keys/' . $pathOld;\r
                } else {\r
-                       $baseDir = $userId . '/' . 'files_encryption/';\r
-                       $oldKeyfilePath = $baseDir . 'keyfiles/' . $params['oldpath'];\r
+                       $oldKeyfilePath = $ownerOld . '/' . 'files_encryption/keyfiles/' . $pathOld;\r
+                       $oldShareKeyPath = $ownerOld . '/' . 'files_encryption/share-keys/' . $pathOld;\r
                }\r
 \r
-               if ($util->isSystemWideMountPoint($params['newpath'])) {\r
-                       $newKeyfilePath =  $baseDir . 'keyfiles/' . $params['newpath'];\r
+               if ($util->isSystemWideMountPoint($pathNew)) {\r
+                       $newKeyfilePath =  'files_encryption/keyfiles/' . $pathNew;\r
+                       $newShareKeyPath =  'files_encryption/share-keys/' . $pathNew;\r
                } else {\r
-                       $newKeyfilePath = $baseDir . 'keyfiles/' . $params['newpath'];\r
+                       $newKeyfilePath = $ownerNew . '/files_encryption/keyfiles/' . $pathNew;\r
+                       $newShareKeyPath = $ownerNew . '/files_encryption/share-keys/' . $pathNew;\r
                }\r
 \r
                // add key ext if this is not an folder\r
@@ -522,11 +543,11 @@ class Hooks {
                        $newKeyfilePath .= '.key';\r
 \r
                        // handle share-keys\r
-                       $localKeyPath = $view->getLocalFile($baseDir . 'share-keys/' . $params['oldpath']);\r
+                       $localKeyPath = $view->getLocalFile($oldShareKeyPath);\r
                        $escapedPath = Helper::escapeGlobPattern($localKeyPath);\r
                        $matches = glob($escapedPath . '*.shareKey');\r
                        foreach ($matches as $src) {\r
-                               $dst = \OC\Files\Filesystem::normalizePath(str_replace($params['oldpath'], $params['newpath'], $src));\r
+                               $dst = \OC\Files\Filesystem::normalizePath(str_replace($pathOld, $pathNew, $src));\r
 \r
                                // create destination folder if not exists\r
                                if (!file_exists(dirname($dst))) {\r
@@ -538,15 +559,13 @@ class Hooks {
 \r
                } else {\r
                        // handle share-keys folders\r
-                       $oldShareKeyfilePath = $baseDir . 'share-keys/' . $params['oldpath'];\r
-                       $newShareKeyfilePath = $baseDir . 'share-keys/' . $params['newpath'];\r
 \r
                        // create destination folder if not exists\r
-                       if (!$view->file_exists(dirname($newShareKeyfilePath))) {\r
-                               $view->mkdir(dirname($newShareKeyfilePath), 0750, true);\r
+                       if (!$view->file_exists(dirname($newShareKeyPath))) {\r
+                               $view->mkdir(dirname($newShareKeyPath), 0750, true);\r
                        }\r
 \r
-                       $view->rename($oldShareKeyfilePath, $newShareKeyfilePath);\r
+                       $view->rename($oldShareKeyPath, $newShareKeyPath);\r
                }\r
 \r
                // Rename keyfile so it isn't orphaned\r
@@ -561,18 +580,17 @@ class Hooks {
                }\r
 \r
                // build the path to the file\r
-               $newPath = '/' . $userId . '/files' . $params['newpath'];\r
-               $newPathRelative = $params['newpath'];\r
+               $newPath = '/' . $ownerNew . '/files' . $pathNew;\r
 \r
                if ($util->fixFileSize($newPath)) {\r
                        // get sharing app state\r
                        $sharingEnabled = \OCP\Share::isEnabled();\r
 \r
                        // get users\r
-                       $usersSharing = $util->getSharingUsersArray($sharingEnabled, $newPathRelative);\r
+                       $usersSharing = $util->getSharingUsersArray($sharingEnabled, $pathNew);\r
 \r
                        // update sharing-keys\r
-                       $util->setSharedFileKeyfiles($session, $usersSharing, $newPathRelative);\r
+                       $util->setSharedFileKeyfiles($session, $usersSharing, $pathNew);\r
                }\r
 \r
                \OC_FileProxy::$enabled = $proxyStatus;\r
index 17bcac5c585dd050c5f82546f77b33892094c257..0f63e1aca987c1f74d937b73ee3cac33115d4480 100755 (executable)
@@ -59,6 +59,7 @@ class Helper {
         */
        public static function registerFilesystemHooks() {
 
+               \OCP\Util::connectHook('OC_Filesystem', 'rename', 'OCA\Encryption\Hooks', 'preRename');
                \OCP\Util::connectHook('OC_Filesystem', 'post_rename', 'OCA\Encryption\Hooks', 'postRename');
        }