[Pkg-owncloud-commits] [owncloud] 46/50: make the versions and encryption app aware of the copy operation

David Prévot taffit at moszumanska.debian.org
Fri Oct 17 03:12:16 UTC 2014


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to annotated tag v6.0.6RC1
in repository owncloud.

commit 1aedc60aa2dcf195b2e91bef8dacfc95e1a44611
Author: Bjoern Schiessle <schiessle at owncloud.com>
Date:   Thu Jul 24 15:30:00 2014 +0200

    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 a7576e6..44dcaae 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 440fcbf..89399ab 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 8f2071d..650d5cc 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 5d3882c..a1550e9 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 52bc133..fd2de52 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']);
 			}
 		}
 	}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud.git



More information about the Pkg-owncloud-commits mailing list