2010-03-10 15:03:40 +03:00
< ? php
/**
2011-04-15 21:24:23 +04:00
* 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 Affero General Public
* License along with this library . If not , see < http :// www . gnu . org / licenses />.
*
*/
2010-03-10 15:03:40 +03:00
// set some stuff
2011-04-15 19:14:02 +04:00
//ob_start();
2011-04-16 22:07:57 +04:00
error_reporting ( E_ALL | E_STRICT );
2010-06-29 16:53:54 +04:00
2010-03-10 15:03:40 +03:00
date_default_timezone_set ( 'Europe/Berlin' );
ini_set ( 'arg_separator.output' , '&' );
ini_set ( 'session.cookie_httponly' , '1;' );
session_start ();
2011-04-15 19:14:02 +04:00
2010-03-16 10:48:36 +03:00
// calculate the documentroot
2011-03-02 01:20:16 +03:00
$SERVERROOT = substr ( __FILE__ , 0 , - 13 );
2010-06-27 20:09:59 +04:00
$DOCUMENTROOT = realpath ( $_SERVER [ 'DOCUMENT_ROOT' ]);
2010-04-30 17:32:22 +04:00
$SERVERROOT = str_replace ( " \\ " , '/' , $SERVERROOT );
2010-06-27 20:09:59 +04:00
$SUBURI = substr ( realpath ( $_SERVER [ " SCRIPT_FILENAME " ]), strlen ( $SERVERROOT ));
2010-06-27 02:16:09 +04:00
$WEBROOT = substr ( $_SERVER [ " SCRIPT_NAME " ], 0 , strlen ( $_SERVER [ " SCRIPT_NAME " ]) - strlen ( $SUBURI ));
2010-06-27 20:09:59 +04:00
2010-07-29 00:45:24 +04:00
2010-06-27 02:16:09 +04:00
if ( $WEBROOT != '' and $WEBROOT [ 0 ] !== '/' ){
2010-04-19 21:46:42 +04:00
$WEBROOT = '/' . $WEBROOT ;
}
2010-03-16 10:48:36 +03:00
// set the right include path
2011-04-16 12:12:53 +04:00
set_include_path ( $SERVERROOT . '/lib' . PATH_SEPARATOR . $SERVERROOT . '/config' . PATH_SEPARATOR . $SERVERROOT . '/3dparty' . PATH_SEPARATOR . get_include_path () . PATH_SEPARATOR . $SERVERROOT );
2010-03-16 10:48:36 +03:00
2011-03-03 00:18:22 +03:00
// define runtime variables - unless this already has been done
if ( ! isset ( $RUNTIME_NOSETUPFS )){
$RUNTIME_NOSETUPFS = false ;
}
2011-04-16 13:11:16 +04:00
if ( ! isset ( $RUNTIME_NOAPPS )){
$RUNTIME_NOAPPS = false ;
}
2011-03-03 00:18:22 +03:00
2011-04-16 14:18:42 +04:00
// 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
// "datadirectory". Any questions?
$CONFIG_DATADIRECTORY = OC_CONFIG :: getValue ( " datadirectory " , " $SERVERROOT /data " );
2010-03-10 15:03:40 +03:00
// redirect to https site if configured
2011-04-16 14:18:42 +04:00
if ( OC_CONFIG :: getValue ( " forcessl " , false )){
2011-03-02 01:20:16 +03:00
if ( ! isset ( $_SERVER [ 'HTTPS' ]) or $_SERVER [ 'HTTPS' ] != 'on' ) {
$url = " https:// " . $_SERVER [ 'SERVER_NAME' ] . $_SERVER [ 'REQUEST_URI' ];
header ( " Location: $url " );
2011-04-16 14:18:42 +04:00
exit ();
2011-03-02 01:20:16 +03:00
}
2010-03-10 15:03:40 +03:00
}
// load core libs
2011-04-16 12:12:53 +04:00
require_once ( 'helper.php' );
2011-04-16 12:17:40 +04:00
require_once ( 'database.php' );
2011-04-16 12:12:53 +04:00
require_once ( 'app.php' );
2011-04-16 21:06:45 +04:00
require_once ( 'appconfig.php' );
2011-04-16 12:12:53 +04:00
require_once ( 'files.php' );
require_once ( 'filesystem.php' );
require_once ( 'filestorage.php' );
require_once ( 'fileobserver.php' );
require_once ( 'log.php' );
require_once ( 'user.php' );
require_once ( 'group.php' );
require_once ( 'ocs.php' );
2011-04-16 20:50:49 +04:00
require_once ( 'ocsclient.php' );
2011-04-16 12:12:53 +04:00
require_once ( 'connect.php' );
require_once ( 'remotestorage.php' );
require_once ( 'plugin.php' );
2010-04-22 21:03:54 +04:00
2011-04-16 17:47:27 +04:00
$error = ( count ( OC_UTIL :: checkServer ()) > 0 );
if ( ! $error ){
OC_PLUGIN :: loadPlugins ( " " );
}
2010-04-28 14:15:52 +04:00
2011-04-16 14:18:42 +04:00
OC_USER :: setBackend ( OC_CONFIG :: getValue ( " userbackend " , " database " ));
OC_GROUP :: setBackend ( OC_CONFIG :: getValue ( " groupbackend " , " database " ));
2010-08-03 19:43:54 +04:00
2011-03-03 00:18:22 +03:00
// Set up file system unless forbidden
2011-04-16 17:47:27 +04:00
if ( ! $error and ! $RUNTIME_NOSETUPFS ){
2011-03-03 00:18:22 +03:00
OC_UTIL :: setupFS ();
}
2010-03-10 15:03:40 +03:00
2011-03-03 00:18:22 +03:00
// Add the stuff we need always
OC_UTIL :: addScript ( " jquery-1.5.min " );
OC_UTIL :: addScript ( " jquery-ui-1.8.10.custom.min " );
OC_UTIL :: addScript ( " js " );
OC_UTIL :: addStyle ( " jquery-ui-1.8.10.custom " );
OC_UTIL :: addStyle ( " styles " );
2011-04-16 13:11:16 +04:00
2011-03-04 01:08:11 +03:00
// Load Apps
2011-04-16 17:47:27 +04:00
if ( ! $error and ! $RUNTIME_NOAPPS ){
2011-04-16 13:11:16 +04:00
OC_APP :: loadApps ();
}
2010-03-10 15:03:40 +03:00
/**
* Class for utility functions
*
*/
class OC_UTIL {
2010-09-02 22:47:15 +04:00
public static $scripts = array ();
2010-09-08 03:43:40 +04:00
public static $styles = array ();
2010-09-06 22:02:17 +04:00
private static $fsSetup = false ;
2011-03-02 01:20:16 +03:00
2011-03-03 00:18:22 +03:00
// Can be set up
2011-03-03 23:25:22 +03:00
public static function setupFS ( $user = " " , $root = " files " ){ // configure the initial filesystem based on the configuration
2010-09-06 22:02:17 +04:00
if ( self :: $fsSetup ){ //setting up the filesystem twice can only lead to trouble
return false ;
}
2011-03-03 00:18:22 +03:00
// Global Variables
2010-10-21 21:38:01 +04:00
global $SERVERROOT ;
2010-09-02 22:47:15 +04:00
global $CONFIG_DATADIRECTORY ;
2011-04-16 14:18:42 +04:00
$CONFIG_DATADIRECTORY_ROOT = OC_CONFIG :: getValue ( " datadirectory " , " $SERVERROOT /data " );
$CONFIG_BACKUPDIRECTORY = OC_CONFIG :: getValue ( " backupdirectory " , " $SERVERROOT /backup " );
2011-03-03 00:18:22 +03:00
// Create root dir
2010-09-02 22:47:15 +04:00
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) " );
}
2011-03-03 00:18:22 +03:00
// If we are not forced to load a specific user we load the one that is logged in
if ( $user == " " && OC_USER :: isLoggedIn ()){
2011-04-15 20:13:49 +04:00
$user = $_SESSION [ 'user_id' ];
2011-03-03 00:18:22 +03:00
}
if ( $user != " " ){ //if we aren't logged in, there is no use to set up the filesystem
2010-09-06 22:02:17 +04:00
//first set up the local "root" storage and the backupstorage if needed
$rootStorage = OC_FILESYSTEM :: createStorage ( 'local' , array ( 'datadir' => $CONFIG_DATADIRECTORY ));
2011-04-16 14:18:42 +04:00
if ( OC_CONFIG :: getValue ( " enablebackup " , false )){
2011-03-03 23:25:22 +03:00
// This creates the Directorys recursively
if ( ! is_dir ( " $CONFIG_BACKUPDIRECTORY / $user / $root " )){
2011-04-16 01:09:05 +04:00
mkdir ( " $CONFIG_BACKUPDIRECTORY / $user / $root " , 0755 , true );
2010-09-02 22:47:15 +04:00
}
2010-09-06 22:02:17 +04:00
$backupStorage = OC_FILESYSTEM :: createStorage ( 'local' , array ( 'datadir' => $CONFIG_BACKUPDIRECTORY ));
2010-09-02 22:47:15 +04:00
$backup = new OC_FILEOBSERVER_BACKUP ( array ( 'storage' => $backupStorage ));
$rootStorage -> addObserver ( $backup );
}
OC_FILESYSTEM :: mount ( $rootStorage , '/' );
2011-03-02 01:20:16 +03:00
2011-03-03 23:25:22 +03:00
$CONFIG_DATADIRECTORY = " $CONFIG_DATADIRECTORY_ROOT / $user / $root " ;
if ( ! is_dir ( $CONFIG_DATADIRECTORY )){
2011-04-16 01:09:05 +04:00
mkdir ( $CONFIG_DATADIRECTORY , 0755 , true );
2010-09-02 22:47:15 +04:00
}
2011-03-02 01:20:16 +03:00
2011-04-16 14:18:42 +04:00
// 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']);
// }
// }
// }
2011-03-02 01:20:16 +03:00
2010-09-06 22:02:17 +04:00
//jail the user into his "home" directory
2011-03-03 23:25:22 +03:00
OC_FILESYSTEM :: chroot ( " / $user / $root " );
2010-09-06 22:02:17 +04:00
self :: $fsSetup = true ;
2010-09-02 22:47:15 +04:00
}
}
2011-03-02 01:20:16 +03:00
2010-09-02 22:47:15 +04:00
/**
2011-03-02 01:20:16 +03:00
* get the current installed version of ownCloud
* @ return array
*/
2010-07-29 00:45:24 +04:00
public static function getVersion (){
2011-03-02 01:20:16 +03:00
return array ( 1 , 2 , 0 );
2010-07-29 00:45:24 +04:00
}
2010-03-10 15:03:40 +03:00
2011-03-02 01:20:16 +03:00
/**
* add a javascript file
*
* @ param url $url
*/
public static function addScript ( $application , $file = null ){
if ( is_null ( $file )){
$file = $application ;
$application = " " ;
}
self :: $scripts [] = " $application /js/ $file " ;
2011-01-18 20:10:37 +03:00
}
2011-03-02 01:20:16 +03:00
/**
* add a css file
*
* @ param url $url
*/
public static function addStyle ( $application , $file = null ){
if ( is_null ( $file )){
$file = $application ;
$application = " " ;
}
self :: $styles [] = " $application /css/ $file " ;
}
2011-04-16 22:34:18 +04:00
/**
* formats a timestamp in the " right " way
*
* @ param timestamp $timestamp
*/
public static function formatDate ( $timestamp ){
$timeformat = 'F j, Y, H:i' ;
return date ( $timeformat , $timestamp );
}
2011-04-17 21:46:09 +04:00
/**
* Shows a pagenavi widget where you can jump to different pages .
*
* @ param int $pagecount
* @ param int $page
* @ param string $url
* @ return html - string
*/
public static function showPageNavi ( $pagecount , $page , $url ) {
$pagelinkcount = 8 ;
if ( $pagecount > 1 ) {
$pagestart = $page - $pagelinkcount ;
if ( $pagestart < 0 ) $pagestart = 0 ;
$pagestop = $page + $pagelinkcount ;
if ( $pagestop > $pagecount ) $pagestop = $pagecount ;
2011-04-18 13:30:56 +04:00
$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 );
$tmpl -> printPage ();
2011-04-17 21:46:09 +04:00
}
}
2011-04-16 22:34:18 +04:00
2011-03-02 01:20:16 +03:00
/**
* check if the current server configuration is suitable for ownCloud
2011-04-16 20:26:13 +04:00
* @ return array arrays with error messages and hints
2011-03-02 01:20:16 +03:00
*/
public static function checkServer (){
global $SERVERROOT ;
2011-04-16 14:18:42 +04:00
global $CONFIG_DATADIRECTORY ;
$CONFIG_DATADIRECTORY_ROOT = OC_CONFIG :: getValue ( " datadirectory " , " $SERVERROOT /data " );;
$CONFIG_BACKUPDIRECTORY = OC_CONFIG :: getValue ( " backupdirectory " , " $SERVERROOT /backup " );
2011-04-16 13:11:16 +04:00
$CONFIG_INSTALLED = OC_CONFIG :: getValue ( " installed " , false );
2011-04-16 17:47:27 +04:00
$errors = array ();
2011-04-16 20:08:40 +04:00
2011-04-16 17:47:27 +04:00
//check for database drivers
2011-03-02 01:20:16 +03:00
if ( ! is_callable ( 'sqlite_open' ) and ! is_callable ( 'mysql_connect' )){
2011-04-16 20:26:13 +04:00
$errors [] = array ( 'error' => 'No database drivers (sqlite or mysql) installed.<br/>' , 'hint' => '' ); //TODO: sane hint
2011-03-02 01:20:16 +03:00
}
2011-04-16 13:11:16 +04:00
$CONFIG_DBTYPE = OC_CONFIG :: getValue ( " dbtype " , " sqlite " );
$CONFIG_DBNAME = OC_CONFIG :: getValue ( " dbname " , " owncloud " );
2011-04-16 17:47:27 +04:00
2011-04-16 20:26:13 +04:00
//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
2011-04-17 20:19:40 +04:00
$permissionsHint = " Permissions can usually be fixed by setting the owner of the file or directory to the user the web server runs as ( $serverUser ) " ;
2011-04-16 20:26:13 +04:00
2011-04-16 17:47:27 +04:00
//check for correct file permissions
2011-03-02 01:20:16 +03:00
if ( ! stristr ( PHP_OS , 'WIN' )){
if ( $CONFIG_DBTYPE == 'sqlite' ){
$file = $SERVERROOT . '/' . $CONFIG_DBNAME ;
if ( file_exists ( $file )){
2011-01-18 20:10:37 +03:00
$prems = substr ( decoct ( fileperms ( $file )), - 3 );
if ( substr ( $prems , 2 , 1 ) != '0' ){
2011-03-02 01:20:16 +03:00
@ chmod ( $file , 0660 );
clearstatcache ();
$prems = substr ( decoct ( fileperms ( $file )), - 3 );
if ( substr ( $prems , 2 , 1 ) != '0' ){
2011-04-16 20:26:13 +04:00
$errors [] = array ( 'error' => 'SQLite database file (' . $file . ') is readable from the web<br/>' , 'hint' => $permissionsHint );
2011-03-02 01:20:16 +03:00
}
2011-01-18 20:10:37 +03:00
}
2010-06-01 15:59:04 +04:00
}
2010-05-09 18:33:16 +04:00
}
2011-01-18 20:10:37 +03:00
$prems = substr ( decoct ( fileperms ( $CONFIG_DATADIRECTORY_ROOT )), - 3 );
if ( substr ( $prems , - 1 ) != '0' ){
2011-04-16 12:23:15 +04:00
OC_HELPER :: chmodr ( $CONFIG_DATADIRECTORY_ROOT , 0770 );
2011-01-18 20:10:37 +03:00
clearstatcache ();
2011-03-02 01:20:16 +03:00
$prems = substr ( decoct ( fileperms ( $CONFIG_DATADIRECTORY_ROOT )), - 3 );
2011-01-18 20:10:37 +03:00
if ( substr ( $prems , 2 , 1 ) != '0' ){
2011-04-16 20:26:13 +04:00
$errors [] = array ( 'error' => 'Data directory (' . $CONFIG_DATADIRECTORY_ROOT . ') is readable from the web<br/>' , 'hint' => $permissionsHint );
2011-01-18 20:10:37 +03:00
}
}
2011-04-16 14:18:42 +04:00
if ( OC_CONFIG :: getValue ( " enablebackup " , false )){
2011-03-02 01:20:16 +03:00
$prems = substr ( decoct ( fileperms ( $CONFIG_BACKUPDIRECTORY )), - 3 );
if ( substr ( $prems , - 1 ) != '0' ){
2011-04-16 12:23:15 +04:00
OC_HELPER :: chmodr ( $CONFIG_BACKUPDIRECTORY , 0770 );
2011-03-02 01:20:16 +03:00
clearstatcache ();
$prems = substr ( decoct ( fileperms ( $CONFIG_BACKUPDIRECTORY )), - 3 );
if ( substr ( $prems , 2 , 1 ) != '0' ){
2011-04-16 20:26:13 +04:00
$errors [] = array ( 'error' => 'Data directory (' . $CONFIG_BACKUPDIRECTORY . ') is readable from the web<br/>' , 'hint' => $permissionsHint );
2011-03-02 01:20:16 +03:00
}
}
}
} else {
//TODO: premisions checks for windows hosts
}
2011-04-16 22:27:08 +04:00
if ( is_dir ( $CONFIG_DATADIRECTORY_ROOT ) and ! is_writable ( $CONFIG_DATADIRECTORY_ROOT )){
2011-04-16 20:26:13 +04:00
$errors [] = array ( 'error' => 'Data directory (' . $CONFIG_DATADIRECTORY_ROOT . ') not writable by ownCloud<br/>' , 'hint' => $permissionsHint );
2011-01-18 20:10:37 +03:00
}
2011-04-16 20:08:40 +04:00
2011-04-16 17:47:27 +04:00
//TODO: check for php modules
2011-04-16 20:08:40 +04:00
2011-04-16 17:47:27 +04:00
return $errors ;
2010-05-09 18:33:16 +04:00
}
2011-03-29 22:21:00 +04:00
}
/**
* This class manages the hooks . It basically provides two functions : adding
* slots and emitting signals .
*/
class OC_HOOK {
static private $registered = array ();
2010-03-16 10:48:36 +03:00
2011-03-29 22:21:00 +04:00
/**
* @ 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
*/
2011-04-16 01:09:05 +04:00
static public function connect ( $signalclass , $signalname , $slotclass , $slotname ){
2011-03-29 22:21:00 +04:00
// 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 ();
2010-05-15 01:32:35 +04:00
}
2011-03-29 22:21:00 +04:00
// register hook
self :: $registered [ $signalclass ][ $signalname ][] = array (
" class " => $slotclass ,
" name " => $slotname );
// No chance for failure ;-)
return true ;
2010-05-15 01:32:35 +04:00
}
2010-03-10 15:03:40 +03:00
2011-03-29 22:21:00 +04:00
/**
* @ 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
*/
2011-04-16 01:09:05 +04:00
static public function emit ( $signalclass , $signalname , $params = array ()){
2011-03-29 22:21:00 +04:00
// 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 ( $registered [ $signalclass ][ $signalname ] as $i ){
call_user_func ( array ( $i [ " class " ], $i [ " name " ] ), $params );
}
// return true
return true ;
}
}
2010-06-27 02:16:09 +04:00
?>