mirror of
https://github.com/phpbb/phpbb.git
synced 2025-05-29 02:29:21 +02:00
Changes: - Ascraeus now uses constants for the phpbb root path and the php extension. This ensures more security for external applications and modifications (no more overwriting of root path and extension possible through insecure mods and register globals enabled) as well as no more globalizing needed. - A second change implemented here is an additional short-hand-notation for append_sid(). It is allowed to omit the root path and extension now (for example calling append_sid('memberlist')) - in this case the root path and extension get added automatically. The hook is called after these are added. git-svn-id: file:///svn/phpbb/trunk@8572 89ea8834-ac86-4346-8a33-228a782c2dd0
801 lines
21 KiB
PHP
Executable File
801 lines
21 KiB
PHP
Executable File
<?php
|
|
/**
|
|
*
|
|
* @package install
|
|
* @version $Id$
|
|
* @copyright (c) 2005 phpBB Group
|
|
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
|
|
*
|
|
*/
|
|
|
|
/**#@+
|
|
* @ignore
|
|
*/
|
|
define('IN_PHPBB', true);
|
|
define('IN_INSTALL', true);
|
|
/**#@-*/
|
|
|
|
if (!defined('PHPBB_ROOT_PATH')) define('PHPBB_ROOT_PATH', './../');
|
|
if (!defined('PHP_EXT')) define('PHP_EXT', substr(strrchr(__FILE__, '.'), 1));
|
|
|
|
// Report all errors, except notices
|
|
error_reporting(E_ALL ^ E_NOTICE);
|
|
|
|
// @todo Review this test and see if we can find out what it is which prevents PHP 4.2.x from even displaying the page with requirements on it
|
|
if (version_compare(PHP_VERSION, '5.1.0') < 0)
|
|
{
|
|
die('You are running an unsupported PHP version. Please upgrade to PHP 5.1.0 or higher before trying to install phpBB 3.0');
|
|
}
|
|
|
|
/*
|
|
* Remove variables created by register_globals from the global scope
|
|
* Thanks to Matt Kavanagh
|
|
*/
|
|
function deregister_globals()
|
|
{
|
|
$not_unset = array(
|
|
'GLOBALS' => true,
|
|
'_GET' => true,
|
|
'_POST' => true,
|
|
'_COOKIE' => true,
|
|
'_REQUEST' => true,
|
|
'_SERVER' => true,
|
|
'_SESSION' => true,
|
|
'_ENV' => true,
|
|
'_FILES' => true,
|
|
'phpEx' => true,
|
|
'phpbb_root_path' => true
|
|
);
|
|
|
|
// Not only will array_merge and array_keys give a warning if
|
|
// a parameter is not an array, array_merge will actually fail.
|
|
// So we check if _SESSION has been initialised.
|
|
if (!isset($_SESSION) || !is_array($_SESSION))
|
|
{
|
|
$_SESSION = array();
|
|
}
|
|
|
|
// Merge all into one extremely huge array; unset this later
|
|
$input = array_merge(
|
|
array_keys($_GET),
|
|
array_keys($_POST),
|
|
array_keys($_COOKIE),
|
|
array_keys($_SERVER),
|
|
array_keys($_SESSION),
|
|
array_keys($_ENV),
|
|
array_keys($_FILES)
|
|
);
|
|
|
|
foreach ($input as $varname)
|
|
{
|
|
if (isset($not_unset[$varname]))
|
|
{
|
|
// Hacking attempt. No point in continuing unless it's a COOKIE
|
|
if ($varname !== 'GLOBALS' || isset($_GET['GLOBALS']) || isset($_POST['GLOBALS']) || isset($_SERVER['GLOBALS']) || isset($_SESSION['GLOBALS']) || isset($_ENV['GLOBALS']) || isset($_FILES['GLOBALS']))
|
|
{
|
|
exit;
|
|
}
|
|
else
|
|
{
|
|
$cookie = &$_COOKIE;
|
|
while (isset($cookie['GLOBALS']))
|
|
{
|
|
foreach ($cookie['GLOBALS'] as $registered_var => $value)
|
|
{
|
|
if (!isset($not_unset[$registered_var]))
|
|
{
|
|
unset($GLOBALS[$registered_var]);
|
|
}
|
|
}
|
|
$cookie = &$cookie['GLOBALS'];
|
|
}
|
|
}
|
|
}
|
|
|
|
unset($GLOBALS[$varname]);
|
|
}
|
|
|
|
unset($input);
|
|
}
|
|
|
|
// If we are on PHP >= 6.0.0 we do not need some code
|
|
if (version_compare(PHP_VERSION, '6.0.0-dev', '>='))
|
|
{
|
|
/**
|
|
* @ignore
|
|
*/
|
|
define('STRIP', false);
|
|
}
|
|
else
|
|
{
|
|
set_magic_quotes_runtime(0);
|
|
|
|
// Be paranoid with passed vars
|
|
if (@ini_get('register_globals') == '1' || strtolower(@ini_get('register_globals')) == 'on')
|
|
{
|
|
deregister_globals();
|
|
}
|
|
|
|
define('STRIP', (get_magic_quotes_gpc()) ? true : false);
|
|
}
|
|
|
|
// Try to override some limits - maybe it helps some...
|
|
@set_time_limit(0);
|
|
$mem_limit = @ini_get('memory_limit');
|
|
if (!empty($mem_limit))
|
|
{
|
|
$unit = strtolower(substr($mem_limit, -1, 1));
|
|
$mem_limit = (int) $mem_limit;
|
|
|
|
if ($unit == 'k')
|
|
{
|
|
$mem_limit = floor($mem_limit / 1024);
|
|
}
|
|
else if ($unit == 'g')
|
|
{
|
|
$mem_limit *= 1024;
|
|
}
|
|
else if (is_numeric($unit))
|
|
{
|
|
$mem_limit = floor((int) ($mem_limit . $unit) / 1048576);
|
|
}
|
|
$mem_limit = max(128, $mem_limit) . 'M';
|
|
}
|
|
else
|
|
{
|
|
$mem_limit = '128M';
|
|
}
|
|
@ini_set('memory_limit', $mem_limit);
|
|
|
|
// Include essential scripts
|
|
require(PHPBB_ROOT_PATH . 'includes/functions.' . PHP_EXT);
|
|
|
|
if (file_exists(PHPBB_ROOT_PATH . 'includes/functions_content.' . PHP_EXT))
|
|
{
|
|
require(PHPBB_ROOT_PATH . 'includes/functions_content.' . PHP_EXT);
|
|
}
|
|
|
|
include(PHPBB_ROOT_PATH . 'includes/auth.' . PHP_EXT);
|
|
include(PHPBB_ROOT_PATH . 'includes/session.' . PHP_EXT);
|
|
include(PHPBB_ROOT_PATH . 'includes/template.' . PHP_EXT);
|
|
include(PHPBB_ROOT_PATH . 'includes/acm/acm_file.' . PHP_EXT);
|
|
include(PHPBB_ROOT_PATH . 'includes/cache.' . PHP_EXT);
|
|
include(PHPBB_ROOT_PATH . 'includes/functions_admin.' . PHP_EXT);
|
|
include(PHPBB_ROOT_PATH . 'includes/utf/utf_tools.' . PHP_EXT);
|
|
require(PHPBB_ROOT_PATH . 'includes/functions_install.' . PHP_EXT);
|
|
|
|
// Try and load an appropriate language if required
|
|
$language = basename(request_var('language', ''));
|
|
|
|
if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && !$language)
|
|
{
|
|
$accept_lang_ary = explode(',', strtolower($_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) . '_' . 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');
|
|
|
|
if (!$dir)
|
|
{
|
|
die('Unable to access the language directory');
|
|
exit;
|
|
}
|
|
|
|
while (($file = readdir($dir)) !== false)
|
|
{
|
|
$path = PHPBB_ROOT_PATH . 'language/' . $file;
|
|
|
|
if (!is_file($path) && !is_link($path) && file_exists($path . '/iso.txt'))
|
|
{
|
|
$language = $file;
|
|
break;
|
|
}
|
|
}
|
|
closedir($dir);
|
|
}
|
|
|
|
if (!file_exists(PHPBB_ROOT_PATH . 'language/' . $language))
|
|
{
|
|
die('No language found!');
|
|
}
|
|
|
|
// And finally, load the relevant language files
|
|
include(PHPBB_ROOT_PATH . 'language/' . $language . '/common.' . PHP_EXT);
|
|
include(PHPBB_ROOT_PATH . 'language/' . $language . '/acp/common.' . PHP_EXT);
|
|
include(PHPBB_ROOT_PATH . 'language/' . $language . '/acp/board.' . PHP_EXT);
|
|
include(PHPBB_ROOT_PATH . 'language/' . $language . '/install.' . PHP_EXT);
|
|
include(PHPBB_ROOT_PATH . 'language/' . $language . '/posting.' . PHP_EXT);
|
|
|
|
$mode = request_var('mode', 'overview');
|
|
$sub = request_var('sub', '');
|
|
|
|
// Set PHP error handler to ours
|
|
set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler');
|
|
|
|
$user = new user();
|
|
$auth = new auth();
|
|
$cache = new acm();
|
|
$template = new template();
|
|
|
|
// Add own hook handler, if present. :o
|
|
if (file_exists(PHPBB_ROOT_PATH . 'includes/hooks/index.' . PHP_EXT))
|
|
{
|
|
require(PHPBB_ROOT_PATH . 'includes/hooks/index.' . PHP_EXT);
|
|
$phpbb_hook = new phpbb_hook(array('exit_handler', 'phpbb_user_session_handler', 'append_sid', array('template', 'display')));
|
|
|
|
foreach (cache::obtain_hooks() as $hook)
|
|
{
|
|
@include(PHPBB_ROOT_PATH . 'includes/hooks/' . $hook . '.' . PHP_EXT);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$phpbb_hook = false;
|
|
}
|
|
|
|
// Set some standard variables we want to force
|
|
$config = array(
|
|
'load_tplcompile' => '1'
|
|
);
|
|
|
|
$template->set_custom_template('../adm/style', 'admin');
|
|
$template->assign_var('T_TEMPLATE_PATH', '../adm/style');
|
|
|
|
// the acp template is never stored in the database
|
|
$user->theme['template_storedb'] = false;
|
|
|
|
$install = new module();
|
|
|
|
$install->create('install', 'index.' . PHP_EXT, $mode, $sub);
|
|
$install->load();
|
|
|
|
// Generate the page
|
|
$install->page_header();
|
|
$install->generate_navigation();
|
|
|
|
$template->set_filenames(array(
|
|
'body' => $install->get_tpl_name())
|
|
);
|
|
|
|
$install->page_footer();
|
|
|
|
/**
|
|
* @package install
|
|
*/
|
|
class module
|
|
{
|
|
var $id = 0;
|
|
var $type = 'install';
|
|
var $module_ary = array();
|
|
var $filename;
|
|
var $module_url = '';
|
|
var $tpl_name = '';
|
|
var $mode;
|
|
var $sub;
|
|
|
|
/**
|
|
* Private methods, should not be overwritten
|
|
*/
|
|
function create($module_type, $module_url, $selected_mod = false, $selected_submod = false)
|
|
{
|
|
global $db, $config;
|
|
|
|
$module = array();
|
|
|
|
// Grab module information using Bart's "neat-o-module" system (tm)
|
|
$dir = @opendir('.');
|
|
|
|
if (!$dir)
|
|
{
|
|
$this->error('Unable to access the installation directory', __LINE__, __FILE__);
|
|
}
|
|
|
|
$setmodules = 1;
|
|
while (($file = readdir($dir)) !== false)
|
|
{
|
|
if (preg_match('#^install_(.*?)\.' . PHP_EXT . '$#', $file))
|
|
{
|
|
include($file);
|
|
}
|
|
}
|
|
closedir($dir);
|
|
|
|
unset($setmodules);
|
|
|
|
if (!sizeof($module))
|
|
{
|
|
$this->error('No installation modules found', __LINE__, __FILE__);
|
|
}
|
|
|
|
// Order to use and count further if modules get assigned to the same position or not having an order
|
|
$max_module_order = 1000;
|
|
|
|
foreach ($module as $row)
|
|
{
|
|
// Check any module pre-reqs
|
|
if ($row['module_reqs'] != '')
|
|
{
|
|
}
|
|
|
|
// Module order not specified or module already assigned at this position?
|
|
if (!isset($row['module_order']) || isset($this->module_ary[$row['module_order']]))
|
|
{
|
|
$row['module_order'] = $max_module_order;
|
|
$max_module_order++;
|
|
}
|
|
|
|
$this->module_ary[$row['module_order']]['name'] = $row['module_title'];
|
|
$this->module_ary[$row['module_order']]['filename'] = $row['module_filename'];
|
|
$this->module_ary[$row['module_order']]['subs'] = $row['module_subs'];
|
|
$this->module_ary[$row['module_order']]['stages'] = $row['module_stages'];
|
|
|
|
if (strtolower($selected_mod) == strtolower($row['module_title']))
|
|
{
|
|
$this->id = (int) $row['module_order'];
|
|
$this->filename = (string) $row['module_filename'];
|
|
$this->module_url = (string) $module_url;
|
|
$this->mode = (string) $selected_mod;
|
|
// Check that the sub-mode specified is valid or set a default if not
|
|
if (is_array($row['module_subs']))
|
|
{
|
|
$this->sub = strtolower((in_array(strtoupper($selected_submod), $row['module_subs'])) ? $selected_submod : $row['module_subs'][0]);
|
|
}
|
|
else if (is_array($row['module_stages']))
|
|
{
|
|
$this->sub = strtolower((in_array(strtoupper($selected_submod), $row['module_stages'])) ? $selected_submod : $row['module_stages'][0]);
|
|
}
|
|
else
|
|
{
|
|
$this->sub = '';
|
|
}
|
|
}
|
|
} // END foreach
|
|
} // END create
|
|
|
|
/**
|
|
* Load and run the relevant module if applicable
|
|
*/
|
|
function load($mode = false, $run = true)
|
|
{
|
|
if ($run)
|
|
{
|
|
if (!empty($mode))
|
|
{
|
|
$this->mode = $mode;
|
|
}
|
|
|
|
$module = $this->filename;
|
|
if (!class_exists($module))
|
|
{
|
|
$this->error('Module "' . htmlspecialchars($module) . '" not accessible.', __LINE__, __FILE__);
|
|
}
|
|
$this->module = new $module($this);
|
|
|
|
if (method_exists($this->module, 'main'))
|
|
{
|
|
$this->module->main($this->mode, $this->sub);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Output the standard page header
|
|
*/
|
|
function page_header()
|
|
{
|
|
if (defined('HEADER_INC'))
|
|
{
|
|
return;
|
|
}
|
|
|
|
define('HEADER_INC', true);
|
|
global $template, $lang, $stage;
|
|
|
|
$template->assign_vars(array(
|
|
'L_CHANGE' => $lang['CHANGE'],
|
|
'L_INSTALL_PANEL' => $lang['INSTALL_PANEL'],
|
|
'L_SELECT_LANG' => $lang['SELECT_LANG'],
|
|
'L_SKIP' => $lang['SKIP'],
|
|
'PAGE_TITLE' => $this->get_page_title(),
|
|
'T_IMAGE_PATH' => PHPBB_ROOT_PATH . 'adm/images/',
|
|
|
|
'S_CONTENT_DIRECTION' => $lang['DIRECTION'],
|
|
'S_CONTENT_FLOW_BEGIN' => ($lang['DIRECTION'] == 'ltr') ? 'left' : 'right',
|
|
'S_CONTENT_FLOW_END' => ($lang['DIRECTION'] == 'ltr') ? 'right' : 'left',
|
|
'S_CONTENT_ENCODING' => 'UTF-8',
|
|
|
|
'S_USER_LANG' => $lang['USER_LANG'],
|
|
)
|
|
);
|
|
|
|
header('Content-type: text/html; charset=UTF-8');
|
|
header('Cache-Control: private, no-cache="set-cookie"');
|
|
header('Expires: 0');
|
|
header('Pragma: no-cache');
|
|
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* Output the standard page footer
|
|
*/
|
|
function page_footer()
|
|
{
|
|
global $db, $template;
|
|
|
|
$template->display('body');
|
|
|
|
// Close our DB connection.
|
|
if (!empty($db) && is_object($db))
|
|
{
|
|
$db->sql_close();
|
|
}
|
|
|
|
if (function_exists('exit_handler'))
|
|
{
|
|
exit_handler();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns desired template name
|
|
*/
|
|
function get_tpl_name()
|
|
{
|
|
return $this->module->tpl_name . '.html';
|
|
}
|
|
|
|
/**
|
|
* Returns the desired page title
|
|
*/
|
|
function get_page_title()
|
|
{
|
|
global $lang;
|
|
|
|
if (!isset($this->module->page_title))
|
|
{
|
|
return '';
|
|
}
|
|
|
|
return (isset($lang[$this->module->page_title])) ? $lang[$this->module->page_title] : $this->module->page_title;
|
|
}
|
|
|
|
/**
|
|
* Generate an HTTP/1.1 header to redirect the user to another page
|
|
* This is used during the installation when we do not have a database available to call the normal redirect function
|
|
* @param string $page The page to redirect to relative to the installer root path
|
|
*/
|
|
function redirect($page)
|
|
{
|
|
// HTTP_HOST is having the correct browser url in most cases...
|
|
$server_name = (!empty($_SERVER['HTTP_HOST'])) ? strtolower($_SERVER['HTTP_HOST']) : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'));
|
|
$server_port = (!empty($_SERVER['SERVER_PORT'])) ? (int) $_SERVER['SERVER_PORT'] : (int) getenv('SERVER_PORT');
|
|
$secure = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 1 : 0;
|
|
|
|
$script_name = (!empty($_SERVER['PHP_SELF'])) ? $_SERVER['PHP_SELF'] : getenv('PHP_SELF');
|
|
if (!$script_name)
|
|
{
|
|
$script_name = (!empty($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : getenv('REQUEST_URI');
|
|
}
|
|
|
|
// Replace backslashes and doubled slashes (could happen on some proxy setups)
|
|
$script_name = str_replace(array('\\', '//'), '/', $script_name);
|
|
$script_path = trim(dirname($script_name));
|
|
|
|
$url = (($secure) ? 'https://' : 'http://') . $server_name;
|
|
|
|
if ($server_port && (($secure && $server_port <> 443) || (!$secure && $server_port <> 80)))
|
|
{
|
|
// HTTP HOST can carry a port number...
|
|
if (strpos($server_name, ':') === false)
|
|
{
|
|
$url .= ':' . $server_port;
|
|
}
|
|
}
|
|
|
|
$url .= $script_path . '/' . $page;
|
|
header('Location: ' . $url);
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Generate the navigation tabs
|
|
*/
|
|
function generate_navigation()
|
|
{
|
|
global $lang, $template, $language;
|
|
|
|
if (is_array($this->module_ary))
|
|
{
|
|
@ksort($this->module_ary);
|
|
foreach ($this->module_ary as $cat_ary)
|
|
{
|
|
$cat = $cat_ary['name'];
|
|
$l_cat = (!empty($lang['CAT_' . $cat])) ? $lang['CAT_' . $cat] : preg_replace('#_#', ' ', $cat);
|
|
$cat = strtolower($cat);
|
|
$url = $this->module_url . "?mode=$cat&language=$language";
|
|
|
|
if ($this->mode == $cat)
|
|
{
|
|
$template->assign_block_vars('t_block1', array(
|
|
'L_TITLE' => $l_cat,
|
|
'S_SELECTED' => true,
|
|
'U_TITLE' => $url,
|
|
));
|
|
|
|
if (is_array($this->module_ary[$this->id]['subs']))
|
|
{
|
|
$subs = $this->module_ary[$this->id]['subs'];
|
|
foreach ($subs as $option)
|
|
{
|
|
$l_option = (!empty($lang['SUB_' . $option])) ? $lang['SUB_' . $option] : preg_replace('#_#', ' ', $option);
|
|
$option = strtolower($option);
|
|
$url = $this->module_url . '?mode=' . $this->mode . "&sub=$option&language=$language";
|
|
|
|
$template->assign_block_vars('l_block1', array(
|
|
'L_TITLE' => $l_option,
|
|
'S_SELECTED' => ($this->sub == $option),
|
|
'U_TITLE' => $url,
|
|
));
|
|
}
|
|
}
|
|
|
|
if (is_array($this->module_ary[$this->id]['stages']))
|
|
{
|
|
$subs = $this->module_ary[$this->id]['stages'];
|
|
$matched = false;
|
|
foreach ($subs as $option)
|
|
{
|
|
$l_option = (!empty($lang['STAGE_' . $option])) ? $lang['STAGE_' . $option] : preg_replace('#_#', ' ', $option);
|
|
$option = strtolower($option);
|
|
$matched = ($this->sub == $option) ? true : $matched;
|
|
|
|
$template->assign_block_vars('l_block2', array(
|
|
'L_TITLE' => $l_option,
|
|
'S_SELECTED' => ($this->sub == $option),
|
|
'S_COMPLETE' => !$matched,
|
|
));
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$template->assign_block_vars('t_block1', array(
|
|
'L_TITLE' => $l_cat,
|
|
'S_SELECTED' => false,
|
|
'U_TITLE' => $url,
|
|
));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Output an error message
|
|
* If skip is true, return and continue execution, else exit
|
|
*/
|
|
function error($error, $line, $file, $skip = false)
|
|
{
|
|
global $lang, $db, $template;
|
|
|
|
if ($skip)
|
|
{
|
|
$template->assign_block_vars('checks', array(
|
|
'S_LEGEND' => true,
|
|
'LEGEND' => $lang['INST_ERR'],
|
|
));
|
|
|
|
$template->assign_block_vars('checks', array(
|
|
'TITLE' => basename($file) . ' [ ' . $line . ' ]',
|
|
'RESULT' => '<b style="color:red">' . $error . '</b>',
|
|
));
|
|
|
|
return;
|
|
}
|
|
|
|
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
|
|
echo '<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">';
|
|
echo '<head>';
|
|
echo '<meta http-equiv="content-type" content="text/html; charset=utf-8" />';
|
|
echo '<title>' . $lang['INST_ERR_FATAL'] . '</title>';
|
|
echo '<link href="../adm/style/admin.css" rel="stylesheet" type="text/css" media="screen" />';
|
|
echo '</head>';
|
|
echo '<body id="errorpage">';
|
|
echo '<div id="wrap">';
|
|
echo ' <div id="page-header">';
|
|
echo ' </div>';
|
|
echo ' <div id="page-body">';
|
|
echo ' <div id="acp">';
|
|
echo ' <div class="panel">';
|
|
echo ' <span class="corners-top"><span></span></span>';
|
|
echo ' <div id="content">';
|
|
echo ' <h1>' . $lang['INST_ERR_FATAL'] . '</h1>';
|
|
echo ' <p>' . $lang['INST_ERR_FATAL'] . "</p>\n";
|
|
echo ' <p>' . basename($file) . ' [ ' . $line . " ]</p>\n";
|
|
echo ' <p><b>' . $error . "</b></p>\n";
|
|
echo ' </div>';
|
|
echo ' <span class="corners-bottom"><span></span></span>';
|
|
echo ' </div>';
|
|
echo ' </div>';
|
|
echo ' </div>';
|
|
echo ' <div id="page-footer">';
|
|
echo ' Powered by phpBB © 2000, 2002, 2005, 2007 <a href="http://www.phpbb.com/">phpBB Group</a>';
|
|
echo ' </div>';
|
|
echo '</div>';
|
|
echo '</body>';
|
|
echo '</html>';
|
|
|
|
if (!empty($db) && is_object($db))
|
|
{
|
|
$db->sql_close();
|
|
}
|
|
|
|
exit_handler();
|
|
}
|
|
|
|
/**
|
|
* Output an error message for a database related problem
|
|
* If skip is true, return and continue execution, else exit
|
|
*/
|
|
function db_error($error, $sql, $line, $file, $skip = false)
|
|
{
|
|
global $lang, $db, $template;
|
|
|
|
if ($skip)
|
|
{
|
|
$template->assign_block_vars('checks', array(
|
|
'S_LEGEND' => true,
|
|
'LEGEND' => $lang['INST_ERR_FATAL'],
|
|
));
|
|
|
|
$template->assign_block_vars('checks', array(
|
|
'TITLE' => basename($file) . ' [ ' . $line . ' ]',
|
|
'RESULT' => '<b style="color:red">' . $error . '</b><br />» SQL:' . $sql,
|
|
));
|
|
|
|
return;
|
|
}
|
|
|
|
$template->set_filenames(array(
|
|
'body' => 'install_error.html')
|
|
);
|
|
$this->page_header();
|
|
$this->generate_navigation();
|
|
|
|
$template->assign_vars(array(
|
|
'MESSAGE_TITLE' => $lang['INST_ERR_FATAL_DB'],
|
|
'MESSAGE_TEXT' => '<p>' . basename($file) . ' [ ' . $line . ' ]</p><p>SQL : ' . $sql . '</p><p><b>' . $error . '</b></p>',
|
|
));
|
|
|
|
// Rollback if in transaction
|
|
if ($db->transaction)
|
|
{
|
|
$db->sql_transaction('rollback');
|
|
}
|
|
|
|
$this->page_footer();
|
|
}
|
|
|
|
/**
|
|
* Generate the relevant HTML for an input field and the associated label and explanatory text
|
|
*/
|
|
function input_field($name, $type, $value='', $options='')
|
|
{
|
|
global $lang;
|
|
$tpl_type = explode(':', $type);
|
|
$tpl = '';
|
|
|
|
switch ($tpl_type[0])
|
|
{
|
|
case 'text':
|
|
case 'password':
|
|
$size = (int) $tpl_type[1];
|
|
$maxlength = (int) $tpl_type[2];
|
|
|
|
$tpl = '<input id="' . $name . '" type="' . $tpl_type[0] . '"' . (($size) ? ' size="' . $size . '"' : '') . ' maxlength="' . (($maxlength) ? $maxlength : 255) . '" name="' . $name . '" value="' . $value . '" />';
|
|
break;
|
|
|
|
case 'textarea':
|
|
$rows = (int) $tpl_type[1];
|
|
$cols = (int) $tpl_type[2];
|
|
|
|
$tpl = '<textarea id="' . $name . '" name="' . $name . '" rows="' . $rows . '" cols="' . $cols . '">' . $value . '</textarea>';
|
|
break;
|
|
|
|
case 'radio':
|
|
$key_yes = ($value) ? ' checked="checked" id="' . $name . '"' : '';
|
|
$key_no = (!$value) ? ' checked="checked" id="' . $name . '"' : '';
|
|
|
|
$tpl_type_cond = explode('_', $tpl_type[1]);
|
|
$type_no = ($tpl_type_cond[0] == 'disabled' || $tpl_type_cond[0] == 'enabled') ? false : true;
|
|
|
|
$tpl_no = '<label><input type="radio" name="' . $name . '" value="0"' . $key_no . ' class="radio" /> ' . (($type_no) ? $lang['NO'] : $lang['DISABLED']) . '</label>';
|
|
$tpl_yes = '<label><input type="radio" name="' . $name . '" value="1"' . $key_yes . ' class="radio" /> ' . (($type_no) ? $lang['YES'] : $lang['ENABLED']) . '</label>';
|
|
|
|
$tpl = ($tpl_type_cond[0] == 'yes' || $tpl_type_cond[0] == 'enabled') ? $tpl_yes . ' ' . $tpl_no : $tpl_no . ' ' . $tpl_yes;
|
|
break;
|
|
|
|
case 'select':
|
|
eval('$s_options = ' . str_replace('{VALUE}', $value, $options) . ';');
|
|
$tpl = '<select id="' . $name . '" name="' . $name . '">' . $s_options . '</select>';
|
|
break;
|
|
|
|
case 'custom':
|
|
eval('$tpl = ' . str_replace('{VALUE}', $value, $options) . ';');
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return $tpl;
|
|
}
|
|
|
|
/**
|
|
* Generate the drop down of available language packs
|
|
*/
|
|
function inst_language_select($default = '')
|
|
{
|
|
$dir = @opendir(PHPBB_ROOT_PATH . 'language');
|
|
|
|
if (!$dir)
|
|
{
|
|
$this->error('Unable to access the language directory', __LINE__, __FILE__);
|
|
}
|
|
|
|
while ($file = readdir($dir))
|
|
{
|
|
$path = PHPBB_ROOT_PATH . 'language/' . $file;
|
|
|
|
if ($file == '.' || $file == '..' || is_link($path) || is_file($path) || $file == 'CVS')
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (file_exists($path . '/iso.txt'))
|
|
{
|
|
list($displayname, $localname) = @file($path . '/iso.txt');
|
|
$lang[$localname] = $file;
|
|
}
|
|
}
|
|
closedir($dir);
|
|
|
|
@asort($lang);
|
|
@reset($lang);
|
|
|
|
$user_select = '';
|
|
foreach ($lang as $displayname => $filename)
|
|
{
|
|
$selected = (strtolower($default) == strtolower($filename)) ? ' selected="selected"' : '';
|
|
$user_select .= '<option value="' . $filename . '"' . $selected . '>' . ucwords($displayname) . '</option>';
|
|
}
|
|
|
|
return $user_select;
|
|
}
|
|
}
|
|
|
|
?>
|