From f5c0dbd947d45520550b68dae77a894f871a0758 Mon Sep 17 00:00:00 2001
From: Jakob Sack <kde@jakobsack.de>
Date: Wed, 27 Jul 2011 19:07:28 +0200
Subject: [PATCH] Use autoload

---
 lib/base.php                                  | 338 +-----------------
 .../Sabre => connector/sabre}/auth.php        |   1 -
 .../Sabre => connector/sabre}/directory.php   |   3 -
 .../Sabre => connector/sabre}/file.php        |   2 -
 .../Sabre => connector/sabre}/locks.php       |   2 -
 .../Sabre => connector/sabre}/node.php        |   3 -
 lib/{database.php => db.php}                  |   0
 lib/files.php                                 |   3 -
 lib/group.php                                 |   1 -
 lib/{Group => group}/backend.php              |   0
 lib/{Group => group}/database.php             |   2 -
 lib/hook.php                                  |  69 ++++
 lib/user.php                                  |   1 -
 lib/{User => user}/backend.php                |   0
 lib/{User => user}/database.php               |   2 -
 lib/{User => user}/example.php                |   2 -
 lib/util.php                                  | 245 +++++++++++++
 17 files changed, 322 insertions(+), 352 deletions(-)
 rename lib/{Connector/Sabre => connector/sabre}/auth.php (96%)
 rename lib/{Connector/Sabre => connector/sabre}/directory.php (98%)
 rename lib/{Connector/Sabre => connector/sabre}/file.php (98%)
 rename lib/{Connector/Sabre => connector/sabre}/locks.php (99%)
 rename lib/{Connector/Sabre => connector/sabre}/node.php (99%)
 rename lib/{database.php => db.php} (100%)
 rename lib/{Group => group}/backend.php (100%)
 rename lib/{Group => group}/database.php (99%)
 create mode 100644 lib/hook.php
 rename lib/{User => user}/backend.php (100%)
 rename lib/{User => user}/database.php (99%)
 rename lib/{User => user}/example.php (98%)
 create mode 100644 lib/util.php

diff --git a/lib/base.php b/lib/base.php
index 743ed58792..7c2e7cf88c 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -20,6 +20,14 @@
  *
  */
 
+// Get rid of this stupid require_once OC_...
+function OC_autoload($className) {
+	if(strpos($className,'OC_')===0) {
+		require_once strtolower(str_replace('_','/',substr($className,3)) . '.php');
+	}
+}
+
+spl_autoload_register('OC_autoload');
 
 // set some stuff
 //ob_start();
@@ -58,9 +66,6 @@ if( !isset( $RUNTIME_NOAPPS )){
 	$RUNTIME_NOAPPS = false;
 }
 
-// Doing the config stuff first
-require_once('config.php');
-
 // TODO: we should get rid of this one, too
 // WARNING: to make everything even more confusing, DATADIRECTORY is a var that
 //   changes and DATATIRECTORY_ROOT stays the same, but is set by
@@ -76,25 +81,6 @@ if( OC_CONFIG::getValue( "forcessl", false )){
 	}
 }
 
-// load core libs
-require_once('helper.php');
-require_once('database.php');
-require_once('app.php');
-require_once('appconfig.php');
-require_once('files.php');
-require_once('filesystem.php');
-require_once('filestorage.php');
-require_once('l10n.php');
-require_once('preferences.php');
-require_once('log.php');
-require_once('user.php');
-require_once('group.php');
-require_once('ocs.php');
-require_once('ocsclient.php');
-require_once('connect.php');
-require_once('remotestorage.php');
-require_once('search.php');
-
 $error=(count(OC_UTIL::checkServer())>0);
 
 OC_USER::useBackend( OC_CONFIG::getValue( "userbackend", "database" ));
@@ -117,313 +103,5 @@ if(!$error and !$RUNTIME_NOAPPS ){
 	OC_APP::loadApps();
 }
 
-/**
- * Class for utility functions
- *
- */
-class OC_UTIL {
-	public static $scripts=array();
-	public static $styles=array();
-	public static $headers=array();
-	private static $fsSetup=false;
-
-	// Can be set up
-	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;
-		}
-
-		// Global Variables
-		global $SERVERROOT;
-		global $CONFIG_DATADIRECTORY;
-
-		$CONFIG_DATADIRECTORY_ROOT = OC_CONFIG::getValue( "datadirectory", "$SERVERROOT/data" );
-		$CONFIG_BACKUPDIRECTORY = OC_CONFIG::getValue( "backupdirectory", "$SERVERROOT/backup" );
-
-		// Create root dir
-		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 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,'/');
-
-			$CONFIG_DATADIRECTORY = "$CONFIG_DATADIRECTORY_ROOT/$user/$root";
-			if( !is_dir( $CONFIG_DATADIRECTORY )){
-				mkdir( $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");
-			self::$fsSetup=true;
-		}
-	}
-
-	public static function tearDownFS(){
-		OC_FILESYSTEM::tearDown();
-		self::$fsSetup=false;
-	}
-
-	/**
-	 * get the current installed version of ownCloud
-	 * @return array
-	 */
-	public static function getVersion(){
-		return array(1,60,0);
-	}
-
-	/**
-	 * add a javascript file
-	 *
-	 * @param url  $url
-	 */
-	public static function addScript( $application, $file = null ){
-		if( is_null( $file )){
-			$file = $application;
-			$application = "";
-		}
-		if( !empty( $application )){
-			self::$scripts[] = "$application/js/$file";
-		}else{
-			self::$scripts[] = "js/$file";
-		}
-	}
-
-	/**
-	 * add a css file
-	 *
-	 * @param url  $url
-	 */
-	public static function addStyle( $application, $file = null ){
-		if( is_null( $file )){
-			$file = $application;
-			$application = "";
-		}
-		if( !empty( $application )){
-			self::$styles[] = "$application/css/$file";
-		}else{
-			self::$styles[] = "css/$file";
-		}
-	}
-
-	/**
-	 * @brief Add a custom element to the header
-	 * @param string tag tag name of the element
-	 * @param array $attributes array of attrobutes for the element
-	 * @param string $text the text content for the element
-	 */
-	public static function addHeader( $tag, $attributes, $text=''){
-		self::$headers[]=array('tag'=>$tag,'attributes'=>$attributes,'text'=>$text);
-	}
-
-       /**
-         * formats a timestamp in the "right" way
-         *
-         * @param int timestamp $timestamp
-         * @param bool dateOnly option to ommit time from the result
-         */
-        public static function formatDate( $timestamp,$dateOnly=false){
-			if(isset($_SESSION['timezone'])){//adjust to clients timezone if we know it
-				$systemTimeZone = intval(exec('date +%z'));
-				$systemTimeZone=(round($systemTimeZone/100,0)*60)+($systemTimeZone%100);
-				$clientTimeZone=$_SESSION['timezone']*60;
-				$offset=$clientTimeZone-$systemTimeZone;
-				$timestamp=$timestamp+$offset*60;
-			}
-			$timeformat=$dateOnly?'F j, Y':'F j, Y, H:i';
-			return date($timeformat,$timestamp);
-        }
-
-	/**
-	 * Shows a pagenavi widget where you can jump to different pages.
-	 *
-	 * @param int $pagecount
-	 * @param int $page
-	 * @param string $url
-	 * @return OC_TEMPLATE
-	 */
-	public static function getPageNavi($pagecount,$page,$url) {
-
-		$pagelinkcount=8;
-		if ($pagecount>1) {
-			$pagestart=$page-$pagelinkcount;
-			if($pagestart<0) $pagestart=0;
-			$pagestop=$page+$pagelinkcount;
-			if($pagestop>$pagecount) $pagestop=$pagecount;
-			
-			$tmpl = new OC_TEMPLATE( '', 'part.pagenavi', '' );
-			$tmpl->assign('page',$page);
-			$tmpl->assign('pagecount',$pagecount);
-			$tmpl->assign('pagestart',$pagestart);
-			$tmpl->assign('pagestop',$pagestop);
-			$tmpl->assign('url',$url);
-			return $tmpl;
-		}
-	}
-
-
-
-	/**
-	 * check if the current server configuration is suitable for ownCloud
-	 * @return array arrays with error messages and hints
-	 */
-	public static function checkServer(){
-		global $SERVERROOT;
-		global $CONFIG_DATADIRECTORY;
-
-		$CONFIG_DATADIRECTORY_ROOT = OC_CONFIG::getValue( "datadirectory", "$SERVERROOT/data" );;
-		$CONFIG_BACKUPDIRECTORY = OC_CONFIG::getValue( "backupdirectory", "$SERVERROOT/backup" );
-		$CONFIG_INSTALLED = OC_CONFIG::getValue( "installed", false );
-		$errors=array();
-
-		//check for database drivers
-		if(!is_callable('sqlite_open') and !is_callable('mysql_connect')){
-			$errors[]=array('error'=>'No database drivers (sqlite or mysql) installed.<br/>','hint'=>'');//TODO: sane hint
-		}
-		$CONFIG_DBTYPE = OC_CONFIG::getValue( "dbtype", "sqlite" );
-		$CONFIG_DBNAME = OC_CONFIG::getValue( "dbname", "owncloud" );
-		
-		//try to get the username the httpd server runs on, used in hints
-		$stat=stat($_SERVER['DOCUMENT_ROOT']);
-		if(is_callable('posix_getpwuid')){
-			$serverUser=posix_getpwuid($stat['uid']);
-			$serverUser='\''.$serverUser['name'].'\'';
-		}else{
-			$serverUser='\'www-data\' for ubuntu/debian';//TODO: try to detect the distro and give a guess based on that
-		}
-		
-		//common hint for all file permissons error messages
-		$permissionsHint="Permissions can usually be fixed by setting the owner of the file or directory to the user the web server runs as ($serverUser)";
-		
-		//check for correct file permissions
-		if(!stristr(PHP_OS, 'WIN')){
-			$prems=substr(decoct(fileperms($CONFIG_DATADIRECTORY_ROOT)),-3);
-			if(substr($prems,-1)!='0'){
-				OC_HELPER::chmodr($CONFIG_DATADIRECTORY_ROOT,0770);
-				clearstatcache();
-				$prems=substr(decoct(fileperms($CONFIG_DATADIRECTORY_ROOT)),-3);
-				if(substr($prems,2,1)!='0'){
-					$errors[]=array('error'=>'Data directory ('.$CONFIG_DATADIRECTORY_ROOT.') is readable from the web<br/>','hint'=>$permissionsHint);
-				}
-			}
-			if( OC_CONFIG::getValue( "enablebackup", false )){
-				$prems=substr(decoct(fileperms($CONFIG_BACKUPDIRECTORY)),-3);
-				if(substr($prems,-1)!='0'){
-					OC_HELPER::chmodr($CONFIG_BACKUPDIRECTORY,0770);
-					clearstatcache();
-					$prems=substr(decoct(fileperms($CONFIG_BACKUPDIRECTORY)),-3);
-					if(substr($prems,2,1)!='0'){
-						$errors[]=array('error'=>'Data directory ('.$CONFIG_BACKUPDIRECTORY.') is readable from the web<br/>','hint'=>$permissionsHint);
-					}
-				}
-			}
-		}else{
-			//TODO: premisions checks for windows hosts
-		}
-		if(is_dir($CONFIG_DATADIRECTORY_ROOT) and !is_writable($CONFIG_DATADIRECTORY_ROOT)){
-			$errors[]=array('error'=>'Data directory ('.$CONFIG_DATADIRECTORY_ROOT.') not writable by ownCloud<br/>','hint'=>$permissionsHint);
-		}
-
-		//TODO: check for php modules
-
-		return $errors;
-	}
-}
-
-/**
- * This class manages the hooks. It basically provides two functions: adding
- * slots and emitting signals.
- */
-class OC_HOOK{
-	static private $registered = array();
-
-	/**
-	 * @brief connects a function to a hook
-	 * @param $signalclass class name of emitter
-	 * @param $signalname name of signal
-	 * @param $slotclass class name of slot
-	 * @param $slotname name of slot
-	 * @returns true/false
-	 *
-	 * This function makes it very easy to connect to use hooks.
-	 *
-	 * TODO: write example
-	 */
-	static public function connect( $signalclass, $signalname, $slotclass, $slotname ){
-		// Cerate the data structure
-		if( !array_key_exists( $signalclass, self::$registered )){
-			self::$registered[$signalclass] = array();
-		}
-		if( !array_key_exists( $signalname, self::$registered[$signalclass] )){
-			self::$registered[$signalclass][$signalname] = array();
-		}
-
-		// register hook
-		self::$registered[$signalclass][$signalname][] = array(
-		  "class" => $slotclass,
-		  "name" => $slotname );
 
-		// No chance for failure ;-)
-		return true;
-	}
-
-	/**
-	 * @brief emitts a signal
-	 * @param $signalclass class name of emitter
-	 * @param $signalname name of signal
-	 * @param $params defautl: array() array with additional data
-	 * @returns true if slots exists or false if not
-	 *
-	 * Emits a signal. To get data from the slot use references!
-	 *
-	 * TODO: write example
-	 */
-	static public function emit( $signalclass, $signalname, $params = array()){
-		// Return false if there are no slots
-		if( !array_key_exists( $signalclass, self::$registered )){
-			return false;
-		}
-		if( !array_key_exists( $signalname, self::$registered[$signalclass] )){
-			return false;
-		}
-
-		// Call all slots
-		foreach( self::$registered[$signalclass][$signalname] as $i ){
-			call_user_func( array( $i["class"], $i["name"] ), $params );
-		}
-
-		// return true
-		return true;
-	}
-}
 ?>
diff --git a/lib/Connector/Sabre/auth.php b/lib/connector/sabre/auth.php
similarity index 96%
rename from lib/Connector/Sabre/auth.php
rename to lib/connector/sabre/auth.php
index cfe7723e76..4e974ad821 100644
--- a/lib/Connector/Sabre/auth.php
+++ b/lib/connector/sabre/auth.php
@@ -1,5 +1,4 @@
 <?php
-require_once("lib/base.php");
 /**
  * HTTP Basic authentication backend class
  *
diff --git a/lib/Connector/Sabre/directory.php b/lib/connector/sabre/directory.php
similarity index 98%
rename from lib/Connector/Sabre/directory.php
rename to lib/connector/sabre/directory.php
index d0ff87f9b1..a73888ca73 100644
--- a/lib/Connector/Sabre/directory.php
+++ b/lib/connector/sabre/directory.php
@@ -1,7 +1,4 @@
 <?php
-
-require_once("lib/base.php");
-
 /**
  * Directory class 
  * 
diff --git a/lib/Connector/Sabre/file.php b/lib/connector/sabre/file.php
similarity index 98%
rename from lib/Connector/Sabre/file.php
rename to lib/connector/sabre/file.php
index bb5ab73843..fb4e559aa5 100644
--- a/lib/Connector/Sabre/file.php
+++ b/lib/connector/sabre/file.php
@@ -1,6 +1,4 @@
 <?php
-
-require_once("lib/base.php");
 /**
  * File class 
  * 
diff --git a/lib/Connector/Sabre/locks.php b/lib/connector/sabre/locks.php
similarity index 99%
rename from lib/Connector/Sabre/locks.php
rename to lib/connector/sabre/locks.php
index 4f3eb7bbf5..88bab50989 100644
--- a/lib/Connector/Sabre/locks.php
+++ b/lib/connector/sabre/locks.php
@@ -1,6 +1,4 @@
 <?php
-require_once("lib/base.php");
-
 /**
  * The Lock manager allows you to handle all file-locks centrally.
  *
diff --git a/lib/Connector/Sabre/node.php b/lib/connector/sabre/node.php
similarity index 99%
rename from lib/Connector/Sabre/node.php
rename to lib/connector/sabre/node.php
index dc1013dc52..03d5e90012 100644
--- a/lib/Connector/Sabre/node.php
+++ b/lib/connector/sabre/node.php
@@ -1,7 +1,4 @@
 <?php
-
-require_once("lib/base.php");
-
 /**
  * Base node-class 
  *
diff --git a/lib/database.php b/lib/db.php
similarity index 100%
rename from lib/database.php
rename to lib/db.php
diff --git a/lib/files.php b/lib/files.php
index d813366795..d24eb282c4 100644
--- a/lib/files.php
+++ b/lib/files.php
@@ -21,9 +21,6 @@
 *
 */
 
-require_once("log.php");
-
-
 /**
  * Class for fileserver access
  *
diff --git a/lib/group.php b/lib/group.php
index 6510838ccf..71caaee613 100644
--- a/lib/group.php
+++ b/lib/group.php
@@ -78,7 +78,6 @@ class OC_GROUP {
 			case 'database':
 			case 'mysql':
 			case 'sqlite':
-				require_once('Group/database.php');
 				self::$_backend = new OC_GROUP_DATABASE();
 				break;
 			default:
diff --git a/lib/Group/backend.php b/lib/group/backend.php
similarity index 100%
rename from lib/Group/backend.php
rename to lib/group/backend.php
diff --git a/lib/Group/database.php b/lib/group/database.php
similarity index 99%
rename from lib/Group/database.php
rename to lib/group/database.php
index 6e508a4d47..8c04ca5d36 100644
--- a/lib/Group/database.php
+++ b/lib/group/database.php
@@ -37,8 +37,6 @@
  *
  */
 
-require_once( 'Group/backend.php' );
-
 /**
  * Class for group management in a SQL Database (e.g. MySQL, SQLite)
  */
diff --git a/lib/hook.php b/lib/hook.php
new file mode 100644
index 0000000000..08b6d5e8b6
--- /dev/null
+++ b/lib/hook.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * This class manages the hooks. It basically provides two functions: adding
+ * slots and emitting signals.
+ */
+class OC_HOOK{
+	static private $registered = array();
+
+	/**
+	 * @brief connects a function to a hook
+	 * @param $signalclass class name of emitter
+	 * @param $signalname name of signal
+	 * @param $slotclass class name of slot
+	 * @param $slotname name of slot
+	 * @returns true/false
+	 *
+	 * This function makes it very easy to connect to use hooks.
+	 *
+	 * TODO: write example
+	 */
+	static public function connect( $signalclass, $signalname, $slotclass, $slotname ){
+		// Cerate the data structure
+		if( !array_key_exists( $signalclass, self::$registered )){
+			self::$registered[$signalclass] = array();
+		}
+		if( !array_key_exists( $signalname, self::$registered[$signalclass] )){
+			self::$registered[$signalclass][$signalname] = array();
+		}
+
+		// register hook
+		self::$registered[$signalclass][$signalname][] = array(
+		  "class" => $slotclass,
+		  "name" => $slotname );
+
+		// No chance for failure ;-)
+		return true;
+	}
+
+	/**
+	 * @brief emitts a signal
+	 * @param $signalclass class name of emitter
+	 * @param $signalname name of signal
+	 * @param $params defautl: array() array with additional data
+	 * @returns true if slots exists or false if not
+	 *
+	 * Emits a signal. To get data from the slot use references!
+	 *
+	 * TODO: write example
+	 */
+	static public function emit( $signalclass, $signalname, $params = array()){
+		// Return false if there are no slots
+		if( !array_key_exists( $signalclass, self::$registered )){
+			return false;
+		}
+		if( !array_key_exists( $signalname, self::$registered[$signalclass] )){
+			return false;
+		}
+
+		// Call all slots
+		foreach( self::$registered[$signalclass][$signalname] as $i ){
+			call_user_func( array( $i["class"], $i["name"] ), $params );
+		}
+
+		// return true
+		return true;
+	}
+}
+ 
diff --git a/lib/user.php b/lib/user.php
index a64ce05f2c..b93e213335 100644
--- a/lib/user.php
+++ b/lib/user.php
@@ -95,7 +95,6 @@ class OC_USER {
 			case 'database':
 			case 'mysql':
 			case 'sqlite':
-				require_once('User/database.php');
 				self::$_usedBackends[$backend] = new OC_USER_DATABASE();
 				break;
 			default:
diff --git a/lib/User/backend.php b/lib/user/backend.php
similarity index 100%
rename from lib/User/backend.php
rename to lib/user/backend.php
diff --git a/lib/User/database.php b/lib/user/database.php
similarity index 99%
rename from lib/User/database.php
rename to lib/user/database.php
index 0396ac3095..ace3c89770 100644
--- a/lib/User/database.php
+++ b/lib/user/database.php
@@ -33,8 +33,6 @@
  *
  */
 
-require_once('User/backend.php');
-
 /**
  * Class for user management in a SQL Database (e.g. MySQL, SQLite)
  */
diff --git a/lib/User/example.php b/lib/user/example.php
similarity index 98%
rename from lib/User/example.php
rename to lib/user/example.php
index 4abc1b3d49..069f14492a 100644
--- a/lib/User/example.php
+++ b/lib/user/example.php
@@ -21,8 +21,6 @@
  *
  */
 
-require_once('User/backend.php');
-
 /**
  * abstract reference class for user management
  * this class should only be used as a reference for method signatures and their descriptions
diff --git a/lib/util.php b/lib/util.php
new file mode 100644
index 0000000000..8beb4a884b
--- /dev/null
+++ b/lib/util.php
@@ -0,0 +1,245 @@
+<?php
+
+/**
+ * Class for utility functions
+ *
+ */
+class OC_UTIL {
+	public static $scripts=array();
+	public static $styles=array();
+	public static $headers=array();
+	private static $fsSetup=false;
+
+	// Can be set up
+	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;
+		}
+
+		// Global Variables
+		global $SERVERROOT;
+		global $CONFIG_DATADIRECTORY;
+
+		$CONFIG_DATADIRECTORY_ROOT = OC_CONFIG::getValue( "datadirectory", "$SERVERROOT/data" );
+		$CONFIG_BACKUPDIRECTORY = OC_CONFIG::getValue( "backupdirectory", "$SERVERROOT/backup" );
+
+		// Create root dir
+		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 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,'/');
+
+			$CONFIG_DATADIRECTORY = "$CONFIG_DATADIRECTORY_ROOT/$user/$root";
+			if( !is_dir( $CONFIG_DATADIRECTORY )){
+				mkdir( $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");
+			self::$fsSetup=true;
+		}
+	}
+
+	public static function tearDownFS(){
+		OC_FILESYSTEM::tearDown();
+		self::$fsSetup=false;
+	}
+
+	/**
+	 * get the current installed version of ownCloud
+	 * @return array
+	 */
+	public static function getVersion(){
+		return array(1,60,0);
+	}
+
+	/**
+	 * add a javascript file
+	 *
+	 * @param url  $url
+	 */
+	public static function addScript( $application, $file = null ){
+		if( is_null( $file )){
+			$file = $application;
+			$application = "";
+		}
+		if( !empty( $application )){
+			self::$scripts[] = "$application/js/$file";
+		}else{
+			self::$scripts[] = "js/$file";
+		}
+	}
+
+	/**
+	 * add a css file
+	 *
+	 * @param url  $url
+	 */
+	public static function addStyle( $application, $file = null ){
+		if( is_null( $file )){
+			$file = $application;
+			$application = "";
+		}
+		if( !empty( $application )){
+			self::$styles[] = "$application/css/$file";
+		}else{
+			self::$styles[] = "css/$file";
+		}
+	}
+
+	/**
+	 * @brief Add a custom element to the header
+	 * @param string tag tag name of the element
+	 * @param array $attributes array of attrobutes for the element
+	 * @param string $text the text content for the element
+	 */
+	public static function addHeader( $tag, $attributes, $text=''){
+		self::$headers[]=array('tag'=>$tag,'attributes'=>$attributes,'text'=>$text);
+	}
+
+       /**
+         * formats a timestamp in the "right" way
+         *
+         * @param int timestamp $timestamp
+         * @param bool dateOnly option to ommit time from the result
+         */
+        public static function formatDate( $timestamp,$dateOnly=false){
+			if(isset($_SESSION['timezone'])){//adjust to clients timezone if we know it
+				$systemTimeZone = intval(exec('date +%z'));
+				$systemTimeZone=(round($systemTimeZone/100,0)*60)+($systemTimeZone%100);
+				$clientTimeZone=$_SESSION['timezone']*60;
+				$offset=$clientTimeZone-$systemTimeZone;
+				$timestamp=$timestamp+$offset*60;
+			}
+			$timeformat=$dateOnly?'F j, Y':'F j, Y, H:i';
+			return date($timeformat,$timestamp);
+        }
+
+	/**
+	 * Shows a pagenavi widget where you can jump to different pages.
+	 *
+	 * @param int $pagecount
+	 * @param int $page
+	 * @param string $url
+	 * @return OC_TEMPLATE
+	 */
+	public static function getPageNavi($pagecount,$page,$url) {
+
+		$pagelinkcount=8;
+		if ($pagecount>1) {
+			$pagestart=$page-$pagelinkcount;
+			if($pagestart<0) $pagestart=0;
+			$pagestop=$page+$pagelinkcount;
+			if($pagestop>$pagecount) $pagestop=$pagecount;
+
+			$tmpl = new OC_TEMPLATE( '', 'part.pagenavi', '' );
+			$tmpl->assign('page',$page);
+			$tmpl->assign('pagecount',$pagecount);
+			$tmpl->assign('pagestart',$pagestart);
+			$tmpl->assign('pagestop',$pagestop);
+			$tmpl->assign('url',$url);
+			return $tmpl;
+		}
+	}
+
+
+
+	/**
+	 * check if the current server configuration is suitable for ownCloud
+	 * @return array arrays with error messages and hints
+	 */
+	public static function checkServer(){
+		global $SERVERROOT;
+		global $CONFIG_DATADIRECTORY;
+
+		$CONFIG_DATADIRECTORY_ROOT = OC_CONFIG::getValue( "datadirectory", "$SERVERROOT/data" );;
+		$CONFIG_BACKUPDIRECTORY = OC_CONFIG::getValue( "backupdirectory", "$SERVERROOT/backup" );
+		$CONFIG_INSTALLED = OC_CONFIG::getValue( "installed", false );
+		$errors=array();
+
+		//check for database drivers
+		if(!is_callable('sqlite_open') and !is_callable('mysql_connect')){
+			$errors[]=array('error'=>'No database drivers (sqlite or mysql) installed.<br/>','hint'=>'');//TODO: sane hint
+		}
+		$CONFIG_DBTYPE = OC_CONFIG::getValue( "dbtype", "sqlite" );
+		$CONFIG_DBNAME = OC_CONFIG::getValue( "dbname", "owncloud" );
+
+		//try to get the username the httpd server runs on, used in hints
+		$stat=stat($_SERVER['DOCUMENT_ROOT']);
+		if(is_callable('posix_getpwuid')){
+			$serverUser=posix_getpwuid($stat['uid']);
+			$serverUser='\''.$serverUser['name'].'\'';
+		}else{
+			$serverUser='\'www-data\' for ubuntu/debian';//TODO: try to detect the distro and give a guess based on that
+		}
+
+		//common hint for all file permissons error messages
+		$permissionsHint="Permissions can usually be fixed by setting the owner of the file or directory to the user the web server runs as ($serverUser)";
+
+		//check for correct file permissions
+		if(!stristr(PHP_OS, 'WIN')){
+			$prems=substr(decoct(fileperms($CONFIG_DATADIRECTORY_ROOT)),-3);
+			if(substr($prems,-1)!='0'){
+				OC_HELPER::chmodr($CONFIG_DATADIRECTORY_ROOT,0770);
+				clearstatcache();
+				$prems=substr(decoct(fileperms($CONFIG_DATADIRECTORY_ROOT)),-3);
+				if(substr($prems,2,1)!='0'){
+					$errors[]=array('error'=>'Data directory ('.$CONFIG_DATADIRECTORY_ROOT.') is readable from the web<br/>','hint'=>$permissionsHint);
+				}
+			}
+			if( OC_CONFIG::getValue( "enablebackup", false )){
+				$prems=substr(decoct(fileperms($CONFIG_BACKUPDIRECTORY)),-3);
+				if(substr($prems,-1)!='0'){
+					OC_HELPER::chmodr($CONFIG_BACKUPDIRECTORY,0770);
+					clearstatcache();
+					$prems=substr(decoct(fileperms($CONFIG_BACKUPDIRECTORY)),-3);
+					if(substr($prems,2,1)!='0'){
+						$errors[]=array('error'=>'Data directory ('.$CONFIG_BACKUPDIRECTORY.') is readable from the web<br/>','hint'=>$permissionsHint);
+					}
+				}
+			}
+		}else{
+			//TODO: premisions checks for windows hosts
+		}
+		if(is_dir($CONFIG_DATADIRECTORY_ROOT) and !is_writable($CONFIG_DATADIRECTORY_ROOT)){
+			$errors[]=array('error'=>'Data directory ('.$CONFIG_DATADIRECTORY_ROOT.') not writable by ownCloud<br/>','hint'=>$permissionsHint);
+		}
+
+		//TODO: check for php modules
+
+		return $errors;
+	}
+}
+ 
-- 
GitLab