change the way the user is rooted in his own folder in order to make filesystem managment easier
This commit is contained in:
parent
1e4432c5d5
commit
a47558b2fd
|
@ -94,29 +94,7 @@ if(!isset($CONFIG_BACKEND)){
|
||||||
}
|
}
|
||||||
OC_USER::setBackend($CONFIG_BACKEND);
|
OC_USER::setBackend($CONFIG_BACKEND);
|
||||||
|
|
||||||
if(!is_dir($CONFIG_DATADIRECTORY_ROOT)){
|
OC_UTIL::setupFS();
|
||||||
@mkdir($CONFIG_DATADIRECTORY_ROOT) or die("Can't create data directory ($CONFIG_DATADIRECTORY_ROOT), you can usually fix this by setting the owner of '$SERVERROOT' to the user that the web server uses (www-data for debian/ubuntu)");
|
|
||||||
}
|
|
||||||
if(OC_USER::isLoggedIn()){
|
|
||||||
//jail the user in a seperate data folder
|
|
||||||
$CONFIG_DATADIRECTORY=$CONFIG_DATADIRECTORY_ROOT.'/'.$_SESSION['username_clean'];
|
|
||||||
if(!is_dir($CONFIG_DATADIRECTORY)){
|
|
||||||
mkdir($CONFIG_DATADIRECTORY);
|
|
||||||
}
|
|
||||||
$rootStorage=new OC_FILESTORAGE_LOCAL(array('datadir'=>$CONFIG_DATADIRECTORY));
|
|
||||||
if($CONFIG_ENABLEBACKUP){
|
|
||||||
if(!is_dir($CONFIG_BACKUPDIRECTORY)){
|
|
||||||
mkdir($CONFIG_BACKUPDIRECTORY);
|
|
||||||
}
|
|
||||||
if(!is_dir($CONFIG_BACKUPDIRECTORY.'/'.$_SESSION['username_clean'])){
|
|
||||||
mkdir($CONFIG_BACKUPDIRECTORY.'/'.$_SESSION['username_clean']);
|
|
||||||
}
|
|
||||||
$backupStorage=new OC_FILESTORAGE_LOCAL(array('datadir'=>$CONFIG_BACKUPDIRECTORY.'/'.$_SESSION['username_clean']));
|
|
||||||
$backup=new OC_FILEOBSERVER_BACKUP(array('storage'=>$backupStorage));
|
|
||||||
$rootStorage->addObserver($backup);
|
|
||||||
}
|
|
||||||
OC_FILESYSTEM::mount($rootStorage,'/');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -132,12 +110,44 @@ $loginresult=OC_USER::loginlisener();
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class OC_UTIL {
|
class OC_UTIL {
|
||||||
public static $scripts=array();
|
public static $scripts=array();
|
||||||
|
|
||||||
/**
|
public static function setupFS(){// configure the initial filesystem based on the configuration
|
||||||
* get the current installed version of ownCloud
|
global $CONFIG_DATADIRECTORY_ROOT;
|
||||||
* @return array
|
global $CONFIG_DATADIRECTORY;
|
||||||
*/
|
global $CONFIG_BACKUPDIRECTORY;
|
||||||
|
global $CONFIG_ENABLEBACKUP;
|
||||||
|
if(!is_dir($CONFIG_DATADIRECTORY_ROOT)){
|
||||||
|
@mkdir($CONFIG_DATADIRECTORY_ROOT) or die("Can't create data directory ($CONFIG_DATADIRECTORY_ROOT), you can usually fix this by setting the owner of '$SERVERROOT' to the user that the web server uses (www-data for debian/ubuntu)");
|
||||||
|
}
|
||||||
|
if(OC_USER::isLoggedIn()){
|
||||||
|
$rootStorage=new OC_FILESTORAGE_LOCAL(array('datadir'=>$CONFIG_DATADIRECTORY));
|
||||||
|
if($CONFIG_ENABLEBACKUP){
|
||||||
|
if(!is_dir($CONFIG_BACKUPDIRECTORY)){
|
||||||
|
mkdir($CONFIG_BACKUPDIRECTORY);
|
||||||
|
}
|
||||||
|
if(!is_dir($CONFIG_BACKUPDIRECTORY.'/'.$_SESSION['username_clean'])){
|
||||||
|
mkdir($CONFIG_BACKUPDIRECTORY.'/'.$_SESSION['username_clean']);
|
||||||
|
}
|
||||||
|
$backupStorage=new OC_FILESTORAGE_LOCAL(array('datadir'=>$CONFIG_BACKUPDIRECTORY));
|
||||||
|
$backup=new OC_FILEOBSERVER_BACKUP(array('storage'=>$backupStorage));
|
||||||
|
$rootStorage->addObserver($backup);
|
||||||
|
}
|
||||||
|
OC_FILESYSTEM::mount($rootStorage,'/');
|
||||||
|
|
||||||
|
$CONFIG_DATADIRECTORY=$CONFIG_DATADIRECTORY_ROOT.'/'.$_SESSION['username_clean'];
|
||||||
|
if(!is_dir($CONFIG_DATADIRECTORY)){
|
||||||
|
mkdir($CONFIG_DATADIRECTORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
OC_FILESYSTEM::chroot('/'.$_SESSION['username_clean']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the current installed version of ownCloud
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
public static function getVersion(){
|
public static function getVersion(){
|
||||||
return array(1,0,60);
|
return array(1,0,60);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,32 @@
|
||||||
*/
|
*/
|
||||||
class OC_FILESYSTEM{
|
class OC_FILESYSTEM{
|
||||||
static private $storages=array();
|
static private $storages=array();
|
||||||
|
static private $fakeRoot='';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* change the root to a fake toor
|
||||||
|
* @param string fakeRoot
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
static public function chroot($fakeRoot){
|
||||||
|
if($fakeRoot[0]!=='/'){
|
||||||
|
$fakeRoot='/'.$fakeRoot;
|
||||||
|
}
|
||||||
|
self::$fakeRoot=$fakeRoot;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the part of the path relative to the mountpoint of the storage it's stored in
|
||||||
|
* @param string path
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
static public function getInternalPath($path){
|
||||||
|
$mountPoint=self::getMountPoint($path);
|
||||||
|
$path=self::$fakeRoot.$path;
|
||||||
|
$internalPath=substr($path,strlen($mountPoint));
|
||||||
|
return $internalPath;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* check if the current users has the right premissions to read a file
|
* check if the current users has the right premissions to read a file
|
||||||
* @param string path
|
* @param string path
|
||||||
|
@ -67,7 +93,7 @@ class OC_FILESYSTEM{
|
||||||
if(substr($mountpoint,0,1)!=='/'){
|
if(substr($mountpoint,0,1)!=='/'){
|
||||||
$mountpoint='/'.$mountpoint;
|
$mountpoint='/'.$mountpoint;
|
||||||
}
|
}
|
||||||
self::$storages[$mountpoint]=$storage;
|
self::$storages[self::$fakeRoot.$mountpoint]=$storage;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -84,6 +110,8 @@ class OC_FILESYSTEM{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the mountpoint of the storage object for a path
|
* get the mountpoint of the storage object for a path
|
||||||
|
( note: because a storage is not always mounted inside the fakeroot, the returned mountpoint is relative to the absolute root of the filesystem and doesn't take the chroot into account
|
||||||
|
*
|
||||||
* @param string path
|
* @param string path
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
|
@ -94,6 +122,7 @@ class OC_FILESYSTEM{
|
||||||
if(substr($path,0,1)!=='/'){
|
if(substr($path,0,1)!=='/'){
|
||||||
$path='/'.$path;
|
$path='/'.$path;
|
||||||
}
|
}
|
||||||
|
$path=self::$fakeRoot.$path;
|
||||||
$foundMountPoint='';
|
$foundMountPoint='';
|
||||||
foreach(self::$storages as $mountpoint=>$storage){
|
foreach(self::$storages as $mountpoint=>$storage){
|
||||||
if($mountpoint==$path){
|
if($mountpoint==$path){
|
||||||
|
@ -109,17 +138,17 @@ class OC_FILESYSTEM{
|
||||||
static public function mkdir($path){
|
static public function mkdir($path){
|
||||||
$parent=substr($path,0,strrpos($path,'/'));
|
$parent=substr($path,0,strrpos($path,'/'));
|
||||||
if(self::canWrite($parent) and $storage=self::getStorage($path)){
|
if(self::canWrite($parent) and $storage=self::getStorage($path)){
|
||||||
return $storage->mkdir(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->mkdir(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function rmdir($path){
|
static public function rmdir($path){
|
||||||
if(self::canWrite($path) and $storage=self::getStorage($path)){
|
if(self::canWrite($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->rmdir(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->rmdir(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function opendir($path){
|
static public function opendir($path){
|
||||||
if(self::canRead($path) and $storage=self::getStorage($path)){
|
if(self::canRead($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->opendir(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->opendir(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function is_dir($path){
|
static public function is_dir($path){
|
||||||
|
@ -127,7 +156,7 @@ class OC_FILESYSTEM{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if(self::canRead($path) and $storage=self::getStorage($path)){
|
if(self::canRead($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->is_dir(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->is_dir(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function is_file($path){
|
static public function is_file($path){
|
||||||
|
@ -135,38 +164,38 @@ class OC_FILESYSTEM{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if(self::canRead($path) and $storage=self::getStorage($path)){
|
if(self::canRead($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->is_file(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->is_file(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function stat($path){
|
static public function stat($path){
|
||||||
if(self::canRead($path) and $storage=self::getStorage($path)){
|
if(self::canRead($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->stat(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->stat(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function filetype($path){
|
static public function filetype($path){
|
||||||
if(self::canRead($path) and $storage=self::getStorage($path)){
|
if(self::canRead($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->filetype(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->filetype(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function filesize($path){
|
static public function filesize($path){
|
||||||
if(self::canRead($path) and $storage=self::getStorage($path)){
|
if(self::canRead($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->filesize(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->filesize(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function readfile($path){
|
static public function readfile($path){
|
||||||
if(self::canRead($path) and $storage=self::getStorage($path)){
|
if(self::canRead($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->readfile(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->readfile(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function is_readable($path){
|
static public function is_readable($path){
|
||||||
if(self::canRead($path) and $storage=self::getStorage($path)){
|
if(self::canRead($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->is_readable(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->is_readable(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
static public function is_writeable($path){
|
static public function is_writeable($path){
|
||||||
if(self::canWrite($path) and $storage=self::getStorage($path)){
|
if(self::canWrite($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->is_writeable(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->is_writeable(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -175,39 +204,39 @@ class OC_FILESYSTEM{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if(self::canWrite($path) and $storage=self::getStorage($path)){
|
if(self::canWrite($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->file_exists(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->file_exists(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
static public function filectime($path){
|
static public function filectime($path){
|
||||||
if($storage=self::getStorage($path)){
|
if($storage=self::getStorage($path)){
|
||||||
return $storage->filectime(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->filectime(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function filemtime($path){
|
static public function filemtime($path){
|
||||||
if($storage=self::getStorage($path)){
|
if($storage=self::getStorage($path)){
|
||||||
return $storage->filemtime(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->filemtime(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function fileatime($path){
|
static public function fileatime($path){
|
||||||
if($storage=self::getStorage($path)){
|
if($storage=self::getStorage($path)){
|
||||||
return $storage->fileatime(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->fileatime(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function file_get_contents($path){
|
static public function file_get_contents($path){
|
||||||
if(self::canRead($path) and $storage=self::getStorage($path)){
|
if(self::canRead($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->file_get_contents(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->file_get_contents(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function file_put_contents($path,$data){
|
static public function file_put_contents($path,$data){
|
||||||
if(self::canWrite($path) and $storage=self::getStorage($path)){
|
if(self::canWrite($path) and $storage=self::getStorage($path)){
|
||||||
$this->notifyObservers($path,OC_FILEACTION_WRITE | OC_FILEACTION_CREATE);
|
$this->notifyObservers($path,OC_FILEACTION_WRITE | OC_FILEACTION_CREATE);
|
||||||
return $storage->file_put_contents(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->file_put_contents(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function unlink($path){
|
static public function unlink($path){
|
||||||
if(self::canWrite($path) and $storage=self::getStorage($path)){
|
if(self::canWrite($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->unlink(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->unlink(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function rename($path1,$path2){
|
static public function rename($path1,$path2){
|
||||||
|
@ -216,12 +245,12 @@ class OC_FILESYSTEM{
|
||||||
$mp2=self::getMountPoint($path2);
|
$mp2=self::getMountPoint($path2);
|
||||||
if($mp1==$mp2){
|
if($mp1==$mp2){
|
||||||
if($storage=self::getStorage($path1)){
|
if($storage=self::getStorage($path1)){
|
||||||
return $storage->rename(substr($path1,strlen($mp1)),substr($path2,strlen($mp2)));
|
return $storage->rename(self::getInternalPath($path1),self::getInternalPath($path2));
|
||||||
}
|
}
|
||||||
}elseif($storage1=self::getStorage($path1) and $storage2=self::getStorage($path2)){
|
}elseif($storage1=self::getStorage($path1) and $storage2=self::getStorage($path2)){
|
||||||
$tmpFile=$storage1->toTmpFile(substr($path1,strlen($mp1)));
|
$tmpFile=$storage1->toTmpFile(self::getInternalPath($path1));
|
||||||
$result=$storage2->fromTmpFile($tmpFile,substr($path2,strlen($mp2)));
|
$result=$storage2->fromTmpFile(self::getInternalPath($path2));
|
||||||
$storage1->unlink(substr($path1,strlen($mp1)));
|
$storage1->unlink(self::getInternalPath($path1));
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -232,11 +261,11 @@ class OC_FILESYSTEM{
|
||||||
$mp2=self::getMountPoint($path2);
|
$mp2=self::getMountPoint($path2);
|
||||||
if($mp1==$mp2){
|
if($mp1==$mp2){
|
||||||
if($storage=self::getStorage($path1)){
|
if($storage=self::getStorage($path1)){
|
||||||
return $storage->copy(substr($path1,strlen($mp1)),substr($path2,strlen($mp2)));
|
return $storage->copy(self::getInternalPath($path1),self::getInternalPath($path2));
|
||||||
}
|
}
|
||||||
}elseif($storage1=self::getStorage($path1) and $storage2=self::getStorage($path2)){
|
}elseif($storage1=self::getStorage($path1) and $storage2=self::getStorage($path2)){
|
||||||
$tmpFile=$storage1->toTmpFile(substr($path1,strlen($mp1)));
|
$tmpFile=$storage1->toTmpFile(self::getInternalPath($path1));
|
||||||
return $storage2->fromTmpFile($tmpFile,substr($path2,strlen($mp2)));
|
return $storage2->fromTmpFile(self::getInternalPath($path2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -244,34 +273,34 @@ class OC_FILESYSTEM{
|
||||||
$allowed=((strpos($path,'r')===false and strpos($path,'r+')!==false and self::canRead) or self::canWrite($path));
|
$allowed=((strpos($path,'r')===false and strpos($path,'r+')!==false and self::canRead) or self::canWrite($path));
|
||||||
if($allowed){
|
if($allowed){
|
||||||
if($storage=self::getStorage($path)){
|
if($storage=self::getStorage($path)){
|
||||||
return $storage->fopen(substr($path,strlen(self::getMountPoint($path))),$mode);
|
return $storage->fopen(self::getInternalPath($path),$mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function toTmpFile($path){
|
static public function toTmpFile($path){
|
||||||
if(self::canRead($path) and $storage=self::getStorage($path)){
|
if(self::canRead($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->toTmpFile(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->toTmpFile(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function fromTmpFile($tmpFile,$path){
|
static public function fromTmpFile($tmpFile,$path){
|
||||||
if(self::canWrite($path) and $storage=self::getStorage($path)){
|
if(self::canWrite($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->fromTmpFile($tmpFile,substr($path,strlen(self::getMountPoint($path))));
|
return $storage->fromTmpFile(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function getMimeType($path){
|
static public function getMimeType($path){
|
||||||
if(self::canRead($path) and $storage=self::getStorage($path)){
|
if(self::canRead($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->getMimeType(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->getMimeType(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function delTree($path){
|
static public function delTree($path){
|
||||||
if(self::canWrite($path) and $storage=self::getStorage($path)){
|
if(self::canWrite($path) and $storage=self::getStorage($path)){
|
||||||
return $storage->delTree(substr($path,strlen(self::getMountPoint($path))));
|
return $storage->delTree(self::getInternalPath($path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static public function find($path){
|
static public function find($path){
|
||||||
if($storage=self::getStorage($path)){
|
if($storage=self::getStorage($path)){
|
||||||
$mp=self::getMountPoint($path);
|
$mp=self::getMountPoint($path);
|
||||||
$return=$storage->find(substr($path,strlen($mp)));
|
$return=$storage->find(self::getInternalPath($path));
|
||||||
foreach($return as &$file){
|
foreach($return as &$file){
|
||||||
$file=$mp.$file;
|
$file=$mp.$file;
|
||||||
}
|
}
|
||||||
|
@ -281,8 +310,7 @@ class OC_FILESYSTEM{
|
||||||
static public function getTree($path){
|
static public function getTree($path){
|
||||||
if(self::canRead($path) and $storage=self::getStorage($path)){
|
if(self::canRead($path) and $storage=self::getStorage($path)){
|
||||||
$mp=self::getMountPoint($path);
|
$mp=self::getMountPoint($path);
|
||||||
$return=$storage->getTree(substr($path,strlen($mp)));
|
$return=$storage->getTree(self::getInternalPath($path));
|
||||||
echo "mp: $mp";
|
|
||||||
foreach($return as &$file){
|
foreach($return as &$file){
|
||||||
if(substr($file,0,1)=='/'){
|
if(substr($file,0,1)=='/'){
|
||||||
$file=substr($file,1);
|
$file=substr($file,1);
|
||||||
|
|
Loading…
Reference in New Issue