2010-05-07 20:50:59 +00:00
< ? php
/**
* ownCloud
*
* @ author Frank Karlitschek
* @ copyright 2010 Frank Karlitschek karlitschek @ kde . org
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation ; either
* version 3 of the License , or any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library . If not , see < http :// www . gnu . org / licenses />.
*
*/
/**
* 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
*/
2010-06-25 11:24:27 +00:00
static private function canRead ( $path ){
if ( substr ( $path , 0 , 1 ) !== '/' ){
$path = '/' . $path ;
}
if ( strstr ( $path , '/../' )){
return false ;
}
2010-05-07 20:50:59 +00:00
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
*/
2010-06-25 11:24:27 +00:00
static private function canWrite ( $path ){
if ( substr ( $path , 0 , 1 ) !== '/' ){
$path = '/' . $path ;
}
if ( strstr ( $path , '/../' )){
return false ;
}
2010-05-07 20:50:59 +00:00
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 )){
2010-05-08 19:32:20 +00:00
$this -> notifyObservers ( $path , OC_FILEACTION_WRITE | OC_FILEACTION_CREATE );
2010-05-07 20:50:59 +00:00
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 )){
2010-05-22 20:08:08 +00:00
$mp = self :: getMountPoint ( $path );
$return = $storage -> find ( substr ( $path , strlen ( $mp )));
foreach ( $return as & $file ){
$file = $mp . $file ;
}
2010-05-07 20:50:59 +00:00
}
2010-05-22 20:08:08 +00:00
return $return ;
2010-05-07 20:50:59 +00:00
}
}
?>