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();
2010-05-04 05:21:57 +04:00
// error_reporting(E_ALL | E_STRICT);
2011-03-02 01:20:16 +03:00
error_reporting ( E_ERROR | E_PARSE | E_WARNING ); // MDB2 gives loads of strict error, disabling for now
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
2010-04-24 14:40:20 +04:00
// set_include_path(get_include_path().PATH_SEPARATOR.$SERVERROOT.PATH_SEPARATOR.$SERVERROOT.'/inc'.PATH_SEPARATOR.$SERVERROOT.'/config');
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 ;
}
2010-03-16 10:48:36 +03:00
// define default config values
2010-04-22 21:03:54 +04:00
$CONFIG_INSTALLED = false ;
2010-04-19 21:46:42 +04:00
$CONFIG_DATADIRECTORY = $SERVERROOT . '/data' ;
2010-05-08 23:32:20 +04:00
$CONFIG_BACKUPDIRECTORY = $SERVERROOT . '/backup' ;
2010-03-16 10:48:36 +03:00
$CONFIG_HTTPFORCESSL = false ;
2010-05-08 23:32:20 +04:00
$CONFIG_ENABLEBACKUP = false ;
2010-03-16 10:48:36 +03:00
$CONFIG_DATEFORMAT = 'j M Y G:i' ;
$CONFIG_DBNAME = 'owncloud' ;
2010-03-31 00:15:45 +04:00
$CONFIG_DBTYPE = 'sqlite' ;
2010-09-06 22:07:27 +04:00
$CONFIG_FILESYSTEM = array ();
2010-04-19 21:46:42 +04:00
2010-03-16 10:48:36 +03:00
// include the generated configfile
2010-05-02 13:24:46 +04:00
@ include_once ( $SERVERROOT . '/config/config.php' );
2010-03-16 10:48:36 +03:00
2010-05-04 05:21:57 +04:00
$CONFIG_DATADIRECTORY_ROOT = $CONFIG_DATADIRECTORY ; // store this in a seperate variable so we can change the data directory to jail users.
2010-03-10 15:03:40 +03:00
// redirect to https site if configured
2010-03-16 10:48:36 +03:00
if ( isset ( $CONFIG_HTTPFORCESSL ) and $CONFIG_HTTPFORCESSL ){
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 " );
exit ;
}
2010-03-10 15:03:40 +03:00
}
// load core libs
2011-03-04 01:08:11 +03:00
oc_require_once ( 'helper.php' );
2011-03-03 23:55:32 +03:00
oc_require_once ( 'app.php' );
2011-03-02 01:20:16 +03:00
oc_require_once ( 'files.php' );
oc_require_once ( 'filesystem.php' );
oc_require_once ( 'filestorage.php' );
oc_require_once ( 'fileobserver.php' );
oc_require_once ( 'log.php' );
oc_require_once ( 'config.php' );
oc_require_once ( 'user.php' );
2011-04-15 19:14:02 +04:00
oc_require_once ( 'group.php' );
2011-03-02 01:20:16 +03:00
oc_require_once ( 'ocs.php' );
oc_require_once ( 'connect.php' );
oc_require_once ( 'remotestorage.php' );
oc_require_once ( 'plugin.php' );
2010-04-22 21:03:54 +04:00
2011-03-03 23:55:32 +03:00
OC_PLUGIN :: loadPlugins ( " " );
2010-04-28 14:15:52 +04:00
2010-08-05 04:44:54 +04:00
if ( ! isset ( $CONFIG_BACKEND )){
$CONFIG_BACKEND = 'database' ;
}
2011-04-15 20:13:49 +04:00
OC_USER :: setBackend ( $CONFIG_BACKEND );
OC_GROUP :: setBackend ( $CONFIG_BACKEND );
2010-08-03 19:43:54 +04:00
2011-03-03 00:18:22 +03:00
// Set up file system unless forbidden
if ( ! $RUNTIME_NOSETUPFS ){
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
2011-03-18 16:12:06 +03:00
OC_APP :: addPersonalMenuEntry ( array ( " order " => 1000 , " href " => OC_HELPER :: linkTo ( " " , " index.php?logout=1 " ), " name " => " Logout " ));
2011-03-03 00:18:22 +03:00
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-03-04 01:08:11 +03:00
// Load Apps
OC_APP :: loadApps ();
2010-03-10 15:03:40 +03:00
2010-03-16 10:48:36 +03:00
// check if the server is correctly configured for ownCloud
OC_UTIL :: checkserver ();
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_ROOT ;
global $CONFIG_DATADIRECTORY ;
global $CONFIG_BACKUPDIRECTORY ;
global $CONFIG_ENABLEBACKUP ;
2010-09-06 22:02:17 +04:00
global $CONFIG_FILESYSTEM ;
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 ));
2010-09-02 22:47:15 +04:00
if ( $CONFIG_ENABLEBACKUP ){
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
2010-09-06 22:02:17 +04:00
//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 " ;
}
/**
* check if the current server configuration is suitable for ownCloud
*
*/
public static function checkServer (){
global $SERVERROOT ;
global $CONFIG_DATADIRECTORY_ROOT ;
global $CONFIG_BACKUPDIRECTORY ;
global $CONFIG_ENABLEBACKUP ;
global $CONFIG_INSTALLED ;
$error = '' ;
if ( ! is_callable ( 'sqlite_open' ) and ! is_callable ( 'mysql_connect' )){
$error .= 'No database drivers (sqlite or mysql) installed.<br/>' ;
}
global $CONFIG_DBTYPE ;
global $CONFIG_DBNAME ;
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' ){
$error .= 'SQLite database file (' . $file . ') is readable from the web<br/>' ;
}
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-03-02 01:20:16 +03:00
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-03-02 01:20:16 +03:00
$error .= 'Data directory (' . $CONFIG_DATADIRECTORY_ROOT . ') is readable from the web<br/>' ;
2011-01-18 20:10:37 +03:00
}
}
2011-03-02 01:20:16 +03:00
if ( $CONFIG_ENABLEBACKUP ){
$prems = substr ( decoct ( fileperms ( $CONFIG_BACKUPDIRECTORY )), - 3 );
if ( substr ( $prems , - 1 ) != '0' ){
chmodr ( $CONFIG_BACKUPDIRECTORY , 0770 );
clearstatcache ();
$prems = substr ( decoct ( fileperms ( $CONFIG_BACKUPDIRECTORY )), - 3 );
if ( substr ( $prems , 2 , 1 ) != '0' ){
$error .= 'Data directory (' . $CONFIG_BACKUPDIRECTORY . ') is readable from the web<br/>' ;
}
}
}
} else {
//TODO: premisions checks for windows hosts
}
if ( $error ){
die ( $error );
2011-01-18 20:10:37 +03:00
}
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-03-16 10:48:36 +03:00
2010-03-10 15:03:40 +03:00
/**
2011-04-08 18:53:17 +04:00
* This class manages the access to the database . It basically is a wrapper for
* MDB2 with some adaptions .
2010-03-10 15:03:40 +03:00
*/
class OC_DB {
2010-05-04 05:21:57 +04:00
static private $DBConnection = false ;
2010-06-18 22:08:24 +04:00
static private $schema = false ;
2010-07-05 15:31:32 +04:00
static private $affected = 0 ;
static private $result = false ;
2011-04-08 18:53:17 +04:00
2010-05-04 05:21:57 +04:00
/**
2011-04-08 18:53:17 +04:00
* @ brief connects to the database
* @ returns true if connection can be established or nothing ( die ())
*
* Connects to the database as specified in config . php
*/
static public function connect (){
// The global data we need
2010-05-04 05:21:57 +04:00
global $CONFIG_DBNAME ;
global $CONFIG_DBHOST ;
global $CONFIG_DBUSER ;
global $CONFIG_DBPASSWORD ;
2010-04-22 21:03:54 +04:00
global $CONFIG_DBTYPE ;
2010-05-04 05:21:57 +04:00
global $DOCUMENTROOT ;
global $SERVERROOT ;
2011-04-08 18:53:17 +04:00
// do nothing if the connection already has been established
2010-05-04 05:21:57 +04:00
if ( ! self :: $DBConnection ){
2011-04-08 18:53:17 +04:00
// Require MDB2.php (TODO: why here not in head of file?)
2011-02-06 03:54:07 +03:00
@ oc_require_once ( 'MDB2.php' );
2011-04-08 18:53:17 +04:00
// Prepare options array
2010-05-04 05:21:57 +04:00
$options = array (
2011-04-15 20:13:49 +04:00
'portability' => MDB2_PORTABILITY_ALL ,
'log_line_break' => '<br>' ,
'idxname_format' => '%s' ,
'debug' => true ,
'quote_identifier' => true );
2011-04-08 18:53:17 +04:00
// Add the dsn according to the database type
2011-04-15 20:13:49 +04:00
if ( $CONFIG_DBTYPE == 'sqlite' ){
2011-04-08 18:53:17 +04:00
// sqlite
2010-05-04 05:21:57 +04:00
$dsn = array (
2011-04-08 18:53:17 +04:00
'phptype' => 'sqlite' ,
'database' => " $SERVERROOT / $CONFIG_DBNAME " ,
'mode' => '0644' );
}
2011-04-15 20:13:49 +04:00
elseif ( $CONFIG_DBTYPE == 'mysql' ){
2011-04-08 18:53:17 +04:00
// MySQL
2010-05-04 05:21:57 +04:00
$dsn = array (
2011-04-08 18:53:17 +04:00
'phptype' => 'mysql' ,
'username' => $CONFIG_DBUSER ,
'password' => $CONFIG_DBPASSWORD ,
'hostspec' => $CONFIG_DBHOST ,
'database' => $CONFIG_DBNAME );
}
2011-04-15 20:13:49 +04:00
elseif ( $CONFIG_DBTYPE == 'pgsql' ){
2011-04-08 18:53:17 +04:00
// PostgreSQL
2010-06-20 19:58:39 +04:00
$dsn = array (
2011-04-08 18:53:17 +04:00
'phptype' => 'pgsql' ,
'username' => $CONFIG_DBUSER ,
'password' => $CONFIG_DBPASSWORD ,
'hostspec' => $CONFIG_DBHOST ,
'database' => $CONFIG_DBNAME );
2010-04-22 21:03:54 +04:00
}
2011-04-08 18:53:17 +04:00
// Try to establish connection
self :: $DBConnection = MDB2 :: factory ( $dsn , $options );
// Die if we could not connect
if ( PEAR :: isError ( self :: $DBConnection )){
echo ( '<b>can not connect to database, using ' . $CONFIG_DBTYPE . '. (' . self :: $DBConnection -> getUserInfo () . ')</center>' );
$error = self :: $DBConnection -> getMessage ();
error_log ( $error );
error_log ( self :: $DBConnection -> getUserInfo ());
die ( $error );
2010-05-04 05:21:57 +04:00
}
2011-04-08 18:53:17 +04:00
// We always, really always want associative arrays
2010-05-04 05:21:57 +04:00
self :: $DBConnection -> setFetchMode ( MDB2_FETCHMODE_ASSOC );
2010-09-11 23:09:53 +04:00
}
2011-03-02 01:20:16 +03:00
2011-04-08 18:53:17 +04:00
// we are done. great!
return true ;
2010-05-04 05:21:57 +04:00
}
2011-03-02 01:20:16 +03:00
2010-05-04 05:21:57 +04:00
/**
2011-04-08 18:53:17 +04:00
* @ brief SQL query
* @ param $query Query string
* @ returns result as MDB2_Result
2011-03-02 01:20:16 +03:00
*
2011-04-08 18:53:17 +04:00
* SQL query via MDB2 query ()
2011-03-02 01:20:16 +03:00
*/
2011-04-08 18:53:17 +04:00
static public function query ( $query ){
// Optimize the query
$query = self :: processQuery ( $query );
2011-01-23 05:23:03 +03:00
2011-04-08 18:53:17 +04:00
self :: connect ();
//fix differences between sql versions
2011-03-02 01:20:16 +03:00
2011-04-08 18:53:17 +04:00
// return the result
$result = self :: $DBConnection -> exec ( $query );
2011-01-23 05:23:03 +03:00
2011-04-08 18:53:17 +04:00
// Die if we have an error (error means: bad query, not 0 results!)
if ( PEAR :: isError ( $result )) {
$entry = 'DB Error: "' . $result -> getMessage () . '"<br />' ;
$entry .= 'Offending command was: ' . $cmd . '<br />' ;
error_log ( $entry );
die ( $entry );
2010-06-20 19:58:39 +04:00
}
2011-03-02 01:20:16 +03:00
2011-04-08 18:53:17 +04:00
return $result ;
2010-05-04 05:21:57 +04:00
}
2010-03-10 15:03:40 +03:00
2010-05-04 05:21:57 +04:00
/**
2011-04-08 18:53:17 +04:00
* @ brief Prepare a SQL query
* @ param $query Query string
* @ returns prepared SQL query
*
* SQL query via MDB2 prepare (), needs to be execute () ' d !
*/
static public function prepare ( $query ){
// Optimize the query
$query = self :: processQuery ( $query );
2010-03-10 15:03:40 +03:00
2011-04-08 18:53:17 +04:00
self :: connect ();
// return the result
$result = self :: $DBConnection -> prepare ( $query );
2010-03-10 15:03:40 +03:00
2011-04-08 18:53:17 +04:00
// Die if we have an error (error means: bad query, not 0 results!)
if ( PEAR :: isError ( $result )) {
$entry = 'DB Error: "' . $result -> getMessage () . '"<br />' ;
$entry .= 'Offending command was: ' . $cmd . '<br />' ;
error_log ( $entry );
die ( $entry );
}
2011-03-02 01:20:16 +03:00
2011-04-08 18:53:17 +04:00
return $result ;
2010-05-16 00:29:14 +04:00
}
/**
2011-04-08 18:53:17 +04:00
* @ brief gets last value of autoincrement
* @ returns id
*
* MDB2 lastInsertID ()
*
* Call this method right after the insert command or other functions may
* cause trouble !
*/
public static function insertid (){
self :: connect ();
return self :: $DBConnection -> lastInsertID ();
2010-05-16 00:29:14 +04:00
}
2011-03-02 01:20:16 +03:00
2010-05-04 05:21:57 +04:00
/**
2011-04-08 18:53:17 +04:00
* @ brief Disconnect
* @ returns true / false
*
* This is good bye , good bye , yeah !
*/
public static function disconnect (){
// Cut connection if required
2010-05-04 05:21:57 +04:00
if ( self :: $DBConnection ){
self :: $DBConnection -> disconnect ();
self :: $DBConnection = false ;
}
2011-04-08 18:53:17 +04:00
return true ;
2010-05-04 05:21:57 +04:00
}
2011-03-02 01:20:16 +03:00
2010-05-23 01:05:49 +04:00
/**
2011-04-08 18:53:17 +04:00
* @ brief Escapes bad characters
* @ param $string string with dangerous characters
* @ returns escaped string
*
* MDB2 escape ()
*/
public static function escape ( $string ){
self :: connect ();
return self :: $DBConnection -> escape ( $string );
2010-05-04 05:21:57 +04:00
}
2011-03-02 01:20:16 +03:00
2011-04-08 18:53:17 +04:00
/**
* @ brief saves database scheme to xml file
* @ param $file name of file
* @ returns true / false
*
* TODO : write more documentation
*/
public static function getDbStructure ( $file ){
self :: connectScheme ();
// write the scheme
2010-06-18 22:08:24 +04:00
$definition = self :: $schema -> getDefinitionFromDatabase ();
$dump_options = array (
'output_mode' => 'file' ,
'output' => $file ,
'end_of_line' => " \n "
);
2011-04-08 18:53:17 +04:00
self :: $schema -> dumpDatabase ( $definition , $dump_options , MDB2_SCHEMA_DUMP_STRUCTURE );
return true ;
2010-06-18 22:08:24 +04:00
}
2011-03-02 01:20:16 +03:00
2011-04-08 18:53:17 +04:00
/**
* @ brief Creates tables from XML file
* @ param $file file to read structure from
* @ returns true / false
*
* TODO : write more documentation
*/
public static function createDbFromStructure ( $file ){
2010-07-06 21:57:08 +04:00
global $CONFIG_DBNAME ;
global $CONFIG_DBTABLEPREFIX ;
2011-04-08 18:53:17 +04:00
self :: connectScheme ();
// read file
$content = file_get_contents ( $file );
// Make changes and save them to a temporary file
$file2 = tempnam ( sys_get_temp_dir (), 'oc_db_scheme_' );
$content = str_replace ( '*dbname*' , $CONFIG_DBNAME , $content );
$content = str_replace ( '*dbprefix*' , $CONFIG_DBTABLEPREFIX , $content );
file_put_contents ( $file2 , $content );
// Try to create tables
$definition = @ self :: $schema -> parseDatabaseDefinitionFile ( $file2 );
// Delete our temporary file
unlink ( $file2 );
// Die in case something went wrong
if ( $definition instanceof MDB2_Schema_Error ){
die ( $definition -> getMessage () . ': ' . $definition -> getUserInfo ());
2010-06-18 22:08:24 +04:00
}
2011-04-08 18:53:17 +04:00
$ret =@ self :: $schema -> createDatabase ( $definition );
// Die in case something went wrong
if ( $ret instanceof MDB2_Error ){
2010-06-18 22:08:24 +04:00
die ( $ret -> getMessage () . ': ' . $ret -> getUserInfo ());
}
2011-04-08 18:53:17 +04:00
return true ;
}
/**
* @ brief connects to a MDB2 database scheme
* @ returns true / false
*
* Connects to a MDB2 database scheme
*/
private static function connectScheme (){
// We need a database connection
self :: connect ();
// Connect if this did not happen before
if ( ! self :: $schema ){
@ oc_require_once ( 'MDB2/Schema.php' );
self :: $schema =& MDB2_Schema :: factory ( self :: $DBConnection );
}
return true ;
}
/**
* @ brief does minor chages to query
* @ param $query Query string
* @ returns corrected query string
*
* This function replaces * PREFIX * with the value of $CONFIG_DBTABLEPREFIX
* and replaces the ` woth ' or " according to the database driver.
*/
private static function processQuery ( $query ){
// We need Database type and table prefix
global $CONFIG_DBTYPE ;
global $CONFIG_DBTABLEPREFIX ;
// differences in escaping of table names (` for mysql)
// Problem: what if there is a ` in the value we want to insert?
if ( $CONFIG_DBTYPE == 'sqlite' ){
$query = str_replace ( '`' , '\'' , $query );
}
elseif ( $CONFIG_DBTYPE == 'pgsql' ){
$query = str_replace ( '`' , '"' , $query );
}
// replace table names
$query = str_replace ( '*PREFIX*' , $CONFIG_DBTABLEPREFIX , $query );
return $query ;
2010-06-18 22:08:24 +04:00
}
2010-03-10 15:03:40 +03:00
}
2010-04-24 14:40:20 +04:00
//custom require/include functions because not all hosts allow us to set the include path
function oc_require ( $file ){
global $SERVERROOT ;
global $DOCUMENTROOT ;
global $WEBROOT ;
global $CONFIG_DBNAME ;
global $CONFIG_DBHOST ;
global $CONFIG_DBUSER ;
global $CONFIG_DBPASSWORD ;
global $CONFIG_DBTYPE ;
global $CONFIG_DATADIRECTORY ;
global $CONFIG_HTTPFORCESSL ;
global $CONFIG_DATEFORMAT ;
global $CONFIG_INSTALLED ;
2011-03-02 01:20:16 +03:00
2010-04-24 14:40:20 +04:00
if ( is_file ( $file )){
2010-05-04 05:21:57 +04:00
return require ( $file );
2011-03-02 01:20:16 +03:00
}
elseif ( is_file ( $SERVERROOT . '/' . $file )){
2010-05-04 05:21:57 +04:00
return require ( $SERVERROOT . '/' . $file );
2011-03-02 01:20:16 +03:00
}
elseif ( is_file ( $SERVERROOT . '/lib/' . $file )){
return require ( $SERVERROOT . '/lib/' . $file );
}
elseif ( is_file ( $SERVERROOT . '/3dparty/' . $file )){
return require ( $SERVERROOT . '/3dparty/' . $file );
2010-04-24 14:40:20 +04:00
}
}
function oc_require_once ( $file ){
global $SERVERROOT ;
global $DOCUMENTROOT ;
global $WEBROOT ;
global $CONFIG_DBNAME ;
global $CONFIG_DBHOST ;
global $CONFIG_DBUSER ;
global $CONFIG_DBPASSWORD ;
global $CONFIG_DBTYPE ;
global $CONFIG_DATADIRECTORY ;
global $CONFIG_HTTPFORCESSL ;
global $CONFIG_DATEFORMAT ;
global $CONFIG_INSTALLED ;
2011-03-02 01:20:16 +03:00
2010-04-24 14:40:20 +04:00
if ( is_file ( $file )){
2010-05-04 05:21:57 +04:00
return require_once ( $file );
2011-03-02 01:20:16 +03:00
}
elseif ( is_file ( $SERVERROOT . '/' . $file )){
2010-05-04 05:21:57 +04:00
return require_once ( $SERVERROOT . '/' . $file );
2011-03-02 01:20:16 +03:00
}
elseif ( is_file ( $SERVERROOT . '/lib/' . $file )){
return require_once ( $SERVERROOT . '/lib/' . $file );
}
elseif ( is_file ( $SERVERROOT . '/3dparty/' . $file )){
return require_once ( $SERVERROOT . '/3dparty/' . $file );
2010-04-24 14:40:20 +04:00
}
}
function oc_include ( $file ){
global $SERVERROOT ;
global $DOCUMENTROOT ;
global $WEBROOT ;
global $CONFIG_DBNAME ;
global $CONFIG_DBHOST ;
global $CONFIG_DBUSER ;
global $CONFIG_DBPASSWORD ;
global $CONFIG_DBTYPE ;
global $CONFIG_DATADIRECTORY ;
global $CONFIG_HTTPFORCESSL ;
global $CONFIG_DATEFORMAT ;
global $CONFIG_INSTALLED ;
2011-03-02 01:20:16 +03:00
2010-04-24 14:40:20 +04:00
if ( is_file ( $file )){
2010-05-04 05:21:57 +04:00
return include ( $file );
2011-03-02 01:20:16 +03:00
}
elseif ( is_file ( $SERVERROOT . '/' . $file )){
2010-05-04 05:21:57 +04:00
return include ( $SERVERROOT . '/' . $file );
2011-03-02 01:20:16 +03:00
}
elseif ( is_file ( $SERVERROOT . '/lib/' . $file )){
return include ( $SERVERROOT . '/lib/' . $file );
}
elseif ( is_file ( $SERVERROOT . '/3dparty/' . $file )){
return include ( $SERVERROOT . '/3dparty/' . $file );
2010-04-24 14:40:20 +04:00
}
}
function oc_include_once ( $file ){
global $SERVERROOT ;
global $DOCUMENTROOT ;
global $WEBROOT ;
global $CONFIG_DBNAME ;
global $CONFIG_DBHOST ;
global $CONFIG_DBUSER ;
global $CONFIG_DBPASSWORD ;
global $CONFIG_DBTYPE ;
global $CONFIG_DATADIRECTORY ;
global $CONFIG_HTTPFORCESSL ;
global $CONFIG_DATEFORMAT ;
global $CONFIG_INSTALLED ;
2011-03-02 01:20:16 +03:00
if ( is_file ( $file )){
2010-07-05 13:37:50 +04:00
return include_once ( $file );
2010-04-24 14:40:20 +04:00
}
2011-03-02 01:20:16 +03:00
elseif ( is_file ( $SERVERROOT . '/' . $file )){
return include_once ( $SERVERROOT . '/' . $file );
}
elseif ( is_file ( $SERVERROOT . '/lib/' . $file )){
return include_once ( $SERVERROOT . '/lib/' . $file );
}
elseif ( is_file ( $SERVERROOT . '/3dparty/' . $file )){
return include_once ( $SERVERROOT . '/3dparty/' . $file );
}
2010-04-24 14:40:20 +04:00
}
2011-03-02 01:20:16 +03:00
function chmodr ( $path , $filemode ) {
// echo "$path<br/>";
if ( ! is_dir ( $path ))
return chmod ( $path , $filemode );
$dh = opendir ( $path );
while (( $file = readdir ( $dh )) !== false ) {
if ( $file != '.' && $file != '..' ) {
$fullpath = $path . '/' . $file ;
if ( is_link ( $fullpath ))
return FALSE ;
elseif ( ! is_dir ( $fullpath ) && ! chmod ( $fullpath , $filemode ))
return FALSE ;
elseif ( ! chmodr ( $fullpath , $filemode ))
return FALSE ;
}
}
closedir ( $dh );
if ( chmod ( $path , $filemode ))
return TRUE ;
else
return FALSE ;
}
2010-06-27 02:16:09 +04:00
?>