From 1aedc60aa2dcf195b2e91bef8dacfc95e1a44611 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Thu, 24 Jul 2014 15:30:00 +0200 Subject: [PATCH] make the versions and encryption app aware of the copy operation Conflicts: apps/files_encryption/hooks/hooks.php apps/files_versions/appinfo/app.php --- apps/files_encryption/hooks/hooks.php | 47 +++++++++++++++++++++------ apps/files_encryption/lib/helper.php | 4 ++- apps/files_versions/appinfo/app.php | 1 + apps/files_versions/lib/hooks.php | 20 +++++++++++- apps/files_versions/lib/versions.php | 11 ++++--- 5 files changed, 67 insertions(+), 16 deletions(-) diff --git a/apps/files_encryption/hooks/hooks.php b/apps/files_encryption/hooks/hooks.php index a7576e660ce..44dcaae2474 100644 --- a/apps/files_encryption/hooks/hooks.php +++ b/apps/files_encryption/hooks/hooks.php @@ -538,18 +538,45 @@ class Hooks { self::$renamedFiles[$params['oldpath']] = array( 'uid' => $ownerOld, 'path' => $pathOld, - 'type' => $type); + 'type' => $type, + 'operation' => 'rename', + ); + } } /** - * @brief after a file is renamed, rename its keyfile and share-keys also fix the file size and fix also the sharing - * @param array with oldpath and newpath + * mark file as renamed so that we know the original source after the file was renamed + * @param array $params with the old path and the new path + */ + public static function preCopy($params) { + $user = \OCP\User::getUser(); + $view = new \OC\Files\View('/'); + $util = new Util($view, $user); + list($ownerOld, $pathOld) = $util->getUidAndFilename($params['oldpath']); + + // we only need to rename the keys if the rename happens on the same mountpoint + // otherwise we perform a stream copy, so we get a new set of keys + $mp1 = $view->getMountPoint('/' . $user . '/files/' . $params['oldpath']); + $mp2 = $view->getMountPoint('/' . $user . '/files/' . $params['newpath']); + + $type = $view->is_dir('/' . $user . '/files/' . $params['oldpath']) ? 'folder' : 'file'; + + if ($mp1 === $mp2) { + self::$renamedFiles[$params['oldpath']] = array( + 'uid' => $ownerOld, + 'path' => $pathOld, + 'type' => $type, + 'operation' => 'copy'); + } + } + + /** + * after a file is renamed/copied, rename/copy its keyfile and share-keys also fix the file size and fix also the sharing * - * This function is connected to the rename signal of OC_Filesystem and adjust the name and location - * of the stored versions along the actual file + * @param array $params array with oldpath and newpath */ - public static function postRename($params) { + public static function postRenameOrCopy($params) { if (\OCP\App::isEnabled('files_encryption') === false) { return true; @@ -568,6 +595,7 @@ class Hooks { $ownerOld = self::$renamedFiles[$params['oldpath']]['uid']; $pathOld = self::$renamedFiles[$params['oldpath']]['path']; $type = self::$renamedFiles[$params['oldpath']]['type']; + $operation = self::$renamedFiles[$params['oldpath']]['operation']; 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); @@ -611,18 +639,17 @@ class Hooks { $matches = Helper::findShareKeys($oldShareKeyPath, $view); foreach ($matches as $src) { $dst = \OC\Files\Filesystem::normalizePath(str_replace($pathOld, $pathNew, $src)); - $view->rename($src, $dst); + $view->$operation($src, $dst); } } else { // handle share-keys folders - // create destination folder if not exists if (!$view->file_exists(dirname($newShareKeyPath))) { mkdir($view->getLocalFile($newShareKeyPath), 0750, true); } - $view->rename($oldShareKeyPath, $newShareKeyPath); + $view->$operation($oldShareKeyPath, $newShareKeyPath); } // Rename keyfile so it isn't orphaned @@ -633,7 +660,7 @@ class Hooks { mkdir(dirname($view->getLocalFile($newKeyfilePath)), 0750, true); } - $view->rename($oldKeyfilePath, $newKeyfilePath); + $view->$operation($oldKeyfilePath, $newKeyfilePath); } // build the path to the file diff --git a/apps/files_encryption/lib/helper.php b/apps/files_encryption/lib/helper.php index 440fcbf91db..89399abfa92 100755 --- a/apps/files_encryption/lib/helper.php +++ b/apps/files_encryption/lib/helper.php @@ -62,7 +62,9 @@ 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'); + \OCP\Util::connectHook('OC_Filesystem', 'post_rename', 'OCA\Encryption\Hooks', 'postRenameOrCopy'); + \OCP\Util::connectHook('OC_Filesystem', 'copy', 'OCA\Encryption\Hooks', 'preCopy'); + \OCP\Util::connectHook('OC_Filesystem', 'post_copy', 'OCA\Encryption\Hooks', 'postRenameOrCopy'); \OCP\Util::connectHook('OC_Filesystem', 'post_delete', 'OCA\Encryption\Hooks', 'postDelete'); \OCP\Util::connectHook('OC_Filesystem', 'delete', 'OCA\Encryption\Hooks', 'preDelete'); } diff --git a/apps/files_versions/appinfo/app.php b/apps/files_versions/appinfo/app.php index 8f2071dd7b6..650d5cc9f1f 100644 --- a/apps/files_versions/appinfo/app.php +++ b/apps/files_versions/appinfo/app.php @@ -16,3 +16,4 @@ OCP\Util::connectHook('OC_Filesystem', 'delete', "OCA\Files_Versions\Hooks", "pr OCP\Util::connectHook('OC_Filesystem', 'rename', "OCA\Files_Versions\Hooks", "rename_hook"); //Listen to delete user signal OCP\Util::connectHook('OC_User', 'pre_deleteUser', "OCA\Files_Versions\Hooks", "deleteUser_hook"); +OCP\Util::connectHook('OC_Filesystem', 'copy', "OCA\Files_Versions\Hooks", "copy_hook"); diff --git a/apps/files_versions/lib/hooks.php b/apps/files_versions/lib/hooks.php index 5d3882cc3e3..a1550e9028f 100644 --- a/apps/files_versions/lib/hooks.php +++ b/apps/files_versions/lib/hooks.php @@ -69,7 +69,25 @@ class Hooks { $oldpath = $params['oldpath']; $newpath = $params['newpath']; if($oldpath<>'' && $newpath<>'') { - Storage::rename( $oldpath, $newpath ); + Storage::renameOrCopy($oldpath, $newpath, 'rename'); + } + } + } + + /** + * copy versions of copied files + * @param array $params array with oldpath and newpath + * + * This function is connected to the copy signal of OC_Filesystem and copies the + * the stored versions to the new location + */ + public static function copy_hook($params) { + + if (\OCP\App::isEnabled('files_versions')) { + $oldpath = $params['oldpath']; + $newpath = $params['newpath']; + if($oldpath<>'' && $newpath<>'') { + Storage::renameOrCopy($oldpath, $newpath, 'copy'); } } } diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index 52bc133e2c2..fd2de520095 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -189,9 +189,12 @@ class Storage { } /** - * rename versions of a file + * rename or copy versions of a file + * @param string $old_path + * @param string $new_path + * @param string $operation can be 'copy' or 'rename' */ - public static function rename($old_path, $new_path) { + public static function renameOrCopy($old_path, $new_path, $operation) { list($uid, $oldpath) = self::getUidAndFilename($old_path); list($uidn, $newpath) = self::getUidAndFilename($new_path); $versions_view = new \OC\Files\View('/'.$uid .'/files_versions'); @@ -206,13 +209,13 @@ class Storage { self::expire($newpath); if ( $files_view->is_dir($oldpath) && $versions_view->is_dir($oldpath) ) { - $versions_view->rename($oldpath, $newpath); + $versions_view->$operation($oldpath, $newpath); } else if ( ($versions = Storage::getVersions($uid, $oldpath)) ) { // create missing dirs if necessary self::createMissingDirectories($newpath, new \OC\Files\View('/'. $uidn)); foreach ($versions as $v) { - $versions_view->rename($oldpath.'.v'.$v['version'], $newpath.'.v'.$v['version']); + $versions_view->$operation($oldpath.'.v'.$v['version'], $newpath.'.v'.$v['version']); } } } -- 2.39.5