From aec6eea235526644be4e0642dd59a3b5f8e9c0e3 Mon Sep 17 00:00:00 2001
From: Bjoern Schiessle <schiessle@owncloud.com>
Date: Tue, 3 Jul 2012 18:01:05 +0200
Subject: [PATCH] use filesystem abstraction layer to copy file versions

---
 apps/files_versions/versions.php | 14 +++++++++++---
 lib/filesystem.php               |  1 +
 lib/filesystemview.php           |  2 +-
 3 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/apps/files_versions/versions.php b/apps/files_versions/versions.php
index 7ed5f25750..1a1a2e9ecf 100644
--- a/apps/files_versions/versions.php
+++ b/apps/files_versions/versions.php
@@ -68,6 +68,9 @@ class Storage {
 	 */
 	public static function store($filename) {
 		if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
+			$files_view = \OCP\Files::getStorage("files");
+			$users_view = \OCP\Files::getStorage("files_versions");
+			$users_view->chroot(\OCP\User::getUser().'/');
 			if (\OCP\App::isEnabled('files_sharing') && $source = \OC_Share::getSource('/'.\OCP\User::getUser().'/files'.$filename)) {
 				$pos = strpos($source, '/files', 1);
 				$uid = substr($source, 1, $pos - 1);
@@ -79,8 +82,13 @@ class Storage {
 			$filesfoldername=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/files';
 			Storage::init();
 
+			//check if source file already exist as version to avoid recursions.
+			if ($users_view->file_exists($filename)) {
+				return false;
+			}
+			
 			// check if filename is a directory
-			if(is_dir($filesfoldername.'/'.$filename)){
+			if($files_view->is_dir($filename)){
 				return false;
 			}
 
@@ -95,7 +103,7 @@ class Storage {
 			}
 			
 			// check filesize
-			if(filesize($filesfoldername.'/'.$filename)>\OCP\Config::getSystemValue('files_versionsmaxfilesize', Storage::DEFAULTMAXFILESIZE)){
+			if($files_view->filesize($filename)>\OCP\Config::getSystemValue('files_versionsmaxfilesize', Storage::DEFAULTMAXFILESIZE)){
 				return false;
 			}
 
@@ -116,7 +124,7 @@ class Storage {
 			if(!file_exists($versionsFolderName.'/'.$info['dirname'])) mkdir($versionsFolderName.'/'.$info['dirname'],0700,true);	
 
 			// store a new version of a file
-			copy($filesfoldername.'/'.$filename,$versionsFolderName.'/'.$filename.'.v'.time());
+			$users_view->copy('files'.$filename, 'versions'.$filename.'.v'.time());
         
 			// expire old revisions if necessary
 			Storage::expire($filename);
diff --git a/lib/filesystem.php b/lib/filesystem.php
index 0ab3bd69ac..65318fa3ab 100644
--- a/lib/filesystem.php
+++ b/lib/filesystem.php
@@ -153,6 +153,7 @@ class OC_Filesystem{
 		if($path[0]!=='/'){
 			$path='/'.$path;
 		}
+		$path=str_replace('//', '/',$path);
 		$foundMountPoint='';
 		foreach(OC_Filesystem::$mounts as $mountpoint=>$storage){
 			if($mountpoint==$path){
diff --git a/lib/filesystemview.php b/lib/filesystemview.php
index d474b61b98..448663bb08 100644
--- a/lib/filesystemview.php
+++ b/lib/filesystemview.php
@@ -314,7 +314,7 @@ class OC_FilesystemView {
 				}else{
 					$source=$this->fopen($path1,'r');
 					$target=$this->fopen($path2,'w');
-					$count=OC_Helper::streamCopy($source,$target);
+					$result=OC_Helper::streamCopy($source,$target);
 				}
         OC_Hook::emit( OC_Filesystem::CLASSNAME, OC_Filesystem::signal_post_copy, array( OC_Filesystem::signal_param_oldpath => $path1 , OC_Filesystem::signal_param_newpath=>$path2));
 				if(!$exists){
-- 
GitLab