From e3f1507374d9922ab8fc7f4de2e640f5feb5535e Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 9 Jun 2012 17:33:57 +0200 Subject: [PATCH] use absolute path for file proxies --- apps/files_encryption/lib/cryptstream.php | 6 ++- apps/files_encryption/lib/proxy.php | 2 +- apps/files_encryption/tests/proxy.php | 15 ++++++++ lib/filesystemview.php | 46 ++++++++++++++++++++--- 4 files changed, 62 insertions(+), 7 deletions(-) diff --git a/apps/files_encryption/lib/cryptstream.php b/apps/files_encryption/lib/cryptstream.php index d6643f3268..a698ee0033 100644 --- a/apps/files_encryption/lib/cryptstream.php +++ b/apps/files_encryption/lib/cryptstream.php @@ -35,8 +35,12 @@ class OC_CryptStream{ private $meta=array();//header/meta for source stream private $count; private $writeCache; + private static $rootView; public function stream_open($path, $mode, $options, &$opened_path){ + if(!self::$rootView){ + self::$rootView=new OC_FilesystemView(''); + } $path=str_replace('crypt://','',$path); if(dirname($path)=='streams' and isset(self::$sourceStreams[basename($path)])){ $this->source=self::$sourceStreams[basename($path)]['stream']; @@ -45,7 +49,7 @@ class OC_CryptStream{ $this->path=$path; OCP\Util::writeLog('files_encryption','open encrypted '.$path. ' in '.$mode,OCP\Util::DEBUG); OC_FileProxy::$enabled=false;//disable fileproxies so we can open the source file - $this->source=OC_FileSystem::fopen($path,$mode); + $this->source=self::$rootView->fopen($path,$mode); OC_FileProxy::$enabled=true; if(!is_resource($this->source)){ OCP\Util::writeLog('files_encryption','failed to open '.$path,OCP\Util::ERROR); diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php index 06f963fc98..9fd57c0f02 100644 --- a/apps/files_encryption/lib/proxy.php +++ b/apps/files_encryption/lib/proxy.php @@ -59,7 +59,7 @@ class OC_FileProxy_Encryption extends OC_FileProxy{ * @return bool */ private static function isEncrypted($path){ - $metadata=OC_FileCache::getCached($path); + $metadata=OC_FileCache::getCached($path,''); return isset($metadata['encrypted']) and (bool)$metadata['encrypted']; } diff --git a/apps/files_encryption/tests/proxy.php b/apps/files_encryption/tests/proxy.php index 0450de82ac..f36b219343 100644 --- a/apps/files_encryption/tests/proxy.php +++ b/apps/files_encryption/tests/proxy.php @@ -30,6 +30,9 @@ class Test_CryptProxy extends UnitTestCase { } public function testSimple(){ + $oldConfig=OCP\Config::getAppValue('files_encryption','enable_encryption','true'); + OCP\Config::setAppValue('files_encryption','enable_encryption','true'); + $file=OC::$SERVERROOT.'/3rdparty/MDB2.php'; $original=file_get_contents($file); @@ -42,5 +45,17 @@ class Test_CryptProxy extends UnitTestCase { $fromFile=OC_Filesystem::file_get_contents('/file'); $this->assertNotEqual($original,$stored); $this->assertEqual($original,$fromFile); + + $rootView=new OC_FilesystemView(''); + $view=new OC_FilesystemView('/'.OC_User::getUser()); + $userDir='/'.OC_User::getUser().'/files'; + + $fromFile=$rootView->file_get_contents($userDir.'/file'); + $this->assertEqual($original,$fromFile); + + $fromFile=$view->file_get_contents('files/file'); + $this->assertEqual($original,$fromFile); + + OCP\Config::setAppValue('files_encryption','enable_encryption',$oldConfig); } } diff --git a/lib/filesystemview.php b/lib/filesystemview.php index d15f91be1e..7265b775ea 100644 --- a/lib/filesystemview.php +++ b/lib/filesystemview.php @@ -74,6 +74,23 @@ class OC_FilesystemView { } return $this->internal_path_cache[$path]; } + + /** + * get path relative to the root of the view + * @param string path + * @return string + */ + public function getRelativePath($path){ + if($this->fakeRoot==''){ + return $path; + } + if(strpos($path,$this->fakeRoot)!==0){ + return null; + }else{ + return substr($path,strlen($this->fakeRoot)); + } + } + /** * get the storage object for a path * @param string path @@ -213,7 +230,14 @@ class OC_FilesystemView { return $this->basicOperation('unlink',$path,array('delete')); } public function rename($path1,$path2){ - if(OC_FileProxy::runPreProxies('rename',$path1,$path2) and OC_Filesystem::isValidPath($path2)){ + $absolutePath1=$this->getAbsolutePath($path1); + $absolutePath2=$this->getAbsolutePath($path2); + if(OC_FileProxy::runPreProxies('rename',$absolutePath1,$absolutePath2) and OC_Filesystem::isValidPath($path2)){ + $path1=$this->getRelativePath($absolutePath1); + $path2=$this->getRelativePath($absolutePath2); + if($path1==null or $path2==null){ + return false; + } $run=true; OC_Hook::emit( OC_Filesystem::CLASSNAME, OC_Filesystem::signal_rename, array( OC_Filesystem::signal_param_oldpath => $path1 , OC_Filesystem::signal_param_newpath=>$path2, OC_Filesystem::signal_param_run => &$run)); if($run){ @@ -237,7 +261,14 @@ class OC_FilesystemView { } } public function copy($path1,$path2){ - if(OC_FileProxy::runPreProxies('copy',$path1,$path2) and $this->is_readable($path1) and OC_Filesystem::isValidPath($path2)){ + $absolutePath1=$this->getAbsolutePath($path1); + $absolutePath2=$this->getAbsolutePath($path2); + if(OC_FileProxy::runPreProxies('copy',$absolutePath1,$absolutePath2) and OC_Filesystem::isValidPath($path2)){ + $path1=$this->getRelativePath($absolutePath1); + $path2=$this->getRelativePath($absolutePath2); + if($path1==null or $path2==null){ + return false; + } $run=true; OC_Hook::emit( OC_Filesystem::CLASSNAME, OC_Filesystem::signal_copy, array( OC_Filesystem::signal_param_oldpath => $path1 , OC_Filesystem::signal_param_newpath=>$path2, OC_Filesystem::signal_param_run => &$run)); $exists=$this->file_exists($path2); @@ -352,8 +383,13 @@ class OC_FilesystemView { * @return mixed */ private function basicOperation($operation,$path,$hooks=array(),$extraParam=null){ - if(OC_FileProxy::runPreProxies($operation,$path, $extraParam) and OC_Filesystem::isValidPath($path)){ - $interalPath=$this->getInternalPath($path); + $absolutePath=$this->getAbsolutePath($path); + if(OC_FileProxy::runPreProxies($operation,$absolutePath, $extraParam) and OC_Filesystem::isValidPath($path)){ + $path=$this->getRelativePath($absolutePath); + if($path==null){ + return false; + } + $internalPath=$this->getInternalPath($path); $run=true; if(OC_Filesystem::$loaded and $this->fakeRoot==OC_Filesystem::getRoot()){ foreach($hooks as $hook){ @@ -370,7 +406,7 @@ class OC_FilesystemView { }else{ $result=$storage->$operation($interalPath); } - $result=OC_FileProxy::runPostProxies($operation,$path,$result); + $result=OC_FileProxy::runPostProxies($operation,$this->getAbsolutePath($path),$result); if(OC_Filesystem::$loaded and $this->fakeRoot==OC_Filesystem::getRoot()){ if($operation!='fopen'){//no post hooks for fopen, the file stream is still open foreach($hooks as $hook){