2011-04-16 22:45:05 +00:00
< ? php
if ( isset ( $_POST [ 'install' ]) and $_POST [ 'install' ] == 'true' ){
$errors = OC_INSTALLER :: install ( $_POST );
if ( count ( $errors ) > 0 ){
OC_TEMPLATE :: printGuestPage ( " " , " error " , array ( " errors " => $errors ));
} else {
header ( " Location: $WEBROOT " );
exit ();
}
}
class OC_INSTALLER {
public static function install ( $options ){
$error = array ();
$dbtype = $options [ 'dbtype' ];
if ( empty ( $options [ 'login' ])){
$error [] = array ( 'error' => 'username not set' );
};
if ( empty ( $options [ 'pass' ])){
$error [] = array ( 'error' => 'password not set' );
};
if ( empty ( $options [ 'directory' ])){
$error [] = array ( 'error' => 'data directory not set' );
};
if ( $dbtype == 'mysql' ){ //mysql needs more config options
if ( empty ( $options [ 'dbuser' ])){
2011-04-17 09:59:15 +00:00
$error [] = array ( 'error' => 'database user not set' );
2011-04-16 22:45:05 +00:00
};
if ( empty ( $options [ 'dbpass' ])){
2011-04-17 09:59:15 +00:00
$error [] = array ( 'error' => 'database password not set' );
2011-04-16 22:45:05 +00:00
};
if ( empty ( $options [ 'dbname' ])){
2011-04-17 09:59:15 +00:00
$error [] = array ( 'error' => 'database name not set' );
2011-04-16 22:45:05 +00:00
};
if ( empty ( $options [ 'dbhost' ])){
2011-04-17 09:59:15 +00:00
$error [] = array ( 'error' => 'database host not set' );
2011-04-16 22:45:05 +00:00
};
if ( ! isset ( $options [ 'dbtableprefix' ])){
2011-04-17 09:59:15 +00:00
$error [] = array ( 'error' => 'database table prefix not set' );
2011-04-16 22:45:05 +00:00
};
}
if ( count ( $error ) == 0 ){ //no errors, good
$username = $options [ 'login' ];
$password = $options [ 'pass' ];
$datadir = $options [ 'directory' ];
//write the config file
OC_CONFIG :: setValue ( 'datadirectory' , $datadir );
OC_CONFIG :: setValue ( 'dbtype' , $dbtype );
if ( $dbtype == 'mysql' ){
$dbuser = $options [ 'dbuser' ];
$dbpass = $options [ 'dbpass' ];
$dbname = $options [ 'dbname' ];
$dbhost = $options [ 'dbhost' ];
$dbtableprefix = $options [ 'dbtableprefix' ];
OC_CONFIG :: setValue ( 'dbname' , $dbname );
OC_CONFIG :: setValue ( 'dbhost' , $dbhost );
OC_CONFIG :: setValue ( 'dbtableprefix' , $dbtableprefix );
//check if the database user has admin right
2011-04-17 09:59:15 +00:00
$connection =@ mysql_connect ( $dbhost , $dbuser , $dbpass );
2011-04-16 22:45:05 +00:00
if ( ! $connection ) {
2011-04-17 09:59:15 +00:00
$error [] = array ( 'error' => 'mysql username and/or password not valid' , 'hint' => 'you need to enter either an existing account, or the administrative account if you wish to create a new user for ownCloud' );
2011-04-16 22:45:05 +00:00
} else {
$query = " SELECT user FROM mysql.user WHERE user=' $dbuser ' " ; //this should be enough to check for admin rights in mysql
if ( mysql_query ( $query , $connection )){
2011-04-17 09:09:42 +00:00
self :: createDBUser ( $username , $password , $connection );
2011-04-16 22:45:05 +00:00
//use the admin login data for the new database user
OC_CONFIG :: setValue ( 'dbuser' , $username );
2011-04-17 13:25:51 +00:00
OC_CONFIG :: setValue ( 'dbpassword' , $password );
2011-04-17 09:09:42 +00:00
//create the database
self :: createDatabase ( $dbname , $username , $connection );
2011-04-16 22:45:05 +00:00
} else {
OC_CONFIG :: setValue ( 'dbuser' , $dbuser );
2011-04-17 09:09:42 +00:00
OC_CONFIG :: setValue ( 'dbpassword' , $dbpass );
2011-04-16 22:45:05 +00:00
//create the database
2011-04-17 09:09:42 +00:00
self :: createDatabase ( $dbname , $dbuser , $connection );
2011-04-16 22:45:05 +00:00
}
2011-04-17 09:59:15 +00:00
//fill the database if needed
$query = " SELECT * FROM $dbname . { $dbtableprefix } users " ;
$result = mysql_query ( $query , $connection );
if ( ! $result ) {
OC_DB :: createDbFromStructure ( 'db_structure.xml' );
}
mysql_close ( $connection );
2011-04-16 22:45:05 +00:00
}
2011-04-17 09:09:42 +00:00
} else {
//in case of sqlite, we can always fill the database
OC_DB :: createDbFromStructure ( 'db_structure.xml' );
2011-04-16 22:45:05 +00:00
}
2011-04-17 09:59:15 +00:00
if ( count ( $error ) == 0 ){
//create the user and group
OC_USER :: createUser ( $username , $password );
OC_GROUP :: createGroup ( 'admin' );
OC_GROUP :: addToGroup ( $username , 'admin' );
2011-04-18 12:05:21 +00:00
//create htaccess files for apache hosts
self :: createHtaccess (); //TODO detect if apache is used
2011-04-17 09:59:15 +00:00
//and we are done
OC_CONFIG :: setValue ( 'installed' , true );
}
2011-04-16 22:45:05 +00:00
}
return $error ;
}
2011-04-17 09:09:42 +00:00
public static function createDatabase ( $name , $user , $connection ){
2011-04-16 22:45:05 +00:00
//we cant user OC_BD functions here because we need to connect as the administrative user.
$query = " CREATE DATABASE IF NOT EXISTS ` $name ` " ;
$result = mysql_query ( $query , $connection );
if ( ! $result ) {
$entry = 'DB Error: "' . mysql_error ( $connection ) . '"<br />' ;
$entry .= 'Offending command was: ' . $query . '<br />' ;
echo ( $entry );
}
$query = " GRANT ALL PRIVILEGES ON ` $name ` . * TO ' $user ' " ;
2011-04-17 09:09:42 +00:00
$result = mysql_query ( $query , $connection ); //this query will fail if there aren't the right permissons, ignore the error
2011-04-16 22:45:05 +00:00
}
2011-04-17 09:09:42 +00:00
private static function createDBUser ( $name , $password , $connection ){
2011-04-16 22:45:05 +00:00
//we need to create 2 accounts, one for global use and one for local user. if we don't speccify the local one,
// the anonymous user would take precedence when there is one.
2011-04-17 09:09:42 +00:00
$query = " CREATE USER ' $name '@'localhost' IDENTIFIED BY ' $password ' " ;
2011-04-16 22:45:05 +00:00
$result = mysql_query ( $query , $connection );
$query = " CREATE USER ' $name '@'%' IDENTIFIED BY ' $password ' " ;
$result = mysql_query ( $query , $connection );
}
2011-04-18 12:05:21 +00:00
/**
* create . htaccess files for apache hosts
*/
private static function createHtaccess (){
global $SERVERROOT ;
global $WEBROOT ;
$content = " ErrorDocument 404 / $WEBROOT /templates/404.php \n " ;
2011-04-28 14:54:10 +00:00
@ file_put_contents ( $SERVERROOT . '/.htaccess' , $content ); //supress errors in case we don't have permissions for it
2011-04-18 12:05:21 +00:00
$content = " deny from all " ;
file_put_contents ( OC_CONFIG :: getValue ( 'datadirectory' , $SERVERROOT . '/data' ) . '/.htaccess' , $content );
}
2011-04-16 22:45:05 +00:00
}
?>