. * */ /** * Class for abstraction of filesystem functions * This class won't call any filesystem functions for itself but but will pass them to the correct OC_FILESTORAGE object * this class should also handle all the file premission related stuff */ class OC_FILESYSTEM{ static private $storages=array(); /** * check if the current users has the right premissions to read a file * @param string path * @return bool */ static private function canRead($path){ if(substr($path,0,1)!=='/'){ $path='/'.$path; } if(strstr($path,'/../')){ return false; } return true;//dummy untill premissions are correctly implemented, also the correcty value because for now users are locked in their seperate data dir and can read/write everything in there } /** * check if the current users has the right premissions to write a file * @param string path * @return bool */ static private function canWrite($path){ if(substr($path,0,1)!=='/'){ $path='/'.$path; } if(strstr($path,'/../')){ return false; } return true;//dummy untill premissions are correctly implemented, also the correcty value because for now users are locked in their seperate data dir and can read/write everything in there } /** * mount an OC_FILESTORAGE in our virtual filesystem * @param OC_FILESTORAGE storage * @param string mountpoint */ static public function mount($storage,$mountpoint){ if(substr($mountpoint,0,1)!=='/'){ $mountpoint='/'.$mountpoint; } self::$storages[$mountpoint]=$storage; } /** * get the storage object for a path * @param string path * @return OC_FILESTORAGE */ static private function getStorage($path){ $mountpoint=self::getMountPoint($path); if($mountpoint){ return self::$storages[$mountpoint]; } } /** * get the mountpoint of the storage object for a path * @param string path * @return string */ static private function getMountPoint($path){ if(!$path){ $path='/'; } if(substr($path,0,1)!=='/'){ $path='/'.$path; } $foundMountPoint=''; foreach(self::$storages as $mountpoint=>$storage){ if($mountpoint==$path){ return $mountpoint; } if(strpos($path,$mountpoint)===0 and strlen($mountpoint)>strlen($foundMountPoint)){ $foundMountPoint=$mountpoint; } } return $foundMountPoint; } static public function mkdir($path){ $parent=substr($path,0,strrpos($path,'/')); if(self::canWrite($parent) and $storage=self::getStorage($path)){ return $storage->mkdir(substr($path,strlen(self::getMountPoint($path)))); } } static public function rmdir($path){ if(self::canWrite($path) and $storage=self::getStorage($path)){ return $storage->rmdir(substr($path,strlen(self::getMountPoint($path)))); } } static public function opendir($path){ if(self::canRead($path) and $storage=self::getStorage($path)){ return $storage->opendir(substr($path,strlen(self::getMountPoint($path)))); } } static public function is_dir($path){ if($path=='/'){ return true; } if(self::canRead($path) and $storage=self::getStorage($path)){ return $storage->is_dir(substr($path,strlen(self::getMountPoint($path)))); } } static public function is_file($path){ if($path=='/'){ return false; } if(self::canRead($path) and $storage=self::getStorage($path)){ return $storage->is_file(substr($path,strlen(self::getMountPoint($path)))); } } static public function stat($path){ if(self::canRead($path) and $storage=self::getStorage($path)){ return $storage->stat(substr($path,strlen(self::getMountPoint($path)))); } } static public function filetype($path){ if(self::canRead($path) and $storage=self::getStorage($path)){ return $storage->filetype(substr($path,strlen(self::getMountPoint($path)))); } } static public function filesize($path){ if(self::canRead($path) and $storage=self::getStorage($path)){ return $storage->filesize(substr($path,strlen(self::getMountPoint($path)))); } } static public function readfile($path){ if(self::canRead($path) and $storage=self::getStorage($path)){ return $storage->readfile(substr($path,strlen(self::getMountPoint($path)))); } } static public function is_readable($path){ if(self::canRead($path) and $storage=self::getStorage($path)){ return $storage->is_readable(substr($path,strlen(self::getMountPoint($path)))); } return false; } static public function is_writeable($path){ if(self::canWrite($path) and $storage=self::getStorage($path)){ return $storage->is_writeable(substr($path,strlen(self::getMountPoint($path)))); } return false; } static public function file_exists($path){ if($path=='/'){ return true; } if(self::canWrite($path) and $storage=self::getStorage($path)){ return $storage->file_exists(substr($path,strlen(self::getMountPoint($path)))); } return false; } static public function filectime($path){ if($storage=self::getStorage($path)){ return $storage->filectime(substr($path,strlen(self::getMountPoint($path)))); } } static public function filemtime($path){ if($storage=self::getStorage($path)){ return $storage->filemtime(substr($path,strlen(self::getMountPoint($path)))); } } static public function fileatime($path){ if($storage=self::getStorage($path)){ return $storage->fileatime(substr($path,strlen(self::getMountPoint($path)))); } } static public function file_get_contents($path){ if(self::canRead($path) and $storage=self::getStorage($path)){ return $storage->file_get_contents(substr($path,strlen(self::getMountPoint($path)))); } } static public function file_put_contents($path){ if(self::canWrite($path) and $storage=self::getStorage($path)){ $this->notifyObservers($path,OC_FILEACTION_WRITE | OC_FILEACTION_CREATE); return $storage->file_put_contents(substr($path,strlen(self::getMountPoint($path)))); } } static public function unlink($path){ if(self::canWrite($path) and $storage=self::getStorage($path)){ return $storage->unlink(substr($path,strlen(self::getMountPoint($path)))); } } static public function rename($path1,$path2){ if(self::canWrite($path1) and self::canWrite($path2)){ $mp1=self::getMountPoint($path1); $mp2=self::getMountPoint($path2); if($mp1==$mp2){ if($storage=self::getStorage($path1)){ return $storage->rename(substr($path1,strlen($mp1)),substr($path2,strlen($mp2))); } }elseif($storage1=self::getStorage($path1) and $storage2=self::getStorage($path2)){ $tmpFile=$storage1->toTmpFile(substr($path1,strlen($mp1))); $result=$storage2->fromTmpFile($tmpFile,substr($path2,strlen($mp2))); $storage1->unlink(substr($path1,strlen($mp1))); return $result; } } } static public function copy($path1,$path2){ if(self::canRead($path1) and self::canWrite($path2)){ $mp1=self::getMountPoint($path1); $mp2=self::getMountPoint($path2); if($mp1==$mp2){ if($storage=self::getStorage($path1)){ return $storage->copy(substr($path1,strlen($mp1)),substr($path2,strlen($mp2))); } }elseif($storage1=self::getStorage($path1) and $storage2=self::getStorage($path2)){ $tmpFile=$storage1->toTmpFile(substr($path1,strlen($mp1))); return $storage2->fromTmpFile($tmpFile,substr($path2,strlen($mp2))); } } } static public function fopen($path,$mode){ $allowed=((strpos($path,'r')===false and strpos($path,'r+')!==false and self::canRead) or self::canWrite($path)); if($allowed){ if($storage=self::getStorage($path)){ return $storage->fopen(substr($path,strlen(self::getMountPoint($path))),$mode); } } } static public function toTmpFile($path){ if(self::canRead($path) and $storage=self::getStorage($path)){ return $storage->toTmpFile(substr($path,strlen(self::getMountPoint($path)))); } } static public function fromTmpFile($tmpFile,$path){ if(self::canWrite($path) and $storage=self::getStorage($path)){ return $storage->fromTmpFile($tmpFile,substr($path,strlen(self::getMountPoint($path)))); } } static public function getMimeType($path){ if(self::canRead($path) and $storage=self::getStorage($path)){ return $storage->getMimeType(substr($path,strlen(self::getMountPoint($path)))); } } static public function delTree($path){ if(self::canWrite($path) and $storage=self::getStorage($path)){ return $storage->delTree(substr($path,strlen(self::getMountPoint($path)))); } } static public function find($path){ if($storage=self::getStorage($path)){ $mp=self::getMountPoint($path); $return=$storage->find(substr($path,strlen($mp))); foreach($return as &$file){ $file=$mp.$file; } } return $return; } static public function getTree($path){ if(self::canRead($path) and $storage=self::getStorage($path)){ $mp=self::getMountPoint($path); $return=$storage->getTree(substr($path,strlen($mp))); echo "mp: $mp"; foreach($return as &$file){ if(substr($file,0,1)=='/'){ $file=substr($file,1); } $file=$mp.$file; } return $return; } } } ?>