* @version $Id$
* @license http://opensource.org/licenses/gpl-2.0.php GNU GPL 2
*/
/**
* Procedure d'installation du forum
*/
if (!defined('ROOT'))
{
die(utf8_decode('This file must be included.
Ce fichier doit etre inclus'));
}
if (!ini_get('date.timezone'))
{
date_default_timezone_set('Europe/Brussels');
}
/**
* Methode magique permettant le chargement dynamique de classes
*
* @param string $classname
*/
function __autoload($classname)
{
$classname = strtolower($classname);
fsb_import($classname);
}
/**
* Permet d'acceder partout aux variables globales necessaires au fonctionement du forum
*
*/
class Fsb extends Fsb_model
{
/**
* @var Config
*/
public static $cfg;
/**
* @var Dbal
*/
public static $db;
/**
* @var Debug
*/
public static $debug;
/**
* @var Fsb_frame
*/
public static $frame;
/**
* @var Adm_menu
*/
public static $menu;
/**
* @var Mods
*/
public static $mods;
/**
* @var Session
*/
public static $session;
/**
* @var Tpl
*/
public static $tpl;
}
/**
* Inclus un fichier dans le dossier main/ de facon inteligente
*
* @param string $filename
*/
function fsb_import($filename)
{
static $store;
if (!isset($store[$filename]))
{
$split = explode('_', $filename);
if (file_exists(ROOT . 'main/class/class_' . $filename . '.' . PHPEXT))
{
include_once(ROOT . 'main/class/class_' . $filename . '.' . PHPEXT);
}
else if (file_exists(ROOT . 'main/class/' . $split[0] . '/' . $filename . '.' . PHPEXT))
{
include_once(ROOT . 'main/class/' . $split[0] . '/' . $filename . '.' . PHPEXT);
}
else if (file_exists(ROOT . 'main/' . $split[0] . '/' . $filename . '.' . PHPEXT))
{
include_once(ROOT . 'main/' . $split[0] . '/' . $filename . '.' . PHPEXT);
}
else if (file_exists(ROOT . 'main/' . $filename . '.' . PHPEXT))
{
include_once(ROOT . 'main/' . $filename . '.' . PHPEXT);
}
$store[$filename] = true;
}
}
// Instance de la classe Debug
Fsb::$debug = new Debug();
// Inclusion des fonctions / classes communes a toutes les pages
fsb_import('csts');
fsb_import('globals');
fsb_import('fcts_common');
// Inclusion des fichiers utiles pour l'installation
if (file_exists(ROOT . 'config/config.' . PHPEXT))
{
include(ROOT . 'config/config.' . PHPEXT);
}
// Gestionaire d'erreur
set_error_handler(array('Display', 'error_handler'));
// Netoyage des variables GET, POST et COOKIE
Http::clean_gpc();
// Configuration de base pour les classes
$config = array('cache_tpl_type' => 'ftp');
// Instance de la classe template
Fsb::$tpl = new Tpl('./');
Fsb::$tpl->use_cache = false;
Fsb::$tpl->set_file('install.html');
// Langue d'installation
$GLOBALS['lg'] = array();
$GLOBALS['lg'] += include(ROOT . 'lang/fr/lg_common.' . PHPEXT);
$GLOBALS['lg'] += include(ROOT . 'lang/fr/lg_install.' . PHPEXT);
/**
* Pour simuler Fsb::$session->lang()
*
*/
class Session extends Fsb_model
{
public function lang($key)
{
return (@$GLOBALS['lg'][$key]);
}
}
Fsb::$session = new Session();
Http::header('Content-Type', 'text/html; charset=UTF-8');
// Convertisseur ?
if ($convert = Http::request('convert'))
{
include(ROOT . 'install/convert.' . PHPEXT);
if (file_exists(ROOT . 'install/convertors/convert_' . $convert . '.' . PHPEXT))
{
include(ROOT . 'install/convertors/convert_' . $convert . '.' . PHPEXT);
$classname = 'Convert_' . $convert;
new $classname($convert);
}
exit;
}
// Liste des DBMS supportees par FSB
$dbms = array(
'mysql' => 'MySQL 4.1+',
'mysqli' => 'MySQLi 4.1+',
'sqlite' => 'SQLite',
'pgsql' => 'PostgreSQL 8',
);
// Fichiers a chmoder
$chmod_files = array(
'config' => array('path' => 'config/config.' . PHPEXT, 'chmod' => 0666),
'cache_sql' => array('path' => 'cache/sql/', 'chmod' => 0777),
'sql_back' => array('path' => 'cache/sql_backup/', 'chmod' => 0777),
'cache_tpl' => array('path' => 'cache/tpl/', 'chmod' => 0777),
'cache_xml' => array('path' => 'cache/xml/', 'chmod' => 0777),
'cache_diff' => array('path' => 'cache/diff/', 'chmod' => 0777),
'avatars' => array('path' => 'images/avatars/', 'chmod' => 0777),
'ranks' => array('path' => 'images/ranks/', 'chmod' => 0777),
'smilies' => array('path' => 'images/smileys/', 'chmod' => 0777),
'save' => array('path' => 'mods/save/', 'chmod' => 0777),
'upload' => array('path' => 'upload/', 'chmod' => 0777),
'langs' => array('path' => 'lang/', 'chmod' => 0777),
'tpl' => array('path' => 'tpl/', 'chmod' => 0777),
'adm_tpl' => array('path' => 'admin/adm_tpl/', 'chmod' => 0777),
);
// Etapes
$steps = array(
'home' => Fsb::$session->lang('step1'),
'chmod' => Fsb::$session->lang('step2'),
'db' => Fsb::$session->lang('step3'),
'admin' => Fsb::$session->lang('step4'),
'config' => Fsb::$session->lang('step5'),
'end' => Fsb::$session->lang('step6'),
);
if (Http::request('go_to_step_chmod', 'post'))
{
$current_step = 'chmod';
}
else if (Http::request('go_to_step_db', 'post'))
{
$current_step = 'db';
}
else
{
$current_step = null;
}
// Chmod ?
if (Http::request('submit_chmod', 'post'))
{
$ftp_host = trim(Http::request('ftp_host', 'post'));
$ftp_login = trim(Http::request('ftp_login', 'post'));
$ftp_password = trim(Http::request('ftp_password', 'post'));
$ftp_port = intval(Http::request('ftp_port', 'post'));
$ftp_path = trim(Http::request('ftp_path', 'post'));
// Connexion FTP ?
if ($ftp_host && (extension_loaded('ftp') || function_exists('fsockopen')))
{
$class = (extension_loaded('ftp')) ? 'File_ftp' : 'File_socket';
$file = new $class();
$file->connexion($ftp_host, $ftp_login, $ftp_password, $ftp_port, $ftp_path);
}
else
{
$file = new File_local();
$file->connexion('', '', '', '', ROOT);
}
// Chmod des fichiers
foreach ($_POST AS $k => $v)
{
if (isset($chmod_files[$k]) && $v)
{
$file->chmod($chmod_files[$k]['path'], $chmod_files[$k]['chmod'], false);
}
}
$current_step = 'chmod';
}
/**
* Configuration
*
* @param bool $quick
*/
function install_config($quick = false)
{
if (!$quick)
{
$config_mail = trim(Http::request('config_email', 'post'));
$config_path = trim(Http::request('config_path', 'post'));
$config_cookie = trim(Http::request('config_cookie', 'post'));
$config_search = trim(Http::request('config_search', 'post'));
$default_utc = intval(Http::request('default_utc', 'post'));
$default_utc_dst = intval(Http::request('default_utc_dst', 'post'));
$config_rewriting = intval(Http::request('config_rewriting', 'post'));
$menu_webftp = (Http::request('menu_webftp', 'post') == 'fondator') ? FONDATOR : ADMIN;
$menu_sql = (Http::request('menu_sql', 'post') == 'fondator') ? FONDATOR : ADMIN;
}
else
{
$config_mail = 'root@localhost.com';
$config_path = 'http://' . dirname(dirname($_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']));
$config_cookie = 'fsb2_';
$config_search = 'fulltext_mysql';
$default_utc = 1;
$default_utc_dst = 0;
$config_rewriting = false;
$menu_webftp = ADMIN;
$menu_sql = ADMIN;
}
Fsb::$db->update('config', array(
'cfg_value' => $config_mail,
), 'WHERE cfg_name = \'forum_mail\'');
Fsb::$db->update('config', array(
'cfg_value' => $config_path,
), 'WHERE cfg_name = \'fsb_path\'');
Fsb::$db->update('config', array(
'cfg_value' => $config_cookie,
), 'WHERE cfg_name = \'cookie_name\'');
Fsb::$db->update('config', array(
'cfg_value' => $config_search,
), 'WHERE cfg_name = \'search_method\'');
Fsb::$db->update('config', array(
'cfg_value' => $default_utc,
), 'WHERE cfg_name = \'default_utc\'');
Fsb::$db->update('config', array(
'cfg_value' => $default_utc_dst,
), 'WHERE cfg_name = \'default_utc_dst\'');
Fsb::$db->update('mods', array(
'mod_status' => $config_rewriting,
), 'WHERE mod_name = \'url_rewriting\'');
Fsb::$db->update('menu_admin', array(
'auth' => $menu_webftp,
), 'WHERE page = \'tools_webftp\'');
Fsb::$db->update('menu_admin', array(
'auth' => $menu_sql,
), 'WHERE page = \'tools_sql\'');
Fsb::$db->destroy_cache();
}
/**
* Compte administrateur
*
* @param bool $quick
*/
function install_admin($quick = false)
{
global $email;
if ($quick)
{
$login = 'admin';
$nickname = 'admin';
$password = 'admin';
$password_confirm = 'admin';
$email = 'root@localhost.com';
}
else
{
// Donnees pour l'inscription
$user_data = array('login', 'nickname', 'password', 'password_confirm', 'email');
foreach ($user_data AS $user_var)
{
$$user_var = trim(Http::request($user_var, 'post'));
}
// Nickname par defaut ?
if (!$nickname)
{
$nickname = $login;
}
// Mots de passe identiques ?
if ($password != $password_confirm)
{
die(Fsb::$session->lang('install_bad_password'));
}
}
// Creation d'un grain pour les mots de passe
Fsb::$cfg = new Config('config', array('fsb_hash' => substr(md5(rand(0, CURRENT_TIME) . rand(0, CURRENT_TIME)), 0, 10)));
Fsb::$db->update('users', array(
'u_nickname' => $nickname,
'u_email' => $email,
'u_joined' => CURRENT_TIME,
'u_register_ip' => $_SERVER['REMOTE_ADDR'],
), 'WHERE u_id = 2');
Fsb::$db->insert('users_password', array(
'u_id' => array(2, true),
'u_login' => $login,
'u_password' => Password::hash($password, 'sha1', true),
'u_algorithm' => 'sha1',
'u_use_salt' => true,
'u_autologin_key' => sha1($login . $password . 2),
), 'REPLACE');
Fsb::$cfg->update('last_user_login', $nickname, false);
Fsb::$cfg->update('fsb_path', 'http://' . dirname(dirname($_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'])), false);
Fsb::$cfg->update('fsb_hash', Fsb::$cfg->get('fsb_hash'), false);
Fsb::$cfg->update('register_time', CURRENT_TIME);
// Mise a jour du message et du sujet
Fsb::$db->update('topics', array(
't_time' => CURRENT_TIME,
't_last_p_time' => CURRENT_TIME,
't_last_p_nickname' => $nickname,
), 'WHERE t_id = 1');
Fsb::$db->update('posts', array(
'p_time' => CURRENT_TIME,
'p_nickname' => $nickname,
'u_ip' => $_SERVER['REMOTE_ADDR'],
), 'WHERE p_id = 1');
Fsb::$db->update('forums', array(
'f_last_p_time' => CURRENT_TIME,
'f_last_p_nickname' => $nickname,
), 'WHERE f_id = 2');
// Mise a jour du timestamp pour les procedures
Fsb::$db->update('process', array(
'process_last_timestamp' => CURRENT_TIME,
));
Log::add(Log::ADMIN, 'install_fsb');
// Mise ŕ jour de l'utilisateur ayant installé le forum
Fsb::$db->update('logs', array(
'u_id' => 2,
), 'WHERE log_key = \'install_fsb\'');
}
/**
* Installation de la base de donnee
*
* @param string $sql_dbms
* @param string $sql_server
* @param string $sql_login
* @param string $sql_password
* @param string $sql_dbname
* @param string $sql_prefix
* @param string $sql_port
* @return unknown
*/
function install_database($sql_dbms, $sql_server, $sql_login, $sql_password, $sql_dbname, $sql_prefix, $sql_port)
{
global $config_code;
// On commence une transaction
Fsb::$db->transaction('begin');
// Execution des requetes d'installations pour la base de donnee
@set_time_limit(0);
$queries = String::split(';', file_get_contents('db_shemas/' . $sql_dbms . '_shemas.sql'));
foreach ($queries AS $query)
{
$query = preg_replace('#fsb2_#', $sql_prefix, $query);
Fsb::$db->query($query);
}
unset($queries);
$queries = String::split(';', file_get_contents('db_shemas/data.sql'));
foreach ($queries AS $query)
{
$query = preg_replace('#fsb2_#', $sql_prefix, $query, 1);
$query = str_replace(array('\n', '\r'), array("\n", "\r"), $query);
Fsb::$db->query($query);
}
unset($queries);
// Requetes apres les requetes de donnees ?
if (file_exists('db_shemas/' . $sql_dbms . '_end.sql'))
{
$queries = String::split(';', file_get_contents('db_shemas/' . $sql_dbms . '_end.sql'));
foreach ($queries AS $query)
{
$query = preg_replace('#fsb2_#', $sql_prefix, $query);
Fsb::$db->query($query);
}
unset($queries);
}
// On fini la transaction
Fsb::$db->transaction('commit');
/*
** Ecriture du fichier config
*/
@chmod(ROOT . 'config/config.' . PHPEXT, 0666);
$config_code = "Impossible de creer la base de donnee ' . $sql_dbname);
mysql_close();
define('SQL_DBAL', $sql_dbms);
define('SQL_LOGIN', $sql_login);
define('SQL_PASS', $sql_password);
define('SQL_SERVER', $sql_server);
define('SQL_DB', $sql_dbname);
define('SQL_PORT', $sql_port);
define('SQL_PREFIX', $sql_prefix);
define('FSB_INSTALL', 'true');
Fsb::$db = Dbal::factory($sql_server, $sql_login, $sql_password, $sql_dbname, $sql_port, false);
install_database($sql_dbms, $sql_server, $sql_login, $sql_password, $sql_dbname, $sql_prefix, $sql_port);
install_admin(true);
install_config(true);
Http::header('location', '../index.php');
exit;
}
else if (Http::request('go_to_step_config', 'post') && defined('FSB_INSTALL'))
{
Fsb::$db = Dbal::factory();
if (!Fsb::$db->_get_id())
{
trigger_error('Impossible de se connecter a la base de donnee : ' . Fsb::$db->sql_error(), FSB_ERROR);
}
install_config();
$current_step = 'end';
}
else if (Http::request('go_to_step_end', 'post') && defined('FSB_INSTALL'))
{
Fsb::$db = Dbal::factory();
if (!Fsb::$db->_get_id())
{
trigger_error('Impossible de se connecter a la base de donnee : ' . Fsb::$db->sql_error(), FSB_ERROR);
}
install_admin();
$current_step = 'config';
}
else if (Http::request('go_to_step_admin', 'post') && !defined('FSB_INSTALL'))
{
/*
** Connexion a la base de donnee
*/
$sql_dbms = trim(Http::request('sql_dbms', 'post'));
$sql_server = trim(Http::request('sql_server', 'post'));
$sql_login = trim(Http::request('sql_login', 'post'));
$sql_password = trim(Http::request('sql_password', 'post'));
$sql_dbname = trim(Http::request('sql_dbname', 'post'));
$sql_prefix = trim(Http::request('sql_prefix', 'post'));
$sql_port = intval(Http::request('sql_port', 'post'));
// Si on utilise SQLite on met la base de donnee dans ~/main/dbal/sqlite/
if ($sql_dbms == 'sqlite')
{
$sql_dbname = md5(uniqid(rand(), true)) . '.sqlite';
}
define('SQL_DBAL', $sql_dbms);
define('SQL_PREFIX', $sql_prefix);
Fsb::$db = Dbal::factory($sql_server, $sql_login, $sql_password, $sql_dbname, $sql_port, false);
if (!Fsb::$db->_get_id())
{
$current_step = 'db';
}
// Si MySQL < 4.1, on redirige vers une erreur
else if ($sql_dbms == 'mysql' && version_compare(Fsb::$db->mysql_version(), '4.1', '<') == 1)
{
$sql_error = sprintf(Fsb::$session->lang('install_bad_mysql_version'), Fsb::$db->mysql_version());
$current_step = 'db';
}
else
{
$write_config = install_database($sql_dbms, $sql_server, $sql_login, $sql_password, $sql_dbname, $sql_prefix, $sql_port);
$current_step = 'admin';
unset($db);
}
}
else if (Http::request('go_to_step_admin', 'post'))
{
$current_step = 'admin';
$write_config = true;
}
// Aucun $current_step ?
if (!$current_step)
{
$current_step = 'home';
}
foreach ($steps AS $k => $step_name)
{
Fsb::$tpl->set_blocks('step', array(
'NAME' => $step_name,
'CURRENT_STEP' => ($current_step == $k) ? true : false,
));
}
// Affichage des pages
switch ($current_step)
{
case 'end' :
// Fin de l'installation du forum
Fsb::$tpl->set_switch('step_end');
class Convert {}
// Liste des convertisseurs
$fd = opendir(ROOT . 'install/convertors/');
while ($file = readdir($fd))
{
if (preg_match('#^convert_(.*?)\.' . PHPEXT . '$#i', $file, $m))
{
include(ROOT . 'install/convertors/' . $file);
$info = call_user_func(array('Convert_' . $m[1], 'forum_type'));
Fsb::$tpl->set_blocks('convert', array(
'NAME' => $info,
'URL' => 'index.' . PHPEXT . '?convert=' . $m[1],
));
}
}
closedir($fd);
break;
case 'config' :
// Configuration du forum
Fsb::$tpl->set_switch('step_config');
Fsb::$tpl->set_vars(array(
'CONFIG_PATH' => 'http://' . dirname(dirname($_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'])),
'CONFIG_EMAIL' => $email,
'LIST_UTC' => Html::list_utc('default_utc', 1, 'utc'),
'LIST_UTC_DST' => Html::list_utc('default_utc_dst', date("I"), 'dst'),
'MENU_WEBFTP' => 'admin',
'MENU_SQL' => 'admin',
'USE_FULLTEXT_MYSQL' => true,
));
break;
case 'admin' :
// Troisieme etape, creation du compte administrateur
Fsb::$tpl->set_switch('step_admin');
if ($write_config)
{
// Si le fichier config a ete ecrit on gere la creation du compte admin
Fsb::$tpl->set_vars(array(
'LOGIN' => (isset($adm_login)) ? $adm_login : '',
'EMAIL' => (isset($adm_email)) ? $adm_email : '',
));
}
else
{
// Si le fichier config n'a pu etre ecrit ...
Fsb::$tpl->set_switch('config_mode');
Fsb::$tpl->set_vars(array(
'CONFIG_CODE' => htmlspecialchars($config_code),
));
}
break;
case 'db' :
// Seconde etape, la base de donnee
Fsb::$tpl->set_switch('step_db');
// Creation de la liste des bases de donnees
$list_db = '