array(
'LABEL' => 'FireBird',
'SCHEMA' => 'firebird',
'MODULE' => 'interbase',
'DELIM' => ';',
'COMMENTS' => 'remove_remarks'
),
'mysql' => array(
'LABEL' => 'MySQL 3.x',
'SCHEMA' => 'mysql',
'MODULE' => 'mysql',
'DELIM' => ';',
'COMMENTS' => 'remove_remarks'
),
'mysql4' => array(
'LABEL' => 'MySQL 4.x',
'SCHEMA' => 'mysql',
'MODULE' => 'mysql',
'DELIM' => ';',
'COMMENTS' => 'remove_remarks'
),
'mssql' => array(
'LABEL' => 'MS SQL Server 7/2000',
'SCHEMA' => 'mssql',
'MODULE' => 'mssql',
'DELIM' => 'GO',
'COMMENTS' => 'remove_comments'
),
'msaccess' => array(
'LABEL' => 'MS Access [ ODBC ]',
'SCHEMA' => '',
'MODULE' => 'odbc',
'DELIM' => '',
'COMMENTS' => ''
),
'mssql-odbc'=> array(
'LABEL' => 'MS SQL Server [ ODBC ]',
'SCHEMA' => 'mssql',
'MODULE' => 'odbc',
'DELIM' => 'GO',
'COMMENTS' => 'remove_comments'
),
'oracle' => array(
'LABEL' => 'Oracle',
'SCHEMA' => 'oracle',
'MODULE' => 'oracle',
'DELIM' => '',
'COMMENTS' => 'remove_comments'
),
'postgres' => array(
'LABEL' => 'PostgreSQL 7.x',
'SCHEMA' => 'postgres',
'MODULE' => 'pgsql',
'DELIM' => ';',
'COMMENTS' => 'remove_comments'
),
);
$suffix = ((defined('PHP_OS')) && (preg_match('#win#i', PHP_OS))) ? 'dll' : 'so';
//
// Variables defined ... start program proper
//
// Try and load an appropriate language if required
if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && !$language)
{
$accept_lang_ary = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
foreach ($accept_lang_ary as $accept_lang)
{
// Set correct format ... guess full xx_YY form
$accept_lang = substr($accept_lang, 0, 2) . '_' . strtoupper(substr($accept_lang, 3, 2));
if (file_exists($phpbb_root_path . 'language/' . $accept_lang))
{
$language = $accept_lang;
break;
}
else
{
// No match on xx_YY so try xx
$accept_lang = substr($accept_lang, 0, 2);
if (file_exists($phpbb_root_path . 'language/' . $accept_lang))
{
$language = $accept_lang;
break;
}
}
}
// No appropriate language found ... so let's use the first one in the language
// dir, this may or may not be English
if (!$language)
{
$dir = @opendir($phpbb_root_path . 'language');
while ($file = readdir($dir))
{
$path = $phpbb_root_path . 'language/' . $file;
if (!is_file($path) && !is_link($path) && file_exists($path . '/iso.txt'))
{
$language = $file;
break;
}
}
}
}
include($phpbb_root_path . 'language/' . $language . '/lang_main.'.$phpEx);
include($phpbb_root_path . 'language/' . $language . '/lang_admin.'.$phpEx);
// Here we do a number of tests and where appropriate reset the installation level
// depending on the outcome of those tests. It's perhaps a little clunky but
// it means we have a fairly clear and logical path through the installation and
// this source ... well, till I go and fill it with fudge ... damn, dribbled
// on my keyboard
if (isset($_POST['retest']))
{
$stage = 0;
}
else if (isset($_POST['testdb']))
{
$stage = 1;
}
else if (isset($_POST['install']))
{
// Check for missing data
$var_ary = array(
'admin' => array('admin_name', 'admin_pass1', 'admin_pass2', 'board_email1', 'board_email2'),
'server' => array('server_name', 'server_port', 'script_path')
);
foreach ($var_ary as $var_type => $var_block)
{
foreach ($var_block as $var)
{
if (!$$var)
{
$error[$var_type][] = $lang['INST_ERR_MISSING_DATA'];
break;
}
}
}
// Check the entered email address and password
if ($admin_pass1 != $admin_pass2 && $admin_pass1 != '')
{
$error['admin'][] = $lang['INST_ERR_PASSWORD_MISMATCH'];
}
if ($board_email1 != $board_email2 && $board_email1 != '')
{
$error['admin'][] = $lang['INST_ERR_EMAIL_MISMATCH'];
}
// Test the database connectivity
if (!@extension_loaded($available_dbms[$dbms]['MODULE']))
{
if (!can_load_dll($available_dbms[$dbms]['MODULE']))
{
$error['db'][] = $lang['INST_ERR_NO_DB'];
}
}
// Include the DB layer
include($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);
// Instantiate it and set return on error true
$db = new sql_db();
$db->sql_return_on_error(true);
// Try and connect ...
if (is_array($db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false)))
{
$db_error = $db->sql_error();
$error['db'][] = $lang['INST_ERR_DB_CONNECT'] . ' ' . (($db_error['message']) ? $db_error['message'] : $lang['INST_ERR_DB_NO_ERROR']);
}
// No errors so lets do the twist
if (sizeof($error))
{
$stage = 1;
}
}
else if (isset($_POST['dldone']))
{
// A minor fudge ... we're basically trying to see if the user uploaded
// their downloaded config file ... it's not worth IMO trying to
// open it and compare all the data. If a user wants to screw up this
// simple task ... well ... uhm
if (filesize($phpbb_root_path . 'config.'.$phpEx) < 10)
{
$stage = 3;
}
}
// Zero stage of installation
//
// Here we basically imform the user of any potential issues such as no database
// support, missing directories, etc. We also give some insight into "missing"
// modules which we'd quite like installed (but which are not essential)
if ($stage == 0)
{
// Test for DB modules
$dlls_db = array();
$passed['db'] = false;
foreach ($available_dbms as $db_name => $db_ary)
{
$dll = $db_ary['MODULE'];
if (!extension_loaded($dll))
{
if (!can_load_dll($dll))
{
$dlls_db[$db_name] = '' . $lang['UNAVAILABLE'] . '';
continue;
}
}
$dlls_db[$db_name] = '' . $lang['AVAILABLE'] . '';
$passed['db'] = true;
}
// Test for other modules
$dlls_other = array();
foreach ($php_dlls_other as $dll)
{
if (!extension_loaded($dll))
{
if (!can_load_dll($dll))
{
$dlls_other[$dll] = '' . $lang['UNAVAILABLE'] . '';
continue;
}
}
$dlls_other[$dll] = '' . $lang['AVAILABLE'] . '';
}
inst_page_header();
?>
• :
' . $lang['NO'] . '';
}
else
{
// We also give feedback on whether we're running in safe mode
echo '' . $lang['YES'];
if (@ini_get('safe_mode') || strtolower(@ini_get('safe_mode')) == 'on')
{
echo ', ' . $lang['PHP_SAFE_MODE'];
}
echo '';
}
?>
sql_return_on_error(true);
// Try and connect ...
if (is_array($db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false)))
{
$db_error = $db->sql_error();
$error['db'][] = $lang['INST_ERR_DB_CONNECT'] . ' ' . (($db_error['message']) ? $db_error['message'] : $lang['INST_ERR_DB_NO_ERROR']);
}
if (!sizeof($error['db']))
{
$error['db'][] = $lang['INSTALL_DB_CONNECT'];
}
}
$available_dbms_temp = array();
foreach ($available_dbms as $type => $dbms_ary)
{
if (!extension_loaded($dbms_ary['MODULE']))
{
if (!can_load_dll($dbms_ary['MODULE']))
{
continue;
}
}
$available_dbms_temp[$type] = $dbms_ary;
}
$available_dbms = &$available_dbms_temp;
// Here we guess at some server information, however we only
// do this if no "errors" exist ... if they do then the user
// has relady set the info and we can bypass it
if (!sizeof($error))
{
if (!empty($_SERVER['SERVER_NAME']) || !empty($_ENV['SERVER_NAME']))
{
$server_name = (!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : $_ENV['SERVER_NAME'];
}
else if (!empty($_SERVER['HTTP_HOST']) || !empty($_ENV['HTTP_HOST']))
{
$server_name = (!empty($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : $_ENV['HTTP_HOST'];
}
else
{
$server_name = '';
}
if (!empty($_SERVER['SERVER_PORT']) || !empty($_ENV['SERVER_PORT']))
{
$server_port = (!empty($_SERVER['SERVER_PORT'])) ? $_SERVER['SERVER_PORT'] : $_ENV['SERVER_PORT'];
}
else
{
$server_port = '80';
}
$script_path = preg_replace('#install\/install\.' . $phpEx . '#i', '', $_SERVER['PHP_SELF']);
}
// Generate list of available DB's
$dbms_options = '';
foreach($available_dbms as $dbms_name => $details)
{
$selected = ($dbms_name == $dbms) ? ' selected="selected"' : '';
$dbms_options .= '';
}
$s_hidden_fields = '';
inst_page_header();
?>
', $error['admin']); ?>
:
:
:
:
:
:
', $error['db']); ?>
:
:
:
:
:
:
:
', $error['server']); ?>
:
:
:
'; // Done this to prevent highlighting editors getting confused!
// Attempt to write out the config directly ...
if (filesize($phpbb_root_path . 'config.' . $phpEx) == 0 && is_writeable($phpbb_root_path . 'config.' . $phpEx))
{
// Lets jump to the DB setup stage ... if nothing goes wrong below
$stage = 3;
if (!($fp = @fopen($phpbb_root_path . 'config.'.$phpEx, 'w')))
{
// Something went wrong ... so let's try another method
$stage = 2;
}
if (!(@fwrite($fp, $config_data)))
{
// Something went wrong ... so let's try another method
$stage = 2;
}
@fclose($fp);
}
// We couldn't write it directly so we'll give the user three alternatives
if ($stage == 2)
{
$ignore_ftp = false;
// User is trying to upload via FTP ... so let's process it
if (isset($_POST['sendftp']))
{
if (($conn_id = @ftp_connect('localhost')))
{
if (@ftp_login($conn_id, $ftp_user, $ftp_pass))
{
// Write out a temp file ... if safe mode is on we'll write it to our
// local cache/tmp directory
$tmp_path = (!@ini_get('safe_mode')) ? false : $phpbb_root_path . 'cache/tmp';
$filename = tempnam($tmp_path, uniqid(rand()) . 'cfg');
$fp = @fopen($filename, 'w');
@fwrite($fp, $config_data);
@fclose($fp);
if (@ftp_chdir($conn_id, $ftp_dir))
{
// So far, so good so now we'll try and upload the file. If it
// works we'll jump to stage 3, else we'll fall back again
if (@ftp_put($conn_id, 'config.' . $phpEx, $filename, FTP_ASCII))
{
$stage = 3;
}
else
{
// Since we couldn't put the file something is fundamentally wrong, e.g.
// the file is owned by a different user, etc. We'll give up trying
// FTP at this point
$ignore_ftp = true;
}
}
else
{
$error['ftp'][] = $lang['INST_ERR_FTP_PATH'];
}
// Remove the temporary file now
@unlink($filename);
}
else
{
$error['ftp'][] = $lang['INST_ERR_FTP_LOGIN'];
}
@ftp_quit($conn_id);
}
}
else if (isset($_POST['dlftp']))
{
// The user requested a download, so send the relevant headers
// and dump out the data
header("Content-Type: text/x-delimtext; name=\"config.$phpEx\"");
header("Content-disposition: attachment; filename=config.$phpEx");
echo $config_data;
exit;
}
// Here we give the users up to three options to complete the setup
// of config.php, FTP, download and a retry and direct writing
if ($stage == 2)
{
inst_page_header();
?>
';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
$s_hidden_fields .= '';
// Can we ftp? If we can then let's offer that option on top of download
// We first see if the relevant extension is loaded and then whether a server is
// listening on the ftp port
if (extension_loaded('ftp') && ($fsock = @fsockopen('localhost', 21, $errno, $errstr, 1)) && !$ignore_ftp)
{
@fclose($fsock);
?>
', $error['ftp']); ?>
:
:
:
sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false);
// We ship the Access schema complete, we don't need to create tables nor
// populate it (at this time ... this may change). So we skip this section
if ($dbms != 'msaccess')
{
// NOTE: trigger_error does not work here.
$db->return_on_error = true;
$ignore_tables = array();
// Ok we have the db info go ahead and read in the relevant schema
// and work on building the table
$dbms_schema = 'schemas/' . $available_dbms[$dbms]['SCHEMA'] . '_schema.sql';
// How should we treat this schema?
$remove_remarks = $available_dbms[$dbms]['COMMENTS'];;
$delimiter = $available_dbms[$dbms]['DELIM'];
$delimiter_basic = $available_dbms[$dbms]['DELIM_BASIC'];
$sql_query = @fread(@fopen($dbms_schema, 'r'), @filesize($dbms_schema));
$sql_query = preg_replace('#phpbb_#is', $table_prefix, $sql_query);
$sql_query = $remove_remarks($sql_query);
$sql_query = split_sql_file($sql_query, $delimiter);
foreach ($sql_query as $sql)
{
$sql = trim($sql);
if (!$db->sql_query($sql))
{
// TODO
//
// This is a fudgy way of dealing with attempts at installing to a DB
// which already contains the relevant tables. Next thing to do is
// to quit back to stage 1 and inform the user that this table extension
// is already in use
$ignore_tables[] = preg_replace('#^CREATE TABLE ([a-z_]+?) .*$#is', '\1', $sql);
$error = $db->sql_error();
die($error['message']);
}
}
unset($sql_query);
$ignore_tables = str_replace('\\|', '|', preg_quote(implode('|', $ignore_tables), '#'));
// Ok tables have been built, let's fill in the basic information
$sql_query = fread(fopen('schemas/schema_data.sql', 'r'), filesize('schemas/schema_data.sql'));
// Deal with any special comments, used at present for mssql set identity switching
switch ($dbms)
{
case 'mssql':
case 'mssql-odbc':
$sql_query = preg_replace('#\# MSSQL IDENTITY (phpbb_[a-z_]+) (ON|OFF) \##s', 'SET IDENTITY_INSERT \1 \2', $sql_query);
break;
default:
$sql_query = preg_replace('#\# MSSQL IDENTITY (phpbb_[a-z_]+) (ON|OFF) \##s', '', $sql_query);
}
$sql_query = preg_replace('#phpbb_#', $table_prefix, $sql_query);
$sql_query = remove_remarks($sql_query);
$sql_query = split_sql_file($sql_query, ';');
foreach ($sql_query as $sql)
{
$sql = trim(str_replace('|', ';', $sql));
if ($ignore_tables != '' && preg_match('#' . $ignore_tables . '#', $sql))
{
continue;
}
if (!$db->sql_query($sql))
{
$error = $db->sql_error();
die($error['message']);
}
}
unset($sql_query);
}
$current_time = time();
// Set default config and post data, this applies to all DB's including Access
$sql_ary = array(
'INSERT INTO ' . $table_prefix . "config (config_name, config_value)
VALUES ('board_startdate', $current_time)",
'INSERT INTO ' . $table_prefix . "config (config_name, config_value)
VALUES ('default_lang', '" . $db->sql_escape($language) . "')",
'UPDATE ' . $table_prefix . "config
SET config_value = '" . $db->sql_escape($server_name) . "'
WHERE config_name = 'server_name'",
'UPDATE ' . $table_prefix . "config
SET config_value = '" . $db->sql_escape($server_port) . "'
WHERE config_name = 'server_port'",
'UPDATE ' . $table_prefix . "config
SET config_value = '" . $db->sql_escape($script_path) . "'
WHERE config_name = 'script_path'",
'UPDATE ' . $table_prefix . "config
SET config_value = '" . $db->sql_escape($board_email) . "'
WHERE config_name = 'board_email'",
'UPDATE ' . $table_prefix . "config
SET config_value = '" . $db->sql_escape($server_name) . "'
WHERE config_name = 'cookie_domain'",
'UPDATE ' . $table_prefix . "config
SET config_value = '" . $db->sql_escape($admin_name) . "'
WHERE config_name = 'newest_username'",
'UPDATE ' . $table_prefix . "users
SET username = '" . $db->sql_escape($admin_name) . "', user_password='" . $db->sql_escape(md5($admin_pass1)) . "', user_lang = '" . $db->sql_escape($language) . "', user_email='" . $db->sql_escape($board_email) . "'
WHERE username = 'Admin'",
'UPDATE ' . $table_prefix . "moderator_cache
SET username = '" . $db->sql_escape($admin_name) . "'
WHERE username = 'Admin'",
'UPDATE ' . $table_prefix . "forums
SET forum_last_poster_name = '" . $db->sql_escape($admin_name) . "'
WHERE forum_last_poster_name = 'Admin'",
'UPDATE ' . $table_prefix . "topics
SET topic_first_poster_name = '" . $db->sql_escape($admin_name) . "', topic_last_poster_name = '" . $db->sql_escape($admin_name) . "'
WHERE topic_first_poster_name = 'Admin'
OR topic_last_poster_name = 'Admin'",
'UPDATE ' . $table_prefix . "users
SET user_regdate = $current_time",
'UPDATE ' . $table_prefix . "posts
SET post_time = $current_time",
'UPDATE ' . $table_prefix . "topics
SET topic_time = $current_time, topic_last_post_time = $current_time",
'UPDATE ' . $table_prefix . "forums
SET forum_last_post_time = $current_time",
);
foreach ($sql_ary as $sql)
{
$sql = trim(str_replace('|', ';', $sql));
if ($ignore_tables != '' && preg_match('#' . $ignore_tables . '#i', $sql))
{
continue;
}
if (!$db->sql_query($sql))
{
$error = $db->sql_error();
die($error['message']);
}
}
$stage = 4;
}
// Install completed ... log the user in ... we're done
if ($stage == 4)
{
// Load the basic configuration data
define('SESSIONS_TABLE', $table_prefix . 'sessions');
define('USERS_TABLE', $table_prefix . 'users');
$sql = "SELECT *
FROM {$table_prefix}config";
$result = $db->sql_query($sql);
$config = array();
while ($row = $db->sql_fetchrow($result))
{
$config[$row['config_name']] = $row['config_value'];
}
$db->sql_freeresult($result);
$user->start();
$auth->login($admin_name, $admin_pass1);
inst_page_header();
?>