diff options
Diffstat (limited to 'phpBB/install')
| -rw-r--r-- | phpBB/install/app.php | 63 | ||||
| -rw-r--r-- | phpBB/install/convert/controller/convertor.php | 865 | ||||
| -rw-r--r-- | phpBB/install/convert/convert.php | 60 | ||||
| -rw-r--r-- | phpBB/install/convert/convertor.php (renamed from phpBB/install/install_convert.php) | 962 | ||||
| -rw-r--r-- | phpBB/install/convertors/convert_phpbb20.php | 7 | ||||
| -rw-r--r-- | phpBB/install/convertors/functions_phpbb20.php | 84 | ||||
| -rw-r--r-- | phpBB/install/data/confusables.php | 9 | ||||
| -rw-r--r-- | phpBB/install/data/new_normalizer.php | 197 | ||||
| -rw-r--r-- | phpBB/install/database_update.php | 244 | ||||
| -rw-r--r-- | phpBB/install/index.html | 11 | ||||
| -rw-r--r-- | phpBB/install/index.php | 834 | ||||
| -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 | 1782 | ||||
| -rwxr-xr-x | phpBB/install/phpbbcli.php | 52 | ||||
| -rw-r--r-- | phpBB/install/phpinfo.php | 20 | ||||
| -rw-r--r-- | phpBB/install/schemas/schema_data.sql | 53 | ||||
| -rw-r--r-- | phpBB/install/startup.php | 143 | 
18 files changed, 1479 insertions, 6316 deletions
| diff --git a/phpBB/install/app.php b/phpBB/install/app.php new file mode 100644 index 0000000000..ef59689a65 --- /dev/null +++ b/phpBB/install/app.php @@ -0,0 +1,63 @@ +<?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); + +if (version_compare(PHP_VERSION, '5.4') < 0) +{ +	die('You are running an unsupported PHP version. Please upgrade to PHP 5.4.0 or higher before trying to install or update to phpBB 3.2'); +} + +$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/convert/controller/convertor.php b/phpBB/install/convert/controller/convertor.php new file mode 100644 index 0000000000..7b2a00d7b9 --- /dev/null +++ b/phpBB/install/convert/controller/convertor.php @@ -0,0 +1,865 @@ +<?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. + * + */ + +namespace phpbb\convert\controller; + +use phpbb\cache\driver\driver_interface; +use phpbb\exception\http_exception; +use phpbb\install\controller\helper; +use phpbb\install\helper\container_factory; +use phpbb\install\helper\database; +use phpbb\install\helper\install_helper; +use phpbb\install\helper\iohandler\factory; +use phpbb\install\helper\iohandler\iohandler_interface; +use phpbb\install\helper\navigation\navigation_provider; +use phpbb\language\language; +use phpbb\request\request_interface; +use phpbb\template\template; +use Symfony\Component\HttpFoundation\StreamedResponse; + +/** + * Controller for forum convertors + * + * WARNING: This file did not meant to be present in a production environment, so moving + * 			this file to a location which is accessible after board installation might + * 			lead to security issues. + */ +class convertor +{ +	/** +	 * @var driver_interface +	 */ +	protected $cache; + +	/** +	 * @var driver_interface +	 */ +	protected $installer_cache; + +	/** +	 * @var \phpbb\config\db +	 */ +	protected $config; + +	/** +	 * @var \phpbb\config_php_file +	 */ +	protected $config_php_file; + +	/** +	 * @var string +	 */ +	protected $config_table; + +	/** +	 * @var helper +	 */ +	protected $controller_helper; + +	/** +	 * @var database +	 */ +	protected $db_helper; + +	/** +	 * @var \phpbb\db\driver\driver_interface +	 */ +	protected $db; + +	/** +	 * @var install_helper +	 */ +	protected $install_helper; + +	/** +	 * @var iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var language +	 */ +	protected $language; + +	/** +	 * @var navigation_provider +	 */ +	protected $navigation_provider; + +	/** +	 * @var request_interface +	 */ +	protected $request; + +	/** +	 * @var string +	 */ +	protected $session_keys_table; + +	/** +	 * @var string +	 */ +	protected $session_table; + +	/** +	 * @var template +	 */ +	protected $template; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * @var string +	 */ +	protected $php_ext; + +	/** +	 * Constructor +	 * +	 * @param driver_interface		$cache +	 * @param container_factory		$container +	 * @param database				$db_helper +	 * @param helper				$controller_helper +	 * @param install_helper		$install_helper +	 * @param factory				$iohandler +	 * @param language				$language +	 * @param navigation_provider	$nav +	 * @param request_interface		$request +	 * @param template				$template +	 * @param string				$phpbb_root_path +	 * @param string				$php_ext +	 */ +	public function __construct(driver_interface $cache, container_factory $container, database $db_helper, helper $controller_helper, install_helper $install_helper, factory $iohandler, language $language, navigation_provider $nav, request_interface $request, template $template, $phpbb_root_path, $php_ext) +	{ +		$this->installer_cache		= $cache; +		$this->controller_helper	= $controller_helper; +		$this->db_helper			= $db_helper; +		$this->install_helper		= $install_helper; +		$this->language				= $language; +		$this->navigation_provider	= $nav; +		$this->request				= $request; +		$this->template				= $template; +		$this->phpbb_root_path		= $phpbb_root_path; +		$this->php_ext				= $php_ext; + +		$iohandler->set_environment('ajax'); +		$this->iohandler = $iohandler->get(); + +		if (!$this->install_helper->is_phpbb_installed() || !defined('IN_INSTALL')) +		{ +			throw new http_exception(403, 'INSTALL_PHPBB_NOT_INSTALLED'); +		} + +		$this->controller_helper->handle_language_select(); + +		$this->cache	= $container->get('cache.driver'); +		$this->config	= $container->get('config'); +		$this->config_php_file	= new \phpbb\config_php_file($this->phpbb_root_path, $this->php_ext); +		$this->db		= $container->get('dbal.conn.driver'); + +		$this->config_table			= $container->get_parameter('tables.config'); +		$this->session_keys_table	= $container->get_parameter('tables.sessions_keys'); +		$this->session_table		= $container->get_parameter('tables.sessions'); +	} + +	/** +	 * Render the intro page +	 * +	 * @param bool|int	$start_new	Whether or not to force to start a new convertor +	 * +	 * @return \Symfony\Component\HttpFoundation\Response +	 */ +	public function intro($start_new) +	{ +		$this->setup_navigation('intro'); + +		if ($start_new) +		{ +			if ($this->request->is_ajax()) +			{ +				$response = new StreamedResponse(); +				$iohandler = $this->iohandler; +				$url = $this->controller_helper->route('phpbb_convert_intro', array('start_new' => 'new')); +				$response->setCallback(function() use ($iohandler, $url) { +					$iohandler->redirect($url); +				}); +				$response->headers->set('X-Accel-Buffering', 'no'); + +				return $response; +			} + +			$this->config['convert_progress'] = ''; +			$this->config['convert_db_server'] = ''; +			$this->config['convert_db_user'] = ''; +			$this->db->sql_query('DELETE FROM ' . $this->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($this->config['convert_progress']) && +			!empty($this->config['convert_db_server']) && +			!empty($this->config['convert_db_user']) && +			!empty($this->config['convert_options'])) +		{ +			$options = unserialize($this->config['convert_progress']); +			$options = array_merge($options, +				unserialize($this->config['convert_db_server']), +				unserialize($this->config['convert_db_user']), +				unserialize($this->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->template->assign_vars(array( +				'TITLE'				=> $this->language->lang('CONTINUE_CONVERT'), +				'BODY'				=> $this->language->lang('CONTINUE_CONVERT_BODY'), +				'S_CONTINUE'		=> true, +				'U_NEW_ACTION'		=> $this->controller_helper->route('phpbb_convert_intro', array('start_new' => 'new')), +				'U_CONTINUE_ACTION'	=> $this->controller_helper->route('phpbb_convert_convert', array('converter' => $options['tag'])), +			)); + +			return $this->controller_helper->render('installer_convert.html', 'CONTINUE_CONVERT', true); +		} + +		return $this->render_convert_list(); +	} + +	/** +	 * Obtain convertor settings +	 * +	 * @param string	$converter	Name of the convertor +	 * +	 * @return \Symfony\Component\HttpFoundation\Response|StreamedResponse +	 */ +	public function settings($converter) +	{ +		$this->setup_navigation('settings'); + +		require_once ($this->phpbb_root_path . 'includes/constants.' . $this->php_ext); +		require_once ($this->phpbb_root_path . 'includes/functions_convert.' . $this->php_ext); + +		// Include convertor if available +		$convertor_file_path = $this->phpbb_root_path . 'install/convertors/convert_' . $converter . '.' . $this->php_ext; +		if (!file_exists($convertor_file_path)) +		{ +			if ($this->request->is_ajax()) +			{ +				$response = new StreamedResponse(); +				$ref = $this; +				$response->setCallback(function() use ($ref) { +					$ref->render_error('CONVERT_NOT_EXIST'); +				}); +				$response->headers->set('X-Accel-Buffering', 'no'); + +				return $response; +			} + +			$this->render_error('CONVERT_NOT_EXIST'); +			return $this->controller_helper->render('installer_convert.html', 'STAGE_SETTINGS', true); +		} + +		$get_info = true; +		$phpbb_root_path = $this->phpbb_root_path; // These globals are required +		$phpEx = $this->php_ext; // See above +		include_once ($convertor_file_path); + +		// The test_file is a file that should be present in the location of the old board. +		if (!isset($test_file)) +		{ +			if ($this->request->is_ajax()) +			{ +				$response = new StreamedResponse(); +				$ref = $this; +				$response->setCallback(function() use ($ref) { +					$ref->render_error('DEV_NO_TEST_FILE'); +				}); +				$response->headers->set('X-Accel-Buffering', 'no'); + +				return $response; +			} + +			$this->render_error('DEV_NO_TEST_FILE'); +			return $this->controller_helper->render('installer_convert.html', 'STAGE_SETTINGS', true); +		} + +		if ($this->request->variable('submit', false)) +		{ +			// It must be an AJAX request at this point +			$response = new StreamedResponse(); +			$ref = $this; +			$response->setCallback(function() use ($ref, $converter) { +				$ref->proccess_settings_form($converter); +			}); +			$response->headers->set('X-Accel-Buffering', 'no'); + +			return $response; +		} +		else +		{ +			$this->template->assign_vars(array( +				'U_ACTION'	=> $this->controller_helper->route('phpbb_convert_settings', array( +					'converter'	=> $converter, +				)) +			)); + +			if ($this->request->is_ajax()) +			{ +				$response = new StreamedResponse(); +				$ref = $this; +				$response->setCallback(function() use ($ref) { +					$ref->render_settings_form(); +				}); +				$response->headers->set('X-Accel-Buffering', 'no'); + +				return $response; +			} + +			$this->render_settings_form(); +		} + +		return $this->controller_helper->render('installer_convert.html', 'STAGE_SETTINGS', true); +	} + +	/** +	 * Run conversion +	 */ +	public function convert($converter) +	{ +		$this->setup_navigation('convert'); + +		if ($this->request->is_ajax()) +		{ +			$route = $this->controller_helper->route('phpbb_convert_convert', array('converter' => $converter)); +			$response = new StreamedResponse(); +			$ref = $this; +			$response->setCallback(function() use ($ref, $route) { +				$ref->redirect_to_html($route); +			}); +			$response->headers->set('X-Accel-Buffering', 'no'); + +			return $response; +		} + +		$convertor = new \phpbb\convert\convertor($this->template, $this->controller_helper); +		$convertor->convert_data($converter); + +		return $this->controller_helper->render('installer_convert.html', 'STAGE_IN_PROGRESS'); +	} + +	/** +	 * Render the final page of the convertor +	 */ +	public function finish() +	{ +		$this->setup_navigation('finish'); + +		$this->template->assign_vars(array( +			'TITLE'		=> $this->language->lang('CONVERT_COMPLETE'), +			'BODY'		=> $this->language->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. +		$this->cache->purge(); +		$this->installer_cache->purge(); + +		require_once($this->phpbb_root_path . 'includes/constants.' . $this->php_ext); +		require_once($this->phpbb_root_path . 'includes/functions_convert.' . $this->php_ext); + +		$sql = 'SELECT config_value +			FROM ' . $this->config_table . ' +			WHERE config_name = \'search_type\''; +		$result = $this->db->sql_query($sql); + +		if ($this->db->sql_fetchfield('config_value') != 'fulltext_mysql') +		{ +			$this->template->assign_vars(array( +				'S_ERROR_BOX'	=> true, +				'ERROR_TITLE'	=> $this->language->lang('SEARCH_INDEX_UNCONVERTED'), +				'ERROR_MSG'		=> $this->language->lang('SEARCH_INDEX_UNCONVERTED_EXPLAIN'), +			)); +		} + +		$this->db->sql_freeresult($result); + +		switch ($this->db->get_sql_layer()) +		{ +			case 'sqlite3': +				$this->db->sql_query('DELETE FROM ' . $this->session_keys_table); +				$this->db->sql_query('DELETE FROM ' . $this->session_table); +			break; + +			default: +				$this->db->sql_query('TRUNCATE TABLE ' . $this->session_keys_table); +				$this->db->sql_query('TRUNCATE TABLE ' . $this->session_table); +			break; +		} + +		return $this->controller_helper->render('installer_convert.html', 'CONVERT_COMPLETE'); +	} + +	/** +	 * Validates settings form +	 * +	 * @param string	$convertor +	 */ +	public function proccess_settings_form($convertor) +	{ +		global $phpbb_root_path, $phpEx, $get_info; + +		$phpbb_root_path = $this->phpbb_root_path; +		$phpEx = $this->php_ext; +		$get_info = true; + +		require_once($this->phpbb_root_path . 'includes/constants.' . $this->php_ext); +		require_once($this->phpbb_root_path . 'includes/functions_convert.' . $this->php_ext); + +		// Include convertor if available +		$convertor_file_path = $this->phpbb_root_path . 'install/convertors/convert_' . $convertor . '.' . $this->php_ext; +		include ($convertor_file_path); + +		// We expect to have an AJAX request here +		$src_dbms			= $this->request->variable('src_dbms', $convertor_data['dbms']); +		$src_dbhost			= $this->request->variable('src_dbhost', $convertor_data['dbhost']); +		$src_dbport			= $this->request->variable('src_dbport', $convertor_data['dbport']); +		$src_dbuser			= $this->request->variable('src_dbuser', $convertor_data['dbuser']); +		$src_dbpasswd		= $this->request->variable('src_dbpasswd', $convertor_data['dbpasswd']); +		$src_dbname			= $this->request->variable('src_dbname', $convertor_data['dbname']); +		$src_table_prefix	= $this->request->variable('src_table_prefix', $convertor_data['table_prefix']); +		$forum_path			= $this->request->variable('forum_path', $convertor_data['forum_path']); +		$refresh			= $this->request->variable('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->variable('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 (!file_exists($this->phpbb_root_path . $forum_path . '/' . $test_file)) +		{ +			$error[] = $this->language->lang('COULD_NOT_FIND_PATH', $forum_path); +		} + +		$connect_test = false; +		$available_dbms = $this->db_helper->get_available_dbms(false, true, true); +		if (!isset($available_dbms[$src_dbms]) || !$available_dbms[$src_dbms]['AVAILABLE']) +		{ +			$error[] = $this->language->lang('INST_ERR_NO_DB'); +		} +		else +		{ +			$connect_test = $this->db_helper->check_database_connection($src_dbms, $src_dbhost, $src_dbport, $src_dbuser, $src_dbpasswd, $src_dbname, $src_table_prefix); +		} + +		extract($this->config_php_file->get_all()); + +		// 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[] = $this->language->lang('TABLE_PREFIX_SAME', $src_table_prefix); +		} + +		if (!$connect_test) +		{ +			$error[] = $this->language->lang('INST_ERR_DB_CONNECT'); +		} + +		$src_dbms = $this->config_php_file->convert_30_dbms_to_31($src_dbms); + +		// Check table prefix +		if (empty($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) +			{ +				/** @var \phpbb\db\driver\driver_interface $src_db */ +				$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 = $this->db; +				$same_db = true; +			} + +			$src_db->sql_return_on_error(true); +			$this->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(); + +				$db_tools_factory = new \phpbb\db\tools\factory(); +				$db_tools = $db_tools_factory->get($src_db); +				$tables_existing = $db_tools->sql_list_tables(); +				$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 .= $this->language->lang_array('DEFAULT_PREFIX_IS', array($convertor_data['forum_name'], $convertor_data['table_prefix'])); +				} + +				if (!empty($possible_prefix)) +				{ +					$msg .= '<br />'; +					$msg .= ($possible_prefix == '*') ? $this->language->lang('BLANK_PREFIX_FOUND') : $this->language->lang_array('PREFIX_FOUND', array($possible_prefix)); +					$src_table_prefix = ($possible_prefix == '*') ? '' : $possible_prefix; +				} + +				$error[] = $msg; +			} + +			$src_db->sql_freeresult($result); +			$src_db->sql_return_on_error(false); +		} + +		if (empty($error)) +		{ +			// Save convertor Status +			$this->config->set('convert_progress', serialize(array( +				'step'			=> '', +				'table_prefix'	=> $src_table_prefix, +				'tag'			=> $convertor, +			)), false); +			$this->config->set('convert_db_server', serialize(array( +				'dbms'			=> $src_dbms, +				'dbhost'		=> $src_dbhost, +				'dbport'		=> $src_dbport, +				'dbname'		=> $src_dbname, +			)), false); +			$this->config->set('convert_db_user', serialize(array( +				'dbuser'		=> $src_dbuser, +				'dbpasswd'		=> $src_dbpasswd, +			)), false); + +			// Save options +			$this->config->set('convert_options', serialize(array( +				'forum_path' => $this->phpbb_root_path . $forum_path, +				'refresh' => $refresh +			)), false); + +			$url = $this->controller_helper->route('phpbb_convert_convert', array('converter' => $convertor)); +			$this->iohandler->redirect($url); +			$this->iohandler->send_response(true); +		} +		else +		{ +			$this->render_settings_form($error); +		} +	} + +	/** +	 * Renders settings form +	 * +	 * @param array	$error	Array of errors +	 */ +	public function render_settings_form($error = array()) +	{ +		foreach ($error as $msg) +		{ +			$this->iohandler->add_error_message($msg); +		} + +		$dbms_options = array(); +		foreach ($this->db_helper->get_available_dbms() as $dbms_key => $dbms_array) +		{ +			$dbms_options[] = array( +				'value'		=> $dbms_key, +				'label'		=> 'DB_OPTION_' . strtoupper($dbms_key), +			); +		} + +		$form_title = 'SPECIFY_OPTIONS'; +		$form_data = array( +			'src_dbms'	=> array( +				'label'		=> 'DBMS', +				'type'		=> 'select', +				'options'	=> $dbms_options, +			), +			'src_dbhost' => array( +				'label'			=> 'DB_HOST', +				'description'	=> 'DB_HOST_EXPLAIN', +				'type'			=> 'text', +			), +			'src_dbport' => array( +				'label'			=> 'DB_PORT', +				'description'	=> 'DB_PORT_EXPLAIN', +				'type'			=> 'text', +			), +			'src_dbname' => array( +				'label'		=> 'DB_NAME', +				'type'		=> 'text', +			), +			'src_dbuser' => array( +				'label'		=> 'DB_USERNAME', +				'type'		=> 'text', +			), +			'src_dbpasswd' => array( +				'label'	=> 'DB_PASSWORD', +				'type'	=> 'password', +			), +			'src_table_prefix' => array( +				'label'			=> 'TABLE_PREFIX', +				'description'	=> 'TABLE_PREFIX_EXPLAIN', +				'type'			=> 'text', +			), +			'forum_path' => array( +				'label'			=> 'FORUM_PATH', +				'description'	=> 'FORUM_PATH_EXPLAIN', +				'type'			=> 'text', +			), +			'refresh' => array( +				'label'			=> 'REFRESH_PAGE', +				'description'	=> 'REFRESH_PAGE_EXPLAIN', +				'type'			=> 'radio', +				'options'		=> array( +					array( +						'value'		=> 0, +						'label'		=> 'NO', +						'selected'	=> true, +					), +					array( +						'value'		=> 1, +						'label'		=> 'YES', +						'selected'	=> false, +					), +				), +			), +			'submit' => array( +				'label'	=> 'SUBMIT', +				'type'	=> 'submit', +			), +		); + +		if ($this->request->is_ajax()) +		{ +			$this->iohandler->add_user_form_group($form_title, $form_data); +			$this->iohandler->send_response(true); +		} +		else +		{ +			$rendered_form = $this->iohandler->generate_form_render_data($form_title, $form_data); + +			$this->template->assign_vars(array( +				'TITLE'		=> $this->language->lang('STAGE_SETTINGS'), +				'CONTENT'	=> $rendered_form, +			)); +		} +	} + +	/** +	 * Render the list of available convertors +	 * +	 * @return \Symfony\Component\HttpFoundation\Response +	 */ +	protected function render_convert_list() +	{ +		$this->template->assign_vars(array( +			'TITLE'		=> $this->language->lang('CONVERT_INTRO'), +			'BODY'		=> $this->language->lang('CONVERT_INTRO_BODY'), +			'S_LIST'	=> true, +		)); + +		$convertors = $sort = array(); +		$get_info = true; // Global flag + +		$handle = @opendir($this->phpbb_root_path . 'install/convertors/'); + +		if (!$handle) +		{ +			die('Unable to access the convertors directory'); +		} + +		while ($entry = readdir($handle)) +		{ +			if (preg_match('/^convert_([a-z0-9_]+).' . $this->php_ext . '$/i', $entry, $m)) +			{ +				$phpbb_root_path = $this->phpbb_root_path; // These globals are required +				$phpEx = $this->php_ext; // See above +				include_once($this->phpbb_root_path . 'install/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) +		{ +			$this->template->assign_block_vars('convertors', array( +				'AUTHOR'	=> $convertors[$index]['author'], +				'SOFTWARE'	=> $convertors[$index]['forum_name'], +				'VERSION'	=> $convertors[$index]['version'], + +				'U_CONVERT'	=> $this->controller_helper->route('phpbb_convert_settings', array('converter' => $convertors[$index]['tag'])), +			)); +		} + +		return $this->controller_helper->render('installer_convert.html', 'SUB_INTRO', true); +	} + +	/** +	 * Renders an error form +	 * +	 * @param string		$msg +	 * @param string|bool	$desc +	 */ +	public function render_error($msg, $desc = false) +	{ +		if ($this->request->is_ajax()) +		{ +			$this->iohandler->add_error_message($msg, $desc); +			$this->iohandler->send_response(true); +		} +		else +		{ +			$this->template->assign_vars(array( +				'S_ERROR_BOX'	=> true, +				'ERROR_TITLE'	=> $this->language->lang($msg), +			)); + +			if ($desc) +			{ +				$this->template->assign_var('ERROR_MSG', $this->language->lang($desc)); +			} +		} +	} + +	/** +	 * Redirects an AJAX request to a non-JS version +	 * +	 * @param string	$url	URL to redirect to +	 */ +	public function redirect_to_html($url) +	{ +		$this->iohandler->redirect($url); +		$this->iohandler->send_response(true); +	} + +	private function setup_navigation($stage) +	{ +		$active = true; +		$completed = false; + +		switch ($stage) +		{ +			case 'finish': +				$this->navigation_provider->set_nav_property( +					array('convert', 0, 'finish'), +					array( +						'selected'	=> $active, +						'completed'	=> $completed, +					) +				); + +				$active = false; +				$completed = true; +			// no break; + +			case 'convert': +				$this->navigation_provider->set_nav_property( +					array('convert', 0, 'convert'), +					array( +						'selected'	=> $active, +						'completed'	=> $completed, +					) +				); + +				$active = false; +				$completed = true; +			// no break; + +			case 'settings': +				$this->navigation_provider->set_nav_property( +					array('convert', 0, 'settings'), +					array( +						'selected'	=> $active, +						'completed'	=> $completed, +					) +				); + +				$active = false; +				$completed = true; +			// no break; + +			case 'intro': +				$this->navigation_provider->set_nav_property( +					array('convert', 0, 'intro'), +					array( +						'selected'	=> $active, +						'completed'	=> $completed, +					) +				); +			break; +		} +	} +} diff --git a/phpBB/install/convert/convert.php b/phpBB/install/convert/convert.php new file mode 100644 index 0000000000..3e9e562f2e --- /dev/null +++ b/phpBB/install/convert/convert.php @@ -0,0 +1,60 @@ +<?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. + * + */ + +namespace phpbb\convert; + +/** + * Class holding all convertor-specific details. + * + * WARNING: This file did not meant to be present in a production environment, so moving this file to a location which + * 			is accessible after board installation might lead to security issues. + */ +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 __construct($p_master) +	{ +		$this->p_master = $p_master; +	} +} diff --git a/phpBB/install/install_convert.php b/phpBB/install/convert/convertor.php index 10b05eb559..f7f05ebdae 100644 --- a/phpBB/install/install_convert.php +++ b/phpBB/install/convert/convertor.php @@ -1,641 +1,85 @@  <?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. -* -*/ + * + * 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. + * + */ + +namespace phpbb\convert; + +use phpbb\install\controller\helper; +use phpbb\template\template;  /** -*/ - -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 + * Convertor backend class + * + * WARNING: This file did not meant to be present in a production environment, so moving this file to a location which + * 			is accessible after board installation might lead to security issues. + */ +class convertor  { -	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; -		} -	} +	 * @var helper +	 */ +	protected $controller_helper;  	/** -	* 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; -	} +	 * @var \phpbb\filesystem\filesystem +	 */ +	protected $filesystem;  	/** -	* 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'], -			)); -		} -	} +	 * @var \phpbb\template\template +	 */ +	protected $template;  	/** -	*/ -	function get_convert_settings($sub) +	 * Constructor +	 * +	 * @param template	$template +	 * @param helper	$controller_helper +	 */ +	public function __construct(template $template, helper $controller_helper)  	{ -		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); +		global $convert, $phpbb_filesystem; -		$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), -				) -			); -		} +		$this->template = $template; +		$this->filesystem = $phpbb_filesystem; +		$this->controller_helper = $controller_helper; -		$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", -		)); +		$convert = new convert($this);  	}  	/** -	* The function which does the actual work (or dispatches it to the relevant places) -	*/ -	function convert_data($sub) +	 * The function which does the actual work (or dispatches it to the relevant places) +	 */ +	function convert_data($converter)  	{ -		global $template, $user, $phpbb_root_path, $phpEx, $db, $lang, $config, $cache, $auth; +		global $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; +		global $request, $phpbb_dispatcher; +		$phpbb_config_php_file = new \phpbb\config_php_file($phpbb_root_path, $phpEx);  		extract($phpbb_config_php_file->get_all()); -		require($phpbb_root_path . 'includes/constants.' . $phpEx); -		require($phpbb_root_path . 'includes/functions_convert.' . $phpEx); +		require_once($phpbb_root_path . 'includes/constants.' . $phpEx); +		require_once($phpbb_root_path . 'includes/functions_convert.' . $phpEx);  		$dbms = $phpbb_config_php_file->convert_30_dbms_to_31($dbms); +		/** @var \phpbb\db\driver\driver_interface $db */  		$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); +		$config = new \phpbb\config\db($db, new \phpbb\cache\driver\dummy, CONFIG_TABLE);  		// Override a couple of config variables for the duration  		$config['max_quote_depth'] = 0; @@ -648,12 +92,6 @@ class install_convert extends module  		$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']))  		{ @@ -671,9 +109,11 @@ class install_convert extends module  			!isset($convert->options['dbname']) ||  			!isset($convert->options['table_prefix']))  		{ -			$this->p_master->error($user->lang['NO_CONVERT_SPECIFIED'], __LINE__, __FILE__); +			$this->error($user->lang['NO_CONVERT_SPECIFIED'], __LINE__, __FILE__);  		} +		$this->template->assign_var('S_CONV_IN_PROGRESS', true); +  		// Make some short variables accessible, for easier referencing  		$convert->convertor_tag = basename($convert->options['tag']);  		$convert->src_dbms = $convert->options['dbms']; @@ -690,6 +130,7 @@ class install_convert extends module  		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; +			/** @var \phpbb\db\driver\driver $src_db */  			$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; @@ -703,10 +144,9 @@ class install_convert extends module  		$convert->mysql_convert = false;  		switch ($src_db->sql_layer)  		{ -			case 'sqlite':  			case 'sqlite3':  				$convert->src_truncate_statement = 'DELETE FROM '; -			break; +				break;  			// Thanks MySQL, for silently converting...  			case 'mysql': @@ -716,16 +156,16 @@ class install_convert extends module  					$convert->mysql_convert = true;  				}  				$convert->src_truncate_statement = 'TRUNCATE TABLE '; -			break; +				break;  			case 'mysqli':  				$convert->mysql_convert = true;  				$convert->src_truncate_statement = 'TRUNCATE TABLE '; -			break; +				break;  			default:  				$convert->src_truncate_statement = 'TRUNCATE TABLE '; -			break; +				break;  		}  		if ($convert->mysql_convert && !$same_db) @@ -735,14 +175,13 @@ class install_convert extends module  		switch ($db->get_sql_layer())  		{ -			case 'sqlite':  			case 'sqlite3':  				$convert->truncate_statement = 'DELETE FROM '; -			break; +				break;  			default:  				$convert->truncate_statement = 'TRUNCATE TABLE '; -			break; +				break;  		}  		$get_info = false; @@ -750,12 +189,12 @@ class install_convert extends module  		// 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__); +			$this->error($user->lang['CONVERT_NOT_EXIST'], __LINE__, __FILE__);  		}  		if (file_exists('./convertors/functions_' . $convert->convertor_tag . '.' . $phpEx))  		{ -			include('./convertors/functions_' . $convert->convertor_tag . '.' . $phpEx); +			include_once('./convertors/functions_' . $convert->convertor_tag . '.' . $phpEx);  		}  		$get_info = true; @@ -778,7 +217,7 @@ class install_convert extends module  		// 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__); +			$this->error(sprintf($user->lang['COULD_NOT_FIND_PATH'], $convert->options['forum_path']), __LINE__, __FILE__);  		}  		$search_type = $config['search_type']; @@ -787,7 +226,7 @@ class install_convert extends module  		if (!class_exists($search_type))  		{  			$search_type = '\phpbb\search\fulltext_native'; -			set_config('search_type', $search_type); +			$config->set('search_type', $search_type);  		}  		if (!class_exists($search_type)) @@ -803,24 +242,24 @@ class install_convert extends module  			trigger_error($error);  		} -		include($phpbb_root_path . 'includes/message_parser.' . $phpEx); -		$message_parser = new parse_message(); +		include_once($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); +		$jump = $request->variable('jump', 0); +		$final_jump = $request->variable('final_jump', 0); +		$sync_batch = $request->variable('sync_batch', -1); +		$last_statement = $request->variable('last', 0);  		// We are running sync...  		if ($sync_batch >= 0)  		{ -			$this->sync_forums($sync_batch); +			$this->sync_forums($converter, $sync_batch);  			return;  		}  		if ($jump)  		{ -			$this->jump($jump, $last_statement); +			$this->jump($converter, $jump, $last_statement);  			return;  		} @@ -830,9 +269,9 @@ class install_convert extends module  			return;  		} -		$current_table = request_var('current_table', 0); +		$current_table = $request->variable('current_table', 0);  		$old_current_table = min(-1, $current_table - 1); -		$skip_rows = request_var('skip_rows', 0); +		$skip_rows = $request->variable('skip_rows', 0);  		if (!$current_table && !$skip_rows)  		{ @@ -856,10 +295,10 @@ class install_convert extends module  						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__); +							$this->error($user->lang['DEV_NO_TEST_FILE'], __LINE__, __FILE__);  						} -						if (!$local_path || !phpbb_is_writable($phpbb_root_path . $local_path)) +						if (!$local_path || !$this->filesystem->is_writable($phpbb_root_path . $local_path))  						{  							if (!$local_path)  							{ @@ -877,11 +316,11 @@ class install_convert extends module  				{  					$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); +					$this->error(sprintf($msg, implode('<br />', $bad_folders)), __LINE__, __FILE__, true); -					$template->assign_vars(array( +					$this->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", +						'U_ACTION'	=> $this->controller_helper->route('phpbb_convert_convert', array('converter' => $converter)),  					));  					return;  				} @@ -909,9 +348,9 @@ class install_convert extends module  								$temp_data = array($temp_data);  							} -							foreach ($temp_data as $val) +							foreach ($temp_data as $value)  							{ -								if (preg_match('/([a-z0-9_]+)\.([a-z0-9_]+)\)* ?A?S? ?([a-z0-9_]*?)\.?([a-z0-9_]*)$/i', $val, $m)) +								if (preg_match('/([a-z0-9_]+)\.([a-z0-9_]+)\)* ?A?S? ?([a-z0-9_]*?)\.?([a-z0-9_]*)$/i', $value, $m))  								{  									$table = $convert->src_table_prefix . $m[1];  									$tables_list[$table] = $table; @@ -975,14 +414,14 @@ class install_convert extends module  				if (sizeof($missing_tables) == sizeof($tables_list))  				{ -					$this->p_master->error($user->lang['NO_TABLES_FOUND'] . ' ' . $user->lang['CHECK_TABLE_PREFIX'], __LINE__, __FILE__); +					$this->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__); +					$this->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'); +				$url = $this->save_convert_progress($converter, 'confirm=1');  				$msg = $user->lang['PRE_CONVERT_COMPLETE'];  				if ($convert->convertor_data['author_notes']) @@ -990,16 +429,16 @@ class install_convert extends module  					$msg .= '</p><p>' . sprintf($user->lang['AUTHOR_NOTES'], $convert->convertor_data['author_notes']);  				} -				$template->assign_vars(array( +				$this->template->assign_vars(array(  					'L_SUBMIT'		=> $user->lang['CONTINUE_CONVERT'], -					'L_MESSAGE'		=> $msg, +					'BODY'			=> $msg,  					'U_ACTION'		=> $url,  				));  				return;  			} // if (!$request->variable('confirm', false))) -			$template->assign_block_vars('checks', array( +			$this->template->assign_block_vars('checks', array(  				'S_LEGEND'		=> true,  				'LEGEND'		=> $user->lang['STARTING_CONVERT'],  			)); @@ -1016,7 +455,7 @@ class install_convert extends module  				$config['max_post_chars'] = $config['min_post_chars'] = 0;  			} -			$template->assign_block_vars('checks', array( +			$this->template->assign_block_vars('checks', array(  				'TITLE'		=> $user->lang['CONFIG_CONVERT'],  				'RESULT'	=> $user->lang['DONE'],  			)); @@ -1063,13 +502,13 @@ class install_convert extends module  				}  			} -			$template->assign_block_vars('checks', array( +			$this->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( +		$this->template->assign_block_vars('checks', array(  			'S_LEGEND'		=> true,  			'LEGEND'		=> $user->lang['FILLING_TABLES'],  		)); @@ -1086,7 +525,7 @@ class install_convert extends module  				continue;  			} -			$template->assign_block_vars('checks', array( +			$this->template->assign_block_vars('checks', array(  				'TITLE'	=> sprintf($user->lang['FILLING_TABLE'], $schema['target']),  			)); @@ -1139,7 +578,7 @@ class install_convert extends module  					{  						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; +							break;  						case 'oracle':  							$result = $db->sql_query('SELECT MAX(' . $schema['autoincrement'] . ') as max_id FROM ' . $schema['target']); @@ -1153,7 +592,7 @@ class install_convert extends module  								$db->sql_query('DROP SEQUENCE ' . $schema['target'] . '_seq');  								$db->sql_query('CREATE SEQUENCE ' . $schema['target'] . '_seq START WITH ' . ($largest_id + 1));  							} -						break; +							break;  					}  				}  			} @@ -1246,7 +685,7 @@ class install_convert extends module  					$rows = ceil($counting/($mtime - $batch_time)) . " rows/s ($counting rows) | ";  				} -				$template->assign_block_vars('checks', array( +				$this->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'] : ''),  				)); @@ -1276,11 +715,10 @@ class install_convert extends module  				{  					switch ($db->get_sql_layer())  					{ -						case 'mssql':  						case 'mssql_odbc':  						case 'mssqlnative':  							$db->sql_query('SET IDENTITY_INSERT ' . $schema['target'] . ' ON'); -						break; +							break;  					}  				} @@ -1337,7 +775,7 @@ class install_convert extends module  										{  											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); +												$this->db_error($user->lang['DB_ERR_INSERT'], htmlspecialchars($insert_query . $waiting_sql) . '<br /><br />' . htmlspecialchars(print_r($db->_sql_error(), true)), __LINE__, __FILE__, true);  											}  										} @@ -1347,7 +785,7 @@ class install_convert extends module  									$waiting_rows = array();  								} -							break; +								break;  							default:  								$insert_sql = $insert_query . '(' . implode(', ', $insert_values) . ')'; @@ -1356,13 +794,13 @@ class install_convert extends module  								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); +									$this->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; +								break;  						}  					} @@ -1391,7 +829,7 @@ class install_convert extends module  						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); +							$this->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); @@ -1404,15 +842,14 @@ class install_convert extends module  				{  					switch ($db->get_sql_layer())  					{ -						case 'mssql':  						case 'mssql_odbc':  						case 'mssqlnative':  							$db->sql_query('SET IDENTITY_INSERT ' . $schema['target'] . ' OFF'); -						break; +							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; +							break;  						case 'oracle':  							$result = $db->sql_query('SELECT MAX(' . $schema['autoincrement'] . ') as max_id FROM ' . $schema['target']); @@ -1426,7 +863,7 @@ class install_convert extends module  								$db->sql_query('DROP SEQUENCE ' . $schema['target'] . '_seq');  								$db->sql_query('CREATE SEQUENCE ' . $schema['target'] . '_seq START WITH ' . ($largest_id + 1));  							} -						break; +							break;  					}  				}  			} @@ -1446,15 +883,15 @@ class install_convert extends module  				}*/  				// Looks like we ran out of time. -				$url = $this->save_convert_progress('&current_table=' . $current_table . '&skip_rows=' . $skip_rows); +				$url = $this->save_convert_progress($converter, '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, +				$this->template->assign_vars(array( +					'BODY'			=> $msg,  					'L_SUBMIT'		=> $user->lang['CONTINUE_CONVERT'],  					'U_ACTION'		=> $url,  				)); @@ -1465,9 +902,9 @@ class install_convert extends module  		}  		// Process execute_last then we'll be done -		$url = $this->save_convert_progress('&jump=1'); +		$url = $this->save_convert_progress($converter, 'jump=1'); -		$template->assign_vars(array( +		$this->template->assign_vars(array(  			'L_SUBMIT'		=> $user->lang['FINAL_STEP'],  			'U_ACTION'		=> $url,  		)); @@ -1477,14 +914,16 @@ class install_convert extends module  	}  	/** -	* Sync function being executed at the middle, some functions need to be executed after a successful sync. -	*/ -	function sync_forums($sync_batch) +	 * Sync function being executed at the middle, some functions need to be executed after a successful sync. +	 */ +	function sync_forums($converter, $sync_batch)  	{ -		global $template, $user, $db, $phpbb_root_path, $phpEx, $config, $cache; +		global $user, $db, $phpbb_root_path, $phpEx, $config, $cache;  		global $convert; -		$template->assign_block_vars('checks', array( +		include_once ($phpbb_root_path . 'includes/functions_admin.' . $phpEx); + +		$this->template->assign_block_vars('checks', array(  			'S_LEGEND'	=> true,  			'LEGEND'	=> $user->lang['SYNC_TOPICS'],  		)); @@ -1519,7 +958,7 @@ class install_convert extends module  			// Sync all topics in batch mode...  			sync('topic', 'range', 'topic_id BETWEEN ' . $sync_batch . ' AND ' . $end, true, true); -			$template->assign_block_vars('checks', array( +			$this->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'],  			)); @@ -1529,9 +968,9 @@ class install_convert extends module  		if ($sync_batch >= $primary_max)  		{ -			$url = $this->save_convert_progress('&final_jump=1'); +			$url = $this->save_convert_progress($converter, 'final_jump=1'); -			$template->assign_vars(array( +			$this->template->assign_vars(array(  				'L_SUBMIT'		=> $user->lang['CONTINUE_CONVERT'],  				'U_ACTION'		=> $url,  			)); @@ -1544,9 +983,9 @@ class install_convert extends module  			$sync_batch--;  		} -		$url = $this->save_convert_progress('&sync_batch=' . $sync_batch); +		$url = $this->save_convert_progress($converter, 'sync_batch=' . $sync_batch); -		$template->assign_vars(array( +		$this->template->assign_vars(array(  			'L_SUBMIT'		=> $user->lang['CONTINUE_CONVERT'],  			'U_ACTION'		=> $url,  		)); @@ -1556,42 +995,44 @@ class install_convert extends module  	}  	/** -	* Save the convertor status -	*/ -	function save_convert_progress($step) +	 * Save the convertor status +	 */ +	function save_convert_progress($convertor_tag, $step)  	{ -		global $convert, $language; +		global $config, $convert, $language;  		// Save convertor Status -		set_config('convert_progress', serialize(array( +		$config->set('convert_progress', serialize(array(  			'step'			=> $step,  			'table_prefix'	=> $convert->src_table_prefix,  			'tag'			=> $convert->convertor_tag, -		)), true); +		)), false); -		set_config('convert_db_server', serialize(array( +		$config->set('convert_db_server', serialize(array(  			'dbms'			=> $convert->src_dbms,  			'dbhost'		=> $convert->src_dbhost,  			'dbport'		=> $convert->src_dbport,  			'dbname'		=> $convert->src_dbname, -		)), true); +		)), false); -		set_config('convert_db_user', serialize(array( +		$config->set('convert_db_user', serialize(array(  			'dbuser'		=> $convert->src_dbuser,  			'dbpasswd'		=> $convert->src_dbpasswd, -		)), true); +		)), false); -		return $this->p_master->module_url . "?mode={$this->mode}&sub=in_progress&tag={$convert->convertor_tag}$step&language=$language"; +		return $this->controller_helper->route('phpbb_convert_convert', array('converter' => $convertor_tag)) . '?' . $step;  	}  	/** -	* Finish conversion, the last function to be called. -	*/ +	 * Finish conversion, the last function to be called. +	 */  	function finish_conversion()  	{ -		global $db, $phpbb_root_path, $phpEx, $convert, $config, $language, $user, $template; +		global $db, $phpbb_root_path, $phpEx, $convert, $config, $language, $user;  		global $cache, $auth, $phpbb_container, $phpbb_log; +		include_once ($phpbb_root_path . 'includes/functions_admin.' . $phpEx); +  		$db->sql_query('DELETE FROM ' . CONFIG_TABLE . "  			WHERE config_name = 'convert_progress'  				OR config_name = 'convert_options' @@ -1599,16 +1040,15 @@ class install_convert extends module  				OR config_name = 'convert_db_user'");  		$db->sql_query('DELETE FROM ' . SESSIONS_TABLE); -		@unlink($phpbb_root_path . 'cache/data_global.' . $phpEx); +		@unlink($phpbb_container->getParameter('core.cache_dir') . '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']); +		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_INSTALL_CONVERTED', false, array($convert->convertor_data['forum_name'], $config['version'])); -		$url = $this->p_master->module_url . "?mode={$this->mode}&sub=final&language=$language"; +		$url = $this->controller_helper->route('phpbb_convert_finish'); -		$template->assign_vars(array( +		$this->template->assign_vars(array(  			'L_SUBMIT'		=> $user->lang['FINAL_STEP'],  			'U_ACTION'		=> $url,  		)); @@ -1618,14 +1058,14 @@ class install_convert extends module  	}  	/** -	* This function marks the steps after syncing -	*/ +	 * 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 $user, $src_db, $same_db, $db, $phpbb_root_path, $phpEx, $config, $cache;  		global $convert; -		$template->assign_block_vars('checks', array( +		$this->template->assign_block_vars('checks', array(  			'S_LEGEND'	=> true,  			'LEGEND'	=> $user->lang['PROCESS_LAST'],  		)); @@ -1636,14 +1076,14 @@ class install_convert extends module  			update_topics_posted(); -			$template->assign_block_vars('checks', array( +			$this->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( +				$this->template->assign_vars(array(  					'S_ERROR_BOX'	=> true,  					'ERROR_TITLE'	=> $user->lang['UPDATE_TOPICS_POSTED'],  					'ERROR_MSG'		=> $user->lang['UPDATE_TOPICS_POSTED_ERR'], @@ -1657,14 +1097,18 @@ class install_convert extends module  	}  	/** -	* This function marks the steps before syncing (jump=1) -	*/ -	function jump($jump, $last_statement) +	 * This function marks the steps before syncing (jump=1) +	 */ +	function jump($converter, $jump, $last_statement)  	{ -		global $template, $user, $src_db, $same_db, $db, $phpbb_root_path, $phpEx, $config, $cache; +		/** @var \phpbb\db\driver\driver_interface $src_db */ +		/** @var \phpbb\cache\driver\driver_interface $cache */ +		global $user, $src_db, $same_db, $db, $phpbb_root_path, $phpEx, $config, $cache;  		global $convert; -		$template->assign_block_vars('checks', array( +		include_once ($phpbb_root_path . 'includes/functions_admin.' . $phpEx); + +		$this->template->assign_block_vars('checks', array(  			'S_LEGEND'	=> true,  			'LEGEND'	=> $user->lang['PROCESS_LAST'],  		)); @@ -1688,20 +1132,20 @@ class install_convert extends module  						eval($convert->convertor['execute_last'][$last_statement]);  						// @codingStandardsIgnoreEnd -						$template->assign_block_vars('checks', array( +						$this->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); +						$url = $this->save_convert_progress($converter, '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( +						$this->template->assign_vars(array(  							'L_SUBMIT'		=> $user->lang['CONTINUE_LAST'], -							'L_MESSAGE'		=> $msg, +							'BODY'			=> $msg,  							'U_ACTION'		=> $url,  						)); @@ -1759,20 +1203,20 @@ class install_convert extends module  			if (!isset($config['board_startdate']) || ($row['board_startdate'] < $config['board_startdate'] && $row['board_startdate'] > 0))  			{ -				set_config('board_startdate', $row['board_startdate']); +				$config->set('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( +			$this->template->assign_block_vars('checks', array(  				'TITLE'		=> $user->lang['CLEAN_VERIFY'],  				'RESULT'	=> $user->lang['DONE'],  			)); -			$url = $this->save_convert_progress('&jump=2'); +			$url = $this->save_convert_progress($converter, 'jump=2'); -			$template->assign_vars(array( +			$this->template->assign_vars(array(  				'L_SUBMIT'		=> $user->lang['CONTINUE_CONVERT'],  				'U_ACTION'		=> $url,  			)); @@ -1790,15 +1234,15 @@ class install_convert extends module  			sync('forum', '', '', false, true);  			$cache->destroy('sql', FORUMS_TABLE); -			$template->assign_block_vars('checks', array( +			$this->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'); +			$url = $this->save_convert_progress($converter, 'sync_batch=0'); -			$template->assign_vars(array( +			$this->template->assign_vars(array(  				'L_SUBMIT'		=> $user->lang['CONTINUE_CONVERT'],  				'U_ACTION'		=> $url,  			)); @@ -1908,14 +1352,14 @@ class install_convert extends module  				// 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__); +					$this->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__); +						$this->error(sprintf($user->lang['NAMING_CONFLICT'], $m[2], $m[3], $schema['left_join']), __LINE__, __FILE__);  					}  					$m[2] = $aliases[$m[2]]; @@ -1961,11 +1405,11 @@ class install_convert extends module  	}  	/** -	* Function for processing the currently handled row -	*/ +	 * 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 $user, $phpbb_root_path, $phpEx, $db, $lang, $config, $cache;  		global $convert, $convert_row;  		$sql_flag = false; @@ -2115,36 +1559,56 @@ class install_convert extends module  	}  	/** -	* Own meta refresh function to be able to change the global time used -	*/ +	 * Own meta refresh function to be able to change the global time used +	 */  	function meta_refresh($url)  	{ -		global $convert, $template; +		global $convert;  		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 . '" />') +			$this->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), -	); +	 * Error handler function +	 * +	 * This function needs to be kept for BC +	 * +	 * @param $error +	 * @param $line +	 * @param $file +	 * @param bool|false $skip +	 */ +	public function error($error, $line, $file, $skip = false) +	{ +		$this->template->assign_block_vars('errors', array( +			'TITLE'	=> $error, +			'DESCRIPTION' => 'In ' . $file . ' on line ' . $line, +		)); +	} + +	/** +	 * Database error handler function +	 * +	 * This function needs to be kept for BC +	 * +	 * @param $error +	 * @param $sql +	 * @param $line +	 * @param $file +	 * @param bool|false $skip +	 */ +	public function db_error($error, $sql, $line, $file, $skip = false) +	{ +		$this->template->assign_block_vars('errors', array( +			'TITLE'	=> $error, +			'DESCRIPTION' => 'In ' . $file . ' on line ' . $line . '<br /><br /><strong>SQL:</strong> ' . $sql, +		)); +	}  } diff --git a/phpBB/install/convertors/convert_phpbb20.php b/phpBB/install/convertors/convert_phpbb20.php index 4aca80188a..aff9eef55b 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.11', +	'phpbb_version'	=> '3.2.1',  	'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..6f43e1915e 100644 --- a/phpBB/install/convertors/functions_phpbb20.php +++ b/phpBB/install/convertors/functions_phpbb20.php @@ -54,7 +54,7 @@ function phpbb_forum_flags()  */  function phpbb_insert_forums()  { -	global $db, $src_db, $same_db, $convert, $user, $config; +	global $db, $src_db, $same_db, $convert, $user;  	$db->sql_query($convert->truncate_statement . FORUMS_TABLE); @@ -94,7 +94,6 @@ function phpbb_insert_forums()  	switch ($db->get_sql_layer())  	{ -		case 'mssql':  		case 'mssql_odbc':  		case 'mssqlnative':  			$db->sql_query('SET IDENTITY_INSERT ' . FORUMS_TABLE . ' ON'); @@ -179,7 +178,6 @@ function phpbb_insert_forums()  		$db->sql_query($sql);  		$cats_added[$unknown_cat_id] = $max_forum_id; -		$max_forum_id++;  	}  	// Now insert the forums @@ -295,7 +293,6 @@ function phpbb_insert_forums()  			$db->sql_query("SELECT SETVAL('" . FORUMS_TABLE . "_seq',(select case when max(forum_id)>0 then max(forum_id)+1 else 1 end from " . FORUMS_TABLE . '));');  		break; -		case 'mssql':  		case 'mssql_odbc':  		case 'mssqlnative':  			$db->sql_query('SET IDENTITY_INSERT ' . FORUMS_TABLE . ' OFF'); @@ -422,8 +419,6 @@ function phpbb_set_encoding($text, $grab_user_lang = true)  		}  	} -	$encoding = $lang_enc_array[$get_lang]; -  	return utf8_recode($text, $lang_enc_array[$get_lang]);  } @@ -514,12 +509,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;  		}  	} @@ -564,7 +559,7 @@ function phpbb_copy_table_fields()  */  function phpbb_convert_authentication($mode)  { -	global $db, $src_db, $same_db, $convert, $user, $config, $cache; +	global $db, $src_db, $same_db, $convert, $config;  	if ($mode == 'start')  	{ @@ -661,7 +656,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 +985,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'  		); @@ -1221,7 +1216,7 @@ function phpbb_replace_size($matches)  */  function phpbb_prepare_message($message)  { -	global $phpbb_root_path, $phpEx, $db, $convert, $user, $config, $cache, $convert_row, $message_parser; +	global $convert, $user, $convert_row, $message_parser;  	if (!$message)  	{ @@ -1251,9 +1246,6 @@ function phpbb_prepare_message($message)  		$message = str_replace('\"', '"', $message);  	} -	// Already the new user id ;) -	$user_id = $convert->row['poster_id']; -  	$message = str_replace('<br />', "\n", $message);  	$message = str_replace('<', '<', $message);  	$message = str_replace('>', '>', $message); @@ -1305,7 +1297,7 @@ function get_bbcode_bitfield()  */  function phpbb_post_edit_user()  { -	global $convert_row, $config; +	global $convert_row;  	if (isset($convert_row['post_edit_count']))  	{ @@ -1326,7 +1318,7 @@ function phpbb_get_files_dir()  		return;  	} -	global $src_db, $same_db, $convert, $user, $config, $cache; +	global $src_db, $same_db, $convert, $user;  	if ($convert->mysql_convert && $same_db)  	{ @@ -1365,7 +1357,7 @@ function phpbb_get_files_dir()  */  function phpbb_copy_thumbnails()  { -	global $db, $convert, $user, $config, $cache, $phpbb_root_path; +	global $convert, $config, $phpbb_root_path;  	$src_path = $convert->options['forum_path'] . '/' . phpbb_get_files_dir() . '/thumbs/'; @@ -1611,8 +1603,6 @@ function phpbb_get_avatar_width($user_avatar)  */  function phpbb_privmsgs_to_userid($to_userid)  { -	global $config; -  	return 'u_' . phpbb_user_id($to_userid);  } @@ -1659,7 +1649,7 @@ function phpbb_get_savebox_id($user_id)  */  function phpbb_import_attach_config()  { -	global $db, $src_db, $same_db, $convert, $config; +	global $src_db, $same_db, $convert, $config;  	if ($convert->mysql_convert && $same_db)  	{ @@ -1682,29 +1672,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']);  }  /** @@ -1765,9 +1755,8 @@ function phpbb_disallowed_username($username)  */  function phpbb_create_userconv_table()  { -	global $db, $src_db, $convert, $table_prefix, $user, $lang; +	global $db; -	$map_dbms = '';  	switch ($db->get_sql_layer())  	{  		case 'mysql': @@ -1789,7 +1778,6 @@ function phpbb_create_userconv_table()  			$map_dbms = 'mysql_41';  		break; -		case 'mssql':  		case 'mssql_odbc':  		case 'mssqlnative':  			$map_dbms = 'mssql'; @@ -1839,7 +1827,6 @@ function phpbb_create_userconv_table()  			)';  		break; -		case 'sqlite':  		case 'sqlite3':  			$create_sql = 'CREATE TABLE ' . USERCONV_TABLE . ' (  				user_id INTEGER NOT NULL DEFAULT \'0\', @@ -1856,7 +1843,7 @@ function phpbb_create_userconv_table()  function phpbb_check_username_collisions()  { -	global $db, $src_db, $convert, $table_prefix, $user, $lang; +	global $db, $src_db, $convert, $user, $lang;  	// now find the clean version of the usernames that collide  	$sql = 'SELECT username_clean @@ -1926,7 +1913,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);  } @@ -1967,13 +1956,14 @@ function phpbb_add_notification_options($user_notify_pm)  		);  	} -	$sql = $db->sql_multi_insert(USER_NOTIFICATIONS_TABLE, $rows); +	$db->sql_multi_insert(USER_NOTIFICATIONS_TABLE, $rows);  }  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..00e806f639 100644 --- a/phpBB/install/data/confusables.php +++ b/phpBB/install/data/confusables.php @@ -628,19 +628,12 @@ function utf8_new_case_fold_nfkc($text, $option = 'full')  		"\xF0\x9D\x9E\xBB"	=> "\xCF\x83",  		"\xF0\x9D\x9F\x8A"	=> "\xCF\x9D",  	); -	global $phpbb_root_path, $phpEx;  	// 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 f367ae1fc0..0000000000 --- a/phpBB/install/database_update.php +++ /dev/null @@ -1,244 +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> -				</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"> -<meta http-equiv="X-UA-Compatible" content="IE=edge"> - -<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"> -						<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); -	} - -	// 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 b5d14f27cf..0000000000 --- a/phpBB/install/index.php +++ /dev/null @@ -1,834 +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 '<meta http-equiv="X-UA-Compatible" content="IE=edge">'; -		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_install.php b/phpBB/install/install_install.php deleted file mode 100644 index 8e57ed3edd..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 and maximum version of PHP -		$php_version = PHP_VERSION; - -		if ((version_compare($php_version, '5.3.3') < 0) || (version_compare($php_version, '7.0.0-dev', '>='))) -		{ -			$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 a00280a925..0000000000 --- a/phpBB/install/install_update.php +++ /dev/null @@ -1,1782 +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('_update_list_time'); -				$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) ? $cache->get('_update_list_time') : 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); -					$cache->put('_update_list_time', time()); - -					// 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..afc70f3302 --- /dev/null +++ b/phpBB/install/phpbbcli.php @@ -0,0 +1,52 @@ +#!/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'); +define('PHPBB_VERSION', '3.2.1-RC1'); +$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(); + +// Enable superglobals for cli support +$phpbb_installer_container->get('request')->enable_super_globals(); + +/** @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 index 1512b00563..28c3b9ff04 100644 --- a/phpBB/install/phpinfo.php +++ b/phpBB/install/phpinfo.php @@ -1,14 +1,14 @@  <?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. -* -*/ + * + * 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 cb0b06eb46..ca0e8bd614 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'); @@ -140,6 +142,8 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('fulltext_postgres_  INSERT INTO phpbb_config (config_name, config_value) VALUES ('fulltext_sphinx_indexer_mem_limit', '512');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('fulltext_sphinx_stopwords', '0');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('gzip_compress', '0'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('help_send_statistics', '1'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('help_send_statistics_time', '0');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('hot_threshold', '25');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('icons_path', 'images/icons');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_create_thumbnail', '0'); @@ -193,6 +197,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_search', '1')  INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_tplcompile', '0');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_unreads_search', '1');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_user_activity', '1'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_user_activity_limit', '5000');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_attachments', '3');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_attachments_pm', '1');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_autologin_time', '0'); @@ -237,6 +242,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('queue_interval', '  INSERT INTO phpbb_config (config_name, config_value) VALUES ('ranks_path', 'images/ranks');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('read_notification_expire_days', '30');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('read_notification_gc', '86400'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('remote_upload_verify', '0');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('require_activation', '0');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('referer_validation', '1');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('script_path', ''); @@ -273,7 +279,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.12-dev'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '3.2.2-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 +315,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 +559,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 +568,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 +723,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 +780,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 +795,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 +803,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..9a4f9bfe39 --- /dev/null +++ b/phpBB/install/startup.php @@ -0,0 +1,143 @@ +<?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; + +	if (error_reporting() == 0) +	{ +		return true; +	} + +	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; + +			if (!empty($phpbb_installer_container)) +			{ +				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); +				} +			} +			else +			{ +				print($msg); +			} + +			return; +		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 = new \phpbb\class_loader('phpbb\\convert\\', "{$phpbb_root_path}install/convert/", $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(); | 
