public static function setupFS($user = "", $root = "files") { // configure the initial filesystem based on the configuration if (self::$fsSetup) { //setting up the filesystem twice can only lead to trouble return false; } $CONFIG_DATADIRECTORY_ROOT = OC_Config::getValue("datadirectory", OC::$SERVERROOT . "/data"); $CONFIG_BACKUPDIRECTORY = OC_Config::getValue("backupdirectory", OC::$SERVERROOT . "/backup"); // Create root dir if (!is_dir($CONFIG_DATADIRECTORY_ROOT)) { $success = @mkdir($CONFIG_DATADIRECTORY_ROOT); if (!$success) { $tmpl = new OC_Template('', 'error', 'guest'); $tmpl->assign('errors', array(1 => array('error' => "Can't create data directory (" . $CONFIG_DATADIRECTORY_ROOT . ")", 'hint' => "You can usually fix this by setting the owner of '" . OC::$SERVERROOT . "' to the user that the web server uses (" . OC_Util::checkWebserverUser() . ")"))); $tmpl->printPage(); exit; } } // If we are not forced to load a specific user we load the one that is logged in if ($user == "" && OC_User::isLoggedIn()) { $user = OC_User::getUser(); } if ($user != "") { //if we aren't logged in, there is no use to set up the filesystem //first set up the local "root" storage and the backupstorage if needed $rootStorage = OC_Filesystem::createStorage('local', array('datadir' => $CONFIG_DATADIRECTORY_ROOT)); // if( OC_Config::getValue( "enablebackup", false )){ // // This creates the Directorys recursively // if(!is_dir( "$CONFIG_BACKUPDIRECTORY/$user/$root" )){ // mkdir( "$CONFIG_BACKUPDIRECTORY/$user/$root", 0755, true ); // } // $backupStorage=OC_Filesystem::createStorage('local',array('datadir'=>$CONFIG_BACKUPDIRECTORY)); // $backup=new OC_FILEOBSERVER_BACKUP(array('storage'=>$backupStorage)); // $rootStorage->addObserver($backup); // } OC_Filesystem::mount($rootStorage, '/'); // TODO add this storage provider in a proper way $sharedStorage = OC_Filesystem::createStorage('shared', array('datadir' => '/' . OC_User::getUser() . '/files/Shared')); OC_Filesystem::mount($sharedStorage, '/' . OC_User::getUser() . '/files/Shared/'); OC::$CONFIG_DATADIRECTORY = $CONFIG_DATADIRECTORY_ROOT . "/{$user}/{$root}"; if (!is_dir(OC::$CONFIG_DATADIRECTORY)) { mkdir(OC::$CONFIG_DATADIRECTORY, 0755, true); } // TODO: find a cool way for doing this // //set up the other storages according to the system settings // foreach($CONFIG_FILESYSTEM as $storageConfig){ // if(OC_Filesystem::hasStorageType($storageConfig['type'])){ // $arguments=$storageConfig; // unset($arguments['type']); // unset($arguments['mountpoint']); // $storage=OC_Filesystem::createStorage($storageConfig['type'],$arguments); // if($storage){ // OC_Filesystem::mount($storage,$storageConfig['mountpoint']); // } // } // } //jail the user into his "home" directory OC_Filesystem::chroot("/{$user}/{$root}"); $quotaProxy = new OC_FileProxy_Quota(); OC_FileProxy::register($quotaProxy); self::$fsSetup = true; } }
/** * get the storage object for a path * @param string path * @return OC_Filestorage */ public static function getStorage($path) { $mountpoint = self::getMountPoint($path); if ($mountpoint) { if (!isset(OC_Filesystem::$storages[$mountpoint])) { $mount = OC_Filesystem::$mounts[$mountpoint]; OC_Filesystem::$storages[$mountpoint] = OC_Filesystem::createStorage($mount['class'], $mount['arguments']); } return OC_Filesystem::$storages[$mountpoint]; } }
/** * get the storage object for a path * @param string path * @return OC_Filestorage */ public static function getStorage($path) { $user = ltrim(substr($path, 0, strpos($path, '/', 1)), '/'); // check mount points if file was shared from a different user if ($user != OC_User::getUser() && !self::mountPointsLoaded($user)) { OC_Util::loadUserMountPoints($user); self::loadSystemMountPoints($user); self::$loadedUsers[] = $user; } $mountpoint = self::getMountPoint($path); if ($mountpoint) { if (!isset(OC_Filesystem::$storages[$mountpoint])) { $mount = OC_Filesystem::$mounts[$mountpoint]; OC_Filesystem::$storages[$mountpoint] = OC_Filesystem::createStorage($mount['class'], $mount['arguments']); } return OC_Filesystem::$storages[$mountpoint]; } }