diff options
Diffstat (limited to 'phpBB/install')
-rw-r--r-- | phpBB/install/app.php | 58 | ||||
-rw-r--r-- | phpBB/install/convertors/convert_phpbb20.php | 7 | ||||
-rw-r--r-- | phpBB/install/convertors/functions_phpbb20.php | 51 | ||||
-rw-r--r-- | phpBB/install/data/confusables.php | 8 | ||||
-rw-r--r-- | phpBB/install/data/new_normalizer.php | 197 | ||||
-rw-r--r-- | phpBB/install/database_update.php | 252 | ||||
-rw-r--r-- | phpBB/install/index.html | 11 | ||||
-rw-r--r-- | phpBB/install/index.php | 833 | ||||
-rw-r--r-- | phpBB/install/install_convert.php | 2150 | ||||
-rw-r--r-- | phpBB/install/install_install.php | 2331 | ||||
-rw-r--r-- | phpBB/install/install_main.php | 78 | ||||
-rw-r--r-- | phpBB/install/install_update.php | 1780 | ||||
-rwxr-xr-x | phpBB/install/phpbbcli.php | 48 | ||||
-rw-r--r-- | phpBB/install/phpinfo.php | 14 | ||||
-rw-r--r-- | phpBB/install/schemas/schema_data.sql | 49 | ||||
-rw-r--r-- | phpBB/install/startup.php | 127 |
16 files changed, 292 insertions, 7702 deletions
diff --git a/phpBB/install/app.php b/phpBB/install/app.php new file mode 100644 index 0000000000..9664f92cf1 --- /dev/null +++ b/phpBB/install/app.php @@ -0,0 +1,58 @@ +<?php +/** + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +/** + * @ignore + */ +define('IN_PHPBB', true); +define('IN_INSTALL', true); +define('PHPBB_ENVIRONMENT', 'production'); +$phpbb_root_path = '../'; +$phpEx = substr(strrchr(__FILE__, '.'), 1); + +$startup_new_path = $phpbb_root_path . 'install/update/update/new/install/startup.' . $phpEx; +$startup_path = (file_exists($startup_new_path)) ? $startup_new_path : $phpbb_root_path . 'install/startup.' . $phpEx; +require($startup_path); + +/** @var \phpbb\filesystem\filesystem $phpbb_filesystem */ +$phpbb_filesystem = $phpbb_installer_container->get('filesystem'); + +/** @var \phpbb\template\template $template */ +$template = $phpbb_installer_container->get('template'); + +// Path to templates +$paths = array($phpbb_root_path . 'install/update/new/adm/style', $phpbb_admin_path . 'style'); +$paths = array_filter($paths, 'is_dir'); + +$template->set_custom_style(array( + array( + 'name' => 'adm', + 'ext_path' => 'adm/style/', + ), +), $paths); + +/** @var $phpbb_dispatcher \phpbb\event\dispatcher */ +$phpbb_dispatcher = $phpbb_installer_container->get('dispatcher'); + +/** @var \phpbb\language\language $language */ +$language = $phpbb_installer_container->get('language'); +$language->add_lang(array('common', 'acp/common', 'acp/board', 'install', 'posting')); + +/** @var $http_kernel \Symfony\Component\HttpKernel\HttpKernel */ +$http_kernel = $phpbb_installer_container->get('http_kernel'); + +/** @var $symfony_request \phpbb\symfony_request */ +$symfony_request = $phpbb_installer_container->get('symfony_request'); +$response = $http_kernel->handle($symfony_request); +$response->send(); +$http_kernel->terminate($symfony_request, $response); diff --git a/phpBB/install/convertors/convert_phpbb20.php b/phpBB/install/convertors/convert_phpbb20.php index 3a5e58cabd..9949c972d9 100644 --- a/phpBB/install/convertors/convert_phpbb20.php +++ b/phpBB/install/convertors/convert_phpbb20.php @@ -38,7 +38,7 @@ $dbms = $phpbb_config_php_file->convert_30_dbms_to_31($dbms); $convertor_data = array( 'forum_name' => 'phpBB 2.0.x', 'version' => '1.0.3', - 'phpbb_version' => '3.1.6', + 'phpbb_version' => '3.2.0-a1', 'author' => '<a href="https://www.phpbb.com/">phpBB Limited</a>', 'dbms' => $dbms, 'dbhost' => $dbhost, @@ -233,11 +233,11 @@ if (!$get_info) $user_id = (int) $src_db->sql_fetchfield('max_user_id'); $src_db->sql_freeresult($result); - set_config('increment_user_id', ($user_id + 1), true); + $config->set('increment_user_id', ($user_id + 1), false); } else { - set_config('increment_user_id', 0, true); + $config->set('increment_user_id', 0, false); } // Overwrite maximum avatar width/height @@ -963,7 +963,6 @@ if (!$get_info) array('pf_phpbb_interests', 'users.user_interests', array('function1' => 'phpbb_set_encoding')), array('pf_phpbb_location', 'users.user_from', array('function1' => 'phpbb_set_encoding')), array('pf_phpbb_icq', 'users.user_icq', array('function1' => 'phpbb_set_encoding')), - array('pf_phpbb_wlm', 'users.user_msnm', array('function1' => 'phpbb_set_encoding')), array('pf_phpbb_yahoo', 'users.user_yim', array('function1' => 'phpbb_set_encoding')), array('pf_phpbb_aol', 'users.user_aim', array('function1' => 'phpbb_set_encoding')), array('pf_phpbb_website', 'users.user_website', 'validate_website'), diff --git a/phpBB/install/convertors/functions_phpbb20.php b/phpBB/install/convertors/functions_phpbb20.php index 817c007274..aa2c59f28c 100644 --- a/phpBB/install/convertors/functions_phpbb20.php +++ b/phpBB/install/convertors/functions_phpbb20.php @@ -514,12 +514,12 @@ function phpbb_user_id($user_id) // If there is a user id 1, we need to increment user ids. :/ if ($id === 1) { - set_config('increment_user_id', ($max_id + 1), true); + $config->set('increment_user_id', ($max_id + 1), false); $config['increment_user_id'] = $max_id + 1; } else { - set_config('increment_user_id', 0, true); + $config->set('increment_user_id', 0, false); $config['increment_user_id'] = 0; } } @@ -661,7 +661,7 @@ function phpbb_convert_authentication($mode) 'auth_delete' => 'f_delete', 'auth_pollcreate' => 'f_poll', 'auth_vote' => 'f_vote', - 'auth_announce' => 'f_announce', + 'auth_announce' => array('f_announce', 'f_announce_global'), 'auth_sticky' => 'f_sticky', 'auth_attachments' => array('f_attach', 'f_download'), 'auth_download' => 'f_download', @@ -990,7 +990,7 @@ function phpbb_convert_authentication($mode) // We make sure that they have at least standard access to the forums they moderate in addition to the moderating permissions $mod_post_map = array( - 'auth_announce' => 'f_announce', + 'auth_announce' => array('f_announce', 'f_announce_global'), 'auth_sticky' => 'f_sticky' ); @@ -1682,29 +1682,29 @@ function phpbb_import_attach_config() } $src_db->sql_freeresult($result); - set_config('allow_attachments', 1); + $config->set('allow_attachments', 1); // old attachment mod? Must be very old if this entry do not exist... if (!empty($attach_config['display_order'])) { - set_config('display_order', $attach_config['display_order']); - } - set_config('max_filesize', $attach_config['max_filesize']); - set_config('max_filesize_pm', $attach_config['max_filesize_pm']); - set_config('attachment_quota', $attach_config['attachment_quota']); - set_config('max_attachments', $attach_config['max_attachments']); - set_config('max_attachments_pm', $attach_config['max_attachments_pm']); - set_config('allow_pm_attach', $attach_config['allow_pm_attach']); - - set_config('img_display_inlined', $attach_config['img_display_inlined']); - set_config('img_max_width', $attach_config['img_max_width']); - set_config('img_max_height', $attach_config['img_max_height']); - set_config('img_link_width', $attach_config['img_link_width']); - set_config('img_link_height', $attach_config['img_link_height']); - set_config('img_create_thumbnail', $attach_config['img_create_thumbnail']); - set_config('img_max_thumb_width', 400); - set_config('img_min_thumb_filesize', $attach_config['img_min_thumb_filesize']); - set_config('img_imagick', $attach_config['img_imagick']); + $config->set('display_order', $attach_config['display_order']); + } + $config->set('max_filesize', $attach_config['max_filesize']); + $config->set('max_filesize_pm', $attach_config['max_filesize_pm']); + $config->set('attachment_quota', $attach_config['attachment_quota']); + $config->set('max_attachments', $attach_config['max_attachments']); + $config->set('max_attachments_pm', $attach_config['max_attachments_pm']); + $config->set('allow_pm_attach', $attach_config['allow_pm_attach']); + + $config->set('img_display_inlined', $attach_config['img_display_inlined']); + $config->set('img_max_width', $attach_config['img_max_width']); + $config->set('img_max_height', $attach_config['img_max_height']); + $config->set('img_link_width', $attach_config['img_link_width']); + $config->set('img_link_height', $attach_config['img_link_height']); + $config->set('img_create_thumbnail', $attach_config['img_create_thumbnail']); + $config->set('img_max_thumb_width', 400); + $config->set('img_min_thumb_filesize', $attach_config['img_min_thumb_filesize']); + $config->set('img_imagick', $attach_config['img_imagick']); } /** @@ -1926,7 +1926,9 @@ function phpbb_check_username_collisions() function phpbb_convert_timezone($timezone) { global $config, $db, $phpbb_root_path, $phpEx, $table_prefix; - $timezone_migration = new \phpbb\db\migration\data\v310\timezone($config, $db, new \phpbb\db\tools($db), $phpbb_root_path, $phpEx, $table_prefix); + + $factory = new \phpbb\db\tools\factory(); + $timezone_migration = new \phpbb\db\migration\data\v310\timezone($config, $db, $factory->get($db), $phpbb_root_path, $phpEx, $table_prefix); return $timezone_migration->convert_phpbb30_timezone($timezone, 0); } @@ -1974,6 +1976,7 @@ function phpbb_convert_password_hash($hash) { global $phpbb_container; + /* @var $manager \phpbb\passwords\manager */ $manager = $phpbb_container->get('passwords.manager'); $hash = $manager->hash($hash, '$H$'); diff --git a/phpBB/install/data/confusables.php b/phpBB/install/data/confusables.php index e3e8c41e62..992207c1ef 100644 --- a/phpBB/install/data/confusables.php +++ b/phpBB/install/data/confusables.php @@ -633,14 +633,8 @@ function utf8_new_case_fold_nfkc($text, $option = 'full') // do the case fold $text = utf8_new_case_fold($text, $option); - if (!class_exists('utf_normalizer')) - { - global $phpbb_root_path, $phpEx; - include($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx); - } - // convert to NFKC - utf_new_normalizer::nfkc($text); + $text = Normalizer::normalize($text, Normalizer::NFKC); // FC_NFKC_Closure, http://www.unicode.org/Public/5.0.0/ucd/DerivedNormalizationProps.txt $text = strtr($text, $fc_nfkc_closure); diff --git a/phpBB/install/data/new_normalizer.php b/phpBB/install/data/new_normalizer.php deleted file mode 100644 index 52652a4f6d..0000000000 --- a/phpBB/install/data/new_normalizer.php +++ /dev/null @@ -1,197 +0,0 @@ -<?php -/** -* -* This file is part of the phpBB Forum Software package. -* -* @copyright (c) phpBB Limited <https://www.phpbb.com> -* @license GNU General Public License, version 2 (GPL-2.0) -* -* For full copyright and license information, please see -* the docs/CREDITS.txt file. -* -*/ - -/** -* @ignore -*/ -if (!defined('IN_PHPBB')) -{ - exit; -} - -/** -* A wrapper function for the normalizer which takes care of including the class if required and modifies the passed strings -* to be in NFC (Normalization Form Composition). -* -* @param mixed $strings a string or an array of strings to normalize -* @return mixed the normalized content, preserving array keys if array given. -*/ -function utf8_new_normalize_nfc($strings) -{ - if (empty($strings)) - { - return $strings; - } - - if (!is_array($strings)) - { - utf_new_normalizer::nfc($strings); - } - else if (is_array($strings)) - { - foreach ($strings as $key => $string) - { - if (is_array($string)) - { - foreach ($string as $_key => $_string) - { - utf_new_normalizer::nfc($strings[$key][$_key]); - } - } - else - { - utf_new_normalizer::nfc($strings[$key]); - } - } - } - - return $strings; -} - -class utf_new_normalizer -{ - /** - * Validate, cleanup and normalize a string - * - * The ultimate convenience function! Clean up invalid UTF-8 sequences, - * and convert to Normal Form C, canonical composition. - * - * @param string &$str The dirty string - * @return string The same string, all shiny and cleaned-up - */ - function cleanup(&$str) - { - // The string below is the list of all autorized characters, sorted by frequency in latin text - $pos = strspn($str, "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x0D"); - $len = strlen($str); - - if ($pos == $len) - { - // ASCII strings with no special chars return immediately - return; - } - - // Note: we do not check for $GLOBALS['utf_canonical_decomp']. It is assumed they are always loaded together - if (!isset($GLOBALS['utf_nfc_qc'])) - { - global $phpbb_root_path, $phpEx; - include($phpbb_root_path . 'includes/utf/data/utf_nfc_qc.' . $phpEx); - } - - if (!isset($GLOBALS['utf_canonical_decomp'])) - { - global $phpbb_root_path, $phpEx; - include($phpbb_root_path . 'includes/utf/data/utf_canonical_decomp.' . $phpEx); - } - - // Replace any byte in the range 0x00..0x1F, except for \r, \n and \t - // We replace those characters with a 0xFF byte, which is illegal in UTF-8 and will in turn be replaced with a UTF replacement char - $str = strtr( - $str, - "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F", - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" - ); - - $str = utf_new_normalizer::recompose($str, $pos, $len, $GLOBALS['utf_nfc_qc'], $GLOBALS['utf_canonical_decomp']); - } - - /** - * Validate and normalize a UTF string to NFC - * - * @param string &$str Unchecked UTF string - * @return string The string, validated and in normal form - */ - function nfc(&$str) - { - $pos = strspn($str, UTF8_ASCII_RANGE); - $len = strlen($str); - - if ($pos == $len) - { - // ASCII strings return immediately - return; - } - - if (!isset($GLOBALS['utf_nfc_qc'])) - { - global $phpbb_root_path, $phpEx; - include($phpbb_root_path . 'includes/utf/data/utf_nfc_qc.' . $phpEx); - } - - if (!isset($GLOBALS['utf_canonical_decomp'])) - { - global $phpbb_root_path, $phpEx; - include($phpbb_root_path . 'includes/utf/data/utf_canonical_decomp.' . $phpEx); - } - - $str = utf_new_normalizer::recompose($str, $pos, $len, $GLOBALS['utf_nfc_qc'], $GLOBALS['utf_canonical_decomp']); - } - - /** - * Validate and normalize a UTF string to NFKC - * - * @param string &$str Unchecked UTF string - * @return string The string, validated and in normal form - */ - function nfkc(&$str) - { - $pos = strspn($str, UTF8_ASCII_RANGE); - $len = strlen($str); - - if ($pos == $len) - { - // ASCII strings return immediately - return; - } - - if (!isset($GLOBALS['utf_nfkc_qc'])) - { - global $phpbb_root_path, $phpEx; - include($phpbb_root_path . 'includes/utf/data/utf_nfkc_qc.' . $phpEx); - } - - if (!isset($GLOBALS['utf_compatibility_decomp'])) - { - global $phpbb_root_path, $phpEx; - include($phpbb_root_path . 'includes/utf/data/utf_compatibility_decomp.' . $phpEx); - } - - $str = utf_new_normalizer::recompose($str, $pos, $len, $GLOBALS['utf_nfkc_qc'], $GLOBALS['utf_compatibility_decomp']); - } - - /** - * Recompose a UTF string - * - * @param string $str Unchecked UTF string - * @param integer $pos Position of the first UTF char (in bytes) - * @param integer $len Length of the string (in bytes) - * @param array &$qc Quick-check array, passed by reference but never modified - * @param array &$decomp_map Decomposition mapping, passed by reference but never modified - * @return string The string, validated and recomposed - * - * @access private - */ - function recompose($str, $pos, $len, &$qc, &$decomp_map) - { - global $utf_canonical_comp; - - // Load the canonical composition table - if (!isset($utf_canonical_comp)) - { - global $phpbb_root_path, $phpEx; - include($phpbb_root_path . 'includes/utf/data/utf_canonical_comp.' . $phpEx); - } - - return utf_normalizer::recompose($str, $pos, $len, $qc, $decomp_map); - } -} diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php deleted file mode 100644 index 80fd40a944..0000000000 --- a/phpBB/install/database_update.php +++ /dev/null @@ -1,252 +0,0 @@ -<?php -/** -* -* This file is part of the phpBB Forum Software package. -* -* @copyright (c) phpBB Limited <https://www.phpbb.com> -* @license GNU General Public License, version 2 (GPL-2.0) -* -* For full copyright and license information, please see -* the docs/CREDITS.txt file. -* -*/ - -$update_start_time = time(); - -/** -* @ignore -*/ -define('IN_PHPBB', true); -define('IN_INSTALL', true); -$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './../'; -$phpEx = substr(strrchr(__FILE__, '.'), 1); - -function phpbb_end_update($cache, $config) -{ - $cache->purge(); - - $config->increment('assets_version', 1); - -?> - </p> - </div> - </div> - <span class="corners-bottom"><span></span></span> - </div> - </div> - </div> - - <div id="page-footer"> - <div class="copyright"> - Powered by <a href="https://www.phpbb.com/">phpBB</a>® Forum Software © phpBB Limited - </div> - </div> - </div> -</body> -</html> - -<?php - - garbage_collection(); - exit_handler(); -} - -require($phpbb_root_path . 'includes/startup.' . $phpEx); -require($phpbb_root_path . 'phpbb/class_loader.' . $phpEx); - -$phpbb_class_loader = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}phpbb/", $phpEx); -$phpbb_class_loader->register(); - -$phpbb_config_php_file = new \phpbb\config_php_file($phpbb_root_path, $phpEx); -extract($phpbb_config_php_file->get_all()); - -if (!defined('PHPBB_INSTALLED') || empty($dbms) || empty($acm_type)) -{ - die("Please read: <a href='../docs/INSTALL.html'>INSTALL.html</a> before attempting to update."); -} - -// In case $phpbb_adm_relative_path is not set (in case of an update), use the default. -$phpbb_adm_relative_path = (isset($phpbb_adm_relative_path)) ? $phpbb_adm_relative_path : 'adm/'; -$phpbb_admin_path = (defined('PHPBB_ADMIN_PATH')) ? PHPBB_ADMIN_PATH : $phpbb_root_path . $phpbb_adm_relative_path; - -// Include files -require($phpbb_root_path . 'includes/functions.' . $phpEx); -require($phpbb_root_path . 'includes/functions_content.' . $phpEx); - -require($phpbb_root_path . 'includes/constants.' . $phpEx); -include($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx); -require($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx); - -// Set PHP error handler to ours -set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler'); - -// Set up container (must be done here because extensions table may not exist) -$phpbb_container_builder = new \phpbb\di\container_builder($phpbb_config_php_file, $phpbb_root_path, $phpEx); -$phpbb_container_builder->set_use_extensions(false); -$phpbb_container_builder->set_use_kernel_pass(false); -$phpbb_container_builder->set_dump_container(false); -$phpbb_container = $phpbb_container_builder->get_container(); - -// set up caching -$cache = $phpbb_container->get('cache'); - -// Instantiate some basic classes -$phpbb_dispatcher = $phpbb_container->get('dispatcher'); -$request = $phpbb_container->get('request'); -$user = $phpbb_container->get('user'); -$auth = $phpbb_container->get('auth'); -$db = $phpbb_container->get('dbal.conn'); -$phpbb_log = $phpbb_container->get('log'); - -// make sure request_var uses this request instance -request_var('', 0, false, false, $request); // "dependency injection" for a function - -// Grab global variables, re-cache if necessary -$config = $phpbb_container->get('config'); -set_config(null, null, null, $config); -set_config_count(null, null, null, $config); - -if (!isset($config['version_update_from'])) -{ - $config->set('version_update_from', $config['version']); -} - -$orig_version = $config['version_update_from']; - -$user->add_lang(array('common', 'acp/common', 'install', 'migrator')); - -// Add own hook handler, if present. :o -if (file_exists($phpbb_root_path . 'includes/hooks/index.' . $phpEx)) -{ - require($phpbb_root_path . 'includes/hooks/index.' . $phpEx); - $phpbb_hook = new phpbb_hook(array('exit_handler', 'phpbb_user_session_handler', 'append_sid', array('template', 'display'))); - - $phpbb_hook_finder = $phpbb_container->get('hook_finder'); - foreach ($phpbb_hook_finder->find() as $hook) - { - @include($phpbb_root_path . 'includes/hooks/' . $hook . '.' . $phpEx); - } -} -else -{ - $phpbb_hook = false; -} - -header('Content-type: text/html; charset=UTF-8'); -?> -<!DOCTYPE html> -<html dir="<?php echo $user->lang['DIRECTION']; ?>" lang="<?php echo $user->lang['USER_LANG']; ?>"> -<head> -<meta charset="utf-8"> - -<title><?php echo $user->lang['UPDATING_TO_LATEST_STABLE']; ?></title> - -<link href="<?php echo htmlspecialchars($phpbb_admin_path); ?>style/admin.css" rel="stylesheet" type="text/css" media="screen" /> - -</head> - -<body> - <div id="wrap"> - <div id="page-header"> </div> - - <div id="page-body"> - <div id="acp"> - <div class="panel"> - <span class="corners-top"><span></span></span> - <div id="content"> - <div id="main" class="install-body"> - - <h1><?php echo $user->lang['UPDATING_TO_LATEST_STABLE']; ?></h1> - - <br /> - - <p><?php echo $user->lang['DATABASE_TYPE']; ?> :: <strong><?php echo $db->get_sql_layer(); ?></strong><br /> - <?php echo $user->lang['PREVIOUS_VERSION']; ?> :: <strong><?php echo $config['version']; ?></strong><br /> - -<?php - -define('IN_DB_UPDATE', true); - -/** -* @todo mysql update? -*/ - -// End startup code - -$migrator = $phpbb_container->get('migrator'); -$migrator->set_output_handler(new \phpbb\db\log_wrapper_migrator_output_handler($user, new \phpbb\db\html_migrator_output_handler($user), $phpbb_root_path . 'store/migrations_' . time() . '.log')); - -$migrator->create_migrations_table(); - -$phpbb_extension_manager = $phpbb_container->get('ext.manager'); - -$migrations = $phpbb_extension_manager - ->get_finder() - ->core_path('phpbb/db/migration/data/') - ->extension_directory('/migrations') - ->get_classes(); - -$migrator->set_migrations($migrations); - -// What is a safe limit of execution time? Half the max execution time should be safe. -// No more than 15 seconds so the user isn't sitting and waiting for a very long time -$phpbb_ini = new \phpbb\php\ini(); -$safe_time_limit = min(15, ($phpbb_ini->get_int('max_execution_time') / 2)); - -// While we're going to try limit this to half the max execution time, -// we want to try and take additional measures to prevent hitting the -// max execution time (if, say, one migration step takes much longer -// than the max execution time) -@set_time_limit(0); - -while (!$migrator->finished()) -{ - try - { - $migrator->update(); - } - catch (\phpbb\db\migration\exception $e) - { - echo $e->getLocalisedMessage($user); - - phpbb_end_update($cache, $config); - } - - $state = array_merge(array( - 'migration_schema_done' => false, - 'migration_data_done' => false, - ), - $migrator->last_run_migration['state'] - ); - - // Are we approaching the time limit? If so we want to pause the update and continue after refreshing - if ((time() - $update_start_time) >= $safe_time_limit) - { - echo '<br />' . $user->lang['DATABASE_UPDATE_NOT_COMPLETED'] . '<br /><br />'; - echo '<a href="' . append_sid($phpbb_root_path . 'install/database_update.' . $phpEx, 'type=' . $request->variable('type', 0) . '&language=' . $request->variable('language', 'en')) . '" class="button1">' . $user->lang['DATABASE_UPDATE_CONTINUE'] . '</a>'; - - phpbb_end_update($cache, $config); - } -} - -if ($orig_version != $config['version']) -{ - add_log('admin', 'LOG_UPDATE_DATABASE', $orig_version, $config['version']); -} - -echo $user->lang['DATABASE_UPDATE_COMPLETE'] . '<br />'; - -if ($request->variable('type', 0)) -{ - echo $user->lang['INLINE_UPDATE_SUCCESSFUL'] . '<br /><br />'; - echo '<a href="' . append_sid($phpbb_root_path . 'install/index.' . $phpEx, 'mode=update&sub=update_db&language=' . $request->variable('language', 'en')) . '" class="button1">' . $user->lang['CONTINUE_UPDATE_NOW'] . '</a>'; -} -else -{ - echo '<div class="errorbox">' . $user->lang['UPDATE_FILES_NOTICE'] . '</div>'; - echo $user->lang['COMPLETE_LOGIN_TO_BOARD']; -} - -$config->delete('version_update_from'); - -phpbb_end_update($cache, $config); diff --git a/phpBB/install/index.html b/phpBB/install/index.html new file mode 100644 index 0000000000..8f8bfb4fb2 --- /dev/null +++ b/phpBB/install/index.html @@ -0,0 +1,11 @@ +<html> +<head> +<title></title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +<meta http-equiv="refresh" content="0; url=./app.php" /> +</head> + +<body bgcolor="#FFFFFF" text="#000000"> + +</body> +</html> diff --git a/phpBB/install/index.php b/phpBB/install/index.php deleted file mode 100644 index 5c16421499..0000000000 --- a/phpBB/install/index.php +++ /dev/null @@ -1,833 +0,0 @@ -<?php -/** -* -* This file is part of the phpBB Forum Software package. -* -* @copyright (c) phpBB Limited <https://www.phpbb.com> -* @license GNU General Public License, version 2 (GPL-2.0) -* -* For full copyright and license information, please see -* the docs/CREDITS.txt file. -* -*/ - -/**#@+ -* @ignore -*/ -define('IN_PHPBB', true); -define('IN_INSTALL', true); -/**#@-*/ - -$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './../'; -$phpEx = substr(strrchr(__FILE__, '.'), 1); - -if (version_compare(PHP_VERSION, '5.3.3') < 0) -{ - die('You are running an unsupported PHP version. Please upgrade to PHP 5.3.3 or higher before trying to install phpBB 3.1'); -} - -function phpbb_require_updated($path, $optional = false) -{ - global $phpbb_root_path, $table_prefix; - - $new_path = $phpbb_root_path . 'install/update/new/' . $path; - $old_path = $phpbb_root_path . $path; - - if (file_exists($new_path)) - { - require($new_path); - } - else if (!$optional || file_exists($old_path)) - { - require($old_path); - } -} - -function phpbb_include_updated($path, $optional = false) -{ - global $phpbb_root_path; - - $new_path = $phpbb_root_path . 'install/update/new/' . $path; - $old_path = $phpbb_root_path . $path; - - if (file_exists($new_path)) - { - include($new_path); - } - else if (!$optional || file_exists($old_path)) - { - include($old_path); - } -} - -phpbb_require_updated('includes/startup.' . $phpEx); - -// 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); - -// In case $phpbb_adm_relative_path is not set (in case of an update), use the default. -$phpbb_adm_relative_path = (isset($phpbb_adm_relative_path)) ? $phpbb_adm_relative_path : 'adm/'; -$phpbb_admin_path = (defined('PHPBB_ADMIN_PATH')) ? PHPBB_ADMIN_PATH : $phpbb_root_path . $phpbb_adm_relative_path; - -// Include essential scripts -phpbb_require_updated('phpbb/class_loader.' . $phpEx); - -phpbb_require_updated('includes/functions.' . $phpEx); - -phpbb_require_updated('includes/functions_content.' . $phpEx, true); - -phpbb_include_updated('includes/functions_admin.' . $phpEx); -phpbb_include_updated('includes/utf/utf_normalizer.' . $phpEx); -phpbb_include_updated('includes/utf/utf_tools.' . $phpEx); -phpbb_require_updated('includes/functions_install.' . $phpEx); - -// Setup class loader first -$phpbb_class_loader_new = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}install/update/new/phpbb/", $phpEx); -$phpbb_class_loader_new->register(); -$phpbb_class_loader = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}phpbb/", $phpEx); -$phpbb_class_loader->register(); -$phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx); -$phpbb_class_loader_ext->register(); - -// Set up container -$phpbb_config_php_file = new \phpbb\config_php_file($phpbb_root_path, $phpEx); -$phpbb_container_builder = new \phpbb\di\container_builder($phpbb_config_php_file, $phpbb_root_path, $phpEx); -$phpbb_container_builder->set_use_extensions(false); -$phpbb_container_builder->set_dump_container(false); -$phpbb_container_builder->set_use_custom_pass(false); -$phpbb_container_builder->set_inject_config(false); -$phpbb_container_builder->set_compile_container(false); - -$other_config_path = $phpbb_root_path . 'install/update/new/config/'; -$config_path = file_exists($other_config_path . 'services.yml') ? $other_config_path : $phpbb_root_path . 'config/'; -$phpbb_container_builder->set_config_path($config_path); - -$phpbb_container_builder->set_custom_parameters(array( - 'core.root_path' => $phpbb_root_path, - 'core.adm_relative_path' => $phpbb_adm_relative_path, - 'core.php_ext' => $phpEx, - 'core.table_prefix' => '', - 'cache.driver.class' => 'phpbb\cache\driver\file', -)); - -$phpbb_container = $phpbb_container_builder->get_container(); -$phpbb_container->register('dbal.conn.driver')->setSynthetic(true); -$phpbb_container->compile(); - -$phpbb_class_loader->set_cache($phpbb_container->get('cache.driver')); -$phpbb_class_loader_ext->set_cache($phpbb_container->get('cache.driver')); - -$phpbb_dispatcher = $phpbb_container->get('dispatcher'); -$request = $phpbb_container->get('request'); - -// make sure request_var uses this request instance -request_var('', 0, false, false, $request); // "dependency injection" for a function - -// Try and load an appropriate language if required -$language = basename($request->variable('language', '')); - -if ($request->header('Accept-Language') && !$language) -{ - $accept_lang_ary = explode(',', strtolower($request->header('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) && is_dir($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) && is_dir($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) || !is_dir($phpbb_root_path . 'language/' . $language)) -{ - die('No language found!'); -} - -// And finally, load the relevant language files -$load_lang_files = array('common', 'acp/common', 'acp/board', 'install', 'posting'); -$new_path = $phpbb_root_path . 'install/update/new/language/' . $language . '/'; -$old_path = $phpbb_root_path . 'language/' . $language . '/'; - -// NOTE: we can not use "phpbb_include_updated" as the files uses vars which would be required -// to be global while loading. -foreach ($load_lang_files as $lang_file) -{ - if (file_exists($new_path . $lang_file . '.' . $phpEx)) - { - include($new_path . $lang_file . '.' . $phpEx); - } - else - { - include($old_path . $lang_file . '.' . $phpEx); - } -} - -// usually we would need every single constant here - and it would be consistent. For 3.0.x, use a dirty hack... :( - -// Define needed constants -define('CHMOD_ALL', 7); -define('CHMOD_READ', 4); -define('CHMOD_WRITE', 2); -define('CHMOD_EXECUTE', 1); - -$mode = $request->variable('mode', 'overview'); -$sub = $request->variable('sub', ''); - -// Set PHP error handler to ours -set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler'); - -$user = new \phpbb\user('\phpbb\datetime'); -$auth = new \phpbb\auth\auth(); - -// Add own hook handler, if present. :o -if (file_exists($phpbb_root_path . 'includes/hooks/index.' . $phpEx)) -{ - require($phpbb_root_path . 'includes/hooks/index.' . $phpEx); - $phpbb_hook = new phpbb_hook(array('exit_handler', 'phpbb_user_session_handler', 'append_sid', array('template', 'display'))); - - $phpbb_hook_finder = $phpbb_container->get('hook_finder'); - foreach ($phpbb_hook_finder->find() as $hook) - { - @include($phpbb_root_path . 'includes/hooks/' . $hook . '.' . $phpEx); - } -} -else -{ - $phpbb_hook = false; -} - -// Set some standard variables we want to force -$config = new \phpbb\config\config(array( - 'load_tplcompile' => '1' -)); - -$symfony_request = $phpbb_container->get('symfony_request'); -$phpbb_filesystem = $phpbb_container->get('filesystem'); -$phpbb_path_helper = $phpbb_container->get('path_helper'); -$template = new \phpbb\template\twig\twig($phpbb_path_helper, $config, $user, new \phpbb\template\context()); -$paths = array($phpbb_root_path . 'install/update/new/adm/style', $phpbb_admin_path . 'style'); -$paths = array_filter($paths, 'is_dir'); -$template->set_custom_style(array( - array( - 'name' => 'adm', - 'ext_path' => 'adm/style/', - ), -), $paths); - -$path = array_shift($paths); - -$template->assign_var('T_ASSETS_PATH', $path . '/../../assets'); -$template->assign_var('T_TEMPLATE_PATH', $path); - -$install = new module(); - -$install->create('install', "index.$phpEx", $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(); - -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, $phpEx, $phpbb_root_path; - - $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_(.*?)\.' . $phpEx . '$#', $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) - { - // 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) - { - global $phpbb_root_path, $phpEx; - - 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, $phpbb_admin_path, $path; - - $template->assign_vars(array( - 'L_CHANGE' => $lang['CHANGE'], - 'L_COLON' => $lang['COLON'], - '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' => htmlspecialchars($phpbb_admin_path) . 'images/', - 'T_JQUERY_LINK' => $path . '/../../assets/javascript/jquery.min.js', - - '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: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT'); - - 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) - { - global $request; - - // HTTP_HOST is having the correct browser url in most cases... - $server_name = strtolower(htmlspecialchars_decode($request->header('Host', $request->server('SERVER_NAME')))); - $server_port = $request->server('SERVER_PORT', 0); - $secure = $request->is_secure() ? 1 : 0; - - $script_name = htmlspecialchars_decode($request->server('PHP_SELF')); - if (!$script_name) - { - $script_name = htmlspecialchars_decode($request->server('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, $phpEx, $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, $phpbb_admin_path; - - 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>'; - echo '<html dir="ltr">'; - echo '<head>'; - echo '<meta charset="utf-8">'; - echo '<title>' . $lang['INST_ERR_FATAL'] . '</title>'; - echo '<link href="' . htmlspecialchars($phpbb_admin_path) . '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 <a href="https://www.phpbb.com/">phpBB</a>® Forum Software © phpBB Limited'; - 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->get_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': - // HTML5 text-like input types - case 'color': - case 'date': - case 'time': - case 'datetime': - case 'datetime-local': - case 'email': - case 'month': - case 'number': - case 'range': - case 'search': - case 'tel': - case 'url': - case 'week': - - $size = (int) $tpl_type[1]; - $maxlength = (int) $tpl_type[2]; - $autocomplete = (isset($options['autocomplete']) && $options['autocomplete'] == 'off') ? ' autocomplete="off"' : ''; - - $tpl = '<input id="' . $name . '" type="' . $tpl_type[0] . '"' . (($size) ? ' size="' . $size . '"' : '') . ' maxlength="' . (($maxlength) ? $maxlength : 255) . '" name="' . $name . '"' . $autocomplete . ' 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': - // @codingStandardsIgnoreStart - eval('$s_options = ' . str_replace('{VALUE}', $value, $options) . ';'); - // @codingStandardsIgnoreEnd - $tpl = '<select id="' . $name . '" name="' . $name . '">' . $s_options . '</select>'; - break; - - case 'custom': - // @codingStandardsIgnoreStart - eval('$tpl = ' . str_replace('{VALUE}', $value, $options) . ';'); - // @codingStandardsIgnoreEnd - break; - - default: - break; - } - - return $tpl; - } - - /** - * Generate the drop down of available language packs - */ - function inst_language_select($default = '') - { - global $phpbb_root_path, $phpEx; - - $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; - } -} diff --git a/phpBB/install/install_convert.php b/phpBB/install/install_convert.php deleted file mode 100644 index a0f8a928de..0000000000 --- a/phpBB/install/install_convert.php +++ /dev/null @@ -1,2150 +0,0 @@ -<?php -/** -* -* This file is part of the phpBB Forum Software package. -* -* @copyright (c) phpBB Limited <https://www.phpbb.com> -* @license GNU General Public License, version 2 (GPL-2.0) -* -* For full copyright and license information, please see -* the docs/CREDITS.txt file. -* -*/ - -/** -*/ - -if (!defined('IN_INSTALL')) -{ - // Someone has tried to access the file direct. This is not a good idea, so exit - exit; -} - -if (!empty($setmodules)) -{ - $module[] = array( - 'module_type' => 'install', - 'module_title' => 'CONVERT', - 'module_filename' => substr(basename(__FILE__), 0, -strlen($phpEx)-1), - 'module_order' => 20, - 'module_subs' => '', - 'module_stages' => array('INTRO', 'SETTINGS', 'IN_PROGRESS', 'FINAL'), - 'module_reqs' => '' - ); -} - -/** -* Class holding all convertor-specific details. -*/ -class convert -{ - var $options = array(); - - var $convertor_tag = ''; - var $src_dbms = ''; - var $src_dbhost = ''; - var $src_dbport = ''; - var $src_dbuser = ''; - var $src_dbpasswd = ''; - var $src_dbname = ''; - var $src_table_prefix = ''; - - var $convertor_data = array(); - var $tables = array(); - var $config_schema = array(); - var $convertor = array(); - var $src_truncate_statement = 'DELETE FROM '; - var $truncate_statement = 'DELETE FROM '; - - var $fulltext_search; - - // Batch size, can be adjusted by the conversion file - // For big boards a value of 6000 seems to be optimal - var $batch_size = 2000; - // Number of rows to be inserted at once (extended insert) if supported - // For installations having enough memory a value of 60 may be good. - var $num_wait_rows = 20; - - // Mysqls internal recoding engine messing up with our (better) functions? We at least support more encodings than mysql so should use it in favor. - var $mysql_convert = false; - - var $p_master; - - function convert(&$p_master) - { - $this->p_master = &$p_master; - } -} - -/** -* Convert class for conversions -*/ -class install_convert extends module -{ - /** @var array */ - protected $lang; - - /** @var string */ - protected $language; - - /** @var \phpbb\template\template */ - protected $template; - - /** @var string */ - protected $phpbb_root_path; - - /** @var string */ - protected $php_ext; - - /** - * Variables used while converting, they are accessible from the global variable $convert - */ - function install_convert(&$p_master) - { - $this->p_master = &$p_master; - } - - function main($mode, $sub) - { - global $lang, $template, $phpbb_root_path, $phpEx, $cache, $config, $language, $table_prefix; - global $convert, $request, $phpbb_container, $phpbb_config_php_file; - - $this->tpl_name = 'install_convert'; - $this->mode = $mode; - $this->lang = $lang; - $this->language = $language; - $this->template = $template; - $this->phpbb_root_path = $phpbb_root_path; - $this->php_ext = $phpEx; - - if (!$this->check_phpbb_installed()) - { - return; - } - - $convert = new convert($this->p_master); - - // Enable super globals to prevent issues with the new \phpbb\request\request object - $request->enable_super_globals(); - // Create a normal container now - $phpbb_container_builder = new \phpbb\di\container_builder($phpbb_config_php_file, $phpbb_root_path, $phpEx); - $phpbb_container = $phpbb_container_builder->get_container(); - - // Create cache - $cache = $phpbb_container->get('cache'); - - switch ($sub) - { - case 'intro': - extract($phpbb_config_php_file->get_all()); - - require($phpbb_root_path . 'includes/constants.' . $phpEx); - require($phpbb_root_path . 'includes/functions_convert.' . $phpEx); - - $dbms = $phpbb_config_php_file->convert_30_dbms_to_31($dbms); - - $db = new $dbms(); - $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, true); - unset($dbpasswd); - - // We need to fill the config to let internal functions correctly work - $config = new \phpbb\config\db($db, new \phpbb\cache\driver\null, CONFIG_TABLE); - set_config(null, null, null, $config); - set_config_count(null, null, null, $config); - - // Detect if there is already a conversion in progress at this point and offer to resume - // It's quite possible that the user will get disconnected during a large conversion so they need to be able to resume it - $new_conversion = request_var('new_conv', 0); - - if ($new_conversion) - { - $config['convert_progress'] = ''; - $config['convert_db_server'] = ''; - $config['convert_db_user'] = ''; - $db->sql_query('DELETE FROM ' . CONFIG_TABLE . " - WHERE config_name = 'convert_progress' - OR config_name = 'convert_db_server' - OR config_name = 'convert_db_user'" - ); - } - - // Let's see if there is a conversion in the works... - $options = array(); - if (!empty($config['convert_progress']) && !empty($config['convert_db_server']) && !empty($config['convert_db_user']) && !empty($config['convert_options'])) - { - $options = unserialize($config['convert_progress']); - $options = array_merge($options, unserialize($config['convert_db_server']), unserialize($config['convert_db_user']), unserialize($config['convert_options'])); - } - - // This information should have already been checked once, but do it again for safety - if (!empty($options) && !empty($options['tag']) && - isset($options['dbms']) && - isset($options['dbhost']) && - isset($options['dbport']) && - isset($options['dbuser']) && - isset($options['dbpasswd']) && - isset($options['dbname']) && - isset($options['table_prefix'])) - { - $this->page_title = $lang['CONTINUE_CONVERT']; - - $template->assign_vars(array( - 'TITLE' => $lang['CONTINUE_CONVERT'], - 'BODY' => $lang['CONTINUE_CONVERT_BODY'], - 'L_NEW' => $lang['CONVERT_NEW_CONVERSION'], - 'L_CONTINUE' => $lang['CONTINUE_OLD_CONVERSION'], - 'S_CONTINUE' => true, - - 'U_NEW_ACTION' => $this->p_master->module_url . "?mode={$this->mode}&sub=intro&new_conv=1&language=$language", - 'U_CONTINUE_ACTION' => $this->p_master->module_url . "?mode={$this->mode}&sub=in_progress&tag={$options['tag']}{$options['step']}&language=$language", - )); - - return; - } - - $this->list_convertors($sub); - - break; - - case 'settings': - $this->get_convert_settings($sub); - break; - - case 'in_progress': - $this->convert_data($sub); - break; - - case 'final': - $this->page_title = $lang['CONVERT_COMPLETE']; - - $template->assign_vars(array( - 'TITLE' => $lang['CONVERT_COMPLETE'], - 'BODY' => $lang['CONVERT_COMPLETE_EXPLAIN'], - )); - - // If we reached this step (conversion completed) we want to purge the cache and log the user out. - // This is for making sure the session get not screwed due to the 3.0.x users table being completely new. - $cache->purge(); - - extract($phpbb_config_php_file->get_all()); - - require($phpbb_root_path . 'includes/constants.' . $phpEx); - require($phpbb_root_path . 'includes/functions_convert.' . $phpEx); - - $dbms = $phpbb_config_php_file->convert_30_dbms_to_31($dbms); - - $db = new $dbms(); - $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, true); - unset($dbpasswd); - - $sql = 'SELECT config_value - FROM ' . CONFIG_TABLE . ' - WHERE config_name = \'search_type\''; - $result = $db->sql_query($sql); - - if ($db->sql_fetchfield('config_value') != 'fulltext_mysql') - { - $template->assign_vars(array( - 'S_ERROR_BOX' => true, - 'ERROR_TITLE' => $lang['SEARCH_INDEX_UNCONVERTED'], - 'ERROR_MSG' => $lang['SEARCH_INDEX_UNCONVERTED_EXPLAIN'], - )); - } - - switch ($db->get_sql_layer()) - { - case 'sqlite': - case 'sqlite3': - $db->sql_query('DELETE FROM ' . SESSIONS_KEYS_TABLE); - $db->sql_query('DELETE FROM ' . SESSIONS_TABLE); - break; - - default: - $db->sql_query('TRUNCATE TABLE ' . SESSIONS_KEYS_TABLE); - $db->sql_query('TRUNCATE TABLE ' . SESSIONS_TABLE); - break; - } - - break; - } - } - - /** - * Check whether phpBB is installed. - * Assigns error template vars if not installed. - * - * @return bool Returns true if phpBB is installed. - */ - public function check_phpbb_installed() - { - if (phpbb_check_installation_exists($this->phpbb_root_path, $this->php_ext)) - { - return true; - } - - $this->page_title = 'BOARD_NOT_INSTALLED'; - $install_url = append_sid($this->phpbb_root_path . 'install/index.' . $this->php_ext, 'mode=install&language=' . $this->language); - - $this->template->assign_vars(array( - 'S_NOT_INSTALLED' => true, - 'BODY' => sprintf($this->lang['BOARD_NOT_INSTALLED_EXPLAIN'], $install_url), - )); - - return false; - } - - /** - * Generate a list of all available conversion modules - */ - function list_convertors($sub) - { - global $lang, $language, $template, $phpbb_root_path, $phpEx; - - $this->page_title = $lang['SUB_INTRO']; - - $template->assign_vars(array( - 'TITLE' => $lang['CONVERT_INTRO'], - 'BODY' => $lang['CONVERT_INTRO_BODY'], - - 'L_AUTHOR' => $lang['AUTHOR'], - 'L_AVAILABLE_CONVERTORS' => $lang['AVAILABLE_CONVERTORS'], - 'L_CONVERT' => $lang['CONVERT'], - 'L_NO_CONVERTORS' => $lang['NO_CONVERTORS'], - 'L_OPTIONS' => $lang['CONVERT_OPTIONS'], - 'L_SOFTWARE' => $lang['SOFTWARE'], - 'L_VERSION' => $lang['VERSION'], - - 'S_LIST' => true, - )); - - $convertors = $sort = array(); - $get_info = true; - - $handle = @opendir('./convertors/'); - - if (!$handle) - { - $this->error('Unable to access the convertors directory', __LINE__, __FILE__); - } - - while ($entry = readdir($handle)) - { - if (preg_match('/^convert_([a-z0-9_]+).' . $phpEx . '$/i', $entry, $m)) - { - include('./convertors/' . $entry); - if (isset($convertor_data)) - { - $sort[strtolower($convertor_data['forum_name'])] = sizeof($convertors); - - $convertors[] = array( - 'tag' => $m[1], - 'forum_name' => $convertor_data['forum_name'], - 'version' => $convertor_data['version'], - 'dbms' => $convertor_data['dbms'], - 'dbhost' => $convertor_data['dbhost'], - 'dbport' => $convertor_data['dbport'], - 'dbuser' => $convertor_data['dbuser'], - 'dbpasswd' => $convertor_data['dbpasswd'], - 'dbname' => $convertor_data['dbname'], - 'table_prefix' => $convertor_data['table_prefix'], - 'author' => $convertor_data['author'] - ); - } - unset($convertor_data); - } - } - closedir($handle); - - @ksort($sort); - - foreach ($sort as $void => $index) - { - $template->assign_block_vars('convertors', array( - 'AUTHOR' => $convertors[$index]['author'], - 'SOFTWARE' => $convertors[$index]['forum_name'], - 'VERSION' => $convertors[$index]['version'], - - 'U_CONVERT' => $this->p_master->module_url . "?mode={$this->mode}&language=$language&sub=settings&tag=" . $convertors[$index]['tag'], - )); - } - } - - /** - */ - function get_convert_settings($sub) - { - global $lang, $language, $template, $db, $phpbb_root_path, $phpEx, $config, $cache, $phpbb_config_php_file; - - extract($phpbb_config_php_file->get_all()); - - require($phpbb_root_path . 'includes/constants.' . $phpEx); - require($phpbb_root_path . 'includes/functions_convert.' . $phpEx); - - $dbms = $phpbb_config_php_file->convert_30_dbms_to_31($dbms); - - $db = new $dbms(); - $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, true); - unset($dbpasswd); - - $this->page_title = $lang['STAGE_SETTINGS']; - - // We need to fill the config to let internal functions correctly work - $config = new \phpbb\config\db($db, new \phpbb\cache\driver\null, CONFIG_TABLE); - set_config(null, null, null, $config); - set_config_count(null, null, null, $config); - - $convertor_tag = request_var('tag', ''); - - if (empty($convertor_tag)) - { - $this->p_master->error($lang['NO_CONVERT_SPECIFIED'], __LINE__, __FILE__); - } - $get_info = true; - - // check security implications of direct inclusion - $convertor_tag = basename($convertor_tag); - if (!file_exists('./convertors/convert_' . $convertor_tag . '.' . $phpEx)) - { - $this->p_master->error($lang['CONVERT_NOT_EXIST'], __LINE__, __FILE__); - } - - include('./convertors/convert_' . $convertor_tag . '.' . $phpEx); - - // The test_file is a file that should be present in the location of the old board. - if (!isset($test_file)) - { - $this->p_master->error($lang['DEV_NO_TEST_FILE'], __LINE__, __FILE__); - } - - $submit = (isset($_POST['submit'])) ? true : false; - - $src_dbms = request_var('src_dbms', $convertor_data['dbms']); - $src_dbhost = request_var('src_dbhost', $convertor_data['dbhost']); - $src_dbport = request_var('src_dbport', $convertor_data['dbport']); - $src_dbuser = request_var('src_dbuser', $convertor_data['dbuser']); - $src_dbpasswd = request_var('src_dbpasswd', $convertor_data['dbpasswd']); - $src_dbname = request_var('src_dbname', $convertor_data['dbname']); - $src_table_prefix = request_var('src_table_prefix', $convertor_data['table_prefix']); - $forum_path = request_var('forum_path', $convertor_data['forum_path']); - $refresh = request_var('refresh', 1); - - // Default URL of the old board - // @todo Are we going to use this for attempting to convert URL references in posts, or should we remove it? - // -> We should convert old urls to the new relative urls format - // $src_url = request_var('src_url', 'Not in use at the moment'); - - // strip trailing slash from old forum path - $forum_path = (strlen($forum_path) && $forum_path[strlen($forum_path) - 1] == '/') ? substr($forum_path, 0, -1) : $forum_path; - - $error = array(); - if ($submit) - { - if (!@file_exists('./../' . $forum_path . '/' . $test_file)) - { - $error[] = sprintf($lang['COULD_NOT_FIND_PATH'], $forum_path); - } - - $connect_test = false; - $available_dbms = get_available_dbms(false, true, true); - - if (!isset($available_dbms[$src_dbms]) || !$available_dbms[$src_dbms]['AVAILABLE']) - { - $error[] = $lang['INST_ERR_NO_DB']; - $connect_test = false; - } - else - { - $connect_test = connect_check_db(true, $error, $available_dbms[$src_dbms], $src_table_prefix, $src_dbhost, $src_dbuser, htmlspecialchars_decode($src_dbpasswd), $src_dbname, $src_dbport, true, ($src_dbms == $dbms) ? false : true, false); - } - - // The forum prefix of the old and the new forum can only be the same if two different databases are used. - if ($src_table_prefix == $table_prefix && $src_dbms == $dbms && $src_dbhost == $dbhost && $src_dbport == $dbport && $src_dbname == $dbname) - { - $error[] = sprintf($lang['TABLE_PREFIX_SAME'], $src_table_prefix); - } - - $src_dbms = $phpbb_config_php_file->convert_30_dbms_to_31($src_dbms); - - // Check table prefix - if (!sizeof($error)) - { - // initiate database connection to old db if old and new db differ - global $src_db, $same_db; - $src_db = $same_db = false; - - if ($src_dbms != $dbms || $src_dbhost != $dbhost || $src_dbport != $dbport || $src_dbname != $dbname || $src_dbuser != $dbuser) - { - $src_db = new $src_dbms(); - $src_db->sql_connect($src_dbhost, $src_dbuser, htmlspecialchars_decode($src_dbpasswd), $src_dbname, $src_dbport, false, true); - $same_db = false; - } - else - { - $src_db = $db; - $same_db = true; - } - - $src_db->sql_return_on_error(true); - $db->sql_return_on_error(true); - - // Try to select one row from the first table to see if the prefix is OK - $result = $src_db->sql_query_limit('SELECT * FROM ' . $src_table_prefix . $tables[0], 1); - - if (!$result) - { - $prefixes = array(); - - $tables_existing = get_tables($src_db); - $tables_existing = array_map('strtolower', $tables_existing); - foreach ($tables_existing as $table_name) - { - compare_table($tables, $table_name, $prefixes); - } - unset($tables_existing); - - foreach ($prefixes as $prefix => $count) - { - if ($count >= sizeof($tables)) - { - $possible_prefix = $prefix; - break; - } - } - - $msg = ''; - if (!empty($convertor_data['table_prefix'])) - { - $msg .= sprintf($lang['DEFAULT_PREFIX_IS'], $convertor_data['forum_name'], $convertor_data['table_prefix']); - } - - if (!empty($possible_prefix)) - { - $msg .= '<br />'; - $msg .= ($possible_prefix == '*') ? $lang['BLANK_PREFIX_FOUND'] : sprintf($lang['PREFIX_FOUND'], $possible_prefix); - $src_table_prefix = ($possible_prefix == '*') ? '' : $possible_prefix; - } - - $error[] = $msg; - } - $src_db->sql_freeresult($result); - $src_db->sql_return_on_error(false); - } - - if (!sizeof($error)) - { - // Save convertor Status - set_config('convert_progress', serialize(array( - 'step' => '', - 'table_prefix' => $src_table_prefix, - 'tag' => $convertor_tag, - )), true); - set_config('convert_db_server', serialize(array( - 'dbms' => $src_dbms, - 'dbhost' => $src_dbhost, - 'dbport' => $src_dbport, - 'dbname' => $src_dbname, - )), true); - set_config('convert_db_user', serialize(array( - 'dbuser' => $src_dbuser, - 'dbpasswd' => $src_dbpasswd, - )), true); - - // Save options - set_config('convert_options', serialize(array('forum_path' => './../' . $forum_path, 'refresh' => $refresh)), true); - - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['VERIFY_OPTIONS'], - 'RESULT' => $lang['CONVERT_SETTINGS_VERIFIED'], - )); - - $template->assign_vars(array( - 'L_SUBMIT' => $lang['BEGIN_CONVERT'], -// 'S_HIDDEN' => $s_hidden_fields, - 'U_ACTION' => $this->p_master->module_url . "?mode={$this->mode}&sub=in_progress&tag=$convertor_tag&language=$language", - )); - - return; - } - else - { - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['VERIFY_OPTIONS'], - 'RESULT' => '<b style="color:red">' . implode('<br />', $error) . '</b>', - )); - } - } // end submit - - foreach ($this->convert_options as $config_key => $vars) - { - if (!is_array($vars) && strpos($config_key, 'legend') === false) - { - continue; - } - - if (strpos($config_key, 'legend') !== false) - { - $template->assign_block_vars('options', array( - 'S_LEGEND' => true, - 'LEGEND' => $lang[$vars]) - ); - - continue; - } - - $options = isset($vars['options']) ? $vars['options'] : ''; - - $template->assign_block_vars('options', array( - 'KEY' => $config_key, - 'TITLE' => $lang[$vars['lang']], - 'S_EXPLAIN' => $vars['explain'], - 'S_LEGEND' => false, - 'TITLE_EXPLAIN' => ($vars['explain']) ? $lang[$vars['lang'] . '_EXPLAIN'] : '', - 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], ${$config_key}, $options), - ) - ); - } - - $template->assign_vars(array( - 'TITLE' => $lang['STAGE_SETTINGS'], - 'BODY' => $lang['CONV_OPTIONS_BODY'], - 'L_SUBMIT' => $lang['BEGIN_CONVERT'], - 'U_ACTION' => $this->p_master->module_url . "?mode={$this->mode}&sub=settings&tag=$convertor_tag&language=$language", - )); - } - - /** - * The function which does the actual work (or dispatches it to the relevant places) - */ - function convert_data($sub) - { - global $template, $user, $phpbb_root_path, $phpEx, $db, $lang, $config, $cache, $auth; - global $convert, $convert_row, $message_parser, $skip_rows, $language; - global $request, $phpbb_config_php_file, $phpbb_dispatcher; - - extract($phpbb_config_php_file->get_all()); - - require($phpbb_root_path . 'includes/constants.' . $phpEx); - require($phpbb_root_path . 'includes/functions_convert.' . $phpEx); - - $dbms = $phpbb_config_php_file->convert_30_dbms_to_31($dbms); - - $db = new $dbms(); - $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, true); - unset($dbpasswd); - - // We need to fill the config to let internal functions correctly work - $config = new \phpbb\config\db($db, new \phpbb\cache\driver\null, CONFIG_TABLE); - set_config(null, null, null, $config); - set_config_count(null, null, null, $config); - - // Override a couple of config variables for the duration - $config['max_quote_depth'] = 0; - - // @todo Need to confirm that max post length in source is <= max post length in destination or there may be interesting formatting issues - $config['max_post_chars'] = $config['min_post_chars'] = 0; - - // Set up a user as well. We _should_ have enough of a database here at this point to do this - // and it helps for any core code we call - $user->session_begin(); - $user->page = $user->extract_current_page($phpbb_root_path); - - // This is a little bit of a fudge, but it allows the language entries to be available to the - // core code without us loading them again - $user->lang = &$lang; - - $this->page_title = $user->lang['STAGE_IN_PROGRESS']; - - $convert->options = array(); - if (isset($config['convert_progress'])) - { - $convert->options = unserialize($config['convert_progress']); - $convert->options = array_merge($convert->options, unserialize($config['convert_db_server']), unserialize($config['convert_db_user']), unserialize($config['convert_options'])); - } - - // This information should have already been checked once, but do it again for safety - if (empty($convert->options) || empty($convert->options['tag']) || - !isset($convert->options['dbms']) || - !isset($convert->options['dbhost']) || - !isset($convert->options['dbport']) || - !isset($convert->options['dbuser']) || - !isset($convert->options['dbpasswd']) || - !isset($convert->options['dbname']) || - !isset($convert->options['table_prefix'])) - { - $this->p_master->error($user->lang['NO_CONVERT_SPECIFIED'], __LINE__, __FILE__); - } - - // Make some short variables accessible, for easier referencing - $convert->convertor_tag = basename($convert->options['tag']); - $convert->src_dbms = $convert->options['dbms']; - $convert->src_dbhost = $convert->options['dbhost']; - $convert->src_dbport = $convert->options['dbport']; - $convert->src_dbuser = $convert->options['dbuser']; - $convert->src_dbpasswd = $convert->options['dbpasswd']; - $convert->src_dbname = $convert->options['dbname']; - $convert->src_table_prefix = $convert->options['table_prefix']; - - // initiate database connection to old db if old and new db differ - global $src_db, $same_db; - $src_db = $same_db = null; - if ($convert->src_dbms != $dbms || $convert->src_dbhost != $dbhost || $convert->src_dbport != $dbport || $convert->src_dbname != $dbname || $convert->src_dbuser != $dbuser) - { - $dbms = $convert->src_dbms; - $src_db = new $dbms(); - $src_db->sql_connect($convert->src_dbhost, $convert->src_dbuser, htmlspecialchars_decode($convert->src_dbpasswd), $convert->src_dbname, $convert->src_dbport, false, true); - $same_db = false; - } - else - { - $src_db = $db; - $same_db = true; - } - - $convert->mysql_convert = false; - switch ($src_db->sql_layer) - { - case 'sqlite': - case 'sqlite3': - $convert->src_truncate_statement = 'DELETE FROM '; - break; - - // Thanks MySQL, for silently converting... - case 'mysql': - case 'mysql4': - if (version_compare($src_db->sql_server_info(true, false), '4.1.3', '>=')) - { - $convert->mysql_convert = true; - } - $convert->src_truncate_statement = 'TRUNCATE TABLE '; - break; - - case 'mysqli': - $convert->mysql_convert = true; - $convert->src_truncate_statement = 'TRUNCATE TABLE '; - break; - - default: - $convert->src_truncate_statement = 'TRUNCATE TABLE '; - break; - } - - if ($convert->mysql_convert && !$same_db) - { - $src_db->sql_query("SET NAMES 'binary'"); - } - - switch ($db->get_sql_layer()) - { - case 'sqlite': - case 'sqlite3': - $convert->truncate_statement = 'DELETE FROM '; - break; - - default: - $convert->truncate_statement = 'TRUNCATE TABLE '; - break; - } - - $get_info = false; - - // check security implications of direct inclusion - if (!file_exists('./convertors/convert_' . $convert->convertor_tag . '.' . $phpEx)) - { - $this->p_master->error($user->lang['CONVERT_NOT_EXIST'], __LINE__, __FILE__); - } - - if (file_exists('./convertors/functions_' . $convert->convertor_tag . '.' . $phpEx)) - { - include('./convertors/functions_' . $convert->convertor_tag . '.' . $phpEx); - } - - $get_info = true; - include('./convertors/convert_' . $convert->convertor_tag . '.' . $phpEx); - - // Map some variables... - $convert->convertor_data = $convertor_data; - $convert->tables = $tables; - $convert->config_schema = $config_schema; - - // Now include the real data - $get_info = false; - include('./convertors/convert_' . $convert->convertor_tag . '.' . $phpEx); - - $convert->convertor_data = $convertor_data; - $convert->tables = $tables; - $convert->config_schema = $config_schema; - $convert->convertor = $convertor; - - // The test_file is a file that should be present in the location of the old board. - if (!file_exists($convert->options['forum_path'] . '/' . $test_file)) - { - $this->p_master->error(sprintf($user->lang['COULD_NOT_FIND_PATH'], $convert->options['forum_path']), __LINE__, __FILE__); - } - - $search_type = $config['search_type']; - - // For conversions we are a bit less strict and set to a search backend we know exist... - if (!class_exists($search_type)) - { - $search_type = '\phpbb\search\fulltext_native'; - set_config('search_type', $search_type); - } - - if (!class_exists($search_type)) - { - trigger_error('NO_SUCH_SEARCH_MODULE'); - } - - $error = false; - $convert->fulltext_search = new $search_type($error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user, $phpbb_dispatcher); - - if ($error) - { - trigger_error($error); - } - - include($phpbb_root_path . 'includes/message_parser.' . $phpEx); - $message_parser = new parse_message(); - - $jump = request_var('jump', 0); - $final_jump = request_var('final_jump', 0); - $sync_batch = request_var('sync_batch', -1); - $last_statement = request_var('last', 0); - - // We are running sync... - if ($sync_batch >= 0) - { - $this->sync_forums($sync_batch); - return; - } - - if ($jump) - { - $this->jump($jump, $last_statement); - return; - } - - if ($final_jump) - { - $this->final_jump($final_jump); - return; - } - - $current_table = request_var('current_table', 0); - $old_current_table = min(-1, $current_table - 1); - $skip_rows = request_var('skip_rows', 0); - - if (!$current_table && !$skip_rows) - { - if (!$request->variable('confirm', false)) - { - // If avatars / ranks / smilies folders are specified make sure they are writable - $bad_folders = array(); - - $local_paths = array( - 'avatar_path' => path($config['avatar_path']), - 'avatar_gallery_path' => path($config['avatar_gallery_path']), - 'icons_path' => path($config['icons_path']), - 'ranks_path' => path($config['ranks_path']), - 'smilies_path' => path($config['smilies_path']) - ); - - foreach ($local_paths as $folder => $local_path) - { - if (isset($convert->convertor[$folder])) - { - if (empty($convert->convertor['test_file'])) - { - // test_file is mandantory at the moment so this should never be reached, but just in case... - $this->p_master->error($user->lang['DEV_NO_TEST_FILE'], __LINE__, __FILE__); - } - - if (!$local_path || !phpbb_is_writable($phpbb_root_path . $local_path)) - { - if (!$local_path) - { - $bad_folders[] = sprintf($user->lang['CONFIG_PHPBB_EMPTY'], $folder); - } - else - { - $bad_folders[] = $local_path; - } - } - } - } - - if (sizeof($bad_folders)) - { - $msg = (sizeof($bad_folders) == 1) ? $user->lang['MAKE_FOLDER_WRITABLE'] : $user->lang['MAKE_FOLDERS_WRITABLE']; - sort($bad_folders); - $this->p_master->error(sprintf($msg, implode('<br />', $bad_folders)), __LINE__, __FILE__, true); - - $template->assign_vars(array( - 'L_SUBMIT' => $user->lang['INSTALL_TEST'], - 'U_ACTION' => $this->p_master->module_url . "?mode={$this->mode}&sub=in_progress&tag={$convert->convertor_tag}&language=$language", - )); - return; - } - - // Grab all the tables used in convertor - $missing_tables = $tables_list = $aliases = array(); - - foreach ($convert->convertor['schema'] as $schema) - { - // Skip those not used (because of addons/plugins not detected) - if (!$schema['target']) - { - continue; - } - - foreach ($schema as $key => $val) - { - // we're dealing with an array like: - // array('forum_status', 'forums.forum_status', 'is_item_locked') - if (is_int($key) && !empty($val[1])) - { - $temp_data = $val[1]; - if (!is_array($temp_data)) - { - $temp_data = array($temp_data); - } - - foreach ($temp_data as $val) - { - if (preg_match('/([a-z0-9_]+)\.([a-z0-9_]+)\)* ?A?S? ?([a-z0-9_]*?)\.?([a-z0-9_]*)$/i', $val, $m)) - { - $table = $convert->src_table_prefix . $m[1]; - $tables_list[$table] = $table; - - if (!empty($m[3])) - { - $aliases[] = $convert->src_table_prefix . $m[3]; - } - } - } - } - // 'left_join' => 'topics LEFT JOIN vote_desc ON topics.topic_id = vote_desc.topic_id AND topics.topic_vote = 1' - else if ($key == 'left_join') - { - // Convert the value if it wasn't an array already. - if (!is_array($val)) - { - $val = array($val); - } - - for ($j = 0; $j < sizeof($val); ++$j) - { - if (preg_match('/LEFT JOIN ([a-z0-9_]+) AS ([a-z0-9_]+)/i', $val[$j], $m)) - { - $table = $convert->src_table_prefix . $m[1]; - $tables_list[$table] = $table; - - if (!empty($m[2])) - { - $aliases[] = $convert->src_table_prefix . $m[2]; - } - } - } - } - } - } - - // Remove aliased tables from $tables_list - foreach ($aliases as $alias) - { - unset($tables_list[$alias]); - } - - // Check if the tables that we need exist - $src_db->sql_return_on_error(true); - foreach ($tables_list as $table => $null) - { - $sql = 'SELECT 1 FROM ' . $table; - $_result = $src_db->sql_query_limit($sql, 1); - - if (!$_result) - { - $missing_tables[] = $table; - } - $src_db->sql_freeresult($_result); - } - $src_db->sql_return_on_error(false); - - // Throw an error if some tables are missing - // We used to do some guessing here, but since we have a suggestion of possible values earlier, I don't see it adding anything here to do it again - - if (sizeof($missing_tables) == sizeof($tables_list)) - { - $this->p_master->error($user->lang['NO_TABLES_FOUND'] . ' ' . $user->lang['CHECK_TABLE_PREFIX'], __LINE__, __FILE__); - } - else if (sizeof($missing_tables)) - { - $this->p_master->error(sprintf($user->lang['TABLES_MISSING'], implode($user->lang['COMMA_SEPARATOR'], $missing_tables)) . '<br /><br />' . $user->lang['CHECK_TABLE_PREFIX'], __LINE__, __FILE__); - } - - $url = $this->save_convert_progress('&confirm=1'); - $msg = $user->lang['PRE_CONVERT_COMPLETE']; - - if ($convert->convertor_data['author_notes']) - { - $msg .= '</p><p>' . sprintf($user->lang['AUTHOR_NOTES'], $convert->convertor_data['author_notes']); - } - - $template->assign_vars(array( - 'L_SUBMIT' => $user->lang['CONTINUE_CONVERT'], - 'L_MESSAGE' => $msg, - 'U_ACTION' => $url, - )); - - return; - } // if (!$request->variable('confirm', false))) - - $template->assign_block_vars('checks', array( - 'S_LEGEND' => true, - 'LEGEND' => $user->lang['STARTING_CONVERT'], - )); - - // Convert the config table and load the settings of the old board - if (!empty($convert->config_schema)) - { - restore_config($convert->config_schema); - - // Override a couple of config variables for the duration - $config['max_quote_depth'] = 0; - - // @todo Need to confirm that max post length in source is <= max post length in destination or there may be interesting formatting issues - $config['max_post_chars'] = $config['min_post_chars'] = 0; - } - - $template->assign_block_vars('checks', array( - 'TITLE' => $user->lang['CONFIG_CONVERT'], - 'RESULT' => $user->lang['DONE'], - )); - - // Now process queries and execute functions that have to be executed prior to the conversion - if (!empty($convert->convertor['execute_first'])) - { - // @codingStandardsIgnoreStart - eval($convert->convertor['execute_first']); - // @codingStandardsIgnoreEnd - } - - if (!empty($convert->convertor['query_first'])) - { - if (!is_array($convert->convertor['query_first'])) - { - $convert->convertor['query_first'] = array('target', array($convert->convertor['query_first'])); - } - else if (!is_array($convert->convertor['query_first'][0])) - { - $convert->convertor['query_first'] = array(array($convert->convertor['query_first'][0], $convert->convertor['query_first'][1])); - } - - foreach ($convert->convertor['query_first'] as $query_first) - { - if ($query_first[0] == 'src') - { - if ($convert->mysql_convert && $same_db) - { - $src_db->sql_query("SET NAMES 'binary'"); - } - - $src_db->sql_query($query_first[1]); - - if ($convert->mysql_convert && $same_db) - { - $src_db->sql_query("SET NAMES 'utf8'"); - } - } - else - { - $db->sql_query($query_first[1]); - } - } - } - - $template->assign_block_vars('checks', array( - 'TITLE' => $user->lang['PREPROCESS_STEP'], - 'RESULT' => $user->lang['DONE'], - )); - } // if (!$current_table && !$skip_rows) - - $template->assign_block_vars('checks', array( - 'S_LEGEND' => true, - 'LEGEND' => $user->lang['FILLING_TABLES'], - )); - - // This loop takes one target table and processes it - while ($current_table < sizeof($convert->convertor['schema'])) - { - $schema = $convert->convertor['schema'][$current_table]; - - // The target table isn't set, this can be because a module (for example the attachement mod) is taking care of this. - if (empty($schema['target'])) - { - $current_table++; - continue; - } - - $template->assign_block_vars('checks', array( - 'TITLE' => sprintf($user->lang['FILLING_TABLE'], $schema['target']), - )); - - // This is only the case when we first start working on the tables. - if (!$skip_rows) - { - // process execute_first and query_first for this table... - if (!empty($schema['execute_first'])) - { - // @codingStandardsIgnoreStart - eval($schema['execute_first']); - // @codingStandardsIgnoreEnd - } - - if (!empty($schema['query_first'])) - { - if (!is_array($schema['query_first'])) - { - $schema['query_first'] = array('target', array($schema['query_first'])); - } - else if (!is_array($schema['query_first'][0])) - { - $schema['query_first'] = array(array($schema['query_first'][0], $schema['query_first'][1])); - } - - foreach ($schema['query_first'] as $query_first) - { - if ($query_first[0] == 'src') - { - if ($convert->mysql_convert && $same_db) - { - $src_db->sql_query("SET NAMES 'binary'"); - } - $src_db->sql_query($query_first[1]); - if ($convert->mysql_convert && $same_db) - { - $src_db->sql_query("SET NAMES 'utf8'"); - } - } - else - { - $db->sql_query($query_first[1]); - } - } - } - - if (!empty($schema['autoincrement'])) - { - switch ($db->get_sql_layer()) - { - case 'postgres': - $db->sql_query("SELECT SETVAL('" . $schema['target'] . "_seq',(select case when max(" . $schema['autoincrement'] . ")>0 then max(" . $schema['autoincrement'] . ")+1 else 1 end from " . $schema['target'] . '));'); - break; - - case 'oracle': - $result = $db->sql_query('SELECT MAX(' . $schema['autoincrement'] . ') as max_id FROM ' . $schema['target']); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $largest_id = (int) $row['max_id']; - - if ($largest_id) - { - $db->sql_query('DROP SEQUENCE ' . $schema['target'] . '_seq'); - $db->sql_query('CREATE SEQUENCE ' . $schema['target'] . '_seq START WITH ' . ($largest_id + 1)); - } - break; - } - } - } - - // Process execute_always for this table - // This is for code which needs to be executed on every pass of this table if - // it gets split because of time restrictions - if (!empty($schema['execute_always'])) - { - // @codingStandardsIgnoreStart - eval($schema['execute_always']); - // @codingStandardsIgnoreEnd - } - - // - // Set up some variables - // - // $waiting_rows holds rows for multirows insertion (MySQL only) - // $src_tables holds unique tables with aliases to select from - // $src_fields will quickly refer source fields (or aliases) corresponding to the current index - // $select_fields holds the names of the fields to retrieve - // - - $sql_data = array( - 'source_fields' => array(), - 'target_fields' => array(), - 'source_tables' => array(), - 'select_fields' => array(), - ); - - // This statement is building the keys for later insertion. - $insert_query = $this->build_insert_query($schema, $sql_data, $current_table); - - // If no source table is affected, we skip the table - if (empty($sql_data['source_tables'])) - { - $skip_rows = 0; - $current_table++; - continue; - } - - $distinct = (!empty($schema['distinct'])) ? 'DISTINCT ' : ''; - - $sql = 'SELECT ' . $distinct . implode(', ', $sql_data['select_fields']) . " \nFROM " . implode(', ', $sql_data['source_tables']); - - // Where - $sql .= (!empty($schema['where'])) ? "\nWHERE (" . $schema['where'] . ')' : ''; - - // Group By - if (!empty($schema['group_by'])) - { - $schema['group_by'] = array($schema['group_by']); - foreach ($sql_data['select_fields'] as $select) - { - $alias = strpos(strtolower($select), ' as '); - $select = ($alias) ? substr($select, 0, $alias) : $select; - if (!in_array($select, $schema['group_by'])) - { - $schema['group_by'][] = $select; - } - } - } - $sql .= (!empty($schema['group_by'])) ? "\nGROUP BY " . implode(', ', $schema['group_by']) : ''; - - // Having - $sql .= (!empty($schema['having'])) ? "\nHAVING " . $schema['having'] : ''; - - // Order By - if (empty($schema['order_by']) && !empty($schema['primary'])) - { - $schema['order_by'] = $schema['primary']; - } - $sql .= (!empty($schema['order_by'])) ? "\nORDER BY " . $schema['order_by'] : ''; - - // Counting basically holds the amount of rows processed. - $counting = -1; - $batch_time = 0; - - while ($counting === -1 || ($counting >= $convert->batch_size && still_on_time())) - { - $old_current_table = $current_table; - - $rows = ''; - $waiting_rows = array(); - - if (!empty($batch_time)) - { - $mtime = explode(' ', microtime()); - $mtime = $mtime[0] + $mtime[1]; - $rows = ceil($counting/($mtime - $batch_time)) . " rows/s ($counting rows) | "; - } - - $template->assign_block_vars('checks', array( - 'TITLE' => "skip_rows = $skip_rows", - 'RESULT' => $rows . ((defined('DEBUG') && function_exists('memory_get_usage')) ? ceil(memory_get_usage()/1024) . ' ' . $user->lang['KIB'] : ''), - )); - - $mtime = explode(' ', microtime()); - $batch_time = $mtime[0] + $mtime[1]; - - if ($convert->mysql_convert && $same_db) - { - $src_db->sql_query("SET NAMES 'binary'"); - } - - // Take skip rows into account and only fetch batch_size amount of rows - $___result = $src_db->sql_query_limit($sql, $convert->batch_size, $skip_rows); - - if ($convert->mysql_convert && $same_db) - { - $src_db->sql_query("SET NAMES 'utf8'"); - } - - // This loop processes each row - $counting = 0; - - $convert->row = $convert_row = array(); - - if (!empty($schema['autoincrement'])) - { - switch ($db->get_sql_layer()) - { - case 'mssql': - case 'mssql_odbc': - case 'mssqlnative': - $db->sql_query('SET IDENTITY_INSERT ' . $schema['target'] . ' ON'); - break; - } - } - - // Now handle the rows until time is over or no more rows to process... - while ($counting === 0 || still_on_time()) - { - $convert_row = $src_db->sql_fetchrow($___result); - - if (!$convert_row) - { - // move to the next batch or table - break; - } - - // With this we are able to always save the last state - $convert->row = $convert_row; - - // Increment the counting variable, it stores the number of rows we have processed - $counting++; - - $insert_values = array(); - - $sql_flag = $this->process_row($schema, $sql_data, $insert_values); - - if ($sql_flag === true) - { - switch ($db->get_sql_layer()) - { - // If MySQL, we'll wait to have num_wait_rows rows to submit at once - case 'mysql': - case 'mysql4': - case 'mysqli': - $waiting_rows[] = '(' . implode(', ', $insert_values) . ')'; - - if (sizeof($waiting_rows) >= $convert->num_wait_rows) - { - $errored = false; - - $db->sql_return_on_error(true); - - if (!$db->sql_query($insert_query . implode(', ', $waiting_rows))) - { - $errored = true; - } - $db->sql_return_on_error(false); - - if ($errored) - { - $db->sql_return_on_error(true); - - // Because it errored out we will try to insert the rows one by one... most of the time this - // is caused by duplicate entries - but we also do not want to miss one... - foreach ($waiting_rows as $waiting_sql) - { - if (!$db->sql_query($insert_query . $waiting_sql)) - { - $this->p_master->db_error($user->lang['DB_ERR_INSERT'], htmlspecialchars($insert_query . $waiting_sql) . '<br /><br />' . htmlspecialchars(print_r($db->_sql_error(), true)), __LINE__, __FILE__, true); - } - } - - $db->sql_return_on_error(false); - } - - $waiting_rows = array(); - } - - break; - - default: - $insert_sql = $insert_query . '(' . implode(', ', $insert_values) . ')'; - - $db->sql_return_on_error(true); - - if (!$db->sql_query($insert_sql)) - { - $this->p_master->db_error($user->lang['DB_ERR_INSERT'], htmlspecialchars($insert_sql) . '<br /><br />' . htmlspecialchars(print_r($db->_sql_error(), true)), __LINE__, __FILE__, true); - } - $db->sql_return_on_error(false); - - $waiting_rows = array(); - - break; - } - } - - $skip_rows++; - } - $src_db->sql_freeresult($___result); - - // We might still have some rows waiting - if (sizeof($waiting_rows)) - { - $errored = false; - $db->sql_return_on_error(true); - - if (!$db->sql_query($insert_query . implode(', ', $waiting_rows))) - { - $errored = true; - } - $db->sql_return_on_error(false); - - if ($errored) - { - $db->sql_return_on_error(true); - - // Because it errored out we will try to insert the rows one by one... most of the time this - // is caused by duplicate entries - but we also do not want to miss one... - foreach ($waiting_rows as $waiting_sql) - { - $db->sql_query($insert_query . $waiting_sql); - $this->p_master->db_error($user->lang['DB_ERR_INSERT'], htmlspecialchars($insert_query . $waiting_sql) . '<br /><br />' . htmlspecialchars(print_r($db->_sql_error(), true)), __LINE__, __FILE__, true); - } - - $db->sql_return_on_error(false); - } - - $waiting_rows = array(); - } - - if (!empty($schema['autoincrement'])) - { - switch ($db->get_sql_layer()) - { - case 'mssql': - case 'mssql_odbc': - case 'mssqlnative': - $db->sql_query('SET IDENTITY_INSERT ' . $schema['target'] . ' OFF'); - break; - - case 'postgres': - $db->sql_query("SELECT SETVAL('" . $schema['target'] . "_seq',(select case when max(" . $schema['autoincrement'] . ")>0 then max(" . $schema['autoincrement'] . ")+1 else 1 end from " . $schema['target'] . '));'); - break; - - case 'oracle': - $result = $db->sql_query('SELECT MAX(' . $schema['autoincrement'] . ') as max_id FROM ' . $schema['target']); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $largest_id = (int) $row['max_id']; - - if ($largest_id) - { - $db->sql_query('DROP SEQUENCE ' . $schema['target'] . '_seq'); - $db->sql_query('CREATE SEQUENCE ' . $schema['target'] . '_seq START WITH ' . ($largest_id + 1)); - } - break; - } - } - } - - // When we reach this point, either the current table has been processed or we're running out of time. - if (still_on_time() && $counting < $convert->batch_size/* && !defined('DEBUG')*/) - { - $skip_rows = 0; - $current_table++; - } - else - {/* - if (still_on_time() && $counting < $convert->batch_size) - { - $skip_rows = 0; - $current_table++; - }*/ - - // Looks like we ran out of time. - $url = $this->save_convert_progress('&current_table=' . $current_table . '&skip_rows=' . $skip_rows); - - $current_table++; -// $percentage = ($skip_rows == 0) ? 0 : floor(100 / ($total_rows / $skip_rows)); - - $msg = sprintf($user->lang['STEP_PERCENT_COMPLETED'], $current_table, sizeof($convert->convertor['schema'])); - - $template->assign_vars(array( - 'L_MESSAGE' => $msg, - 'L_SUBMIT' => $user->lang['CONTINUE_CONVERT'], - 'U_ACTION' => $url, - )); - - $this->meta_refresh($url); - return; - } - } - - // Process execute_last then we'll be done - $url = $this->save_convert_progress('&jump=1'); - - $template->assign_vars(array( - 'L_SUBMIT' => $user->lang['FINAL_STEP'], - 'U_ACTION' => $url, - )); - - $this->meta_refresh($url); - return; - } - - /** - * Sync function being executed at the middle, some functions need to be executed after a successful sync. - */ - function sync_forums($sync_batch) - { - global $template, $user, $db, $phpbb_root_path, $phpEx, $config, $cache; - global $convert; - - $template->assign_block_vars('checks', array( - 'S_LEGEND' => true, - 'LEGEND' => $user->lang['SYNC_TOPICS'], - )); - - $batch_size = $convert->batch_size; - - $sql = 'SELECT MIN(topic_id) as min_value, MAX(topic_id) AS max_value - FROM ' . TOPICS_TABLE; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - // Set values of minimum/maximum primary value for this table. - $primary_min = $row['min_value']; - $primary_max = $row['max_value']; - - if ($sync_batch == 0) - { - $sync_batch = (int) $primary_min; - } - - if ($sync_batch == 0) - { - $sync_batch = 1; - } - - // Fetch a batch of rows, process and insert them. - while ($sync_batch <= $primary_max && still_on_time()) - { - $end = ($sync_batch + $batch_size - 1); - - // Sync all topics in batch mode... - sync('topic', 'range', 'topic_id BETWEEN ' . $sync_batch . ' AND ' . $end, true, true); - - $template->assign_block_vars('checks', array( - 'TITLE' => sprintf($user->lang['SYNC_TOPIC_ID'], $sync_batch, ($sync_batch + $batch_size)) . ((defined('DEBUG') && function_exists('memory_get_usage')) ? ' [' . ceil(memory_get_usage()/1024) . ' ' . $user->lang['KIB'] . ']' : ''), - 'RESULT' => $user->lang['DONE'], - )); - - $sync_batch += $batch_size; - } - - if ($sync_batch >= $primary_max) - { - $url = $this->save_convert_progress('&final_jump=1'); - - $template->assign_vars(array( - 'L_SUBMIT' => $user->lang['CONTINUE_CONVERT'], - 'U_ACTION' => $url, - )); - - $this->meta_refresh($url); - return; - } - else - { - $sync_batch--; - } - - $url = $this->save_convert_progress('&sync_batch=' . $sync_batch); - - $template->assign_vars(array( - 'L_SUBMIT' => $user->lang['CONTINUE_CONVERT'], - 'U_ACTION' => $url, - )); - - $this->meta_refresh($url); - return; - } - - /** - * Save the convertor status - */ - function save_convert_progress($step) - { - global $convert, $language; - - // Save convertor Status - set_config('convert_progress', serialize(array( - 'step' => $step, - 'table_prefix' => $convert->src_table_prefix, - 'tag' => $convert->convertor_tag, - )), true); - - set_config('convert_db_server', serialize(array( - 'dbms' => $convert->src_dbms, - 'dbhost' => $convert->src_dbhost, - 'dbport' => $convert->src_dbport, - 'dbname' => $convert->src_dbname, - )), true); - - set_config('convert_db_user', serialize(array( - 'dbuser' => $convert->src_dbuser, - 'dbpasswd' => $convert->src_dbpasswd, - )), true); - - return $this->p_master->module_url . "?mode={$this->mode}&sub=in_progress&tag={$convert->convertor_tag}$step&language=$language"; - } - - /** - * Finish conversion, the last function to be called. - */ - function finish_conversion() - { - global $db, $phpbb_root_path, $phpEx, $convert, $config, $language, $user, $template; - global $cache, $auth, $phpbb_container, $phpbb_log; - - $db->sql_query('DELETE FROM ' . CONFIG_TABLE . " - WHERE config_name = 'convert_progress' - OR config_name = 'convert_options' - OR config_name = 'convert_db_server' - OR config_name = 'convert_db_user'"); - $db->sql_query('DELETE FROM ' . SESSIONS_TABLE); - - @unlink($phpbb_root_path . 'cache/data_global.' . $phpEx); - phpbb_cache_moderators($db, $cache, $auth); - - // And finally, add a note to the log - $phpbb_log = $phpbb_container->get('log'); - add_log('admin', 'LOG_INSTALL_CONVERTED', $convert->convertor_data['forum_name'], $config['version']); - - $url = $this->p_master->module_url . "?mode={$this->mode}&sub=final&language=$language"; - - $template->assign_vars(array( - 'L_SUBMIT' => $user->lang['FINAL_STEP'], - 'U_ACTION' => $url, - )); - - $this->meta_refresh($url); - return; - } - - /** - * This function marks the steps after syncing - */ - function final_jump($final_jump) - { - global $template, $user, $src_db, $same_db, $db, $phpbb_root_path, $phpEx, $config, $cache; - global $convert; - - $template->assign_block_vars('checks', array( - 'S_LEGEND' => true, - 'LEGEND' => $user->lang['PROCESS_LAST'], - )); - - if ($final_jump == 1) - { - $db->sql_return_on_error(true); - - update_topics_posted(); - - $template->assign_block_vars('checks', array( - 'TITLE' => $user->lang['UPDATE_TOPICS_POSTED'], - 'RESULT' => $user->lang['DONE'], - )); - - if ($db->get_sql_error_triggered()) - { - $template->assign_vars(array( - 'S_ERROR_BOX' => true, - 'ERROR_TITLE' => $user->lang['UPDATE_TOPICS_POSTED'], - 'ERROR_MSG' => $user->lang['UPDATE_TOPICS_POSTED_ERR'], - )); - } - $db->sql_return_on_error(false); - - $this->finish_conversion(); - return; - } - } - - /** - * This function marks the steps before syncing (jump=1) - */ - function jump($jump, $last_statement) - { - global $template, $user, $src_db, $same_db, $db, $phpbb_root_path, $phpEx, $config, $cache; - global $convert; - - $template->assign_block_vars('checks', array( - 'S_LEGEND' => true, - 'LEGEND' => $user->lang['PROCESS_LAST'], - )); - - if ($jump == 1) - { - // Execute 'last' statements/queries - if (!empty($convert->convertor['execute_last'])) - { - if (!is_array($convert->convertor['execute_last'])) - { - // @codingStandardsIgnoreStart - eval($convert->convertor['execute_last']); - // @codingStandardsIgnoreEnd - } - else - { - while ($last_statement < sizeof($convert->convertor['execute_last'])) - { - // @codingStandardsIgnoreStart - eval($convert->convertor['execute_last'][$last_statement]); - // @codingStandardsIgnoreEnd - - $template->assign_block_vars('checks', array( - 'TITLE' => $convert->convertor['execute_last'][$last_statement], - 'RESULT' => $user->lang['DONE'], - )); - - $last_statement++; - $url = $this->save_convert_progress('&jump=1&last=' . $last_statement); - - $percentage = ($last_statement == 0) ? 0 : floor(100 / (sizeof($convert->convertor['execute_last']) / $last_statement)); - $msg = sprintf($user->lang['STEP_PERCENT_COMPLETED'], $last_statement, sizeof($convert->convertor['execute_last']), $percentage); - - $template->assign_vars(array( - 'L_SUBMIT' => $user->lang['CONTINUE_LAST'], - 'L_MESSAGE' => $msg, - 'U_ACTION' => $url, - )); - - $this->meta_refresh($url); - return; - } - } - } - - if (!empty($convert->convertor['query_last'])) - { - if (!is_array($convert->convertor['query_last'])) - { - $convert->convertor['query_last'] = array('target', array($convert->convertor['query_last'])); - } - else if (!is_array($convert->convertor['query_last'][0])) - { - $convert->convertor['query_last'] = array(array($convert->convertor['query_last'][0], $convert->convertor['query_last'][1])); - } - - foreach ($convert->convertor['query_last'] as $query_last) - { - if ($query_last[0] == 'src') - { - if ($convert->mysql_convert && $same_db) - { - $src_db->sql_query("SET NAMES 'binary'"); - } - - $src_db->sql_query($query_last[1]); - - if ($convert->mysql_convert && $same_db) - { - $src_db->sql_query("SET NAMES 'utf8'"); - } - } - else - { - $db->sql_query($query_last[1]); - } - } - } - - // Sanity check - $db->sql_return_on_error(false); - $src_db->sql_return_on_error(false); - - fix_empty_primary_groups(); - - $sql = 'SELECT MIN(user_regdate) AS board_startdate - FROM ' . USERS_TABLE; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - if (!isset($config['board_startdate']) || ($row['board_startdate'] < $config['board_startdate'] && $row['board_startdate'] > 0)) - { - set_config('board_startdate', $row['board_startdate']); - $db->sql_query('UPDATE ' . USERS_TABLE . ' SET user_regdate = ' . $row['board_startdate'] . ' WHERE user_id = ' . ANONYMOUS); - } - - update_dynamic_config(); - - $template->assign_block_vars('checks', array( - 'TITLE' => $user->lang['CLEAN_VERIFY'], - 'RESULT' => $user->lang['DONE'], - )); - - $url = $this->save_convert_progress('&jump=2'); - - $template->assign_vars(array( - 'L_SUBMIT' => $user->lang['CONTINUE_CONVERT'], - 'U_ACTION' => $url, - )); - - $this->meta_refresh($url); - return; - } - - if ($jump == 2) - { - $db->sql_query('UPDATE ' . USERS_TABLE . " SET user_permissions = ''"); - - // TODO: sync() is likely going to bomb out on forums with a considerable amount of topics. - // TODO: the sync function is able to handle FROM-TO values, we should use them here (batch processing) - sync('forum', '', '', false, true); - $cache->destroy('sql', FORUMS_TABLE); - - $template->assign_block_vars('checks', array( - 'TITLE' => $user->lang['SYNC_FORUMS'], - 'RESULT' => $user->lang['DONE'], - )); - - // Continue with synchronizing the forums... - $url = $this->save_convert_progress('&sync_batch=0'); - - $template->assign_vars(array( - 'L_SUBMIT' => $user->lang['CONTINUE_CONVERT'], - 'U_ACTION' => $url, - )); - - $this->meta_refresh($url); - return; - } - } - - function build_insert_query(&$schema, &$sql_data, $current_table) - { - global $db, $user; - global $convert; - - // Can we use IGNORE with this DBMS? - $sql_ignore = (strpos($db->get_sql_layer(), 'mysql') === 0 && !defined('DEBUG')) ? 'IGNORE ' : ''; - $insert_query = 'INSERT ' . $sql_ignore . 'INTO ' . $schema['target'] . ' ('; - - $aliases = array(); - - $sql_data = array( - 'source_fields' => array(), - 'target_fields' => array(), - 'source_tables' => array(), - 'select_fields' => array(), - ); - - foreach ($schema as $key => $val) - { - // Example: array('group_name', 'extension_groups.group_name', 'htmlspecialchars'), - if (is_int($key)) - { - if (!empty($val[0])) - { - // Target fields - $sql_data['target_fields'][$val[0]] = $key; - $insert_query .= $val[0] . ', '; - } - - if (!is_array($val[1])) - { - $val[1] = array($val[1]); - } - - foreach ($val[1] as $valkey => $value_1) - { - // This should cover about any case: - // - // table.field => SELECT table.field FROM table - // table.field AS alias => SELECT table.field AS alias FROM table - // table.field AS table2.alias => SELECT table2.field AS alias FROM table table2 - // table.field AS table2.field => SELECT table2.field FROM table table2 - // - if (preg_match('/^([a-z0-9_]+)\.([a-z0-9_]+)( +AS +(([a-z0-9_]+?)\.)?([a-z0-9_]+))?$/i', $value_1, $m)) - { - // There is 'AS ...' in the field names - if (!empty($m[3])) - { - $value_1 = ($m[2] == $m[6]) ? $m[1] . '.' . $m[2] : $m[1] . '.' . $m[2] . ' AS ' . $m[6]; - - // Table alias: store it then replace the source table with it - if (!empty($m[5]) && $m[5] != $m[1]) - { - $aliases[$m[5]] = $m[1]; - $value_1 = str_replace($m[1] . '.' . $m[2], $m[5] . '.' . $m[2], $value_1); - } - } - else - { - // No table alias - $sql_data['source_tables'][$m[1]] = (empty($convert->src_table_prefix)) ? $m[1] : $convert->src_table_prefix . $m[1] . ' ' . $m[1]; - } - - $sql_data['select_fields'][$value_1] = $value_1; - $sql_data['source_fields'][$key][$valkey] = (!empty($m[6])) ? $m[6] : $m[2]; - } - } - } - else if ($key == 'where' || $key == 'group_by' || $key == 'order_by' || $key == 'having') - { - if (@preg_match_all('/([a-z0-9_]+)\.([a-z0-9_]+)/i', $val, $m)) - { - foreach ($m[1] as $value) - { - $sql_data['source_tables'][$value] = (empty($convert->src_table_prefix)) ? $value : $convert->src_table_prefix . $value . ' ' . $value; - } - } - } - } - - // Add the aliases to the list of tables - foreach ($aliases as $alias => $table) - { - $sql_data['source_tables'][$alias] = $convert->src_table_prefix . $table . ' ' . $alias; - } - - // 'left_join' => 'forums LEFT JOIN forum_prune ON forums.forum_id = forum_prune.forum_id', - if (!empty($schema['left_join'])) - { - if (!is_array($schema['left_join'])) - { - $schema['left_join'] = array($schema['left_join']); - } - - foreach ($schema['left_join'] as $left_join) - { - // This won't handle concatened LEFT JOINs - if (!preg_match('/([a-z0-9_]+) LEFT JOIN ([a-z0-9_]+) A?S? ?([a-z0-9_]*?) ?(ON|USING)(.*)/i', $left_join, $m)) - { - $this->p_master->error(sprintf($user->lang['NOT_UNDERSTAND'], 'LEFT JOIN', $left_join, $current_table, $schema['target']), __LINE__, __FILE__); - } - - if (!empty($aliases[$m[2]])) - { - if (!empty($m[3])) - { - $this->p_master->error(sprintf($user->lang['NAMING_CONFLICT'], $m[2], $m[3], $schema['left_join']), __LINE__, __FILE__); - } - - $m[2] = $aliases[$m[2]]; - $m[3] = $m[2]; - } - - $right_table = $convert->src_table_prefix . $m[2]; - if (!empty($m[3])) - { - unset($sql_data['source_tables'][$m[3]]); - } - else if ($m[2] != $m[1]) - { - unset($sql_data['source_tables'][$m[2]]); - } - - if (strpos($sql_data['source_tables'][$m[1]], "\nLEFT JOIN") !== false) - { - $sql_data['source_tables'][$m[1]] = '(' . $sql_data['source_tables'][$m[1]] . ")\nLEFT JOIN $right_table"; - } - else - { - $sql_data['source_tables'][$m[1]] .= "\nLEFT JOIN $right_table"; - } - - if (!empty($m[3])) - { - unset($sql_data['source_tables'][$m[3]]); - $sql_data['source_tables'][$m[1]] .= ' AS ' . $m[3]; - } - else if (!empty($convert->src_table_prefix)) - { - $sql_data['source_tables'][$m[1]] .= ' AS ' . $m[2]; - } - $sql_data['source_tables'][$m[1]] .= ' ' . $m[4] . $m[5]; - } - } - - // Remove ", " from the end of the insert query - $insert_query = substr($insert_query, 0, -2) . ') VALUES '; - - return $insert_query; - } - - /** - * Function for processing the currently handled row - */ - function process_row(&$schema, &$sql_data, &$insert_values) - { - global $template, $user, $phpbb_root_path, $phpEx, $db, $lang, $config, $cache; - global $convert, $convert_row; - - $sql_flag = false; - - foreach ($schema as $key => $fields) - { - // We are only interested in the lines with: - // array('comment', 'attachments_desc.comment', 'htmlspecialchars'), - if (is_int($key)) - { - if (!is_array($fields[1])) - { - $fields[1] = array($fields[1]); - } - - $firstkey_set = false; - $firstkey = 0; - - foreach ($fields[1] as $inner_key => $inner_value) - { - if (!$firstkey_set) - { - $firstkey = $inner_key; - $firstkey_set = true; - } - - $src_field = isset($sql_data['source_fields'][$key][$inner_key]) ? $sql_data['source_fields'][$key][$inner_key] : ''; - - if (!empty($src_field)) - { - $fields[1][$inner_key] = $convert->row[$src_field]; - } - } - - if (!empty($fields[0])) - { - // We have a target field, if we haven't set $sql_flag yet it will be set to TRUE. - // If a function has already set it to FALSE it won't change it. - if ($sql_flag === false) - { - $sql_flag = true; - } - - // No function assigned? - if (empty($fields[2])) - { - $value = $fields[1][$firstkey]; - } - else if (is_array($fields[2]) && !is_callable($fields[2])) - { - // Execute complex function/eval/typecast - $value = $fields[1]; - - foreach ($fields[2] as $type => $execution) - { - if (strpos($type, 'typecast') === 0) - { - if (!is_array($value)) - { - $value = array($value); - } - $value = $value[0]; - settype($value, $execution); - } - else if (strpos($type, 'function') === 0) - { - if (!is_array($value)) - { - $value = array($value); - } - - $value = call_user_func_array($execution, $value); - } - else if (strpos($type, 'execute') === 0) - { - if (!is_array($value)) - { - $value = array($value); - } - - $execution = str_replace('{RESULT}', '$value', $execution); - $execution = str_replace('{VALUE}', '$value', $execution); - // @codingStandardsIgnoreStart - eval($execution); - // @codingStandardsIgnoreEnd - } - } - } - else - { - $value = call_user_func_array($fields[2], $fields[1]); - } - - if (is_null($value)) - { - $value = ''; - } - - $insert_values[] = $db->_sql_validate_value($value); - } - else if (!empty($fields[2])) - { - if (is_array($fields[2])) - { - // Execute complex function/eval/typecast - $value = ''; - - foreach ($fields[2] as $type => $execution) - { - if (strpos($type, 'typecast') === 0) - { - $value = settype($value, $execution); - } - else if (strpos($type, 'function') === 0) - { - if (!is_array($value)) - { - $value = array($value); - } - - $value = call_user_func_array($execution, $value); - } - else if (strpos($type, 'execute') === 0) - { - if (!is_array($value)) - { - $value = array($value); - } - - $execution = str_replace('{RESULT}', '$value', $execution); - $execution = str_replace('{VALUE}', '$value', $execution); - // @codingStandardsIgnoreStart - eval($execution); - // @codingStandardsIgnoreEnd - } - } - } - else - { - call_user_func_array($fields[2], $fields[1]); - } - } - } - } - - return $sql_flag; - } - - /** - * Own meta refresh function to be able to change the global time used - */ - function meta_refresh($url) - { - global $convert, $template; - - if ($convert->options['refresh']) - { - // Because we should not rely on correct settings, we simply use the relative path here directly. - $template->assign_vars(array( - 'S_REFRESH' => true, - 'META' => '<meta http-equiv="refresh" content="5; url=' . $url . '" />') - ); - } - } - - /** - * The information below will be used to build the input fields presented to the user - */ - var $convert_options = array( - 'legend1' => 'SPECIFY_OPTIONS', - 'src_dbms' => array('lang' => 'DBMS', 'type' => 'select', 'options' => 'dbms_select(\'{VALUE}\', true)', 'explain' => false), - 'src_dbhost' => array('lang' => 'DB_HOST', 'type' => 'text:25:100', 'explain' => true), - 'src_dbport' => array('lang' => 'DB_PORT', 'type' => 'text:25:100', 'explain' => true), - 'src_dbname' => array('lang' => 'DB_NAME', 'type' => 'text:25:100', 'explain' => false), - 'src_dbuser' => array('lang' => 'DB_USERNAME', 'type' => 'text:25:100', 'explain' => false), - 'src_dbpasswd' => array('lang' => 'DB_PASSWORD', 'type' => 'password:25:100', 'explain' => false), - 'src_table_prefix' => array('lang' => 'TABLE_PREFIX', 'type' => 'text:25:100', 'explain' => false), - //'src_url' => array('lang' => 'FORUM_ADDRESS', 'type' => 'text:50:100', 'explain' => true), - 'forum_path' => array('lang' => 'FORUM_PATH', 'type' => 'text:25:100', 'explain' => true), - 'refresh' => array('lang' => 'REFRESH_PAGE', 'type' => 'radio:yes_no', 'explain' => true), - ); -} diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php deleted file mode 100644 index 5b818f9475..0000000000 --- a/phpBB/install/install_install.php +++ /dev/null @@ -1,2331 +0,0 @@ -<?php -/** -* -* This file is part of the phpBB Forum Software package. -* -* @copyright (c) phpBB Limited <https://www.phpbb.com> -* @license GNU General Public License, version 2 (GPL-2.0) -* -* For full copyright and license information, please see -* the docs/CREDITS.txt file. -* -*/ - -/** -*/ -if (!defined('IN_INSTALL')) -{ - // Someone has tried to access the file direct. This is not a good idea, so exit - exit; -} - -if (!empty($setmodules)) -{ - // If phpBB is already installed we do not include this module - if (phpbb_check_installation_exists($phpbb_root_path, $phpEx) && !file_exists($phpbb_root_path . 'cache/install_lock')) - { - return; - } - - $module[] = array( - 'module_type' => 'install', - 'module_title' => 'INSTALL', - 'module_filename' => substr(basename(__FILE__), 0, -strlen($phpEx)-1), - 'module_order' => 10, - 'module_subs' => '', - 'module_stages' => array('INTRO', 'REQUIREMENTS', 'DATABASE', 'ADMINISTRATOR', 'CONFIG_FILE', 'ADVANCED', 'CREATE_TABLE', 'FINAL'), - 'module_reqs' => '' - ); -} - -/** -* Installation -*/ -class install_install extends module -{ - function install_install(&$p_master) - { - $this->p_master = &$p_master; - } - - function main($mode, $sub) - { - global $lang, $template, $language, $phpbb_root_path, $phpEx; - global $phpbb_container, $cache, $phpbb_log, $request, $phpbb_config_php_file; - - switch ($sub) - { - case 'intro': - $phpbb_container->get('cache.driver')->purge(); - - $this->page_title = $lang['SUB_INTRO']; - - $template->assign_vars(array( - 'TITLE' => $lang['INSTALL_INTRO'], - 'BODY' => $lang['INSTALL_INTRO_BODY'], - 'L_SUBMIT' => $lang['NEXT_STEP'], - 'S_LANG_SELECT' => '<select id="language" name="language">' . $this->p_master->inst_language_select($language) . '</select>', - 'U_ACTION' => $this->p_master->module_url . "?mode=$mode&sub=requirements&language=$language", - )); - - break; - - case 'requirements': - $this->check_server_requirements($mode, $sub); - - break; - - case 'database': - $this->obtain_database_settings($mode, $sub); - - break; - - case 'administrator': - $this->obtain_admin_settings($mode, $sub); - - break; - - case 'config_file': - $this->create_config_file($mode, $sub); - - break; - - case 'advanced': - $this->obtain_advanced_settings($mode, $sub); - - break; - - case 'create_table': - $this->load_schema($mode, $sub); - break; - - case 'final': - // Enable super globals to prevent issues with the new \phpbb\request\request object - $request->enable_super_globals(); - - // Create a normal container now - $phpbb_container_builder = new \phpbb\di\container_builder($phpbb_config_php_file, $phpbb_root_path, $phpEx); - $phpbb_container = $phpbb_container_builder->get_container(); - - // Sets the global variables - $cache = $phpbb_container->get('cache'); - $phpbb_log = $phpbb_container->get('log'); - - $this->build_search_index($mode, $sub); - $this->add_modules($mode, $sub); - $this->add_language($mode, $sub); - $this->add_bots($mode, $sub); - $this->email_admin($mode, $sub); - $this->disable_avatars_if_unwritable(); - $this->populate_migrations($phpbb_container->get('ext.manager'), $phpbb_container->get('migrator')); - - // Remove the lock file - @unlink($phpbb_root_path . 'cache/install_lock'); - - break; - } - - $this->tpl_name = 'install_install'; - } - - /** - * Checks that the server we are installing on meets the requirements for running phpBB - */ - function check_server_requirements($mode, $sub) - { - global $lang, $template, $phpbb_root_path, $phpEx, $language; - - $this->page_title = $lang['STAGE_REQUIREMENTS']; - - $template->assign_vars(array( - 'TITLE' => $lang['REQUIREMENTS_TITLE'], - 'BODY' => $lang['REQUIREMENTS_EXPLAIN'], - )); - - $passed = array('php' => false, 'db' => false, 'files' => false, 'pcre' => false, 'imagesize' => false, 'json' => false,); - - // Test for basic PHP settings - $template->assign_block_vars('checks', array( - 'S_LEGEND' => true, - 'LEGEND' => $lang['PHP_SETTINGS'], - 'LEGEND_EXPLAIN' => $lang['PHP_SETTINGS_EXPLAIN'], - )); - - // Test the minimum PHP version - $php_version = PHP_VERSION; - - if (version_compare($php_version, '5.3.3') < 0) - { - $result = '<strong style="color:red">' . $lang['NO'] . '</strong>'; - } - else - { - $passed['php'] = true; - - // We also give feedback on whether we're running in safe mode - $result = '<strong style="color:green">' . $lang['YES']; - if (@ini_get('safe_mode') == '1' || strtolower(@ini_get('safe_mode')) == 'on') - { - $result .= ', ' . $lang['PHP_SAFE_MODE']; - } - $result .= '</strong>'; - } - - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['PHP_VERSION_REQD'], - 'RESULT' => $result, - - 'S_EXPLAIN' => false, - 'S_LEGEND' => false, - )); - - // Don't check for register_globals on 5.4+ - if (version_compare($php_version, '5.4.0-dev') < 0) - { - // Check for register_globals being enabled - if (@ini_get('register_globals') == '1' || strtolower(@ini_get('register_globals')) == 'on') - { - $result = '<strong style="color:red">' . $lang['NO'] . '</strong>'; - } - else - { - $result = '<strong style="color:green">' . $lang['YES'] . '</strong>'; - } - - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['PHP_REGISTER_GLOBALS'], - 'TITLE_EXPLAIN' => $lang['PHP_REGISTER_GLOBALS_EXPLAIN'], - 'RESULT' => $result, - - 'S_EXPLAIN' => true, - 'S_LEGEND' => false, - )); - } - - // Check for url_fopen - if (@ini_get('allow_url_fopen') == '1' || strtolower(@ini_get('allow_url_fopen')) == 'on') - { - $result = '<strong style="color:green">' . $lang['YES'] . '</strong>'; - } - else - { - $result = '<strong style="color:red">' . $lang['NO'] . '</strong>'; - } - - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['PHP_URL_FOPEN_SUPPORT'], - 'TITLE_EXPLAIN' => $lang['PHP_URL_FOPEN_SUPPORT_EXPLAIN'], - 'RESULT' => $result, - - 'S_EXPLAIN' => true, - 'S_LEGEND' => false, - )); - - // Check for getimagesize - if (@function_exists('getimagesize')) - { - $passed['imagesize'] = true; - $result = '<strong style="color:green">' . $lang['YES'] . '</strong>'; - } - else - { - $result = '<strong style="color:red">' . $lang['NO'] . '</strong>'; - } - - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['PHP_GETIMAGESIZE_SUPPORT'], - 'TITLE_EXPLAIN' => $lang['PHP_GETIMAGESIZE_SUPPORT_EXPLAIN'], - 'RESULT' => $result, - - 'S_EXPLAIN' => true, - 'S_LEGEND' => false, - )); - - // Check for PCRE UTF-8 support - if (@preg_match('//u', '')) - { - $passed['pcre'] = true; - $result = '<strong style="color:green">' . $lang['YES'] . '</strong>'; - } - else - { - $result = '<strong style="color:red">' . $lang['NO'] . '</strong>'; - } - - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['PCRE_UTF_SUPPORT'], - 'TITLE_EXPLAIN' => $lang['PCRE_UTF_SUPPORT_EXPLAIN'], - 'RESULT' => $result, - - 'S_EXPLAIN' => true, - 'S_LEGEND' => false, - )); - - // Check for php json support - if (@extension_loaded('json')) - { - $passed['json'] = true; - $result = '<strong style="color:green">' . $lang['YES'] . '</strong>'; - } - else - { - $result = '<strong style="color:red">' . $lang['NO'] . '</strong>'; - } - - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['PHP_JSON_SUPPORT'], - 'TITLE_EXPLAIN' => $lang['PHP_JSON_SUPPORT_EXPLAIN'], - 'RESULT' => $result, - - 'S_EXPLAIN' => true, - 'S_LEGEND' => false, - )); - - $passed['mbstring'] = true; - if (@extension_loaded('mbstring')) - { - // Test for available database modules - $template->assign_block_vars('checks', array( - 'S_LEGEND' => true, - 'LEGEND' => $lang['MBSTRING_CHECK'], - 'LEGEND_EXPLAIN' => $lang['MBSTRING_CHECK_EXPLAIN'], - )); - - $checks = array( - array('func_overload', '&', MB_OVERLOAD_MAIL|MB_OVERLOAD_STRING), - array('encoding_translation', '!=', 0), - array('http_input', '!=', array('pass', '')), - array('http_output', '!=', array('pass', '')) - ); - - foreach ($checks as $mb_checks) - { - $ini_val = @ini_get('mbstring.' . $mb_checks[0]); - switch ($mb_checks[1]) - { - case '&': - if (intval($ini_val) & $mb_checks[2]) - { - $result = '<strong style="color:red">' . $lang['NO'] . '</strong>'; - $passed['mbstring'] = false; - } - else - { - $result = '<strong style="color:green">' . $lang['YES'] . '</strong>'; - } - break; - - case '!=': - if (!is_array($mb_checks[2]) && $ini_val != $mb_checks[2] || - is_array($mb_checks[2]) && !in_array($ini_val, $mb_checks[2])) - { - $result = '<strong style="color:red">' . $lang['NO'] . '</strong>'; - $passed['mbstring'] = false; - } - else - { - $result = '<strong style="color:green">' . $lang['YES'] . '</strong>'; - } - break; - } - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['MBSTRING_' . strtoupper($mb_checks[0])], - 'TITLE_EXPLAIN' => $lang['MBSTRING_' . strtoupper($mb_checks[0]) . '_EXPLAIN'], - 'RESULT' => $result, - - 'S_EXPLAIN' => true, - 'S_LEGEND' => false, - )); - } - } - - // Test for available database modules - $template->assign_block_vars('checks', array( - 'S_LEGEND' => true, - 'LEGEND' => $lang['PHP_SUPPORTED_DB'], - 'LEGEND_EXPLAIN' => $lang['PHP_SUPPORTED_DB_EXPLAIN'], - )); - - $available_dbms = get_available_dbms(false, true); - $passed['db'] = $available_dbms['ANY_DB_SUPPORT']; - unset($available_dbms['ANY_DB_SUPPORT']); - - foreach ($available_dbms as $db_name => $db_ary) - { - if (!$db_ary['AVAILABLE']) - { - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['DLL_' . strtoupper($db_name)], - 'RESULT' => '<span style="color:red">' . $lang['UNAVAILABLE'] . '</span>', - - 'S_EXPLAIN' => false, - 'S_LEGEND' => false, - )); - } - else - { - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['DLL_' . strtoupper($db_name)], - 'RESULT' => '<strong style="color:green">' . $lang['AVAILABLE'] . '</strong>', - - 'S_EXPLAIN' => false, - 'S_LEGEND' => false, - )); - } - } - - // Test for other modules - $template->assign_block_vars('checks', array( - 'S_LEGEND' => true, - 'LEGEND' => $lang['PHP_OPTIONAL_MODULE'], - 'LEGEND_EXPLAIN' => $lang['PHP_OPTIONAL_MODULE_EXPLAIN'], - )); - - foreach ($this->php_dlls_other as $dll) - { - if (!@extension_loaded($dll)) - { - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['DLL_' . strtoupper($dll)], - 'RESULT' => '<strong style="color:red">' . $lang['UNAVAILABLE'] . '</strong>', - - 'S_EXPLAIN' => false, - 'S_LEGEND' => false, - )); - continue; - } - - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['DLL_' . strtoupper($dll)], - 'RESULT' => '<strong style="color:green">' . $lang['AVAILABLE'] . '</strong>', - - 'S_EXPLAIN' => false, - 'S_LEGEND' => false, - )); - } - - // Can we find Imagemagick anywhere on the system? - $exe = (DIRECTORY_SEPARATOR == '\\') ? '.exe' : ''; - - $magic_home = getenv('MAGICK_HOME'); - $img_imagick = ''; - if (empty($magic_home)) - { - $locations = array('C:/WINDOWS/', 'C:/WINNT/', 'C:/WINDOWS/SYSTEM/', 'C:/WINNT/SYSTEM/', 'C:/WINDOWS/SYSTEM32/', 'C:/WINNT/SYSTEM32/', '/usr/bin/', '/usr/sbin/', '/usr/local/bin/', '/usr/local/sbin/', '/opt/', '/usr/imagemagick/', '/usr/bin/imagemagick/'); - $path_locations = str_replace('\\', '/', (explode(($exe) ? ';' : ':', getenv('PATH')))); - - $locations = array_merge($path_locations, $locations); - foreach ($locations as $location) - { - // The path might not end properly, fudge it - if (substr($location, -1, 1) !== '/') - { - $location .= '/'; - } - - if (@file_exists($location) && @is_readable($location . 'mogrify' . $exe) && @filesize($location . 'mogrify' . $exe) > 3000) - { - $img_imagick = str_replace('\\', '/', $location); - continue; - } - } - } - else - { - $img_imagick = str_replace('\\', '/', $magic_home); - } - - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['APP_MAGICK'], - 'RESULT' => ($img_imagick) ? '<strong style="color:green">' . $lang['AVAILABLE'] . ', ' . $img_imagick . '</strong>' : '<strong style="color:blue">' . $lang['NO_LOCATION'] . '</strong>', - - 'S_EXPLAIN' => false, - 'S_LEGEND' => false, - )); - - // Check permissions on files/directories we need access to - $template->assign_block_vars('checks', array( - 'S_LEGEND' => true, - 'LEGEND' => $lang['FILES_REQUIRED'], - 'LEGEND_EXPLAIN' => $lang['FILES_REQUIRED_EXPLAIN'], - )); - - $directories = array('cache/', 'files/', 'store/'); - - umask(0); - - $passed['files'] = true; - foreach ($directories as $dir) - { - $exists = $write = false; - - // Try to create the directory if it does not exist - if (!file_exists($phpbb_root_path . $dir)) - { - @mkdir($phpbb_root_path . $dir, 0777); - phpbb_chmod($phpbb_root_path . $dir, CHMOD_READ | CHMOD_WRITE); - } - - // Now really check - if (file_exists($phpbb_root_path . $dir) && is_dir($phpbb_root_path . $dir)) - { - phpbb_chmod($phpbb_root_path . $dir, CHMOD_READ | CHMOD_WRITE); - $exists = true; - } - - // Now check if it is writable by storing a simple file - $fp = @fopen($phpbb_root_path . $dir . 'test_lock', 'wb'); - if ($fp !== false) - { - $write = true; - } - @fclose($fp); - - @unlink($phpbb_root_path . $dir . 'test_lock'); - - $passed['files'] = ($exists && $write && $passed['files']) ? true : false; - - $exists = ($exists) ? '<strong style="color:green">' . $lang['FOUND'] . '</strong>' : '<strong style="color:red">' . $lang['NOT_FOUND'] . '</strong>'; - $write = ($write) ? ', <strong style="color:green">' . $lang['WRITABLE'] . '</strong>' : (($exists) ? ', <strong style="color:red">' . $lang['UNWRITABLE'] . '</strong>' : ''); - - $template->assign_block_vars('checks', array( - 'TITLE' => $dir, - 'RESULT' => $exists . $write, - - 'S_EXPLAIN' => false, - 'S_LEGEND' => false, - )); - } - - // Check permissions on files/directories it would be useful access to - $template->assign_block_vars('checks', array( - 'S_LEGEND' => true, - 'LEGEND' => $lang['FILES_OPTIONAL'], - 'LEGEND_EXPLAIN' => $lang['FILES_OPTIONAL_EXPLAIN'], - )); - - $directories = array('config.' . $phpEx, 'images/avatars/upload/'); - - foreach ($directories as $dir) - { - $write = $exists = true; - if (file_exists($phpbb_root_path . $dir)) - { - if (!phpbb_is_writable($phpbb_root_path . $dir)) - { - $write = false; - } - } - else - { - $write = $exists = false; - } - - $exists_str = ($exists) ? '<strong style="color:green">' . $lang['FOUND'] . '</strong>' : '<strong style="color:red">' . $lang['NOT_FOUND'] . '</strong>'; - $write_str = ($write) ? ', <strong style="color:green">' . $lang['WRITABLE'] . '</strong>' : (($exists) ? ', <strong style="color:red">' . $lang['UNWRITABLE'] . '</strong>' : ''); - - $template->assign_block_vars('checks', array( - 'TITLE' => $dir, - 'RESULT' => $exists_str . $write_str, - - 'S_EXPLAIN' => false, - 'S_LEGEND' => false, - )); - } - - // And finally where do we want to go next (well today is taken isn't it :P) - $s_hidden_fields = ($img_imagick) ? '<input type="hidden" name="img_imagick" value="' . addslashes($img_imagick) . '" />' : ''; - - $url = (!in_array(false, $passed)) ? $this->p_master->module_url . "?mode=$mode&sub=database&language=$language" : $this->p_master->module_url . "?mode=$mode&sub=requirements&language=$language "; - $submit = (!in_array(false, $passed)) ? $lang['INSTALL_START'] : $lang['INSTALL_TEST']; - - $template->assign_vars(array( - 'L_SUBMIT' => $submit, - 'S_HIDDEN' => $s_hidden_fields, - 'U_ACTION' => $url, - )); - } - - /** - * Obtain the information required to connect to the database - */ - function obtain_database_settings($mode, $sub) - { - global $lang, $template, $phpEx; - - $this->page_title = $lang['STAGE_DATABASE']; - - // Obtain any submitted data - $data = $this->get_submitted_data(); - - $connect_test = false; - $error = array(); - $available_dbms = get_available_dbms(false, true); - - // Has the user opted to test the connection? - if (isset($_POST['testdb'])) - { - if (!isset($available_dbms[$data['dbms']]) || !$available_dbms[$data['dbms']]['AVAILABLE']) - { - $error[] = $lang['INST_ERR_NO_DB']; - $connect_test = false; - } - else if (!preg_match(get_preg_expression('table_prefix'), $data['table_prefix'])) - { - $error[] = $lang['INST_ERR_DB_INVALID_PREFIX']; - $connect_test = false; - } - else - { - $connect_test = connect_check_db(true, $error, $available_dbms[$data['dbms']], $data['table_prefix'], $data['dbhost'], $data['dbuser'], htmlspecialchars_decode($data['dbpasswd']), $data['dbname'], $data['dbport']); - } - - $template->assign_block_vars('checks', array( - 'S_LEGEND' => true, - 'LEGEND' => $lang['DB_CONNECTION'], - 'LEGEND_EXPLAIN' => false, - )); - - if ($connect_test) - { - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['DB_TEST'], - 'RESULT' => '<strong style="color:green">' . $lang['SUCCESSFUL_CONNECT'] . '</strong>', - - 'S_EXPLAIN' => false, - 'S_LEGEND' => false, - )); - } - else - { - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['DB_TEST'], - 'RESULT' => '<strong style="color:red">' . implode('<br />', $error) . '</strong>', - - 'S_EXPLAIN' => false, - 'S_LEGEND' => false, - )); - } - } - - if (!$connect_test) - { - // Update the list of available DBMS modules to only contain those which can be used - $available_dbms_temp = array(); - foreach ($available_dbms as $type => $dbms_ary) - { - if (!$dbms_ary['AVAILABLE']) - { - continue; - } - - $available_dbms_temp[$type] = $dbms_ary; - } - - $available_dbms = &$available_dbms_temp; - - // And now for the main part of this page - $data['table_prefix'] = (!empty($data['table_prefix']) ? $data['table_prefix'] : 'phpbb_'); - - foreach ($this->db_config_options as $config_key => $vars) - { - if (!is_array($vars) && strpos($config_key, 'legend') === false) - { - continue; - } - - if (strpos($config_key, 'legend') !== false) - { - $template->assign_block_vars('options', array( - 'S_LEGEND' => true, - 'LEGEND' => $lang[$vars]) - ); - - continue; - } - - $options = isset($vars['options']) ? $vars['options'] : ''; - - $template->assign_block_vars('options', array( - 'KEY' => $config_key, - 'TITLE' => $lang[$vars['lang']], - 'S_EXPLAIN' => $vars['explain'], - 'S_LEGEND' => false, - 'TITLE_EXPLAIN' => ($vars['explain']) ? $lang[$vars['lang'] . '_EXPLAIN'] : '', - 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], $data[$config_key], $options), - ) - ); - } - } - - // And finally where do we want to go next (well today is taken isn't it :P) - $s_hidden_fields = ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : ''; - $s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />'; - if ($connect_test) - { - foreach ($this->db_config_options as $config_key => $vars) - { - if (!is_array($vars)) - { - continue; - } - $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />'; - } - } - - $url = ($connect_test) ? $this->p_master->module_url . "?mode=$mode&sub=administrator" : $this->p_master->module_url . "?mode=$mode&sub=database"; - $s_hidden_fields .= ($connect_test) ? '' : '<input type="hidden" name="testdb" value="true" />'; - - $submit = $lang['NEXT_STEP']; - - $template->assign_vars(array( - 'L_SUBMIT' => $submit, - 'S_HIDDEN' => $s_hidden_fields, - 'U_ACTION' => $url, - )); - } - - /** - * Obtain the administrator's name, password and email address - */ - function obtain_admin_settings($mode, $sub) - { - global $lang, $template, $phpEx; - - $this->page_title = $lang['STAGE_ADMINISTRATOR']; - - // Obtain any submitted data - $data = $this->get_submitted_data(); - - if ($data['dbms'] == '') - { - // Someone's been silly and tried calling this page direct - // So we send them back to the start to do it again properly - $this->p_master->redirect("index.$phpEx?mode=install"); - } - - $s_hidden_fields = ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : ''; - $passed = false; - - $data['default_lang'] = ($data['default_lang'] !== '') ? $data['default_lang'] : $data['language']; - - if (isset($_POST['check'])) - { - $error = array(); - - // Check the entered email address and password - if ($data['admin_name'] == '' || $data['admin_pass1'] == '' || $data['admin_pass2'] == '' || $data['board_email'] == '') - { - $error[] = $lang['INST_ERR_MISSING_DATA']; - } - - if ($data['admin_pass1'] != $data['admin_pass2'] && $data['admin_pass1'] != '') - { - $error[] = $lang['INST_ERR_PASSWORD_MISMATCH']; - } - - // Test against the default username rules - if ($data['admin_name'] != '' && utf8_strlen($data['admin_name']) < 3) - { - $error[] = $lang['INST_ERR_USER_TOO_SHORT']; - } - - if ($data['admin_name'] != '' && utf8_strlen($data['admin_name']) > 20) - { - $error[] = $lang['INST_ERR_USER_TOO_LONG']; - } - - // Test against the default password rules - if ($data['admin_pass1'] != '' && utf8_strlen($data['admin_pass1']) < 6) - { - $error[] = $lang['INST_ERR_PASSWORD_TOO_SHORT']; - } - - if ($data['admin_pass1'] != '' && utf8_strlen($data['admin_pass1']) > 30) - { - $error[] = $lang['INST_ERR_PASSWORD_TOO_LONG']; - } - - if ($data['board_email'] != '' && !preg_match('/^' . get_preg_expression('email') . '$/i', $data['board_email'])) - { - $error[] = $lang['INST_ERR_EMAIL_INVALID']; - } - - $template->assign_block_vars('checks', array( - 'S_LEGEND' => true, - 'LEGEND' => $lang['STAGE_ADMINISTRATOR'], - 'LEGEND_EXPLAIN' => false, - )); - - if (!sizeof($error)) - { - $passed = true; - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['ADMIN_TEST'], - 'RESULT' => '<strong style="color:green">' . $lang['TESTS_PASSED'] . '</strong>', - - 'S_EXPLAIN' => false, - 'S_LEGEND' => false, - )); - } - else - { - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['ADMIN_TEST'], - 'RESULT' => '<strong style="color:red">' . implode('<br />', $error) . '</strong>', - - 'S_EXPLAIN' => false, - 'S_LEGEND' => false, - )); - } - } - - if (!$passed) - { - foreach ($this->admin_config_options as $config_key => $vars) - { - if (!is_array($vars) && strpos($config_key, 'legend') === false) - { - continue; - } - - if (strpos($config_key, 'legend') !== false) - { - $template->assign_block_vars('options', array( - 'S_LEGEND' => true, - 'LEGEND' => $lang[$vars]) - ); - - continue; - } - - $options = isset($vars['options']) ? $vars['options'] : ''; - - $template->assign_block_vars('options', array( - 'KEY' => $config_key, - 'TITLE' => $lang[$vars['lang']], - 'S_EXPLAIN' => $vars['explain'], - 'S_LEGEND' => false, - 'TITLE_EXPLAIN' => ($vars['explain']) ? $lang[$vars['lang'] . '_EXPLAIN'] : '', - 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], $data[$config_key], $options), - ) - ); - } - } - else - { - foreach ($this->admin_config_options as $config_key => $vars) - { - if (!is_array($vars)) - { - continue; - } - $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />'; - } - } - - $s_hidden_fields .= ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : ''; - $s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />'; - - foreach ($this->db_config_options as $config_key => $vars) - { - if (!is_array($vars)) - { - continue; - } - $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />'; - } - - $submit = $lang['NEXT_STEP']; - - $url = ($passed) ? $this->p_master->module_url . "?mode=$mode&sub=config_file" : $this->p_master->module_url . "?mode=$mode&sub=administrator"; - $s_hidden_fields .= ($passed) ? '' : '<input type="hidden" name="check" value="true" />'; - - $template->assign_vars(array( - 'L_SUBMIT' => $submit, - 'S_HIDDEN' => $s_hidden_fields, - 'U_ACTION' => $url, - )); - } - - /** - * Writes the config file to disk, or if unable to do so offers alternative methods - */ - function create_config_file($mode, $sub) - { - global $lang, $template, $phpbb_root_path, $phpEx; - - $this->page_title = $lang['STAGE_CONFIG_FILE']; - - // Obtain any submitted data - $data = $this->get_submitted_data(); - - if ($data['dbms'] == '') - { - // Someone's been silly and tried calling this page direct - // So we send them back to the start to do it again properly - $this->p_master->redirect("index.$phpEx?mode=install"); - } - - $s_hidden_fields = ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : ''; - $s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />'; - $written = false; - - // Create a list of any PHP modules we wish to have loaded - $available_dbms = get_available_dbms($data['dbms']); - - // Create a lock file to indicate that there is an install in progress - $fp = @fopen($phpbb_root_path . 'cache/install_lock', 'wb'); - if ($fp === false) - { - // We were unable to create the lock file - abort - $this->p_master->error($lang['UNABLE_WRITE_LOCK'], __LINE__, __FILE__); - } - @fclose($fp); - - @chmod($phpbb_root_path . 'cache/install_lock', 0777); - - // Time to convert the data provided into a config file - $config_data = phpbb_create_config_file_data($data, $available_dbms[$data['dbms']]['DRIVER']); - - // Attempt to write out the config file directly. If it works, this is the easiest way to do it ... - if ((file_exists($phpbb_root_path . 'config.' . $phpEx) && phpbb_is_writable($phpbb_root_path . 'config.' . $phpEx)) || phpbb_is_writable($phpbb_root_path)) - { - // Assume it will work ... if nothing goes wrong below - $written = true; - - if (!($fp = @fopen($phpbb_root_path . 'config.' . $phpEx, 'w'))) - { - // Something went wrong ... so let's try another method - $written = false; - } - - if (!(@fwrite($fp, $config_data))) - { - // Something went wrong ... so let's try another method - $written = false; - } - - @fclose($fp); - - if ($written) - { - // We may revert back to chmod() if we see problems with users not able to change their config.php file directly - phpbb_chmod($phpbb_root_path . 'config.' . $phpEx, CHMOD_READ); - } - } - - if (isset($_POST['dldone'])) - { - // Do a basic check to make sure that the file has been uploaded - // Note that all we check is that the file has _something_ in it - // We don't compare the contents exactly - if they can't upload - // a single file correctly, it's likely they will have other problems.... - if (filesize($phpbb_root_path . 'config.' . $phpEx) > 10) - { - $written = true; - } - } - - $config_options = array_merge($this->db_config_options, $this->admin_config_options); - - foreach ($config_options as $config_key => $vars) - { - if (!is_array($vars)) - { - continue; - } - $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />'; - } - - if (!$written) - { - // OK, so it didn't work let's try the alternatives - - if (isset($_POST['dlconfig'])) - { - // They want a copy of the file to 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; - } - - // The option to download the config file is always available, so output it here - $template->assign_vars(array( - 'BODY' => $lang['CONFIG_FILE_UNABLE_WRITE'], - 'L_DL_CONFIG' => $lang['DL_CONFIG'], - 'L_DL_CONFIG_EXPLAIN' => $lang['DL_CONFIG_EXPLAIN'], - 'L_DL_DONE' => $lang['DONE'], - 'L_DL_DOWNLOAD' => $lang['DL_DOWNLOAD'], - 'S_HIDDEN' => $s_hidden_fields, - 'S_SHOW_DOWNLOAD' => true, - 'U_ACTION' => $this->p_master->module_url . "?mode=$mode&sub=config_file", - )); - return; - } - else - { - $template->assign_vars(array( - 'BODY' => $lang['CONFIG_FILE_WRITTEN'], - 'L_SUBMIT' => $lang['NEXT_STEP'], - 'S_HIDDEN' => $s_hidden_fields, - 'U_ACTION' => $this->p_master->module_url . "?mode=$mode&sub=advanced", - )); - return; - } - } - - /** - * Provide an opportunity to customise some advanced settings during the install - * in case it is necessary for them to be set to access later - */ - function obtain_advanced_settings($mode, $sub) - { - global $lang, $template, $phpEx, $request; - - $this->page_title = $lang['STAGE_ADVANCED']; - - // Obtain any submitted data - $data = $this->get_submitted_data(); - - if ($data['dbms'] == '') - { - // Someone's been silly and tried calling this page direct - // So we send them back to the start to do it again properly - $this->p_master->redirect("index.$phpEx?mode=install"); - } - - $s_hidden_fields = ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : ''; - $s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />'; - - // HTTP_HOST is having the correct browser url in most cases... - $server_name = strtolower(htmlspecialchars_decode($request->header('Host', $request->server('SERVER_NAME')))); - - // HTTP HOST can carry a port number... - if (strpos($server_name, ':') !== false) - { - $server_name = substr($server_name, 0, strpos($server_name, ':')); - } - - $data['email_enable'] = ($data['email_enable'] !== '') ? $data['email_enable'] : true; - $data['server_name'] = ($data['server_name'] !== '') ? $data['server_name'] : $server_name; - $data['server_port'] = ($data['server_port'] !== '') ? $data['server_port'] : $request->server('SERVER_PORT', 0); - $data['server_protocol'] = ($data['server_protocol'] !== '') ? $data['server_protocol'] : ($request->is_secure() ? 'https://' : 'http://'); - $data['cookie_secure'] = ($data['cookie_secure'] !== '') ? $data['cookie_secure'] : $request->is_secure(); - - if ($data['script_path'] === '') - { - $name = htmlspecialchars_decode($request->server('PHP_SELF')); - if (!$name) - { - $name = htmlspecialchars_decode($request->server('REQUEST_URI')); - } - - // Replace backslashes and doubled slashes (could happen on some proxy setups) - $name = str_replace(array('\\', '//'), '/', $name); - $data['script_path'] = trim(dirname(dirname($name))); - } - - foreach ($this->advanced_config_options as $config_key => $vars) - { - if (!is_array($vars) && strpos($config_key, 'legend') === false) - { - continue; - } - - if (strpos($config_key, 'legend') !== false) - { - $template->assign_block_vars('options', array( - 'S_LEGEND' => true, - 'LEGEND' => $lang[$vars]) - ); - - continue; - } - - $options = isset($vars['options']) ? $vars['options'] : ''; - - $template->assign_block_vars('options', array( - 'KEY' => $config_key, - 'TITLE' => $lang[$vars['lang']], - 'S_EXPLAIN' => $vars['explain'], - 'S_LEGEND' => false, - 'TITLE_EXPLAIN' => ($vars['explain']) ? $lang[$vars['lang'] . '_EXPLAIN'] : '', - 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], $data[$config_key], $options), - ) - ); - } - - $config_options = array_merge($this->db_config_options, $this->admin_config_options); - foreach ($config_options as $config_key => $vars) - { - if (!is_array($vars)) - { - continue; - } - $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />'; - } - - $submit = $lang['NEXT_STEP']; - - $url = $this->p_master->module_url . "?mode=$mode&sub=create_table"; - - $template->assign_vars(array( - 'BODY' => $lang['STAGE_ADVANCED_EXPLAIN'], - 'L_SUBMIT' => $submit, - 'S_HIDDEN' => $s_hidden_fields, - 'U_ACTION' => $url, - )); - } - - /** - * Load the contents of the schema into the database and then alter it based on what has been input during the installation - */ - function load_schema($mode, $sub) - { - global $db, $lang, $template, $phpbb_root_path, $phpEx, $request; - - $this->page_title = $lang['STAGE_CREATE_TABLE']; - $s_hidden_fields = ''; - - // Obtain any submitted data - $data = $this->get_submitted_data(); - - if ($data['dbms'] == '') - { - // Someone's been silly and tried calling this page direct - // So we send them back to the start to do it again properly - $this->p_master->redirect("index.$phpEx?mode=install"); - } - - // HTTP_HOST is having the correct browser url in most cases... - $server_name = strtolower(htmlspecialchars_decode($request->header('Host', $request->server('SERVER_NAME')))); - $referer = strtolower($request->header('Referer')); - - // HTTP HOST can carry a port number... - if (strpos($server_name, ':') !== false) - { - $server_name = substr($server_name, 0, strpos($server_name, ':')); - } - - $cookie_domain = ($data['server_name'] != '') ? $data['server_name'] : $server_name; - - // Try to come up with the best solution for cookie domain... - if (strpos($cookie_domain, 'www.') === 0) - { - $cookie_domain = str_replace('www.', '.', $cookie_domain); - } - - // If we get here and the extension isn't loaded it should be safe to just go ahead and load it - $available_dbms = get_available_dbms($data['dbms']); - - if (!isset($available_dbms[$data['dbms']])) - { - // Someone's been silly and tried providing a non-existant dbms - $this->p_master->redirect("index.$phpEx?mode=install"); - } - - $dbms = $available_dbms[$data['dbms']]['DRIVER']; - - // Instantiate the database - $db = new $dbms(); - $db->sql_connect($data['dbhost'], $data['dbuser'], htmlspecialchars_decode($data['dbpasswd']), $data['dbname'], $data['dbport'], false, false); - - // NOTE: trigger_error does not work here. - $db->sql_return_on_error(true); - - // If mysql is chosen, we need to adjust the schema filename slightly to reflect the correct version. ;) - if ($data['dbms'] == 'mysql') - { - if (version_compare($db->sql_server_info(true), '4.1.3', '>=')) - { - $available_dbms[$data['dbms']]['SCHEMA'] .= '_41'; - } - else - { - $available_dbms[$data['dbms']]['SCHEMA'] .= '_40'; - } - } - - // 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[$data['dbms']]['SCHEMA'] . '_schema.sql'; - - // How should we treat this schema? - $delimiter = $available_dbms[$data['dbms']]['DELIM']; - - if (file_exists($dbms_schema)) - { - $sql_query = @file_get_contents($dbms_schema); - $sql_query = preg_replace('#phpbb_#i', $data['table_prefix'], $sql_query); - $sql_query = phpbb_remove_comments($sql_query); - $sql_query = split_sql_file($sql_query, $delimiter); - - foreach ($sql_query as $sql) - { - // Ignore errors when the functions or types already exist - // to allow installing phpBB twice in the same database with - // a different prefix - $db->sql_query($sql); - } - unset($sql_query); - } - - // Ok we have the db info go ahead and work on building the table - if (file_exists('schemas/schema.json')) - { - $db_table_schema = @file_get_contents('schemas/schema.json'); - $db_table_schema = json_decode($db_table_schema, true); - } - else - { - global $phpbb_root_path, $phpEx, $table_prefix; - $table_prefix = 'phpbb_'; - - if (!defined('CONFIG_TABLE')) - { - // We need to include the constants file for the table constants - // when we generate the schema from the migration files. - include($phpbb_root_path . 'includes/constants.' . $phpEx); - } - - $finder = new \phpbb\finder(new \phpbb\filesystem(), $phpbb_root_path, null, $phpEx); - $classes = $finder->core_path('phpbb/db/migration/data/') - ->get_classes(); - - $sqlite_db = new \phpbb\db\driver\sqlite(); - $schema_generator = new \phpbb\db\migration\schema_generator($classes, new \phpbb\config\config(array()), $sqlite_db, new \phpbb\db\tools($sqlite_db, true), $phpbb_root_path, $phpEx, $table_prefix); - $db_table_schema = $schema_generator->get_schema(); - } - - if (!defined('CONFIG_TABLE')) - { - // CONFIG_TABLE is required by sql_create_index() to check the - // length of index names. However table_prefix is not defined - // here yet, so we need to create the constant ourselves. - define('CONFIG_TABLE', $data['table_prefix'] . 'config'); - } - - $db_tools = new \phpbb\db\tools($db); - foreach ($db_table_schema as $table_name => $table_data) - { - $db_tools->sql_create_table( - $data['table_prefix'] . substr($table_name, 6), - $table_data - ); - } - - // Ok tables have been built, let's fill in the basic information - $sql_query = file_get_contents('schemas/schema_data.sql'); - - // Deal with any special comments and characters - switch ($data['dbms']) - { - case 'mssql': - case 'mssql_odbc': - case 'mssqlnative': - $sql_query = preg_replace('#\# MSSQL IDENTITY (phpbb_[a-z_]+) (ON|OFF) \##s', 'SET IDENTITY_INSERT \1 \2;', $sql_query); - break; - - case 'postgres': - $sql_query = preg_replace('#\# POSTGRES (BEGIN|COMMIT) \##s', '\1; ', $sql_query); - break; - - case 'mysql': - case 'mysqli': - $sql_query = str_replace('\\', '\\\\', $sql_query); - break; - } - - // Change prefix - $sql_query = preg_replace('# phpbb_([^\s]*) #i', ' ' . $data['table_prefix'] . '\1 ', $sql_query); - - // Change language strings... - $sql_query = preg_replace_callback('#\{L_([A-Z0-9\-_]*)\}#s', 'adjust_language_keys_callback', $sql_query); - - $sql_query = phpbb_remove_comments($sql_query); - $sql_query = split_sql_file($sql_query, ';'); - - foreach ($sql_query as $sql) - { - //$sql = trim(str_replace('|', ';', $sql)); - if (!$db->sql_query($sql)) - { - $error = $db->sql_error(); - $this->p_master->db_error($error['message'], $sql, __LINE__, __FILE__); - } - } - unset($sql_query); - - $current_time = time(); - - $user_ip = $request->server('REMOTE_ADDR') ? phpbb_ip_normalise($request->server('REMOTE_ADDR')) : ''; - - if ($data['script_path'] !== '/') - { - // Adjust destination path (no trailing slash) - if (substr($data['script_path'], -1) == '/') - { - $data['script_path'] = substr($data['script_path'], 0, -1); - } - - $data['script_path'] = str_replace(array('../', './'), '', $data['script_path']); - - if ($data['script_path'][0] != '/') - { - $data['script_path'] = '/' . $data['script_path']; - } - } - - // Set default config and post data, this applies to all DB's - $sql_ary = array( - 'INSERT INTO ' . $data['table_prefix'] . "config (config_name, config_value) - VALUES ('board_startdate', '$current_time')", - - 'INSERT INTO ' . $data['table_prefix'] . "config (config_name, config_value) - VALUES ('default_lang', '" . $db->sql_escape($data['default_lang']) . "')", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['img_imagick']) . "' - WHERE config_name = 'img_imagick'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['server_name']) . "' - WHERE config_name = 'server_name'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['server_port']) . "' - WHERE config_name = 'server_port'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['board_email']) . "' - WHERE config_name = 'board_email'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['board_email']) . "' - WHERE config_name = 'board_contact'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($cookie_domain) . "' - WHERE config_name = 'cookie_domain'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($lang['default_dateformat']) . "' - WHERE config_name = 'default_dateformat'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['email_enable']) . "' - WHERE config_name = 'email_enable'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['smtp_delivery']) . "' - WHERE config_name = 'smtp_delivery'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['smtp_host']) . "' - WHERE config_name = 'smtp_host'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['smtp_auth']) . "' - WHERE config_name = 'smtp_auth_method'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['smtp_user']) . "' - WHERE config_name = 'smtp_username'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['smtp_pass']) . "' - WHERE config_name = 'smtp_password'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['cookie_secure']) . "' - WHERE config_name = 'cookie_secure'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['force_server_vars']) . "' - WHERE config_name = 'force_server_vars'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['script_path']) . "' - WHERE config_name = 'script_path'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['server_protocol']) . "' - WHERE config_name = 'server_protocol'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($data['admin_name']) . "' - WHERE config_name = 'newest_username'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . md5(mt_rand()) . "' - WHERE config_name = 'avatar_salt'", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . md5(mt_rand()) . "' - WHERE config_name = 'plupload_salt'", - - 'UPDATE ' . $data['table_prefix'] . "users - SET username = '" . $db->sql_escape($data['admin_name']) . "', user_password='" . $db->sql_escape(md5($data['admin_pass1'])) . "', user_ip = '" . $db->sql_escape($user_ip) . "', user_lang = '" . $db->sql_escape($data['default_lang']) . "', user_email='" . $db->sql_escape($data['board_email']) . "', user_dateformat='" . $db->sql_escape($lang['default_dateformat']) . "', user_email_hash = " . $db->sql_escape(phpbb_email_hash($data['board_email'])) . ", username_clean = '" . $db->sql_escape(utf8_clean_string($data['admin_name'])) . "' - WHERE username = 'Admin'", - - 'UPDATE ' . $data['table_prefix'] . "moderator_cache - SET username = '" . $db->sql_escape($data['admin_name']) . "' - WHERE username = 'Admin'", - - 'UPDATE ' . $data['table_prefix'] . "forums - SET forum_last_poster_name = '" . $db->sql_escape($data['admin_name']) . "' - WHERE forum_last_poster_name = 'Admin'", - - 'UPDATE ' . $data['table_prefix'] . "topics - SET topic_first_poster_name = '" . $db->sql_escape($data['admin_name']) . "', topic_last_poster_name = '" . $db->sql_escape($data['admin_name']) . "' - WHERE topic_first_poster_name = 'Admin' - OR topic_last_poster_name = 'Admin'", - - 'UPDATE ' . $data['table_prefix'] . "users - SET user_regdate = $current_time", - - 'UPDATE ' . $data['table_prefix'] . "posts - SET post_time = $current_time, poster_ip = '" . $db->sql_escape($user_ip) . "'", - - 'UPDATE ' . $data['table_prefix'] . "topics - SET topic_time = $current_time, topic_last_post_time = $current_time", - - 'UPDATE ' . $data['table_prefix'] . "forums - SET forum_last_post_time = $current_time", - - 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($db->sql_server_info(true)) . "' - WHERE config_name = 'dbms_version'", - ); - - if (@extension_loaded('gd')) - { - $sql_ary[] = 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = 'core.captcha.plugins.gd' - WHERE config_name = 'captcha_plugin'"; - - $sql_ary[] = 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '1' - WHERE config_name = 'captcha_gd'"; - } - - $ref = substr($referer, strpos($referer, '://') + 3); - - if (!(stripos($ref, $server_name) === 0)) - { - $sql_ary[] = 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '0' - WHERE config_name = 'referer_validation'"; - } - - // We set a (semi-)unique cookie name to bypass login issues related to the cookie name. - $cookie_name = 'phpbb3_'; - $rand_str = md5(mt_rand()); - $rand_str = str_replace('0', 'z', base_convert($rand_str, 16, 35)); - $rand_str = substr($rand_str, 0, 5); - $cookie_name .= strtolower($rand_str); - - $sql_ary[] = 'UPDATE ' . $data['table_prefix'] . "config - SET config_value = '" . $db->sql_escape($cookie_name) . "' - WHERE config_name = 'cookie_name'"; - - foreach ($sql_ary as $sql) - { - //$sql = trim(str_replace('|', ';', $sql)); - - if (!$db->sql_query($sql)) - { - $error = $db->sql_error(); - $this->p_master->db_error($error['message'], $sql, __LINE__, __FILE__); - } - } - - $submit = $lang['NEXT_STEP']; - - $url = $this->p_master->module_url . "?mode=$mode&sub=final"; - - $template->assign_vars(array( - 'BODY' => $lang['STAGE_CREATE_TABLE_EXPLAIN'], - 'L_SUBMIT' => $submit, - 'S_HIDDEN' => build_hidden_fields($data), - 'U_ACTION' => $url, - )); - } - - /** - * Build the search index... - */ - function build_search_index($mode, $sub) - { - global $db, $lang, $phpbb_root_path, $phpbb_dispatcher, $phpEx, $config, $auth, $user; - - // Obtain any submitted data - $data = $this->get_submitted_data(); - $table_prefix = $data['table_prefix']; - - // If we get here and the extension isn't loaded it should be safe to just go ahead and load it - $available_dbms = get_available_dbms($data['dbms']); - - if (!isset($available_dbms[$data['dbms']])) - { - // Someone's been silly and tried providing a non-existant dbms - $this->p_master->redirect("index.$phpEx?mode=install"); - } - - $dbms = $available_dbms[$data['dbms']]['DRIVER']; - - // Instantiate the database - $db = new $dbms(); - $db->sql_connect($data['dbhost'], $data['dbuser'], htmlspecialchars_decode($data['dbpasswd']), $data['dbname'], $data['dbport'], false, false); - - // NOTE: trigger_error does not work here. - $db->sql_return_on_error(true); - - include_once($phpbb_root_path . 'includes/constants.' . $phpEx); - include_once($phpbb_root_path . 'phpbb/search/fulltext_native.' . $phpEx); - - // We need to fill the config to let internal functions correctly work - $config = new \phpbb\config\db($db, new \phpbb\cache\driver\null, CONFIG_TABLE); - set_config(null, null, null, $config); - set_config_count(null, null, null, $config); - - $error = false; - $search = new \phpbb\search\fulltext_native($error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user, $phpbb_dispatcher); - - $sql = 'SELECT post_id, post_subject, post_text, poster_id, forum_id - FROM ' . POSTS_TABLE; - $result = $db->sql_query($sql); - - while ($row = $db->sql_fetchrow($result)) - { - $search->index('post', $row['post_id'], $row['post_text'], $row['post_subject'], $row['poster_id'], $row['forum_id']); - } - $db->sql_freeresult($result); - } - - /** - * Populate the module tables - */ - function add_modules($mode, $sub) - { - global $db, $lang, $phpbb_root_path, $phpEx, $phpbb_extension_manager, $config, $phpbb_container; - - // modules require an extension manager - if (empty($phpbb_extension_manager)) - { - $phpbb_extension_manager = $phpbb_container->get('ext.manager'); - } - - include_once($phpbb_root_path . 'includes/acp/acp_modules.' . $phpEx); - - $_module = new acp_modules(); - $module_classes = array('acp', 'mcp', 'ucp'); - - // Add categories - foreach ($module_classes as $module_class) - { - $categories = array(); - - // Set the module class - $_module->module_class = $module_class; - - foreach ($this->module_categories[$module_class] as $cat_name => $subs) - { - $basename = ''; - // Check if this sub-category has a basename. If it has, use it. - if (isset($this->module_categories_basenames[$cat_name])) - { - $basename = $this->module_categories_basenames[$cat_name]; - } - $module_data = array( - 'module_basename' => $basename, - 'module_enabled' => 1, - 'module_display' => 1, - 'parent_id' => 0, - 'module_class' => $module_class, - 'module_langname' => $cat_name, - 'module_mode' => '', - 'module_auth' => '', - ); - - // Add category - $_module->update_module_data($module_data, true); - - // Check for last sql error happened - if ($db->get_sql_error_triggered()) - { - $error = $db->sql_error($db->get_sql_error_sql()); - $this->p_master->db_error($error['message'], $db->get_sql_error_sql(), __LINE__, __FILE__); - } - - $categories[$cat_name]['id'] = (int) $module_data['module_id']; - $categories[$cat_name]['parent_id'] = 0; - - // Create sub-categories... - if (is_array($subs)) - { - foreach ($subs as $level2_name) - { - $basename = ''; - // Check if this sub-category has a basename. If it has, use it. - if (isset($this->module_categories_basenames[$level2_name])) - { - $basename = $this->module_categories_basenames[$level2_name]; - } - $module_data = array( - 'module_basename' => $basename, - 'module_enabled' => 1, - 'module_display' => 1, - 'parent_id' => (int) $categories[$cat_name]['id'], - 'module_class' => $module_class, - 'module_langname' => $level2_name, - 'module_mode' => '', - 'module_auth' => '', - ); - - $_module->update_module_data($module_data, true); - - // Check for last sql error happened - if ($db->get_sql_error_triggered()) - { - $error = $db->sql_error($db->get_sql_error_sql()); - $this->p_master->db_error($error['message'], $db->get_sql_error_sql(), __LINE__, __FILE__); - } - - $categories[$level2_name]['id'] = (int) $module_data['module_id']; - $categories[$level2_name]['parent_id'] = (int) $categories[$cat_name]['id']; - } - } - } - - // Get the modules we want to add... returned sorted by name - $module_info = $_module->get_module_infos('', $module_class); - - foreach ($module_info as $module_basename => $fileinfo) - { - foreach ($fileinfo['modes'] as $module_mode => $row) - { - foreach ($row['cat'] as $cat_name) - { - if (!isset($categories[$cat_name])) - { - continue; - } - - $module_data = array( - 'module_basename' => $module_basename, - 'module_enabled' => 1, - 'module_display' => (isset($row['display'])) ? (int) $row['display'] : 1, - 'parent_id' => (int) $categories[$cat_name]['id'], - 'module_class' => $module_class, - 'module_langname' => $row['title'], - 'module_mode' => $module_mode, - 'module_auth' => $row['auth'], - ); - - $_module->update_module_data($module_data, true); - - // Check for last sql error happened - if ($db->get_sql_error_triggered()) - { - $error = $db->sql_error($db->get_sql_error_sql()); - $this->p_master->db_error($error['message'], $db->get_sql_error_sql(), __LINE__, __FILE__); - } - } - } - } - - // Move some of the modules around since the code above will put them in the wrong place - if ($module_class == 'acp') - { - // Move main module 4 up... - $sql = 'SELECT * - FROM ' . MODULES_TABLE . " - WHERE module_basename = 'acp_main' - AND module_class = 'acp' - AND module_mode = 'main'"; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $_module->move_module_by($row, 'move_up', 4); - - // Move permissions intro screen module 4 up... - $sql = 'SELECT * - FROM ' . MODULES_TABLE . " - WHERE module_basename = 'acp_permissions' - AND module_class = 'acp' - AND module_mode = 'intro'"; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $_module->move_module_by($row, 'move_up', 4); - - // Move manage users screen module 5 up... - $sql = 'SELECT * - FROM ' . MODULES_TABLE . " - WHERE module_basename = 'acp_users' - AND module_class = 'acp' - AND module_mode = 'overview'"; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $_module->move_module_by($row, 'move_up', 5); - - // Move extension management module 1 up... - $sql = 'SELECT * - FROM ' . MODULES_TABLE . " - WHERE module_langname = 'ACP_EXTENSION_MANAGEMENT' - AND module_class = 'acp' - AND module_mode = '' - AND module_basename = ''"; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $_module->move_module_by($row, 'move_up', 1); - } - - if ($module_class == 'mcp') - { - // Move pm report details module 3 down... - $sql = 'SELECT * - FROM ' . MODULES_TABLE . " - WHERE module_basename = 'mcp_pm_reports' - AND module_class = 'mcp' - AND module_mode = 'pm_report_details'"; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $_module->move_module_by($row, 'move_down', 3); - - // Move closed pm reports module 3 down... - $sql = 'SELECT * - FROM ' . MODULES_TABLE . " - WHERE module_basename = 'mcp_pm_reports' - AND module_class = 'mcp' - AND module_mode = 'pm_reports_closed'"; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $_module->move_module_by($row, 'move_down', 3); - - // Move open pm reports module 3 down... - $sql = 'SELECT * - FROM ' . MODULES_TABLE . " - WHERE module_basename = 'mcp_pm_reports' - AND module_class = 'mcp' - AND module_mode = 'pm_reports'"; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $_module->move_module_by($row, 'move_down', 3); - } - - if ($module_class == 'ucp') - { - // Move attachment module 4 down... - $sql = 'SELECT * - FROM ' . MODULES_TABLE . " - WHERE module_basename = 'ucp_attachments' - AND module_class = 'ucp' - AND module_mode = 'attachments'"; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $_module->move_module_by($row, 'move_down', 4); - - // Move notification options module 4 down... - $sql = 'SELECT * - FROM ' . MODULES_TABLE . " - WHERE module_basename = 'ucp_notifications' - AND module_class = 'ucp' - AND module_mode = 'notification_options'"; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $_module->move_module_by($row, 'move_down', 4); - - // Move OAuth module 5 down... - $sql = 'SELECT * - FROM ' . MODULES_TABLE . " - WHERE module_basename = 'ucp_auth_link' - AND module_class = 'ucp' - AND module_mode = 'auth_link'"; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $_module->move_module_by($row, 'move_down', 5); - } - - // And now for the special ones - // (these are modules which appear in multiple categories and thus get added manually to some for more control) - if (isset($this->module_extras[$module_class])) - { - foreach ($this->module_extras[$module_class] as $cat_name => $mods) - { - $sql = 'SELECT module_id, left_id, right_id - FROM ' . MODULES_TABLE . " - WHERE module_langname = '" . $db->sql_escape($cat_name) . "' - AND module_class = '" . $db->sql_escape($module_class) . "'"; - $result = $db->sql_query_limit($sql, 1); - $row2 = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - foreach ($mods as $mod_name) - { - $sql = 'SELECT * - FROM ' . MODULES_TABLE . " - WHERE module_langname = '" . $db->sql_escape($mod_name) . "' - AND module_class = '" . $db->sql_escape($module_class) . "' - AND module_basename <> ''"; - $result = $db->sql_query_limit($sql, 1); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $module_data = array( - 'module_basename' => $row['module_basename'], - 'module_enabled' => (int) $row['module_enabled'], - 'module_display' => (int) $row['module_display'], - 'parent_id' => (int) $row2['module_id'], - 'module_class' => $row['module_class'], - 'module_langname' => $row['module_langname'], - 'module_mode' => $row['module_mode'], - 'module_auth' => $row['module_auth'], - ); - - $_module->update_module_data($module_data, true); - - // Check for last sql error happened - if ($db->get_sql_error_triggered()) - { - $error = $db->sql_error($db->get_sql_error_sql()); - $this->p_master->db_error($error['message'], $db->get_sql_error_sql(), __LINE__, __FILE__); - } - } - } - } - - $_module->remove_cache_file(); - } - } - - /** - * Populate the language tables - */ - function add_language($mode, $sub) - { - global $db, $lang, $phpbb_root_path, $phpEx; - - $dir = @opendir($phpbb_root_path . 'language'); - - if (!$dir) - { - $this->error('Unable to access the language directory', __LINE__, __FILE__); - } - - $installed_languages = array(); - while (($file = readdir($dir)) !== false) - { - $path = $phpbb_root_path . 'language/' . $file; - - if ($file == '.' || $file == '..' || is_link($path) || is_file($path) || $file == 'CVS') - { - continue; - } - - if (is_dir($path) && file_exists($path . '/iso.txt')) - { - $lang_file = file("$path/iso.txt"); - - $lang_pack = array( - 'lang_iso' => basename($path), - 'lang_dir' => basename($path), - 'lang_english_name' => trim(htmlspecialchars($lang_file[0])), - 'lang_local_name' => trim(htmlspecialchars($lang_file[1], ENT_COMPAT, 'UTF-8')), - 'lang_author' => trim(htmlspecialchars($lang_file[2], ENT_COMPAT, 'UTF-8')), - ); - - $db->sql_query('INSERT INTO ' . LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $lang_pack)); - - $installed_languages[] = (int) $db->sql_nextid(); - if ($db->get_sql_error_triggered()) - { - $error = $db->sql_error($db->get_sql_error_sql()); - $this->p_master->db_error($error['message'], $db->get_sql_error_sql(), __LINE__, __FILE__); - } - } - } - closedir($dir); - - $sql = 'SELECT * - FROM ' . PROFILE_FIELDS_TABLE; - $result = $db->sql_query($sql); - - $profile_fields = array(); - $insert_buffer = new \phpbb\db\sql_insert_buffer($db, PROFILE_LANG_TABLE); - while ($row = $db->sql_fetchrow($result)) - { - foreach ($installed_languages as $lang_id) - { - $insert_buffer->insert(array( - 'field_id' => $row['field_id'], - 'lang_id' => $lang_id, - 'lang_name' => strtoupper(substr($row['field_name'], 6)),// Remove phpbb_ from field name - 'lang_explain' => '', - 'lang_default_value' => '', - )); - } - } - $db->sql_freeresult($result); - - $insert_buffer->flush(); - } - - /** - * Add search robots to the database - */ - function add_bots($mode, $sub) - { - global $db, $lang, $phpbb_root_path, $phpEx, $config; - - // Obtain any submitted data - $data = $this->get_submitted_data(); - - // We need to fill the config to let internal functions correctly work - $config = new \phpbb\config\db($db, new \phpbb\cache\driver\null, CONFIG_TABLE); - set_config(null, null, null, $config); - set_config_count(null, null, null, $config); - - $sql = 'SELECT group_id - FROM ' . GROUPS_TABLE . " - WHERE group_name = 'BOTS'"; - $result = $db->sql_query($sql); - $group_id = (int) $db->sql_fetchfield('group_id'); - $db->sql_freeresult($result); - - if (!$group_id) - { - // If we reach this point then something has gone very wrong - $this->p_master->error($lang['NO_GROUP'], __LINE__, __FILE__); - } - - if (!function_exists('user_add')) - { - include($phpbb_root_path . 'includes/functions_user.' . $phpEx); - } - - foreach ($this->bot_list as $bot_name => $bot_ary) - { - $user_row = array( - 'user_type' => USER_IGNORE, - 'group_id' => $group_id, - 'username' => $bot_name, - 'user_regdate' => time(), - 'user_password' => '', - 'user_colour' => '9E8DA7', - 'user_email' => '', - 'user_lang' => $data['default_lang'], - 'user_style' => 1, - 'user_timezone' => 'UTC', - 'user_dateformat' => $lang['default_dateformat'], - 'user_allow_massemail' => 0, - 'user_allow_pm' => 0, - ); - - $user_id = user_add($user_row); - - if (!$user_id) - { - // If we can't insert this user then continue to the next one to avoid inconsistent data - $this->p_master->db_error('Unable to insert bot into users table', $db->get_sql_error_sql(), __LINE__, __FILE__, true); - continue; - } - - $sql = 'INSERT INTO ' . BOTS_TABLE . ' ' . $db->sql_build_array('INSERT', array( - 'bot_active' => 1, - 'bot_name' => (string) $bot_name, - 'user_id' => (int) $user_id, - 'bot_agent' => (string) $bot_ary[0], - 'bot_ip' => (string) $bot_ary[1], - )); - - $db->sql_query($sql); - } - } - - /** - * Sends an email to the board administrator with their password and some useful links - */ - function email_admin($mode, $sub) - { - global $auth, $config, $db, $lang, $template, $user, $phpbb_root_path, $phpbb_admin_path, $phpEx; - - $this->page_title = $lang['STAGE_FINAL']; - - // Obtain any submitted data - $data = $this->get_submitted_data(); - - // We need to fill the config to let internal functions correctly work - $config = new \phpbb\config\db($db, new \phpbb\cache\driver\null, CONFIG_TABLE); - set_config(null, null, null, $config); - set_config_count(null, null, null, $config); - - $user->session_begin(); - $auth->login($data['admin_name'], $data['admin_pass1'], false, true, true); - - // OK, Now that we've reached this point we can be confident that everything - // is installed and working......I hope :) - // So it's time to send an email to the administrator confirming the details - // they entered - - if ($config['email_enable']) - { - include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx); - - $messenger = new messenger(false); - - $messenger->template('installed', $data['language']); - - $messenger->to($data['board_email'], $data['admin_name']); - - $messenger->anti_abuse_headers($config, $user); - - $messenger->assign_vars(array( - 'USERNAME' => htmlspecialchars_decode($data['admin_name']), - 'PASSWORD' => htmlspecialchars_decode($data['admin_pass1'])) - ); - - $messenger->send(NOTIFY_EMAIL); - } - - // And finally, add a note to the log - add_log('admin', 'LOG_INSTALL_INSTALLED', $config['version']); - - $template->assign_vars(array( - 'TITLE' => $lang['INSTALL_CONGRATS'], - 'BODY' => sprintf($lang['INSTALL_CONGRATS_EXPLAIN'], $config['version'], append_sid($phpbb_root_path . 'install/index.' . $phpEx, 'mode=convert&language=' . $data['language']), '../docs/README.html'), - 'L_SUBMIT' => $lang['INSTALL_LOGIN'], - 'U_ACTION' => append_sid($phpbb_admin_path . 'index.' . $phpEx, 'i=send_statistics&mode=send_statistics'), - )); - } - - /** - * Check if the avatar directory is writable and disable avatars - * if it isn't writable. - */ - function disable_avatars_if_unwritable() - { - global $phpbb_root_path; - - if (!phpbb_is_writable($phpbb_root_path . 'images/avatars/upload/')) - { - set_config('allow_avatar', 0); - set_config('allow_avatar_upload', 0); - } - } - - /** - * Populate migrations for the installation - * - * This "installs" all migrations from (root path)/phpbb/db/migrations/data. - * "installs" means it adds all migrations to the migrations table, but does not - * perform any of the actions in the migrations. - * - * @param \phpbb\extension\manager $extension_manager - * @param \phpbb\db\migrator $migrator - */ - function populate_migrations($extension_manager, $migrator) - { - $finder = $extension_manager->get_finder(); - - $migrations = $finder - ->core_path('phpbb/db/migration/data/') - ->get_classes(); - $migrator->populate_migrations($migrations); - } - - /** - * Generate a list of available mail server authentication methods - */ - function mail_auth_select($selected_method) - { - global $lang; - - $auth_methods = array('PLAIN', 'LOGIN', 'CRAM-MD5', 'DIGEST-MD5', 'POP-BEFORE-SMTP'); - $s_smtp_auth_options = ''; - - foreach ($auth_methods as $method) - { - $s_smtp_auth_options .= '<option value="' . $method . '"' . (($selected_method == $method) ? ' selected="selected"' : '') . '>' . $lang['SMTP_' . str_replace('-', '_', $method)] . '</option>'; - } - - return $s_smtp_auth_options; - } - - /** - * Get submitted data - */ - function get_submitted_data() - { - return array( - 'language' => basename(request_var('language', '')), - 'dbms' => request_var('dbms', ''), - 'dbhost' => request_var('dbhost', '', true), - 'dbport' => request_var('dbport', ''), - 'dbuser' => request_var('dbuser', ''), - 'dbpasswd' => request_var('dbpasswd', '', true), - 'dbname' => request_var('dbname', ''), - 'table_prefix' => request_var('table_prefix', ''), - 'default_lang' => basename(request_var('default_lang', '')), - 'admin_name' => utf8_normalize_nfc(request_var('admin_name', '', true)), - 'admin_pass1' => request_var('admin_pass1', '', true), - 'admin_pass2' => request_var('admin_pass2', '', true), - 'board_email' => strtolower(request_var('board_email', '')), - 'img_imagick' => request_var('img_imagick', ''), - 'ftp_path' => request_var('ftp_path', ''), - 'ftp_user' => request_var('ftp_user', ''), - 'ftp_pass' => request_var('ftp_pass', ''), - 'email_enable' => request_var('email_enable', ''), - 'smtp_delivery' => request_var('smtp_delivery', ''), - 'smtp_host' => request_var('smtp_host', ''), - 'smtp_auth' => request_var('smtp_auth', ''), - 'smtp_user' => request_var('smtp_user', ''), - 'smtp_pass' => request_var('smtp_pass', ''), - 'cookie_secure' => request_var('cookie_secure', ''), - 'force_server_vars' => request_var('force_server_vars', ''), - 'server_protocol' => request_var('server_protocol', ''), - 'server_name' => request_var('server_name', ''), - 'server_port' => request_var('server_port', ''), - 'script_path' => request_var('script_path', ''), - ); - } - - /** - * The information below will be used to build the input fields presented to the user - */ - var $db_config_options = array( - 'legend1' => 'DB_CONFIG', - 'dbms' => array('lang' => 'DBMS', 'type' => 'select', 'options' => 'dbms_select(\'{VALUE}\')', 'explain' => false), - 'dbhost' => array('lang' => 'DB_HOST', 'type' => 'text:25:100', 'explain' => true), - 'dbport' => array('lang' => 'DB_PORT', 'type' => 'text:25:100', 'explain' => true), - 'dbname' => array('lang' => 'DB_NAME', 'type' => 'text:25:100', 'explain' => false), - 'dbuser' => array('lang' => 'DB_USERNAME', 'type' => 'text:25:100', 'explain' => false), - 'dbpasswd' => array('lang' => 'DB_PASSWORD', 'type' => 'password:25:100', 'explain' => false), - 'table_prefix' => array('lang' => 'TABLE_PREFIX', 'type' => 'text:25:100', 'explain' => true), - ); - var $admin_config_options = array( - 'legend1' => 'ADMIN_CONFIG', - 'default_lang' => array('lang' => 'DEFAULT_LANG', 'type' => 'select', 'options' => '$this->module->inst_language_select(\'{VALUE}\')', 'explain' => false), - 'admin_name' => array('lang' => 'ADMIN_USERNAME', 'type' => 'text:25:100', 'explain' => true), - 'admin_pass1' => array('lang' => 'ADMIN_PASSWORD', 'type' => 'password:25:100', 'explain' => true), - 'admin_pass2' => array('lang' => 'ADMIN_PASSWORD_CONFIRM', 'type' => 'password:25:100', 'explain' => false), - 'board_email' => array('lang' => 'CONTACT_EMAIL', 'type' => 'email:25:100', 'explain' => false), - ); - var $advanced_config_options = array( - 'legend1' => 'ACP_EMAIL_SETTINGS', - 'email_enable' => array('lang' => 'ENABLE_EMAIL', 'type' => 'radio:enabled_disabled', 'explain' => true), - 'smtp_delivery' => array('lang' => 'USE_SMTP', 'type' => 'radio:yes_no', 'explain' => true), - 'smtp_host' => array('lang' => 'SMTP_SERVER', 'type' => 'text:25:50', 'explain' => false), - 'smtp_auth' => array('lang' => 'SMTP_AUTH_METHOD', 'type' => 'select', 'options' => '$this->module->mail_auth_select(\'{VALUE}\')', 'explain' => true), - 'smtp_user' => array('lang' => 'SMTP_USERNAME', 'type' => 'text:25:255', 'explain' => true, 'options' => array('autocomplete' => 'off')), - 'smtp_pass' => array('lang' => 'SMTP_PASSWORD', 'type' => 'password:25:255', 'explain' => true, 'options' => array('autocomplete' => 'off')), - - 'legend2' => 'SERVER_URL_SETTINGS', - 'cookie_secure' => array('lang' => 'COOKIE_SECURE', 'type' => 'radio:enabled_disabled', 'explain' => true), - 'force_server_vars' => array('lang' => 'FORCE_SERVER_VARS', 'type' => 'radio:yes_no', 'explain' => true), - 'server_protocol' => array('lang' => 'SERVER_PROTOCOL', 'type' => 'text:10:10', 'explain' => true), - 'server_name' => array('lang' => 'SERVER_NAME', 'type' => 'text:40:255', 'explain' => true), - 'server_port' => array('lang' => 'SERVER_PORT', 'type' => 'text:5:5', 'explain' => true), - 'script_path' => array('lang' => 'SCRIPT_PATH', 'type' => 'text::255', 'explain' => true), - ); - - /** - * Specific PHP modules we may require for certain optional or extended features - */ - var $php_dlls_other = array('zlib', 'ftp', 'gd', 'xml'); - - /** - * A list of the web-crawlers/bots we recognise by default - * - * Candidates but not included: - * 'Accoona [Bot]' 'Accoona-AI-Agent/' - * 'ASPseek [Crawler]' 'ASPseek/' - * 'Boitho [Crawler]' 'boitho.com-dc/' - * 'Bunnybot [Bot]' 'powered by www.buncat.de' - * 'Cosmix [Bot]' 'cfetch/' - * 'Crawler Search [Crawler]' '.Crawler-Search.de' - * 'Findexa [Crawler]' 'Findexa Crawler (' - * 'GBSpider [Spider]' 'GBSpider v' - * 'genie [Bot]' 'genieBot (' - * 'Hogsearch [Bot]' 'oegp v. 1.3.0' - * 'Insuranco [Bot]' 'InsurancoBot' - * 'IRLbot [Bot]' 'http://irl.cs.tamu.edu/crawler' - * 'ISC Systems [Bot]' 'ISC Systems iRc Search' - * 'Jyxobot [Bot]' 'Jyxobot/' - * 'Kraehe [Metasuche]' '-DIE-KRAEHE- META-SEARCH-ENGINE/' - * 'LinkWalker' 'LinkWalker' - * 'MMSBot [Bot]' 'http://www.mmsweb.at/bot.html' - * 'Naver [Bot]' 'nhnbot@naver.com)' - * 'NetResearchServer' 'NetResearchServer/' - * 'Nimble [Crawler]' 'NimbleCrawler' - * 'Ocelli [Bot]' 'Ocelli/' - * 'Onsearch [Bot]' 'onCHECK-Robot' - * 'Orange [Spider]' 'OrangeSpider' - * 'Sproose [Bot]' 'http://www.sproose.com/bot' - * 'Susie [Sync]' '!Susie (http://www.sync2it.com/susie)' - * 'Tbot [Bot]' 'Tbot/' - * 'Thumbshots [Capture]' 'thumbshots-de-Bot' - * 'Vagabondo [Crawler]' 'http://webagent.wise-guys.nl/' - * 'Walhello [Bot]' 'appie 1.1 (www.walhello.com)' - * 'WissenOnline [Bot]' 'WissenOnline-Bot' - * 'WWWeasel [Bot]' 'WWWeasel Robot v' - * 'Xaldon [Spider]' 'Xaldon WebSpider' - */ - var $bot_list = array( - 'AdsBot [Google]' => array('AdsBot-Google', ''), - 'Alexa [Bot]' => array('ia_archiver', ''), - 'Alta Vista [Bot]' => array('Scooter/', ''), - 'Ask Jeeves [Bot]' => array('Ask Jeeves', ''), - 'Baidu [Spider]' => array('Baiduspider', ''), - 'Bing [Bot]' => array('bingbot/', ''), - 'Exabot [Bot]' => array('Exabot', ''), - 'FAST Enterprise [Crawler]' => array('FAST Enterprise Crawler', ''), - 'FAST WebCrawler [Crawler]' => array('FAST-WebCrawler/', ''), - 'Francis [Bot]' => array('http://www.neomo.de/', ''), - 'Gigabot [Bot]' => array('Gigabot/', ''), - 'Google Adsense [Bot]' => array('Mediapartners-Google', ''), - 'Google Desktop' => array('Google Desktop', ''), - 'Google Feedfetcher' => array('Feedfetcher-Google', ''), - 'Google [Bot]' => array('Googlebot', ''), - 'Heise IT-Markt [Crawler]' => array('heise-IT-Markt-Crawler', ''), - 'Heritrix [Crawler]' => array('heritrix/1.', ''), - 'IBM Research [Bot]' => array('ibm.com/cs/crawler', ''), - 'ICCrawler - ICjobs' => array('ICCrawler - ICjobs', ''), - 'ichiro [Crawler]' => array('ichiro/', ''), - 'Majestic-12 [Bot]' => array('MJ12bot/', ''), - 'Metager [Bot]' => array('MetagerBot/', ''), - 'MSN NewsBlogs' => array('msnbot-NewsBlogs/', ''), - 'MSN [Bot]' => array('msnbot/', ''), - 'MSNbot Media' => array('msnbot-media/', ''), - 'Nutch [Bot]' => array('http://lucene.apache.org/nutch/', ''), - 'Online link [Validator]' => array('online link validator', ''), - 'psbot [Picsearch]' => array('psbot/0', ''), - 'Sensis [Crawler]' => array('Sensis Web Crawler', ''), - 'SEO Crawler' => array('SEO search Crawler/', ''), - 'Seoma [Crawler]' => array('Seoma [SEO Crawler]', ''), - 'SEOSearch [Crawler]' => array('SEOsearch/', ''), - 'Snappy [Bot]' => array('Snappy/1.1 ( http://www.urltrends.com/ )', ''), - 'Steeler [Crawler]' => array('http://www.tkl.iis.u-tokyo.ac.jp/~crawler/', ''), - 'Telekom [Bot]' => array('crawleradmin.t-info@telekom.de', ''), - 'TurnitinBot [Bot]' => array('TurnitinBot/', ''), - 'Voyager [Bot]' => array('voyager/', ''), - 'W3 [Sitesearch]' => array('W3 SiteSearch Crawler', ''), - 'W3C [Linkcheck]' => array('W3C-checklink/', ''), - 'W3C [Validator]' => array('W3C_Validator', ''), - 'YaCy [Bot]' => array('yacybot', ''), - 'Yahoo MMCrawler [Bot]' => array('Yahoo-MMCrawler/', ''), - 'Yahoo Slurp [Bot]' => array('Yahoo! DE Slurp', ''), - 'Yahoo [Bot]' => array('Yahoo! Slurp', ''), - 'YahooSeeker [Bot]' => array('YahooSeeker/', ''), - ); - - /** - * Define the module structure so that we can populate the database without - * needing to hard-code module_id values - */ - var $module_categories = array( - 'acp' => array( - 'ACP_CAT_GENERAL' => array( - 'ACP_QUICK_ACCESS', - 'ACP_BOARD_CONFIGURATION', - 'ACP_CLIENT_COMMUNICATION', - 'ACP_SERVER_CONFIGURATION', - ), - 'ACP_CAT_FORUMS' => array( - 'ACP_MANAGE_FORUMS', - 'ACP_FORUM_BASED_PERMISSIONS', - ), - 'ACP_CAT_POSTING' => array( - 'ACP_MESSAGES', - 'ACP_ATTACHMENTS', - ), - 'ACP_CAT_USERGROUP' => array( - 'ACP_CAT_USERS', - 'ACP_GROUPS', - 'ACP_USER_SECURITY', - ), - 'ACP_CAT_PERMISSIONS' => array( - 'ACP_GLOBAL_PERMISSIONS', - 'ACP_FORUM_BASED_PERMISSIONS', - 'ACP_PERMISSION_ROLES', - 'ACP_PERMISSION_MASKS', - ), - 'ACP_CAT_CUSTOMISE' => array( - 'ACP_STYLE_MANAGEMENT', - 'ACP_EXTENSION_MANAGEMENT', - 'ACP_LANGUAGE', - ), - 'ACP_CAT_MAINTENANCE' => array( - 'ACP_FORUM_LOGS', - 'ACP_CAT_DATABASE', - ), - 'ACP_CAT_SYSTEM' => array( - 'ACP_AUTOMATION', - 'ACP_GENERAL_TASKS', - 'ACP_MODULE_MANAGEMENT', - ), - 'ACP_CAT_DOT_MODS' => null, - ), - 'mcp' => array( - 'MCP_MAIN' => null, - 'MCP_QUEUE' => null, - 'MCP_REPORTS' => null, - 'MCP_NOTES' => null, - 'MCP_WARN' => null, - 'MCP_LOGS' => null, - 'MCP_BAN' => null, - ), - 'ucp' => array( - 'UCP_MAIN' => null, - 'UCP_PROFILE' => null, - 'UCP_PREFS' => null, - 'UCP_PM' => null, - 'UCP_USERGROUPS' => null, - 'UCP_ZEBRA' => null, - ), - ); - var $module_categories_basenames = array( - 'UCP_PM' => 'ucp_pm', - ); - - var $module_extras = array( - 'acp' => array( - 'ACP_QUICK_ACCESS' => array( - 'ACP_MANAGE_USERS', - 'ACP_GROUPS_MANAGE', - 'ACP_MANAGE_FORUMS', - 'ACP_MOD_LOGS', - 'ACP_BOTS', - 'ACP_PHP_INFO', - ), - 'ACP_FORUM_BASED_PERMISSIONS' => array( - 'ACP_FORUM_PERMISSIONS', - 'ACP_FORUM_PERMISSIONS_COPY', - 'ACP_FORUM_MODERATORS', - 'ACP_USERS_FORUM_PERMISSIONS', - 'ACP_GROUPS_FORUM_PERMISSIONS', - ), - ), - ); -} diff --git a/phpBB/install/install_main.php b/phpBB/install/install_main.php deleted file mode 100644 index d5874dac83..0000000000 --- a/phpBB/install/install_main.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php -/** -* -* This file is part of the phpBB Forum Software package. -* -* @copyright (c) phpBB Limited <https://www.phpbb.com> -* @license GNU General Public License, version 2 (GPL-2.0) -* -* For full copyright and license information, please see -* the docs/CREDITS.txt file. -* -*/ - -/** -*/ - -if ( !defined('IN_INSTALL') ) -{ - // Someone has tried to access the file direct. This is not a good idea, so exit - exit; -} - -if (!empty($setmodules)) -{ - $module[] = array( - 'module_type' => 'install', - 'module_title' => 'OVERVIEW', - 'module_filename' => substr(basename(__FILE__), 0, -strlen($phpEx)-1), - 'module_order' => 0, - 'module_subs' => array('INTRO', 'LICENSE', 'SUPPORT'), - 'module_stages' => '', - 'module_reqs' => '' - ); -} - -/** -* Main Tab - Installation -*/ -class install_main extends module -{ - function install_main(&$p_master) - { - $this->p_master = &$p_master; - } - - function main($mode, $sub) - { - global $lang, $template, $language; - - switch ($sub) - { - case 'intro' : - $title = $lang['SUB_INTRO']; - $body = $lang['OVERVIEW_BODY']; - break; - - case 'license' : - $title = $lang['GPL']; - $body = implode("<br/>\n", file(__DIR__ . '/../docs/LICENSE.txt')); - break; - - case 'support' : - $title = $lang['SUB_SUPPORT']; - $body = $lang['SUPPORT_BODY']; - break; - } - - $this->tpl_name = 'install_main'; - $this->page_title = $title; - - $template->assign_vars(array( - 'TITLE' => $title, - 'BODY' => $body, - - 'S_LANG_SELECT' => '<select id="language" name="language">' . $this->p_master->inst_language_select($language) . '</select>', - )); - } -} diff --git a/phpBB/install/install_update.php b/phpBB/install/install_update.php deleted file mode 100644 index 82ca0fc18d..0000000000 --- a/phpBB/install/install_update.php +++ /dev/null @@ -1,1780 +0,0 @@ -<?php -/** -* -* This file is part of the phpBB Forum Software package. -* -* @copyright (c) phpBB Limited <https://www.phpbb.com> -* @license GNU General Public License, version 2 (GPL-2.0) -* -* For full copyright and license information, please see -* the docs/CREDITS.txt file. -* -*/ - -/** -* @todo check for writable cache/store/files directory -*/ - -if (!defined('IN_INSTALL')) -{ - // Someone has tried to access the file directly. This is not a good idea, so exit - exit; -} - -if (!empty($setmodules)) -{ - // If phpBB is not installed we do not include this module - if (!phpbb_check_installation_exists($phpbb_root_path, $phpEx) || file_exists($phpbb_root_path . 'cache/install_lock')) - { - return; - } - - $module[] = array( - 'module_type' => 'update', - 'module_title' => 'UPDATE', - 'module_filename' => substr(basename(__FILE__), 0, -strlen($phpEx)-1), - 'module_order' => 30, - 'module_subs' => '', - 'module_stages' => array('INTRO', 'VERSION_CHECK', 'FILE_CHECK', 'UPDATE_FILES', 'UPDATE_DB'), - 'module_reqs' => '' - ); -} - -/** -* Update Installation -*/ -class install_update extends module -{ - var $p_master; - var $update_info; - - var $old_location; - var $new_location; - var $latest_version; - var $current_version; - - var $update_to_version; - - // Set to false - var $test_update = false; - - function install_update(&$p_master) - { - $this->p_master = &$p_master; - } - - function main($mode, $sub) - { - global $template, $phpEx, $phpbb_root_path, $user, $db, $config, $cache, $auth, $language; - global $request, $phpbb_admin_path, $phpbb_adm_relative_path, $phpbb_container, $phpbb_config_php_file; - - // We must enable super globals, otherwise creating a new instance of the request class, - // using the new container with a dbal connection will fail with the following PHP Notice: - // Object of class phpbb_request_deactivated_super_global could not be converted to int - $request->enable_super_globals(); - - // Create a normal container now - $phpbb_container_builder = new \phpbb\di\container_builder($phpbb_config_php_file, $phpbb_root_path, $phpEx); - $phpbb_container_builder->set_dump_container(false); - $phpbb_container_builder->set_use_extensions(false); - if (file_exists($phpbb_root_path . 'install/update/new/config')) - { - $phpbb_container_builder->set_config_path($phpbb_root_path . 'install/update/new/config'); - } - $phpbb_container = $phpbb_container_builder->get_container(); - - // Writes into global $cache - $cache = $phpbb_container->get('cache'); - - $this->tpl_name = 'install_update'; - $this->page_title = 'UPDATE_INSTALLATION'; - - $this->old_location = $phpbb_root_path . 'install/update/old/'; - $this->new_location = $phpbb_root_path . 'install/update/new/'; - - // Init DB - extract($phpbb_config_php_file->get_all()); - require($phpbb_root_path . 'includes/constants.' . $phpEx); - - // Special options for conflicts/modified files - define('MERGE_NO_MERGE_NEW', 1); - define('MERGE_NO_MERGE_MOD', 2); - define('MERGE_NEW_FILE', 3); - define('MERGE_MOD_FILE', 4); - - $dbms = $phpbb_config_php_file->convert_30_dbms_to_31($dbms); - - $db = new $dbms(); - - // Connect to DB - $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, false); - - // We do not need this any longer, unset for safety purposes - unset($dbpasswd); - - // We need to fill the config to let internal functions correctly work - $config = new \phpbb\config\db($db, new \phpbb\cache\driver\null, CONFIG_TABLE); - set_config(null, null, null, $config); - set_config_count(null, null, null, $config); - - // Force template recompile - $config['load_tplcompile'] = 1; - - // First of all, init the user session - $user->session_begin(); - $auth->acl($user->data); - - // Overwrite user's language with the selected one. - // Config needs to be changed to ensure that guests also get the selected language. - $config_default_lang = $config['default_lang']; - $config['default_lang'] = $language; - $user->data['user_lang'] = $language; - - $user->add_lang(array('common', 'acp/common', 'acp/board', 'install', 'posting')); - - // Reset the default_lang - $config['default_lang'] = $config_default_lang; - unset($config_default_lang); - - // If we are within the intro page we need to make sure we get up-to-date version info - if ($sub == 'intro') - { - $cache->destroy('_version_info'); - } - - // Set custom template again. ;) - $paths = array($phpbb_root_path . 'install/update/new/adm/style', $phpbb_admin_path . 'style'); - $paths = array_filter($paths, 'is_dir'); - $template->set_custom_style(array( - array( - 'name' => 'adm', - 'ext_path' => 'adm/style/', - ), - ), $paths); - - $template->assign_vars(array( - 'S_USER_LANG' => $user->lang['USER_LANG'], - 'S_CONTENT_DIRECTION' => $user->lang['DIRECTION'], - 'S_CONTENT_ENCODING' => 'UTF-8', - 'S_CONTENT_FLOW_BEGIN' => ($user->lang['DIRECTION'] == 'ltr') ? 'left' : 'right', - 'S_CONTENT_FLOW_END' => ($user->lang['DIRECTION'] == 'ltr') ? 'right' : 'left', - )); - - // Get current and latest version - $version_helper = $phpbb_container->get('version_helper'); - try - { - $this->latest_version = $version_helper->get_latest_on_current_branch(true); - } - catch (\RuntimeException $e) - { - $this->latest_version = false; - - $update_info = array(); - include($phpbb_root_path . 'install/update/index.' . $phpEx); - $info = (empty($update_info) || !is_array($update_info)) ? false : $update_info; - - if ($info !== false) - { - $this->latest_version = (!empty($info['version']['to'])) ? trim($info['version']['to']) : false; - } - } - - // For the current version we trick a bit. ;) - $this->current_version = (!empty($config['version_update_from'])) ? $config['version_update_from'] : $config['version']; - - $up_to_date = (version_compare(str_replace('rc', 'RC', strtolower($this->current_version)), str_replace('rc', 'RC', strtolower($this->latest_version)), '<')) ? false : true; - - // Check for a valid update directory, else point the user to the phpbb.com website - if (!file_exists($phpbb_root_path . 'install/update') || !file_exists($phpbb_root_path . 'install/update/index.' . $phpEx) || !file_exists($this->old_location) || !file_exists($this->new_location)) - { - $template->assign_vars(array( - 'S_ERROR' => true, - 'ERROR_MSG' => ($up_to_date) ? $user->lang['NO_UPDATE_FILES_UP_TO_DATE'] : sprintf($user->lang['NO_UPDATE_FILES_OUTDATED'], $config['version'], $this->current_version, $this->latest_version)) - ); - - return; - } - - $this->update_info = $this->get_file('update_info'); - - // Make sure the update directory holds the correct information - // Since admins are able to run the update/checks more than once we only check if the current version is lower or equal than the version to which we update to. - if (version_compare(str_replace('rc', 'RC', strtolower($this->current_version)), str_replace('rc', 'RC', strtolower($this->update_info['version']['to'])), '>')) - { - $template->assign_vars(array( - 'S_ERROR' => true, - 'ERROR_MSG' => sprintf($user->lang['INCOMPATIBLE_UPDATE_FILES'], $config['version'], $this->update_info['version']['from'], $this->update_info['version']['to'])) - ); - - return; - } - - // Check if the update files are actually meant to update from the current version - if ($this->current_version != $this->update_info['version']['from']) - { - $template->assign_vars(array( - 'S_ERROR' => true, - 'ERROR_MSG' => sprintf($user->lang['INCOMPATIBLE_UPDATE_FILES'], $this->current_version, $this->update_info['version']['from'], $this->update_info['version']['to']), - )); - } - - // Check if the update files stored are for the latest version... - if (version_compare(strtolower($this->latest_version), strtolower($this->update_info['version']['to']), '>')) - { - $template->assign_vars(array( - 'S_WARNING' => true, - 'WARNING_MSG' => sprintf($user->lang['OLD_UPDATE_FILES'], $this->update_info['version']['from'], $this->update_info['version']['to'], $this->latest_version)) - ); - } - - // We store the "update to" version, because it is not always the latest. ;) - $this->update_to_version = $this->update_info['version']['to']; - - // Fill DB version - if (empty($config['dbms_version'])) - { - set_config('dbms_version', $db->sql_server_info(true)); - } - - if ($this->test_update === false) - { - // What about the language file? Got it updated? - if (in_array('language/' . $language . '/install.' . $phpEx, $this->update_info['files'])) - { - $lang = array(); - include($this->new_location . 'language/' . $language . '/install.' . $phpEx); - // this is the user's language.. just merge it - $user->lang = array_merge($user->lang, $lang); - } - if ($language != 'en' && in_array('language/en/install.' . $phpEx, $this->update_info['files'])) - { - $lang = array(); - include($this->new_location . 'language/en/install.' . $phpEx); - // only add new keys to user's language in english - $new_keys = array_diff(array_keys($lang), array_keys($user->lang)); - foreach ($new_keys as $i => $new_key) - { - $user->lang[$new_key] = $lang[$new_key]; - } - } - } - - // Include renderer and engine - $this->include_file('includes/diff/diff.' . $phpEx); - $this->include_file('includes/diff/engine.' . $phpEx); - $this->include_file('includes/diff/renderer.' . $phpEx); - - // Make sure we stay at the file check if checking the files again - if ($request->variable('check_again', false, false, \phpbb\request\request_interface::POST)) - { - $sub = $this->p_master->sub = 'file_check'; - } - - switch ($sub) - { - case 'intro': - $this->page_title = 'UPDATE_INSTALLATION'; - - $template->assign_vars(array( - 'S_INTRO' => true, - 'U_ACTION' => append_sid($this->p_master->module_url, "language=$language&mode=$mode&sub=version_check"), - )); - - // Make sure the update list is destroyed. - $cache->destroy('_update_list'); - $cache->destroy('_diff_files'); - $cache->destroy('_expected_files'); - break; - - case 'version_check': - $this->page_title = 'STAGE_VERSION_CHECK'; - - $template->assign_vars(array( - 'S_VERSION_CHECK' => true, - - 'U_ACTION' => append_sid($this->p_master->module_url, "language=$language&mode=$mode&sub=file_check"), - - 'S_UP_TO_DATE' => $up_to_date, - 'LATEST_VERSION' => $this->latest_version, - 'CURRENT_VERSION' => $this->current_version, - )); - - // Print out version the update package updates to - if ($this->latest_version != $this->update_info['version']['to']) - { - $template->assign_var('PACKAGE_VERSION', $this->update_info['version']['to']); - } - - // Since some people try to update to RC releases, but phpBB.com tells them the last version is the version they currently run - // we are faced with the updater thinking the database schema is up-to-date; which it is, but should be updated none-the-less - // We now try to cope with this by triggering the update process - if (version_compare(str_replace('rc', 'RC', strtolower($this->current_version)), str_replace('rc', 'RC', strtolower($this->update_info['version']['to'])), '<')) - { - $template->assign_vars(array( - 'S_UP_TO_DATE' => false, - )); - } - - break; - - case 'update_db': - // Redirect the user to the database update script with some explanations... - $template->assign_vars(array( - 'S_DB_UPDATE' => true, - 'S_DB_UPDATE_FINISHED' => ($config['version'] == $this->update_info['version']['to']) ? true : false, - 'U_DB_UPDATE' => append_sid($phpbb_root_path . 'install/database_update.' . $phpEx, 'type=1&language=' . $user->data['user_lang']), - 'U_DB_UPDATE_ACTION' => append_sid($this->p_master->module_url, "language=$language&mode=$mode&sub=update_db"), - 'U_ACTION' => append_sid($this->p_master->module_url, "language=$language&mode=$mode&sub=file_check"), - 'L_EVERYTHING_UP_TO_DATE' => $user->lang('EVERYTHING_UP_TO_DATE', append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login'), append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login&redirect=' . $phpbb_adm_relative_path . 'index.php%3Fi=send_statistics%26mode=send_statistics')), - )); - - // Do not display incompatible package note after successful update - if ($config['version'] == $this->update_info['version']['to']) - { - $template->assign_var('S_ERROR', false); - } - break; - - case 'file_check': - - // retrieve info on what changes should have already been made to the files. - $expected_files = $cache->get('_expected_files'); - if (!$expected_files) - { - $expected_files = array(); - } - - // Now make sure the previous file collection is no longer valid... - $cache->destroy('_diff_files'); - - $this->page_title = 'STAGE_FILE_CHECK'; - - // Now make sure our update list is correct if the admin refreshes - $action = request_var('action', ''); - - // We are directly within an update. To make sure our update list is correct we check its status. - $update_list = ($request->variable('check_again', false, false, \phpbb\request\request_interface::POST)) ? false : $cache->get('_update_list'); - $modified = ($update_list !== false) ? @filemtime($cache->get_driver()->cache_dir . 'data_update_list.' . $phpEx) : 0; - - // Make sure the list is up-to-date - if ($update_list !== false) - { - $get_new_list = false; - foreach ($this->update_info['files'] as $file) - { - if (file_exists($phpbb_root_path . $file) && filemtime($phpbb_root_path . $file) > $modified) - { - $get_new_list = true; - break; - } - } - } - else - { - $get_new_list = true; - } - - if (!$get_new_list && $update_list['status'] != -1) - { - $get_new_list = true; - } - - if ($get_new_list) - { - $this->get_update_structure($update_list, $expected_files); - $cache->put('_update_list', $update_list); - - // Refresh the page if we are still not finished... - if ($update_list['status'] != -1) - { - $refresh_url = append_sid($this->p_master->module_url, "language=$language&mode=$mode&sub=file_check"); - meta_refresh(2, $refresh_url); - - $template->assign_vars(array( - 'S_IN_PROGRESS' => true, - 'S_COLLECTED' => (int) $update_list['status'], - 'S_TO_COLLECT' => sizeof($this->update_info['files']), - 'L_IN_PROGRESS' => $user->lang['COLLECTING_FILE_DIFFS'], - 'L_IN_PROGRESS_EXPLAIN' => sprintf($user->lang['NUMBER_OF_FILES_COLLECTED'], (int) $update_list['status'], sizeof($this->update_info['files']) + sizeof($this->update_info['deleted'])), - )); - - return; - } - } - - if ($action == 'diff') - { - $this->show_diff($update_list); - return; - } - - if (sizeof($update_list['no_update'])) - { - $template->assign_vars(array( - 'S_NO_UPDATE_FILES' => true, - 'NO_UPDATE_FILES' => implode(', ', array_map('htmlspecialchars', $update_list['no_update']))) - ); - } - - $new_expected_files = array(); - - // Now assign the list to the template - foreach ($update_list as $status => $filelist) - { - if ($status == 'no_update' || !sizeof($filelist) || $status == 'status' || $status == 'status_deleted') - { - continue; - } - -/* $template->assign_block_vars('files', array( - 'S_STATUS' => true, - 'STATUS' => $status, - 'L_STATUS' => $user->lang['STATUS_' . strtoupper($status)], - 'TITLE' => $user->lang['FILES_' . strtoupper($status)], - 'EXPLAIN' => $user->lang['FILES_' . strtoupper($status) . '_EXPLAIN'], - ) - );*/ - - foreach ($filelist as $file_struct) - { - $s_binary = (!empty($this->update_info['binary']) && in_array($file_struct['filename'], $this->update_info['binary'])) ? true : false; - - $filename = htmlspecialchars($file_struct['filename']); - if (strrpos($filename, '/') !== false) - { - $dir_part = substr($filename, 0, strrpos($filename, '/') + 1); - $file_part = substr($filename, strrpos($filename, '/') + 1); - } - else - { - $dir_part = ''; - $file_part = $filename; - } - - $diff_url = append_sid($this->p_master->module_url, "language=$language&mode=$mode&sub=file_check&action=diff&status=$status&file=" . urlencode($file_struct['filename'])); - - if (isset($file_struct['as_expected']) && $file_struct['as_expected']) - { - $new_expected_files[$file_struct['filename']] = $expected_files[$file_struct['filename']]; - } - else - { - $template->assign_block_vars($status, array( - 'STATUS' => $status, - - 'FILENAME' => $filename, - 'DIR_PART' => $dir_part, - 'FILE_PART' => $file_part, - 'NUM_CONFLICTS' => (isset($file_struct['conflicts'])) ? $file_struct['conflicts'] : 0, - - 'S_CUSTOM' => ($file_struct['custom']) ? true : false, - 'S_BINARY' => $s_binary, - 'CUSTOM_ORIGINAL' => ($file_struct['custom']) ? $file_struct['original'] : '', - - 'U_SHOW_DIFF' => $diff_url, - 'L_SHOW_DIFF' => ($status != 'up_to_date') ? $user->lang['SHOW_DIFF_' . strtoupper($status)] : '', - - 'U_VIEW_MOD_FILE' => $diff_url . '&op=' . MERGE_MOD_FILE, - 'U_VIEW_NEW_FILE' => $diff_url . '&op=' . MERGE_NEW_FILE, - 'U_VIEW_NO_MERGE_MOD' => $diff_url . '&op=' . MERGE_NO_MERGE_MOD, - 'U_VIEW_NO_MERGE_NEW' => $diff_url . '&op=' . MERGE_NO_MERGE_NEW, - )); - } - } - } - - $cache->put('_expected_files', $new_expected_files); - - $all_up_to_date = true; - foreach ($update_list as $status => $filelist) - { - if ($status != 'up_to_date' && $status != 'custom' && $status != 'status' && $status != 'status_deleted' && sizeof($filelist)) - { - $all_up_to_date = false; - break; - } - } - - $template->assign_vars(array( - 'S_FILE_CHECK' => true, - 'S_ALL_UP_TO_DATE' => $all_up_to_date, - 'S_VERSION_UP_TO_DATE' => $up_to_date, - 'S_UP_TO_DATE' => $up_to_date, - 'U_ACTION' => append_sid($this->p_master->module_url, "language=$language&mode=$mode&sub=file_check"), - 'U_UPDATE_ACTION' => append_sid($this->p_master->module_url, "language=$language&mode=$mode&sub=update_files"), - 'U_DB_UPDATE_ACTION' => append_sid($this->p_master->module_url, "language=$language&mode=$mode&sub=update_db"), - )); - - // Since some people try to update to RC releases, but phpBB.com tells them the last version is the version they currently run - // we are faced with the updater thinking the database schema is up-to-date; which it is, but should be updated none-the-less - // We now try to cope with this by triggering the update process - if (version_compare(str_replace('rc', 'RC', strtolower($this->current_version)), str_replace('rc', 'RC', strtolower($this->update_info['version']['to'])), '<')) - { - $template->assign_vars(array( - 'S_UP_TO_DATE' => false, - )); - } - - if ($all_up_to_date) - { - global $phpbb_container; - $phpbb_log = $phpbb_container->get('log'); - - // Add database update to log - $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_UPDATE_PHPBB', time(), array($this->current_version, $this->update_to_version)); - - $db->sql_return_on_error(true); - $db->sql_query('DELETE FROM ' . CONFIG_TABLE . " WHERE config_name = 'version_update_from'"); - $db->sql_return_on_error(false); - - $cache->purge(); - } - - break; - - case 'update_files': - - $this->page_title = 'STAGE_UPDATE_FILES'; - - $s_hidden_fields = ''; - $params = array(); - $conflicts = request_var('conflict', array('' => 0)); - $modified = request_var('modified', array('' => 0)); - - foreach ($conflicts as $filename => $merge_option) - { - $s_hidden_fields .= '<input type="hidden" name="conflict[' . htmlspecialchars($filename) . ']" value="' . $merge_option . '" />'; - $params[] = 'conflict[' . urlencode($filename) . ']=' . urlencode($merge_option); - } - - foreach ($modified as $filename => $merge_option) - { - if (!$merge_option) - { - continue; - } - $s_hidden_fields .= '<input type="hidden" name="modified[' . htmlspecialchars($filename) . ']" value="' . $merge_option . '" />'; - $params[] = 'modified[' . urlencode($filename) . ']=' . urlencode($merge_option); - } - - $no_update = request_var('no_update', array(0 => '')); - - foreach ($no_update as $index => $filename) - { - $s_hidden_fields .= '<input type="hidden" name="no_update[]" value="' . htmlspecialchars($filename) . '" />'; - $params[] = 'no_update[]=' . urlencode($filename); - } - - // Before the user is choosing his preferred method, let's create the content list... - $update_list = $cache->get('_update_list'); - - if ($update_list === false) - { - trigger_error($user->lang['NO_UPDATE_INFO'], E_USER_ERROR); - } - - // Check if the conflicts data is valid - if (sizeof($conflicts)) - { - $conflict_filenames = array(); - foreach ($update_list['conflict'] as $files) - { - $conflict_filenames[] = $files['filename']; - } - - $new_conflicts = array(); - foreach ($conflicts as $filename => $diff_method) - { - if (in_array($filename, $conflict_filenames)) - { - $new_conflicts[$filename] = $diff_method; - } - } - - $conflicts = $new_conflicts; - } - - // Build list for modifications - if (sizeof($modified)) - { - $modified_filenames = array(); - foreach ($update_list['modified'] as $files) - { - $modified_filenames[] = $files['filename']; - } - - $new_modified = array(); - foreach ($modified as $filename => $diff_method) - { - if (in_array($filename, $modified_filenames)) - { - $new_modified[$filename] = $diff_method; - } - } - - $modified = $new_modified; - } - - // Check number of conflicting files, they need to be equal. For modified files the number can differ - if (sizeof($update_list['conflict']) != sizeof($conflicts)) - { - trigger_error($user->lang['MERGE_SELECT_ERROR'], E_USER_ERROR); - } - - // Before we do anything, let us diff the files and store the raw file information "somewhere" - $get_files = false; - $file_list = $cache->get('_diff_files'); - $expected_files = $cache->get('_expected_files'); - - if ($file_list === false || $file_list['status'] != -1) - { - $get_files = true; - } - - if ($get_files) - { - if ($file_list === false) - { - $file_list = array( - 'status' => 0, - ); - } - - if (!isset($expected_files) || $expected_files === false) - { - $expected_files = array(); - } - - $processed = 0; - foreach ($update_list as $status => $files) - { - if (!is_array($files)) - { - continue; - } - - foreach ($files as $file_struct) - { - // Skip this file if the user selected to not update it - if (in_array($file_struct['filename'], $no_update)) - { - $expected_files[$file_struct['filename']] = false; - continue; - } - - // Already handled... then skip of course... - if (isset($file_list[$file_struct['filename']])) - { - continue; - } - - // Refresh if we reach 5 diffs... - if ($processed >= 5) - { - $cache->put('_diff_files', $file_list); - - if ($request->variable('download', false)) - { - $params[] = 'download=1'; - } - - $redirect_url = append_sid($this->p_master->module_url, "language=$language&mode=$mode&sub=update_files&" . implode('&', $params)); - meta_refresh(3, $redirect_url); - - $template->assign_vars(array( - 'S_IN_PROGRESS' => true, - 'L_IN_PROGRESS' => $user->lang['MERGING_FILES'], - 'L_IN_PROGRESS_EXPLAIN' => $user->lang['MERGING_FILES_EXPLAIN'], - )); - - return; - } - - if (file_exists($phpbb_root_path . $file_struct['filename'])) - { - $contents = file_get_contents($phpbb_root_path . $file_struct['filename']); - if (isset($expected_files[$file_struct['filename']]) && md5($contents) == $expected_files[$file_struct['filename']]) - { - continue; - } - } - - $original_filename = ($file_struct['custom']) ? $file_struct['original'] : $file_struct['filename']; - - switch ($status) - { - case 'modified': - - $option = (isset($modified[$file_struct['filename']])) ? $modified[$file_struct['filename']] : 0; - - switch ($option) - { - case MERGE_NO_MERGE_NEW: - $contents = file_get_contents($this->new_location . $original_filename); - break; - - case MERGE_NO_MERGE_MOD: - $contents = file_get_contents($phpbb_root_path . $file_struct['filename']); - break; - - default: - $diff = $this->return_diff($this->old_location . $original_filename, $phpbb_root_path . $file_struct['filename'], $this->new_location . $original_filename); - - $contents = implode("\n", $diff->merged_output()); - unset($diff); - break; - } - - $expected_files[$file_struct['filename']] = md5($contents); - $file_list[$file_struct['filename']] = '_file_' . md5($file_struct['filename']); - $cache->put($file_list[$file_struct['filename']], base64_encode($contents)); - - $file_list['status']++; - $processed++; - - break; - - case 'conflict': - - $option = $conflicts[$file_struct['filename']]; - $contents = ''; - - switch ($option) - { - case MERGE_NO_MERGE_NEW: - $contents = file_get_contents($this->new_location . $original_filename); - break; - - case MERGE_NO_MERGE_MOD: - $contents = file_get_contents($phpbb_root_path . $file_struct['filename']); - break; - - default: - - $diff = $this->return_diff($this->old_location . $original_filename, $phpbb_root_path . $file_struct['filename'], $this->new_location . $original_filename); - - if ($option == MERGE_NEW_FILE) - { - $contents = implode("\n", $diff->merged_new_output()); - } - else if ($option == MERGE_MOD_FILE) - { - $contents = implode("\n", $diff->merged_orig_output()); - } - else - { - unset($diff); - break 2; - } - - unset($diff); - break; - } - - $expected_files[$file_struct['filename']] = md5($contents); - $file_list[$file_struct['filename']] = '_file_' . md5($file_struct['filename']); - $cache->put($file_list[$file_struct['filename']], base64_encode($contents)); - - $file_list['status']++; - $processed++; - - break; - } - } - } - $cache->put('_expected_files', $expected_files); - } - - $file_list['status'] = -1; - $cache->put('_diff_files', $file_list); - - if ($request->variable('download', false)) - { - $this->include_file('includes/functions_compress.' . $phpEx); - - $use_method = request_var('use_method', ''); - $methods = array('.tar'); - - $available_methods = array('.tar.gz' => 'zlib', '.tar.bz2' => 'bz2', '.zip' => 'zlib'); - foreach ($available_methods as $type => $module) - { - if (!@extension_loaded($module)) - { - continue; - } - - $methods[] = $type; - } - - // Let the user decide in which format he wants to have the pack - if (!$use_method) - { - $this->page_title = 'SELECT_DOWNLOAD_FORMAT'; - - $radio_buttons = ''; - foreach ($methods as $method) - { - $radio_buttons .= '<label><input type="radio"' . ((!$radio_buttons) ? ' id="use_method"' : '') . ' class="radio" value="' . $method . '" name="use_method" /> ' . $method . '</label>'; - } - - $template->assign_vars(array( - 'S_DOWNLOAD_FILES' => true, - 'U_ACTION' => append_sid($this->p_master->module_url, "language=$language&mode=$mode&sub=update_files"), - 'RADIO_BUTTONS' => $radio_buttons, - 'S_HIDDEN_FIELDS' => $s_hidden_fields) - ); - - // To ease the update process create a file location map - $update_list = $cache->get('_update_list'); - $script_path = ($config['force_server_vars']) ? (($config['script_path'] == '/') ? '/' : $config['script_path'] . '/') : $user->page['root_script_path']; - - foreach ($update_list as $status => $files) - { - if ($status == 'up_to_date' || $status == 'no_update' || $status == 'status' || $status == 'status_deleted') - { - continue; - } - - foreach ($files as $file_struct) - { - if (in_array($file_struct['filename'], $no_update)) - { - continue; - } - - $template->assign_block_vars('location', array( - 'SOURCE' => htmlspecialchars($file_struct['filename']), - 'DESTINATION' => $script_path . htmlspecialchars($file_struct['filename']), - )); - } - } - return; - } - - if (!in_array($use_method, $methods)) - { - $use_method = '.tar'; - } - - $update_mode = 'download'; - } - else - { - $this->include_file('includes/functions_transfer.' . $phpEx); - - // Choose FTP, if not available use fsock... - $method = basename(request_var('method', '')); - $submit = (isset($_POST['submit'])) ? true : false; - $test_ftp_connection = request_var('test_connection', ''); - - if (!$method || !class_exists($method)) - { - $method = 'ftp'; - $methods = transfer::methods(); - - if (!in_array('ftp', $methods)) - { - $method = $methods[0]; - } - } - - $test_connection = false; - if ($test_ftp_connection || $submit) - { - $transfer = new $method( - request_var('host', ''), - request_var('username', ''), - htmlspecialchars_decode($request->untrimmed_variable('password', '')), - request_var('root_path', ''), - request_var('port', ''), - request_var('timeout', '') - ); - $test_connection = $transfer->open_session(); - - // Make sure that the directory is correct by checking for the existence of common.php - if ($test_connection === true) - { - // Check for common.php file - if (!$transfer->file_exists($phpbb_root_path, 'common.' . $phpEx)) - { - $test_connection = 'ERR_WRONG_PATH_TO_PHPBB'; - } - } - - $transfer->close_session(); - - // Make sure the login details are correct before continuing - if ($submit && $test_connection !== true) - { - $submit = false; - $test_ftp_connection = true; - } - } - - $s_hidden_fields .= build_hidden_fields(array('method' => $method)); - - if (!$submit) - { - $this->page_title = 'SELECT_FTP_SETTINGS'; - - if (!class_exists($method)) - { - trigger_error('Method does not exist.', E_USER_ERROR); - } - - $requested_data = call_user_func(array($method, 'data')); - foreach ($requested_data as $data => $default) - { - $template->assign_block_vars('data', array( - 'DATA' => $data, - 'NAME' => $user->lang[strtoupper($method . '_' . $data)], - 'EXPLAIN' => $user->lang[strtoupper($method . '_' . $data) . '_EXPLAIN'], - 'DEFAULT' => $request->variable($data, (string) $default), - )); - } - - $template->assign_vars(array( - 'S_CONNECTION_SUCCESS' => ($test_ftp_connection && $test_connection === true) ? true : false, - 'S_CONNECTION_FAILED' => ($test_ftp_connection && $test_connection !== true) ? true : false, - 'ERROR_MSG' => ($test_ftp_connection && $test_connection !== true) ? $user->lang[$test_connection] : '', - - 'S_FTP_UPLOAD' => true, - 'UPLOAD_METHOD' => $method, - 'U_ACTION' => append_sid($this->p_master->module_url, "language=$language&mode=$mode&sub=update_files"), - 'U_DOWNLOAD_METHOD' => append_sid($this->p_master->module_url, "language=$language&mode=$mode&sub=update_files&download=1"), - 'S_HIDDEN_FIELDS' => $s_hidden_fields, - )); - - return; - } - - $update_mode = 'upload'; - } - - // Now update the installation or download the archive... - $download_filename = 'update_' . $this->update_info['version']['from'] . '_to_' . $this->update_info['version']['to']; - $archive_filename = $download_filename . '_' . time() . '_' . unique_id(); - - // Now init the connection - if ($update_mode == 'download') - { - if (function_exists('phpbb_is_writable') && !phpbb_is_writable($phpbb_root_path . 'store/')) - { - trigger_error(sprintf('The directory “%s” is not writable.', $phpbb_root_path . 'store/'), E_USER_ERROR); - } - - if ($use_method == '.zip') - { - $compress = new compress_zip('w', $phpbb_root_path . 'store/' . $archive_filename . $use_method); - } - else - { - $compress = new compress_tar('w', $phpbb_root_path . 'store/' . $archive_filename . $use_method, $use_method); - } - } - else - { - $transfer = new $method( - request_var('host', ''), - request_var('username', ''), - htmlspecialchars_decode($request->untrimmed_variable('password', '')), - request_var('root_path', ''), - request_var('port', ''), - request_var('timeout', '') - ); - $transfer->open_session(); - } - - // Ok, go through the update list and do the operations based on their status - foreach ($update_list as $status => $files) - { - if (!is_array($files)) - { - continue; - } - - foreach ($files as $file_struct) - { - // Skip this file if the user selected to not update it - if (in_array($file_struct['filename'], $no_update)) - { - continue; - } - - $original_filename = ($file_struct['custom']) ? $file_struct['original'] : $file_struct['filename']; - - switch ($status) - { - case 'new': - case 'new_conflict': - case 'not_modified': - - if ($update_mode == 'download') - { - $compress->add_custom_file($this->new_location . $original_filename, $file_struct['filename']); - } - else - { - if ($status != 'new') - { - $transfer->rename($file_struct['filename'], $file_struct['filename'] . '.bak'); - } - - // New directory too? - $dirname = dirname($file_struct['filename']); - - if ($dirname && !file_exists($phpbb_root_path . $dirname)) - { - $transfer->make_dir($dirname); - } - - $transfer->copy_file($this->new_location . $original_filename, $file_struct['filename']); - } - break; - - case 'modified': - - $contents = base64_decode($cache->get($file_list[$file_struct['filename']])); - - if ($update_mode == 'download') - { - $compress->add_data($contents, $file_struct['filename']); - } - else - { - // @todo add option to specify if a backup file should be created? - $transfer->rename($file_struct['filename'], $file_struct['filename'] . '.bak'); - $transfer->write_file($file_struct['filename'], $contents); - } - break; - - case 'conflict': - - $contents = base64_decode($cache->get($file_list[$file_struct['filename']])); - - if ($update_mode == 'download') - { - $compress->add_data($contents, $file_struct['filename']); - } - else - { - $transfer->rename($file_struct['filename'], $file_struct['filename'] . '.bak'); - $transfer->write_file($file_struct['filename'], $contents); - } - break; - - case 'deleted': - - if ($update_mode != 'download') - { - $transfer->rename($file_struct['filename'], $file_struct['filename'] . '.bak'); - } - break; - } - } - } - - if ($update_mode == 'download') - { - $compress->close(); - - $compress->download($archive_filename, $download_filename); - @unlink($phpbb_root_path . 'store/' . $archive_filename . $use_method); - - exit; - } - else - { - $transfer->close_session(); - - $template->assign_vars(array( - 'S_UPLOAD_SUCCESS' => true, - 'U_ACTION' => append_sid($this->p_master->module_url, "language=$language&mode=$mode&sub=file_check")) - ); - return; - } - - break; - - } - } - - /** - * Show file diff - */ - function show_diff(&$update_list) - { - global $phpbb_root_path, $template, $user, $phpbb_adm_relative_path; - - $this->tpl_name = 'install_update_diff'; - - $this->page_title = 'VIEWING_FILE_DIFF'; - - $status = request_var('status', ''); - $file = request_var('file', ''); - $diff_mode = request_var('diff_mode', 'inline'); - - // First of all make sure the file is within our file update list with the correct status - $found_entry = array(); - foreach ($update_list[$status] as $index => $file_struct) - { - if ($file_struct['filename'] === $file) - { - $found_entry = $update_list[$status][$index]; - } - } - - if (empty($found_entry)) - { - trigger_error($user->lang['FILE_DIFF_NOT_ALLOWED'], E_USER_ERROR); - } - - // If the status is 'up_to_date' then we do not need to show a diff - if ($status == 'up_to_date') - { - trigger_error($user->lang['FILE_ALREADY_UP_TO_DATE'], E_USER_ERROR); - } - - $original_file = ($found_entry['custom']) ? $found_entry['original'] : $file; - - // Get the correct diff - switch ($status) - { - case 'conflict': - $option = request_var('op', 0); - - switch ($option) - { - case MERGE_NO_MERGE_NEW: - case MERGE_NO_MERGE_MOD: - - $diff = $this->return_diff(array(), ($option == MERGE_NO_MERGE_NEW) ? $this->new_location . $original_file : $phpbb_root_path . $file); - - $template->assign_var('S_DIFF_NEW_FILE', true); - $diff_mode = 'inline'; - $this->page_title = 'VIEWING_FILE_CONTENTS'; - - break; - - // Merge differences and use new phpBB code for conflicted blocks - case MERGE_NEW_FILE: - case MERGE_MOD_FILE: - - $diff = $this->return_diff($this->old_location . $original_file, $phpbb_root_path . $file, $this->new_location . $original_file); - - $template->assign_vars(array( - 'S_DIFF_CONFLICT_FILE' => true, - 'NUM_CONFLICTS' => $diff->get_num_conflicts()) - ); - - $diff = $this->return_diff($phpbb_root_path . $file, ($option == MERGE_NEW_FILE) ? $diff->merged_new_output() : $diff->merged_orig_output()); - break; - - // Download conflict file - default: - - $diff = $this->return_diff($this->old_location . $original_file, $phpbb_root_path . $file, $this->new_location . $original_file); - - header('Pragma: no-cache'); - header("Content-Type: application/octetstream; name=\"$file\""); - header("Content-disposition: attachment; filename=$file"); - - @set_time_limit(0); - - echo implode("\n", $diff->get_conflicts_content()); - - flush(); - exit; - - break; - } - - break; - - case 'modified': - $option = request_var('op', 0); - - switch ($option) - { - case MERGE_NO_MERGE_NEW: - case MERGE_NO_MERGE_MOD: - - $diff = $this->return_diff(array(), ($option == MERGE_NO_MERGE_NEW) ? $this->new_location . $original_file : $phpbb_root_path . $file); - - $template->assign_var('S_DIFF_NEW_FILE', true); - $diff_mode = 'inline'; - $this->page_title = 'VIEWING_FILE_CONTENTS'; - - break; - - default: - $diff = $this->return_diff($this->old_location . $original_file, $phpbb_root_path . $original_file, $this->new_location . $file); - $diff = $this->return_diff($phpbb_root_path . $file, $diff->merged_output()); - break; - } - break; - - case 'not_modified': - case 'new_conflict': - $diff = $this->return_diff($phpbb_root_path . $file, $this->new_location . $original_file); - break; - - case 'new': - - $diff = $this->return_diff(array(), $this->new_location . $original_file); - - $template->assign_var('S_DIFF_NEW_FILE', true); - $diff_mode = 'inline'; - $this->page_title = 'VIEWING_FILE_CONTENTS'; - - break; - - case 'deleted': - - $diff = $this->return_diff(array(), $phpbb_root_path . $original_file); - - $template->assign_var('S_DIFF_NEW_FILE', true); - $diff_mode = 'inline'; - $this->page_title = 'VIEWING_FILE_CONTENTS'; - - break; - } - - $diff_mode_options = ''; - foreach (array('side_by_side', 'inline', 'unified', 'raw') as $option) - { - $diff_mode_options .= '<option value="' . $option . '"' . (($diff_mode == $option) ? ' selected="selected"' : '') . '>' . $user->lang['DIFF_' . strtoupper($option)] . '</option>'; - } - - // Now the correct renderer - $render_class = 'diff_renderer_' . $diff_mode; - - if (!class_exists($render_class)) - { - trigger_error('Chosen diff mode is not supported', E_USER_ERROR); - } - - $renderer = new $render_class(); - - $template->assign_vars(array( - 'DIFF_CONTENT' => $renderer->get_diff_content($diff), - 'DIFF_MODE' => $diff_mode, - 'S_DIFF_MODE_OPTIONS' => $diff_mode_options, - 'S_SHOW_DIFF' => true, - )); - - unset($diff, $renderer); - } - - /** - * Collect all file status infos we need for the update by diffing all files - */ - function get_update_structure(&$update_list, $expected_files) - { - global $phpbb_root_path, $phpEx, $user; - - if ($update_list === false) - { - $update_list = array( - 'up_to_date' => array(), - 'new' => array(), - 'not_modified' => array(), - 'modified' => array(), - 'new_conflict' => array(), - 'conflict' => array(), - 'no_update' => array(), - 'deleted' => array(), - 'status' => 0, - 'status_deleted'=> 0, - ); - } - - /* if (!empty($this->update_info['custom'])) - { - foreach ($this->update_info['custom'] as $original_file => $file_ary) - { - foreach ($file_ary as $index => $file) - { - $this->make_update_diff($update_list, $original_file, $file, true); - } - } - } */ - - // Get a list of those files which are completely new by checking with file_exists... - $num_bytes_processed = 0; - - foreach ($this->update_info['files'] as $index => $file) - { - if (is_int($update_list['status']) && $index < $update_list['status']) - { - continue; - } - - if ($num_bytes_processed >= 500 * 1024) - { - return; - } - - if (!file_exists($phpbb_root_path . $file)) - { - // Make sure the update files are consistent by checking if the file is in new_files... - if (!file_exists($this->new_location . $file)) - { - trigger_error($user->lang['INCOMPLETE_UPDATE_FILES'], E_USER_ERROR); - } - - // If the file exists within the old directory the file got removed and we will write it back - // not a biggie, but we might want to state this circumstance separately later. - // if (file_exists($this->old_location . $file)) - // { - // $update_list['removed'][] = $file; - // } - - /* Only include a new file as new if the underlying path exist - // The path normally do not exist if the original style or language has been removed - if (file_exists($phpbb_root_path . dirname($file))) - { - $this->get_custom_info($update_list['new'], $file); - $update_list['new'][] = array('filename' => $file, 'custom' => false); - } - else - { - // Do not include style-related or language-related content - if (strpos($file, 'styles/') !== 0 && strpos($file, 'language/') !== 0) - { - $update_list['no_update'][] = $file; - } - }*/ - - if (!phpbb_ignore_new_file_on_update($phpbb_root_path, $file)) - { - $this->get_custom_info($update_list['new'], $file); - $update_list['new'][] = array('filename' => $file, 'custom' => false); - } - - // unset($this->update_info['files'][$index]); - } - else - { - // not modified? - $this->make_update_diff($update_list, $file, $file, $expected_files); - } - - $num_bytes_processed += (file_exists($this->new_location . $file)) ? filesize($this->new_location . $file) : 100 * 1024; - $update_list['status']++; - } - - foreach ($this->update_info['deleted'] as $index => $file) - { - if (is_int($update_list['status_deleted']) && $index < $update_list['status_deleted']) - { - continue; - } - - if ($num_bytes_processed >= 500 * 1024) - { - return; - } - - if (file_exists($phpbb_root_path . $file)) - { - $update_list['deleted'][] = array('filename' => $file, 'custom' => false, 'as_expected' => false); - $num_bytes_processed += filesize($phpbb_root_path . $file); - } - - $update_list['status_deleted']++; - $update_list['status']++; - } - - $update_list['status_deleted'] = -1; - $update_list['status'] = -1; - -/* if (!sizeof($this->update_info['files'])) - { - return $update_list; - } - - // Now diff the remaining files to get information about their status (not modified/modified/up-to-date) - - // not modified? - foreach ($this->update_info['files'] as $index => $file) - { - $this->make_update_diff($update_list, $file, $file); - } - - // Now to the styles... - if (empty($this->update_info['custom'])) - { - return $update_list; - } - - foreach ($this->update_info['custom'] as $original_file => $file_ary) - { - foreach ($file_ary as $index => $file) - { - $this->make_update_diff($update_list, $original_file, $file, true); - } - } - - return $update_list;*/ - } - - /** - * Compare files for storage in update_list - */ - function make_update_diff(&$update_list, $original_file, $file, $expected_files, $custom = false) - { - global $phpbb_root_path, $user; - - $update_ary = array('filename' => $file, 'custom' => $custom, 'as_expected' => false); - - if ($custom) - { - $update_ary['original'] = $original_file; - } - - if (file_exists($phpbb_root_path . $file)) - { - $content = file_get_contents($phpbb_root_path . $file); - - if (isset($expected_files[$file]) && // the user already selected what to do with this file - ($expected_files[$file] === false || // the user wanted this file to stay the same, so just assume it's alright - $expected_files[$file] === md5($content))) - { - // the file contains what it was supposed to contain after the merge - $update_ary['as_expected'] = true; - $update_ary['was_ignored'] = ($expected_files[$file] === false); - $update_list['up_to_date'][] = $update_ary; - - return; - } - } - - // we only want to know if the files are successfully merged and newlines could result in errors (duplicate addition of lines and such things) - // Therefore we check for empty diffs with two methods, preserving newlines and not preserving them (which mostly works best, therefore the first option) - - // On a successfull update the new location file exists but the old one does not exist. - // Check for this circumstance, the new file need to be up-to-date with the current file then... - if (!file_exists($this->old_location . $original_file) && file_exists($this->new_location . $original_file) && file_exists($phpbb_root_path . $file)) - { - $tmp = array( - 'file1' => file_get_contents($this->new_location . $original_file), - 'file2' => $content, - ); - - // We need to diff the contents here to make sure the file is really the one we expect - $diff = new diff($tmp['file1'], $tmp['file2'], false); - $empty = $diff->is_empty(); - - unset($tmp, $diff); - - // if there are no differences we have an up-to-date file... - if ($empty) - { - $update_list['up_to_date'][] = $update_ary; - return; - } - - // If no other status matches we have another file in the way... - $update_list['new_conflict'][] = $update_ary; - return; - } - - // Old file removed? - if (file_exists($this->old_location . $original_file) && !file_exists($this->new_location . $original_file)) - { - return; - } - - // Check for existance, else abort immediately - if (!file_exists($this->old_location . $original_file) || !file_exists($this->new_location . $original_file)) - { - trigger_error($user->lang['INCOMPLETE_UPDATE_FILES'], E_USER_ERROR); - } - - $preserve_cr_ary = array(false, true); - - foreach ($preserve_cr_ary as $preserve_cr) - { - $tmp = array( - 'file1' => file_get_contents($this->old_location . $original_file), - 'file2' => $content, - ); - - // We need to diff the contents here to make sure the file is really the one we expect - $diff = new diff($tmp['file1'], $tmp['file2'], $preserve_cr); - $empty_1 = $diff->is_empty(); - - unset($tmp, $diff); - - $tmp = array( - 'file1' => file_get_contents($this->new_location . $original_file), - 'file2' => $content, - ); - - $diff = new diff($tmp['file1'], $tmp['file2'], $preserve_cr); - $empty_2 = $diff->is_empty(); - - unset($tmp, $diff); - - // If the file is not modified we are finished here... - if ($empty_1) - { - // Further check if it is already up to date - it could happen that non-modified files - // slip through - if ($empty_2) - { - $update_list['up_to_date'][] = $update_ary; - return; - } - - $update_list['not_modified'][] = $update_ary; - return; - } - - // If the file had been modified then we need to check if it is already up to date - - // if there are no differences we have an up-to-date file... - if ($empty_2) - { - $update_list['up_to_date'][] = $update_ary; - return; - } - } - - $conflicts = false; - - foreach ($preserve_cr_ary as $preserve_cr) - { - // if the file is modified we try to make sure a merge succeed - $tmp = array( - 'orig' => file_get_contents($this->old_location . $original_file), - 'final1' => file_get_contents($phpbb_root_path . $file), - 'final2' => file_get_contents($this->new_location . $original_file), - ); - - $diff = new diff3($tmp['orig'], $tmp['final1'], $tmp['final2'], $preserve_cr); - unset($tmp); - - if (!$diff->get_num_conflicts()) - { - $tmp = array( - 'file1' => file_get_contents($phpbb_root_path . $file), - 'file2' => implode("\n", $diff->merged_output()), - ); - - // now compare the merged output with the original file to see if the modified file is up to date - $diff2 = new diff($tmp['file1'], $tmp['file2'], $preserve_cr); - $empty = $diff2->is_empty(); - - unset($diff, $diff2); - - if ($empty) - { - $update_list['up_to_date'][] = $update_ary; - return; - } - - // If we preserve cr tag it as modified because the conflict would not show in this mode anyway - if ($preserve_cr) - { - $update_list['modified'][] = $update_ary; - return; - } - } - else - { - // There is one special case... users having merged with a conflicting file... we need to check this - $tmp = array( - 'file1' => file_get_contents($phpbb_root_path . $file), - 'file2' => implode("\n", $diff->merged_new_output()), - ); - - $diff2 = new diff($tmp['file1'], $tmp['file2'], $preserve_cr); - $empty = $diff2->is_empty(); - - if (!$empty) - { - unset($tmp, $diff2); - - // We check if the user merged with his output - $tmp = array( - 'file1' => file_get_contents($phpbb_root_path . $file), - 'file2' => implode("\n", $diff->merged_orig_output()), - ); - - $diff2 = new diff($tmp['file1'], $tmp['file2'], $preserve_cr); - $empty = $diff2->is_empty(); - } - - if (!$empty) - { - $conflicts = $diff->get_num_conflicts(); - } - - unset($diff, $diff2); - - if ($empty) - { - // A conflict got resolved... - $update_list['up_to_date'][] = $update_ary; - return; - } - } - } - - if ($conflicts !== false) - { - $update_ary['conflicts'] = $conflicts; - $update_list['conflict'][] = $update_ary; - return; - } - - // If no other status matches we have a modified file... - $update_list['modified'][] = $update_ary; - } - - /** - * Update update_list with custom new files - */ - function get_custom_info(&$update_list, $file) - { - if (empty($this->update_info['custom'])) - { - return; - } - - if (isset($this->update_info['custom'][$file])) - { - foreach ($this->update_info['custom'][$file] as $_file) - { - $update_list[] = array('filename' => $_file, 'custom' => true, 'original' => $file); - } - } - } - - /** - * Get remote file - */ - function get_file($mode) - { - global $user, $db; - - $errstr = ''; - $errno = 0; - - switch ($mode) - { - case 'update_info': - global $phpbb_root_path, $phpEx; - - $update_info = array(); - include($phpbb_root_path . 'install/update/index.' . $phpEx); - - $info = (empty($update_info) || !is_array($update_info)) ? false : $update_info; - $errstr = ($info === false) ? $user->lang['WRONG_INFO_FILE_FORMAT'] : ''; - - if ($info !== false) - { - // We assume that all file extensions have been renamed to .$phpEx, - // if someone is using a non .php file extension for php files. - // However, in $update_info['files'] we use hardcoded .php. - // We therefore replace .php with .$phpEx. - $info['files'] = preg_replace('/\.php$/i', ".$phpEx", $info['files']); - - // Adjust the update info file to hold some specific style-related information - $info['custom'] = array(); -/* - // Get custom installed styles... - $sql = 'SELECT style_name, style_path - FROM ' . STYLES_TABLE . " - WHERE LOWER(style_name) NOT IN ('subsilver2', 'prosilver')"; - $result = $db->sql_query($sql); - - $templates = array(); - while ($row = $db->sql_fetchrow($result)) - { - $templates[] = $row; - } - $db->sql_freeresult($result); - - if (sizeof($templates)) - { - foreach ($info['files'] as $filename) - { - // Template update? - if (strpos(strtolower($filename), 'styles/prosilver/template/') === 0) - { - foreach ($templates as $row) - { - $info['custom'][$filename][] = str_replace('/prosilver/', '/' . $row['style_path'] . '/', $filename); - } - } - } - } -*/ - } - break; - - default: - trigger_error('Mode for getting remote file not specified', E_USER_ERROR); - break; - } - - if ($info === false) - { - trigger_error($errstr, E_USER_ERROR); - } - - return $info; - } - - /** - * Function for including files... - */ - function include_file($filename) - { - global $phpbb_root_path, $phpEx; - - if (!empty($this->update_info['files']) && in_array($filename, $this->update_info['files'])) - { - include_once($this->new_location . $filename); - } - else - { - include_once($phpbb_root_path . $filename); - } - } - - /** - * Wrapper for returning a diff object - */ - function return_diff() - { - $args = func_get_args(); - $three_way_diff = (func_num_args() > 2) ? true : false; - - $file1 = array_shift($args); - $file2 = array_shift($args); - - $tmp['file1'] = (!empty($file1) && is_string($file1)) ? file_get_contents($file1) : $file1; - $tmp['file2'] = (!empty($file2) && is_string($file2)) ? file_get_contents($file2) : $file2; - - if ($three_way_diff) - { - $file3 = array_shift($args); - $tmp['file3'] = (!empty($file3) && is_string($file3)) ? file_get_contents($file3) : $file3; - - $diff = new diff3($tmp['file1'], $tmp['file2'], $tmp['file3']); - } - else - { - $diff = new diff($tmp['file1'], $tmp['file2']); - } - - unset($tmp); - - return $diff; - } -} diff --git a/phpBB/install/phpbbcli.php b/phpBB/install/phpbbcli.php new file mode 100755 index 0000000000..e36922f1a5 --- /dev/null +++ b/phpBB/install/phpbbcli.php @@ -0,0 +1,48 @@ +#!/usr/bin/env php +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +use Symfony\Component\Console\Input\ArgvInput; + +if (php_sapi_name() !== 'cli') +{ + echo 'This program must be run from the command line.' . PHP_EOL; + exit(1); +} + +define('IN_PHPBB', true); +define('IN_INSTALL', true); +define('PHPBB_ENVIRONMENT', 'production'); +$phpbb_root_path = __DIR__ . '/../'; +$phpEx = substr(strrchr(__FILE__, '.'), 1); + +// +// Let's do the common.php logic +// +$startup_new_path = $phpbb_root_path . 'install/update/update/new/install/startup.' . $phpEx; +$startup_path = (file_exists($startup_new_path)) ? $startup_new_path : $phpbb_root_path . 'install/startup.' . $phpEx; +require($startup_path); + +$input = new ArgvInput(); + +/** @var \phpbb\filesystem\filesystem $phpbb_filesystem */ +$phpbb_filesystem = $phpbb_installer_container->get('filesystem'); + +/** @var \phpbb\language\language $language */ +$language = $phpbb_installer_container->get('language'); +$language->add_lang(array('common', 'acp/common', 'acp/board', 'install', 'posting', 'cli')); + +$application = new \phpbb\console\application('phpBB Installer', PHPBB_VERSION, $language); +$application->setDispatcher($phpbb_installer_container->get('dispatcher')); +$application->register_container_commands($phpbb_installer_container->get('console.installer.command_collection')); +$application->run($input); diff --git a/phpBB/install/phpinfo.php b/phpBB/install/phpinfo.php deleted file mode 100644 index 1512b00563..0000000000 --- a/phpBB/install/phpinfo.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php -/** -* -* This file is part of the phpBB Forum Software package. -* -* @copyright (c) phpBB Limited <https://www.phpbb.com> -* @license GNU General Public License, version 2 (GPL-2.0) -* -* For full copyright and license information, please see -* the docs/CREDITS.txt file. -* -*/ - -phpinfo(); diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql index 1b6766e1b1..5cf5af6ddc 100644 --- a/phpBB/install/schemas/schema_data.sql +++ b/phpBB/install/schemas/schema_data.sql @@ -41,6 +41,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_sig_pm', '1' INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_sig_smilies', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_smilies', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_topic_notify', '1'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('allowed_schemes_links', 'http,https,ftp'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('assets_version', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('attachment_quota', '52428800'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('auth_bbcode_pm', '1'); @@ -107,6 +108,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_max_chunk_si INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_package_size', '20'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_confirm', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_mod_rewrite', '0'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_board_notifications', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_pm_icons', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_post_confirm', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('feed_enable', '1'); @@ -273,7 +275,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('tpl_allow_php', '0 INSERT INTO phpbb_config (config_name, config_value) VALUES ('upload_icons_path', 'images/upload_icons'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('upload_path', 'files'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('use_system_cron', '0'); -INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '3.1.7-dev'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '3.2.0-a2-dev'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('warnings_expire_days', '90'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('warnings_gc', '14400'); @@ -309,6 +311,7 @@ INSERT INTO phpbb_config_text (config_name, config_value) VALUES ('contact_admin # -- Forum related auth options INSERT INTO phpbb_acl_options (auth_option, is_local) VALUES ('f_', 1); INSERT INTO phpbb_acl_options (auth_option, is_local) VALUES ('f_announce', 1); +INSERT INTO phpbb_acl_options (auth_option, is_local) VALUES ('f_announce_global', 1); INSERT INTO phpbb_acl_options (auth_option, is_local) VALUES ('f_attach', 1); INSERT INTO phpbb_acl_options (auth_option, is_local) VALUES ('f_bbcode', 1); INSERT INTO phpbb_acl_options (auth_option, is_local) VALUES ('f_bump', 1); @@ -552,7 +555,7 @@ INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 14, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%'; # Standard Access (f_) -INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 15, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option NOT IN ('f_announce', 'f_flash', 'f_ignoreflood', 'f_poll', 'f_sticky', 'f_user_lock'); +INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 15, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option NOT IN ('f_announce', 'f_announce_global', 'f_flash', 'f_ignoreflood', 'f_poll', 'f_sticky', 'f_user_lock'); # No Access (f_) INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 16, auth_option_id, 0 FROM phpbb_acl_options WHERE auth_option = 'f_'; @@ -561,20 +564,20 @@ INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 17, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option IN ('f_', 'f_download', 'f_list', 'f_read', 'f_search', 'f_subscribe', 'f_print'); # Limited Access (f_) -INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 18, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option NOT IN ('f_announce', 'f_attach', 'f_bump', 'f_delete', 'f_flash', 'f_icons', 'f_ignoreflood', 'f_poll', 'f_sticky', 'f_user_lock', 'f_votechg'); +INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 18, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option NOT IN ('f_announce', 'f_announce_global', 'f_attach', 'f_bump', 'f_delete', 'f_flash', 'f_icons', 'f_ignoreflood', 'f_poll', 'f_sticky', 'f_user_lock', 'f_votechg'); # Bot Access (f_) INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 19, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option IN ('f_', 'f_download', 'f_list', 'f_read', 'f_print'); # On Moderation Queue (f_) -INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 20, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option NOT IN ('f_announce', 'f_bump', 'f_delete', 'f_flash', 'f_icons', 'f_ignoreflood', 'f_poll', 'f_sticky', 'f_user_lock', 'f_votechg', 'f_noapprove'); +INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 20, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option NOT IN ('f_announce', 'f_announce_global', 'f_bump', 'f_delete', 'f_flash', 'f_icons', 'f_ignoreflood', 'f_poll', 'f_sticky', 'f_user_lock', 'f_votechg', 'f_noapprove'); INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 20, auth_option_id, 0 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option IN ('f_noapprove'); # Standard Access + Polls (f_) -INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 21, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option NOT IN ('f_announce', 'f_flash', 'f_ignoreflood', 'f_sticky', 'f_user_lock'); +INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 21, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option NOT IN ('f_announce', 'f_announce_global', 'f_flash', 'f_ignoreflood', 'f_sticky', 'f_user_lock'); # Limited Access + Polls (f_) -INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 22, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option NOT IN ('f_announce', 'f_attach', 'f_bump', 'f_delete', 'f_flash', 'f_icons', 'f_ignoreflood', 'f_sticky', 'f_user_lock', 'f_votechg'); +INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 22, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option NOT IN ('f_announce', 'f_announce_global', 'f_attach', 'f_bump', 'f_delete', 'f_flash', 'f_icons', 'f_ignoreflood', 'f_sticky', 'f_user_lock', 'f_votechg'); # New Member (u_) INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 23, auth_option_id, 0 FROM phpbb_acl_options WHERE auth_option LIKE 'u_%' AND auth_option IN ('u_sendpm', 'u_masspm', 'u_masspm_group', 'u_chgprofileinfo'); @@ -716,10 +719,7 @@ INSERT INTO phpbb_extension_groups (group_name, cat_id, allow_group, download_mo INSERT INTO phpbb_extension_groups (group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize, allowed_forums) VALUES ('ARCHIVES', 0, 1, 1, '', 0, ''); INSERT INTO phpbb_extension_groups (group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize, allowed_forums) VALUES ('PLAIN_TEXT', 0, 0, 1, '', 0, ''); INSERT INTO phpbb_extension_groups (group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize, allowed_forums) VALUES ('DOCUMENTS', 0, 0, 1, '', 0, ''); -INSERT INTO phpbb_extension_groups (group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize, allowed_forums) VALUES ('REAL_MEDIA', 3, 0, 1, '', 0, ''); -INSERT INTO phpbb_extension_groups (group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize, allowed_forums) VALUES ('WINDOWS_MEDIA', 2, 0, 1, '', 0, ''); INSERT INTO phpbb_extension_groups (group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize, allowed_forums) VALUES ('FLASH_FILES', 5, 0, 1, '', 0, ''); -INSERT INTO phpbb_extension_groups (group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize, allowed_forums) VALUES ('QUICKTIME_MEDIA', 6, 0, 1, '', 0, ''); INSERT INTO phpbb_extension_groups (group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize, allowed_forums) VALUES ('DOWNLOADABLE_FILES', 0, 0, 1, '', 0, ''); # -- extensions @@ -776,27 +776,13 @@ INSERT INTO phpbb_extensions (group_id, extension) VALUES (4, 'ods'); INSERT INTO phpbb_extensions (group_id, extension) VALUES (4, 'odt'); INSERT INTO phpbb_extensions (group_id, extension) VALUES (4, 'rtf'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (5, 'rm'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (5, 'ram'); +INSERT INTO phpbb_extensions (group_id, extension) VALUES (5, 'swf'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (6, 'wma'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (6, 'wmv'); - -INSERT INTO phpbb_extensions (group_id, extension) VALUES (7, 'swf'); - -INSERT INTO phpbb_extensions (group_id, extension) VALUES (8, 'mov'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (8, 'm4v'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (8, 'm4a'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (8, 'mp4'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (8, '3gp'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (8, '3g2'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (8, 'qt'); - -INSERT INTO phpbb_extensions (group_id, extension) VALUES (9, 'mpeg'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (9, 'mpg'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (9, 'mp3'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (9, 'ogg'); -INSERT INTO phpbb_extensions (group_id, extension) VALUES (9, 'ogm'); +INSERT INTO phpbb_extensions (group_id, extension) VALUES (6, 'mp3'); +INSERT INTO phpbb_extensions (group_id, extension) VALUES (6, 'mpeg'); +INSERT INTO phpbb_extensions (group_id, extension) VALUES (6, 'mpg'); +INSERT INTO phpbb_extensions (group_id, extension) VALUES (6, 'ogg'); +INSERT INTO phpbb_extensions (group_id, extension) VALUES (6, 'ogm'); # Add default profile fields INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_location', 'profilefields.type.string', 'phpbb_location', '20', '2', '100', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, '', ''); @@ -805,7 +791,6 @@ INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_len INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_occupation', 'profilefields.type.text', 'phpbb_occupation', '3|30', '2', '500', '', '', '.*', 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, '', ''); INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_aol', 'profilefields.type.string', 'phpbb_aol', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 5, 1, '', ''); INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_icq', 'profilefields.type.string', 'phpbb_icq', '20', '3', '15', '', '', '[0-9]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 6, 1, 'SEND_ICQ_MESSAGE', 'https://www.icq.com/people/%s/'); -INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_wlm', 'profilefields.type.string', 'phpbb_wlm', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 7, 1, '', ''); INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_yahoo', 'profilefields.type.string', 'phpbb_yahoo', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 8, 1, 'SEND_YIM_MESSAGE', 'ymsgr:sendim?%s'); INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_facebook', 'profilefields.type.string', 'phpbb_facebook', '20', '5', '50', '', '', '[\w.]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 9, 1, 'VIEW_FACEBOOK_PROFILE', 'http://facebook.com/%s/'); INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_twitter', 'profilefields.type.string', 'phpbb_twitter', '20', '1', '15', '', '', '[\w_]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 10, 1, 'VIEW_TWITTER_PROFILE', 'http://twitter.com/%s'); @@ -814,9 +799,9 @@ INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_len INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_googleplus', 'profilefields.type.googleplus', 'phpbb_googleplus', '20', '3', '255', '', '', '[\w]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 13, 1, 'VIEW_GOOGLEPLUS_PROFILE', 'http://plus.google.com/%s'); # User Notification Options (for first user) -INSERT INTO phpbb_user_notifications (item_type, item_id, user_id, method) VALUES('notification.type.post', 0, 2, ''); +INSERT INTO phpbb_user_notifications (item_type, item_id, user_id, method) VALUES('notification.type.post', 0, 2, 'notification.method.board'); INSERT INTO phpbb_user_notifications (item_type, item_id, user_id, method) VALUES('notification.type.post', 0, 2, 'notification.method.email'); -INSERT INTO phpbb_user_notifications (item_type, item_id, user_id, method) VALUES('notification.type.topic', 0, 2, ''); +INSERT INTO phpbb_user_notifications (item_type, item_id, user_id, method) VALUES('notification.type.topic', 0, 2, 'notification.method.board'); INSERT INTO phpbb_user_notifications (item_type, item_id, user_id, method) VALUES('notification.type.topic', 0, 2, 'notification.method.email'); # POSTGRES COMMIT # diff --git a/phpBB/install/startup.php b/phpBB/install/startup.php new file mode 100644 index 0000000000..0d3e01efaa --- /dev/null +++ b/phpBB/install/startup.php @@ -0,0 +1,127 @@ +<?php +/** + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +/** @ignore */ +if (!defined('IN_PHPBB') || !defined('IN_INSTALL')) +{ + exit; +} + +function phpbb_require_updated($path, $phpbb_root_path, $optional = false) +{ + $new_path = $phpbb_root_path . 'install/update/new/' . $path; + $old_path = $phpbb_root_path . $path; + + if (file_exists($new_path)) + { + require($new_path); + } + else if (!$optional || file_exists($old_path)) + { + require($old_path); + } +} + +function phpbb_include_updated($path, $phpbb_root_path, $optional = false) +{ + $new_path = $phpbb_root_path . 'install/update/new/' . $path; + $old_path = $phpbb_root_path . $path; + + if (file_exists($new_path)) + { + include($new_path); + } + else if (!$optional || file_exists($old_path)) + { + include($old_path); + } +} + +function installer_msg_handler($errno, $msg_text, $errfile, $errline) +{ + global $phpbb_installer_container; + + switch ($errno) + { + case E_NOTICE: + case E_WARNING: + case E_USER_WARNING: + case E_USER_NOTICE: + $msg = '[phpBB debug] "' . $msg_text . '" in file ' . $errfile . ' on line ' . $errline; + + try + { + /** @var \phpbb\install\helper\iohandler\iohandler_interface $iohandler */ + $iohandler = $phpbb_installer_container->get('installer.helper.iohandler'); + $iohandler->add_warning_message($msg); + } + catch (\phpbb\install\helper\iohandler\exception\iohandler_not_implemented_exception $e) + { + print ($msg); + } + break; + case E_USER_ERROR: + $msg = '<b>General Error:</b><br />' . $msg_text . '<br /> in file ' . $errfile . ' on line ' . $errline; + + $backtrace = get_backtrace(); + if ($backtrace) + { + $msg .= '<br /><br />BACKTRACE<br />' . $backtrace; + } + + throw new \phpbb\exception\runtime_exception($msg); + break; + case E_DEPRECATED: + return true; + break; + } + + return false; +} + +phpbb_require_updated('includes/startup.' . $phpEx, $phpbb_root_path); +phpbb_require_updated('phpbb/class_loader.' . $phpEx, $phpbb_root_path); + +$phpbb_class_loader_new = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}install/update/new/phpbb/", $phpEx); +$phpbb_class_loader_new->register(); +$phpbb_class_loader = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}phpbb/", $phpEx); +$phpbb_class_loader->register(); +$phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx); +$phpbb_class_loader_ext->register(); + +// In case $phpbb_adm_relative_path is not set (in case of an update), use the default. +$phpbb_adm_relative_path = (isset($phpbb_adm_relative_path)) ? $phpbb_adm_relative_path : 'adm/'; +$phpbb_admin_path = (defined('PHPBB_ADMIN_PATH')) ? PHPBB_ADMIN_PATH : $phpbb_root_path . $phpbb_adm_relative_path; + +// Include files +phpbb_require_updated('includes/functions.' . $phpEx, $phpbb_root_path); +phpbb_require_updated('includes/functions_content.' . $phpEx, $phpbb_root_path); +phpbb_include_updated('includes/functions_compatibility.' . $phpEx, $phpbb_root_path); +phpbb_require_updated('includes/functions_user.' . $phpEx, $phpbb_root_path); +phpbb_require_updated('includes/utf/utf_tools.' . $phpEx, $phpbb_root_path); + +// Set PHP error handler to ours +set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'installer_msg_handler'); + +$phpbb_installer_container_builder = new \phpbb\di\container_builder($phpbb_root_path, $phpEx); +$phpbb_installer_container_builder + ->with_environment('installer') + ->without_extensions(); + +$other_config_path = $phpbb_root_path . 'install/update/new/config'; +$config_path = (file_exists($other_config_path . '/installer/config.yml')) ? $other_config_path : $phpbb_root_path . 'config'; + +$phpbb_installer_container = $phpbb_installer_container_builder + ->with_config_path($config_path) + ->with_custom_parameters(array('cache.driver.class' => 'phpbb\cache\driver\file')) + ->get_container(); |