diff options
Diffstat (limited to 'phpBB/phpbb/install/module')
42 files changed, 6619 insertions, 0 deletions
| diff --git a/phpBB/phpbb/install/module/install_data/module.php b/phpBB/phpbb/install/module/install_data/module.php new file mode 100644 index 0000000000..77f1f73f1f --- /dev/null +++ b/phpBB/phpbb/install/module/install_data/module.php @@ -0,0 +1,28 @@ +<?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\install\module\install_data; + +/** + * Installer module for recovering and installing default data installation + */ +class module extends \phpbb\install\module_base +{ +	/** +	 * {@inheritdoc} +	 */ +	public function get_navigation_stage_path() +	{ +		return array('install', 0, 'install'); +	} +} diff --git a/phpBB/phpbb/install/module/install_data/task/add_bots.php b/phpBB/phpbb/install/module/install_data/task/add_bots.php new file mode 100644 index 0000000000..d45a6839a0 --- /dev/null +++ b/phpBB/phpbb/install/module/install_data/task/add_bots.php @@ -0,0 +1,262 @@ +<?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\install\module\install_data\task; + +use phpbb\install\exception\resource_limit_reached_exception; + +class add_bots extends \phpbb\install\task_base +{ +	/** +	 * 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 array +	 */ +	protected $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/', ''), +	); + +	/** +	 * @var \phpbb\db\driver\driver_interface +	 */ +	protected $db; + +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $install_config; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $io_handler; + +	/** +	 * @var \phpbb\language\language +	 */ +	protected $language; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * @var string +	 */ +	protected $php_ext; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\config							$install_config		Installer's config +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler			Input-output handler for the installer +	 * @param \phpbb\install\helper\container_factory				$container			Installer's DI container +	 * @param \phpbb\language\language								$language			Language provider +	 * @param string												$phpbb_root_path	Relative path to phpBB root +	 * @param string												$php_ext			PHP extension +	 */ +	public function __construct(\phpbb\install\helper\config $install_config, +								\phpbb\install\helper\iohandler\iohandler_interface $iohandler, +								\phpbb\install\helper\container_factory $container, +								\phpbb\language\language $language, +								$phpbb_root_path, +								$php_ext) +	{ +		parent::__construct(true); + +		$this->db				= $container->get('dbal.conn'); +		$this->install_config	= $install_config; +		$this->io_handler		= $iohandler; +		$this->language			= $language; +		$this->phpbb_root_path	= $phpbb_root_path; +		$this->php_ext			= $php_ext; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		$this->db->sql_return_on_error(true); + +		$sql = 'SELECT group_id +			FROM ' . GROUPS_TABLE . " +			WHERE group_name = 'BOTS'"; +		$result = $this->db->sql_query($sql); +		$group_id = (int) $this->db->sql_fetchfield('group_id'); +		$this->db->sql_freeresult($result); + +		if (!$group_id) +		{ +			// If we reach this point then something has gone very wrong +			$this->io_handler->add_error_message('NO_GROUP'); +		} + +		$i = $this->install_config->get('add_bot_index', 0); +		$bot_list = array_slice($this->bot_list, $i); + +		foreach ($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'				=> $this->install_config->get('default_lang'), +				'user_style'			=> 1, +				'user_timezone'			=> 'UTC', +				'user_dateformat'		=> $this->language->lang('default_dateformat'), +				'user_allow_massemail'	=> 0, +				'user_allow_pm'			=> 0, +			); + +			if (!function_exists('user_add')) +			{ +				include($this->phpbb_root_path . 'includes/functions_user.' . $this->php_ext); +			} + +			$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->io_handler->add_error_message('CONV_ERROR_INSERT_BOT'); + +				continue; +			} + +			$sql = 'INSERT INTO ' . BOTS_TABLE . ' ' . $this->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], +			)); + +			$this->db->sql_query($sql); + +			$i++; + +			// Stop execution if resource limit is reached +			if ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0) +			{ +				break; +			} +		} + +		$this->install_config->set('add_bot_index', $i); + +		if ($i < sizeof($this->bot_list)) +		{ +			throw new resource_limit_reached_exception(); +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 1; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return 'TASK_ADD_BOTS'; +	} +} diff --git a/phpBB/phpbb/install/module/install_data/task/add_languages.php b/phpBB/phpbb/install/module/install_data/task/add_languages.php new file mode 100644 index 0000000000..7ffdf4f276 --- /dev/null +++ b/phpBB/phpbb/install/module/install_data/task/add_languages.php @@ -0,0 +1,121 @@ +<?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\install\module\install_data\task; + +class add_languages extends \phpbb\install\task_base +{ +	/** +	 * @var \phpbb\db\driver\driver_interface +	 */ +	protected $db; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var \phpbb\language\language_file_helper +	 */ +	protected $language_helper; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler			Installer's input-output handler +	 * @param \phpbb\install\helper\container_factory				$container			Installer's DI container +	 * @param \phpbb\language\language_file_helper					$language_helper	Language file helper service +	 */ +	public function __construct(\phpbb\install\helper\iohandler\iohandler_interface $iohandler, +								\phpbb\install\helper\container_factory $container, +								\phpbb\language\language_file_helper $language_helper) +	{ +		$this->db				= $container->get('dbal.conn'); +		$this->iohandler		= $iohandler; +		$this->language_helper	= $language_helper; + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		$this->db->sql_return_on_error(true); + +		$languages = $this->language_helper->get_available_languages(); +		$installed_languages = array(); + +		foreach ($languages as $lang_info) +		{ +			$lang_pack = array( +				'lang_iso'			=> $lang_info['iso'], +				'lang_dir'			=> $lang_info['iso'], +				'lang_english_name'	=> htmlspecialchars($lang_info['name']), +				'lang_local_name'	=> htmlspecialchars($lang_info['local_name'], ENT_COMPAT, 'UTF-8'), +				'lang_author'		=> htmlspecialchars($lang_info['author'], ENT_COMPAT, 'UTF-8'), +			); + +			$this->db->sql_query('INSERT INTO ' . LANG_TABLE . ' ' . $this->db->sql_build_array('INSERT', $lang_pack)); + +			$installed_languages[] = (int) $this->db->sql_nextid(); +			if ($this->db->get_sql_error_triggered()) +			{ +				$error = $this->db->sql_error($this->db->get_sql_error_sql()); +				$this->iohandler->add_error_message($error['message']); +			} +		} + +		$sql = 'SELECT * FROM ' . PROFILE_FIELDS_TABLE; +		$result = $this->db->sql_query($sql); + +		$insert_buffer = new \phpbb\db\sql_insert_buffer($this->db, PROFILE_LANG_TABLE); +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			foreach ($installed_languages as $lang_id) +			{ +				$insert_buffer->insert(array( +					'field_id'				=> $row['field_id'], +					'lang_id'				=> $lang_id, + +					// Remove phpbb_ from field name +					'lang_name'				=> strtoupper(substr($row['field_name'], 6)), +					'lang_explain'			=> '', +					'lang_default_value'	=> '', +				)); +			} +		} + +		$this->db->sql_freeresult($result); + +		$insert_buffer->flush(); +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 1; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return 'TASK_ADD_LANGUAGES'; +	} +} diff --git a/phpBB/phpbb/install/module/install_data/task/add_modules.php b/phpBB/phpbb/install/module/install_data/task/add_modules.php new file mode 100644 index 0000000000..d21a5be823 --- /dev/null +++ b/phpBB/phpbb/install/module/install_data/task/add_modules.php @@ -0,0 +1,568 @@ +<?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\install\module\install_data\task; + +use phpbb\install\exception\resource_limit_reached_exception; +use phpbb\install\helper\config; +use phpbb\install\helper\container_factory; +use phpbb\install\helper\iohandler\iohandler_interface; + +class add_modules extends \phpbb\install\task_base +{ +	/** +	 * @var config +	 */ +	protected $config; + +	/** +	 * @var \phpbb\db\driver\driver_interface +	 */ +	protected $db; + +	/** +	 * @var \phpbb\extension\manager +	 */ +	protected $extension_manager; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var \phpbb\module\module_manager +	 */ +	protected $module_manager; + +	/** +	 * Define the module structure so that we can populate the database without +	 * needing to hard-code module_id values +	 * +	 * @var array +	 */ +	protected $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 array +	 */ +	protected $module_categories_basenames = array( +		'UCP_PM' => 'ucp_pm', +	); + +	/** +	 * @var array +	 */ +	protected $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', +			), +		), +	); + +	/** +	 * Constructor +	 * +	 * @parma config				$config		Installer's config +	 * @param iohandler_interface	$iohandler	Installer's input-output handler +	 * @param container_factory		$container	Installer's DI container +	 */ +	public function __construct(config $config, iohandler_interface $iohandler, container_factory $container) +	{ +		$this->config				= $config; +		$this->db					= $container->get('dbal.conn'); +		$this->extension_manager	= $container->get('ext.manager'); +		$this->iohandler			= $iohandler; +		$this->module_manager		= $container->get('module.manager'); + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		$this->db->sql_return_on_error(true); + +		$module_classes = array('acp', 'mcp', 'ucp'); +		$total = sizeof($module_classes); +		$i = $this->config->get('module_class_index', 0); +		$module_classes = array_slice($module_classes, $i); + +		foreach ($module_classes as $module_class) +		{ +			$categories = $this->config->get('module_categories_array', array()); + +			$k = $this->config->get('module_categories_index', 0); +			$module_categories = array_slice($this->module_categories[$module_class], $k); +			$timed_out = false; + +			foreach ($module_categories as $cat_name => $subs) +			{ +				// Check if this sub-category has a basename. If it has, use it. +				$basename = (isset($this->module_categories_basenames[$cat_name])) ? $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'		=> '', +				); + +				$this->module_manager->update_module_data($module_data); + +				// Check for last sql error happened +				if ($this->db->get_sql_error_triggered()) +				{ +					$error = $this->db->sql_error($this->db->get_sql_error_sql()); +					$this->iohandler->add_error_message('INST_ERR_DB', $error['message']); +				} + +				$categories[$cat_name]['id'] = (int) $module_data['module_id']; +				$categories[$cat_name]['parent_id'] = 0; + +				if (is_array($subs)) +				{ +					foreach ($subs as $level2_name) +					{ +						// Check if this sub-category has a basename. If it has, use it. +						$basename = (isset($this->module_categories_basenames[$level2_name])) ? $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'		=> '', +						); + +						$this->module_manager->update_module_data($module_data); + +						// Check for last sql error happened +						if ($this->db->get_sql_error_triggered()) +						{ +							$error = $this->db->sql_error($this->db->get_sql_error_sql()); +							$this->iohandler->add_error_message('INST_ERR_DB', $error['message']); +						} + +						$categories[$level2_name]['id'] = (int) $module_data['module_id']; +						$categories[$level2_name]['parent_id'] = (int) $categories[$cat_name]['id']; +					} +				} + +				$k++; + +				// Stop execution if resource limit is reached +				if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0) +				{ +					$timed_out = true; +					break; +				} +			} + +			$this->config->set('module_categories_array', $categories); +			$this->config->set('module_categories_index', $k); + +			if ($timed_out) +			{ +				throw new resource_limit_reached_exception(); +			} + +			// Get the modules we want to add... returned sorted by name +			$module_info = $this->module_manager->get_module_infos($module_class); + +			$k = $this->config->get('module_info_index', 0); +			$module_info = array_slice($module_info, $k); + +			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'], +						); + +						$this->module_manager->update_module_data($module_data); + +						// Check for last sql error happened +						if ($this->db->get_sql_error_triggered()) +						{ +							$error = $this->db->sql_error($this->db->get_sql_error_sql()); +							$this->iohandler->add_error_message('INST_ERR_DB', $error['message']); +						} +					} +				} + +				$k++; + +				// Stop execution if resource limit is reached +				if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0) +				{ +					$timed_out = true; +					break; +				} +			} + +			$this->config->set('module_info_index', $k); + +			// Stop execution if resource limit is reached +			if ($timed_out) +			{ +				throw new resource_limit_reached_exception(); +			} + +			// Move some of the modules around since the code above will put them in the wrong place +			if (!$this->config->get('modules_ordered', false)) +			{ +				$this->order_modules($module_class); +				$this->config->set('modules_ordered', true); + +				// Stop execution if resource limit is reached +				if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0) +				{ +					throw new resource_limit_reached_exception(); +				} +			} + +			// 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])) +			{ +				$this->add_module_extras($module_class); +			} + +			$this->module_manager->remove_cache_file($module_class); + +			$i++; + +			$this->config->set('module_class_index', $i); +			$this->config->set('module_categories_index', 0); +			$this->config->set('module_info_index', 0); +			$this->config->set('added_extra_modules', false); +			$this->config->set('modules_ordered', false); +			$this->config->set('module_categories_array', array()); + +			// Stop execution if resource limit is reached +			if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0) +			{ +				break; +			} +		} + +		if ($i < $total) +		{ +			throw new resource_limit_reached_exception(); +		} +	} + +	/** +	 * Move modules to their correct place +	 * +	 * @param string	$module_class +	 */ +	protected function order_modules($module_class) +	{ +		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 = $this->db->sql_query($sql); +			$row = $this->db->sql_fetchrow($result); +			$this->db->sql_freeresult($result); + +			$this->module_manager->move_module_by($row, 'acp', '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 = $this->db->sql_query($sql); +			$row = $this->db->sql_fetchrow($result); +			$this->db->sql_freeresult($result); + +			$this->module_manager->move_module_by($row, 'acp', '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 = $this->db->sql_query($sql); +			$row = $this->db->sql_fetchrow($result); +			$this->db->sql_freeresult($result); + +			$this->module_manager->move_module_by($row, 'acp', '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 = $this->db->sql_query($sql); +			$row = $this->db->sql_fetchrow($result); +			$this->db->sql_freeresult($result); + +			$this->module_manager->move_module_by($row, 'acp', '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 = $this->db->sql_query($sql); +			$row = $this->db->sql_fetchrow($result); +			$this->db->sql_freeresult($result); + +			$this->module_manager->move_module_by($row, 'mcp', '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 = $this->db->sql_query($sql); +			$row = $this->db->sql_fetchrow($result); +			$this->db->sql_freeresult($result); + +			$this->module_manager->move_module_by($row, 'mcp', '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 = $this->db->sql_query($sql); +			$row = $this->db->sql_fetchrow($result); +			$this->db->sql_freeresult($result); + +			$this->module_manager->move_module_by($row, 'mcp', '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 = $this->db->sql_query($sql); +			$row = $this->db->sql_fetchrow($result); +			$this->db->sql_freeresult($result); + +			$this->module_manager->move_module_by($row, 'ucp', '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 = $this->db->sql_query($sql); +			$row = $this->db->sql_fetchrow($result); +			$this->db->sql_freeresult($result); + +			$this->module_manager->move_module_by($row, 'ucp', '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 = $this->db->sql_query($sql); +			$row = $this->db->sql_fetchrow($result); +			$this->db->sql_freeresult($result); + +			$this->module_manager->move_module_by($row, 'ucp', 'move_down', 5); +		} +	} + +	/** +	 * Add extra modules +	 * +	 * @param string	$module_class +	 */ +	protected function add_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 = '" . $this->db->sql_escape($cat_name) . "' +					AND module_class = '" . $this->db->sql_escape($module_class) . "'"; +			$result = $this->db->sql_query_limit($sql, 1); +			$row2 = $this->db->sql_fetchrow($result); +			$this->db->sql_freeresult($result); + +			foreach ($mods as $mod_name) +			{ +				$sql = 'SELECT * +					FROM ' . MODULES_TABLE . " +					WHERE module_langname = '" . $this->db->sql_escape($mod_name) . "' +						AND module_class = '" . $this->db->sql_escape($module_class) . "' +						AND module_basename <> ''"; +				$result = $this->db->sql_query_limit($sql, 1); +				$row = $this->db->sql_fetchrow($result); +				$this->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'], +				); + +				$this->module_manager->update_module_data($module_data); + +				// Check for last sql error happened +				if ($this->db->get_sql_error_triggered()) +				{ +					$error = $this->db->sql_error($this->db->get_sql_error_sql()); +					$this->iohandler->add_error_message('INST_ERR_DB', $error['message']); +				} +			} +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 1; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return 'TASK_ADD_MODULES'; +	} +} diff --git a/phpBB/phpbb/install/module/install_database/module.php b/phpBB/phpbb/install/module/install_database/module.php new file mode 100644 index 0000000000..0d8b33087f --- /dev/null +++ b/phpBB/phpbb/install/module/install_database/module.php @@ -0,0 +1,28 @@ +<?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\install\module\install_database; + +/** + * Installer module for database installation + */ +class module extends \phpbb\install\module_base +{ +	/** +	 * {@inheritdoc} +	 */ +	public function get_navigation_stage_path() +	{ +		return array('install', 0, 'install'); +	} +} diff --git a/phpBB/phpbb/install/module/install_database/task/add_config_settings.php b/phpBB/phpbb/install/module/install_database/task/add_config_settings.php new file mode 100644 index 0000000000..20b7679ec1 --- /dev/null +++ b/phpBB/phpbb/install/module/install_database/task/add_config_settings.php @@ -0,0 +1,361 @@ +<?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\install\module\install_database\task; + +use phpbb\install\exception\resource_limit_reached_exception; + +/** + * Create database schema + */ +class add_config_settings extends \phpbb\install\task_base +{ +	/** +	 * @var \phpbb\db\driver\driver_interface +	 */ +	protected $db; + +	/** +	 * @var \phpbb\filesystem\filesystem_interface +	 */ +	protected $filesystem; + +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $install_config; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var \phpbb\language\language +	 */ +	protected $language; + +	/** +	 * @var \phpbb\passwords\manager +	 */ +	protected $password_manager; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * @var string +	 */ +	protected $config_table; + +	/** +	 * @var string +	 */ +	protected $user_table; + +	/** +	 * @var string +	 */ +	protected $topics_table; + +	/** +	 * @var string +	 */ +	protected $forums_table; + +	/** +	 * @var string +	 */ +	protected $posts_table; + +	/** +	 * @var string +	 */ +	protected $moderator_cache_table; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\filesystem\filesystem_interface				$filesystem			Filesystem service +	 * @param \phpbb\install\helper\config							$install_config		Installer's config helper +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler			Installer's input-output handler +	 * @param \phpbb\install\helper\container_factory				$container			Installer's DI container +	 * @param \phpbb\language\language								$language			Language service +	 * @param string												$phpbb_root_path	Path to phpBB's root +	 */ +	public function __construct(\phpbb\filesystem\filesystem_interface $filesystem, +								\phpbb\install\helper\config $install_config, +								\phpbb\install\helper\iohandler\iohandler_interface $iohandler, +								\phpbb\install\helper\container_factory $container, +								\phpbb\language\language $language, +								$phpbb_root_path) +	{ +		$this->db				= $container->get('dbal.conn'); +		$this->filesystem		= $filesystem; +		$this->install_config	= $install_config; +		$this->iohandler		= $iohandler; +		$this->language			= $language; +		$this->password_manager	= $container->get('passwords.manager'); +		$this->phpbb_root_path	= $phpbb_root_path; + +		// Table names +		$this->config_table				= $container->get_parameter('tables.config'); +		$this->forums_table				= $container->get_parameter('tables.forums'); +		$this->topics_table				= $container->get_parameter('tables.topics'); +		$this->user_table				= $container->get_parameter('tables.users'); +		$this->moderator_cache_table	= $container->get_parameter('tables.moderator_cache'); +		$this->posts_table				= $container->get_parameter('tables.posts'); + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		$this->db->sql_return_on_error(true); + +		$server_name	= $this->install_config->get('server_name'); +		$cookie_domain	= $this->install_config->get('cookie_domain'); +		$current_time 	= time(); +		$user_ip		= phpbb_ip_normalise($this->iohandler->get_server_variable('REMOTE_ADDR')); +		$user_ip		= ($user_ip === false) ? '' : $user_ip; +		$referer		= $this->iohandler->get_server_variable('REFERER'); + +		// Set default config and post data, this applies to all DB's +		$sql_ary = array( +			'INSERT INTO ' . $this->config_table . " (config_name, config_value) +				VALUES ('board_startdate', '$current_time')", + +			'INSERT INTO ' . $this->config_table . " (config_name, config_value) +				VALUES ('default_lang', '" . $this->db->sql_escape($this->install_config->get('default_lang')) . "')", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('img_imagick')) . "' +				WHERE config_name = 'img_imagick'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('server_name')) . "' +				WHERE config_name = 'server_name'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('server_port')) . "' +				WHERE config_name = 'server_port'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('board_email')) . "' +				WHERE config_name = 'board_email'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('board_email')) . "' +				WHERE config_name = 'board_contact'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($cookie_domain) . "' +				WHERE config_name = 'cookie_domain'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->language->lang('default_dateformat')) . "' +				WHERE config_name = 'default_dateformat'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('email_enable')) . "' +				WHERE config_name = 'email_enable'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('smtp_delivery')) . "' +				WHERE config_name = 'smtp_delivery'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('smtp_host')) . "' +				WHERE config_name = 'smtp_host'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('smtp_auth')) . "' +				WHERE config_name = 'smtp_auth_method'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('smtp_user')) . "' +				WHERE config_name = 'smtp_username'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('smtp_pass')) . "' +				WHERE config_name = 'smtp_password'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('cookie_secure')) . "' +				WHERE config_name = 'cookie_secure'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('force_server_vars')) . "' +				WHERE config_name = 'force_server_vars'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('script_path')) . "' +				WHERE config_name = 'script_path'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('server_protocol')) . "' +				WHERE config_name = 'server_protocol'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('admin_name')) . "' +				WHERE config_name = 'newest_username'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . md5(mt_rand()) . "' +				WHERE config_name = 'avatar_salt'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . md5(mt_rand()) . "' +				WHERE config_name = 'plupload_salt'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('board_name')) . "' +				WHERE config_name = 'sitename'", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->install_config->get('board_description')) . "' +				WHERE config_name = 'site_desc'", + +			'UPDATE ' . $this->user_table . " +				SET username = '" . $this->db->sql_escape($this->install_config->get('admin_name')) . "', +					user_password='" . $this->password_manager->hash($this->install_config->get('admin_passwd')) . "', +					user_ip = '" . $this->db->sql_escape($user_ip) . "', +					user_lang = '" . $this->db->sql_escape($this->install_config->get('user_language', 'en')) . "', +					user_email='" . $this->db->sql_escape($this->install_config->get('board_email')) . "', +					user_dateformat='" . $this->db->sql_escape($this->language->lang('default_dateformat')) . "', +					user_email_hash = " . $this->db->sql_escape(phpbb_email_hash($this->install_config->get('board_email'))) . ", +					username_clean = '" . $this->db->sql_escape(utf8_clean_string($this->install_config->get('admin_name'))) . "' +				WHERE username = 'Admin'", + +			'UPDATE ' . $this->moderator_cache_table . " +				SET username = '" . $this->db->sql_escape($this->install_config->get('admin_name')) . "' +				WHERE username = 'Admin'", + +			'UPDATE ' . $this->forums_table . " +				SET forum_last_poster_name = '" . $this->db->sql_escape($this->install_config->get('admin_name')) . "' +				WHERE forum_last_poster_name = 'Admin'", + +			'UPDATE ' . $this->topics_table . " +				SET topic_first_poster_name = '" . $this->db->sql_escape($this->install_config->get('admin_name')) . "', +				topic_last_poster_name = '" . $this->db->sql_escape($this->install_config->get('admin_name')) . "' +				WHERE topic_first_poster_name = 'Admin' +					OR topic_last_poster_name = 'Admin'", + +			'UPDATE ' . $this->user_table . " +				SET user_regdate = $current_time", + +			'UPDATE ' . $this->posts_table . " +				SET post_time = $current_time, poster_ip = '" . $this->db->sql_escape($user_ip) . "'", + +			'UPDATE ' . $this->topics_table . " +				SET topic_time = $current_time, topic_last_post_time = $current_time", + +			'UPDATE ' . $this->forums_table . " +				SET forum_last_post_time = $current_time", + +			'UPDATE ' . $this->config_table . " +				SET config_value = '" . $this->db->sql_escape($this->db->sql_server_info(true)) . "' +				WHERE config_name = 'dbms_version'", +		); + +		if (@extension_loaded('gd')) +		{ +			$sql_ary[] = 'UPDATE ' . $this->config_table . " +				SET config_value = 'core.captcha.plugins.gd' +				WHERE config_name = 'captcha_plugin'"; + +			$sql_ary[] = 'UPDATE ' . $this->config_table . " +				SET config_value = '1' +				WHERE config_name = 'captcha_gd'"; +		} + +		$ref = substr($referer, strpos($referer, '://') + 3); +		if (!(stripos($ref, $server_name) === 0)) +		{ +			$sql_ary[] = 'UPDATE ' . $this->config_table . " +				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 ' . $this->config_table . " +			SET config_value = '" . $this->db->sql_escape($cookie_name) . "' +			WHERE config_name = 'cookie_name'"; + +		// Disable avatars if upload directory is not writable +		if (!$this->filesystem->is_writable($this->phpbb_root_path . 'images/avatars/upload/')) +		{ +			$sql_ary[] = 'UPDATE ' . $this->config_table . " +				SET config_value = '0' +				WHERE config_name = 'allow_avatar'"; + +			$sql_ary[] = 'UPDATE ' . $this->config_table . " +				SET config_value = '0' +				WHERE config_name = 'allow_avatar_upload'"; +		} + +		$i = $this->install_config->get('add_config_settings_index', 0); +		$total = sizeof($sql_ary); +		$sql_ary = array_slice($sql_ary, $i); + +		foreach ($sql_ary as $sql) +		{ +			if (!$this->db->sql_query($sql)) +			{ +				$error = $this->db->sql_error($this->db->get_sql_error_sql()); +				$this->iohandler->add_error_message('INST_ERR_DB', $error['message']); +			} + +			$i++; + +			// Stop execution if resource limit is reached +			if ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0) +			{ +				break; +			} +		} + +		if ($i < $total) +		{ +			$this->install_config->set('add_config_settings_index', $i); +			throw new resource_limit_reached_exception(); +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 1; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return 'TASK_ADD_CONFIG_SETTINGS'; +	} +} diff --git a/phpBB/phpbb/install/module/install_database/task/add_default_data.php b/phpBB/phpbb/install/module/install_database/task/add_default_data.php new file mode 100644 index 0000000000..f5157637ee --- /dev/null +++ b/phpBB/phpbb/install/module/install_database/task/add_default_data.php @@ -0,0 +1,184 @@ +<?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\install\module\install_database\task; + +use phpbb\install\exception\resource_limit_reached_exception; + +/** + * Create database schema + */ +class add_default_data extends \phpbb\install\task_base +{ +	/** +	 * @var \phpbb\db\driver\driver_interface +	 */ +	protected $db; + +	/** +	 * @var \phpbb\install\helper\database +	 */ +	protected $database_helper; + +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $config; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var \phpbb\language\language +	 */ +	protected $language; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\database						$db_helper	Installer's database helper +	 * @param \phpbb\install\helper\config							$config		Installer config +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler	Installer's input-output handler +	 * @param \phpbb\install\helper\container_factory				$container	Installer's DI container +	 * @param \phpbb\language\language								$language	Language service +	 * @param string												$root_path	Root path of phpBB +	 */ +	public function __construct(\phpbb\install\helper\database $db_helper, +								\phpbb\install\helper\config $config, +								\phpbb\install\helper\iohandler\iohandler_interface $iohandler, +								\phpbb\install\helper\container_factory $container, +								\phpbb\language\language $language, +								$root_path) +	{ +		$this->db				= $container->get('dbal.conn.driver'); +		$this->database_helper	= $db_helper; +		$this->config			= $config; +		$this->iohandler		= $iohandler; +		$this->language			= $language; +		$this->phpbb_root_path	= $root_path; + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		$this->db->sql_return_on_error(true); + +		$table_prefix = $this->config->get('table_prefix'); +		$dbms = $this->config->get('dbms'); +		$dbms_info = $this->database_helper->get_available_dbms($dbms); + +		// Get schema data from file +		$sql_query = @file_get_contents($this->phpbb_root_path . 'install/schemas/schema_data.sql'); + +		// Clean up SQL +		$sql_query = $this->replace_dbms_specific_sql($sql_query); +		$sql_query = preg_replace('# phpbb_([^\s]*) #i', ' ' . $table_prefix . '\1 ', $sql_query); +		$sql_query = preg_replace_callback('#\{L_([A-Z0-9\-_]*)\}#s', array($this, 'lang_replace_callback'), $sql_query); +		$sql_query = $this->database_helper->remove_comments($sql_query); +		$sql_query = $this->database_helper->split_sql_file($sql_query, $dbms_info[$dbms]['DELIM']); + +		$i = $this->config->get('add_default_data_index', 0); +		$total = sizeof($sql_query); +		$sql_query = array_slice($sql_query, $i); + +		foreach ($sql_query as $sql) +		{ +			if (!$this->db->sql_query($sql)) +			{ +				$error = $this->db->sql_error($this->db->get_sql_error_sql()); +				$this->iohandler->add_error_message('INST_ERR_DB', $error['message']); +			} + +			$i++; + +			// Stop execution if resource limit is reached +			if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0) +			{ +				break; +			} +		} + +		$this->config->set('add_default_data_index', $i); + +		if ($i < $total) +		{ +			throw new resource_limit_reached_exception(); +		} +	} + +	/** +	 * Process DB specific SQL +	 * +	 * @return string +	 */ +	protected function replace_dbms_specific_sql($query) +	{ +		if ($this->db instanceof \phpbb\db\driver\mssql_base || $this->db instanceof \phpbb\db\driver\mssql) +		{ +			$query = preg_replace('#\# MSSQL IDENTITY (phpbb_[a-z_]+) (ON|OFF) \##s', 'SET IDENTITY_INSERT \1 \2;', $query); +		} +		else if ($this->db instanceof \phpbb\db\driver\postgres) +		{ +			$query = preg_replace('#\# POSTGRES (BEGIN|COMMIT) \##s', '\1; ', $query); +		} +		else if ($this->db instanceof \phpbb\db\driver\mysql_base) +		{ +			$query = str_replace('\\', '\\\\', $query); +		} + +		return $query; +	} + +	/** +	 * Callback function for language replacing +	 * +	 * @param array	$matches +	 * @return string +	 */ +	public function lang_replace_callback($matches) +	{ +		if (!empty($matches[1])) +		{ +			return $this->db->sql_escape($this->language->lang($matches[1])); +		} + +		return ''; +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 1; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return 'TASK_ADD_DEFAULT_DATA'; +	} +} diff --git a/phpBB/phpbb/install/module/install_database/task/add_tables.php b/phpBB/phpbb/install/module/install_database/task/add_tables.php new file mode 100644 index 0000000000..f344f91582 --- /dev/null +++ b/phpBB/phpbb/install/module/install_database/task/add_tables.php @@ -0,0 +1,151 @@ +<?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\install\module\install_database\task; + +use phpbb\install\exception\resource_limit_reached_exception; + +/** + * Create tables + */ +class add_tables extends \phpbb\install\task_base +{ +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $config; + +	/** +	 * @var \phpbb\db\driver\driver_interface +	 */ +	protected $db; + +	/** +	 * @var \phpbb\db\tools\tools_interface +	 */ +	protected $db_tools; + +	/** +	 * @var \phpbb\filesystem\filesystem_interface +	 */ +	protected $filesystem; + +	/** +	 * @var string +	 */ +	protected $schema_file_path; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\config				$config +	 * @param \phpbb\install\helper\database			$db_helper +	 * @param \phpbb\filesystem\filesystem_interface	$filesystem +	 * @param string									$phpbb_root_path +	 */ +	public function __construct(\phpbb\install\helper\config $config, +								\phpbb\install\helper\database $db_helper, +								\phpbb\filesystem\filesystem_interface $filesystem, +								$phpbb_root_path) +	{ +		$dbms = $db_helper->get_available_dbms($config->get('dbms')); +		$dbms = $dbms[$config->get('dbms')]['DRIVER']; +		$factory = new \phpbb\db\tools\factory(); + +		$this->db				= new $dbms(); +		$this->db->sql_connect( +			$config->get('dbhost'), +			$config->get('dbuser'), +			$config->get('dbpasswd'), +			$config->get('dbname'), +			$config->get('dbport'), +			false, +			false +		); + +		$this->config			= $config; +		$this->db_tools			= $factory->get($this->db); +		$this->filesystem		= $filesystem; +		$this->schema_file_path	= $phpbb_root_path . 'store/schema.json'; + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		$this->db->sql_return_on_error(true); + +		$table_prefix = $this->config->get('table_prefix'); +		$change_prefix = $this->config->get('change_table_prefix', true); + +		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', $table_prefix . 'config'); +		} + +		$db_table_schema = @file_get_contents($this->schema_file_path); +		$db_table_schema = json_decode($db_table_schema, true); +		$total = sizeof($db_table_schema); +		$i = $this->config->get('add_table_index', 0); +		$db_table_schema = array_slice($db_table_schema, $i); + +		foreach ($db_table_schema as $table_name => $table_data) +		{ +			$i++; + +			$this->db_tools->sql_create_table( +				( ($change_prefix) ? ($table_prefix . substr($table_name, 6)) : $table_name ), +				$table_data +			); + +			// Stop execution if resource limit is reached +			if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0) +			{ +				break; +			} +		} + +		$this->config->set('add_table_index', $i); + +		if ($i < $total) +		{ +			throw new resource_limit_reached_exception(); +		} +		else +		{ +			@unlink($this->schema_file_path); +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 1; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return 'TASK_CREATE_TABLES'; +	} +} diff --git a/phpBB/phpbb/install/module/install_database/task/create_schema.php b/phpBB/phpbb/install/module/install_database/task/create_schema.php new file mode 100644 index 0000000000..a5635d5dbe --- /dev/null +++ b/phpBB/phpbb/install/module/install_database/task/create_schema.php @@ -0,0 +1,234 @@ +<?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\install\module\install_database\task; + +use phpbb\install\exception\resource_limit_reached_exception; + +/** + * Create database schema + */ +class create_schema extends \phpbb\install\task_base +{ +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $config; + +	/** +	 * @var \phpbb\db\driver\driver_interface +	 */ +	protected $db; + +	/** +	 * @var \phpbb\db\tools\tools_interface +	 */ +	protected $db_tools; + +	/** +	 * @var \phpbb\install\helper\database +	 */ +	protected $database_helper; + +	/** +	 * @var \phpbb\filesystem\filesystem_interface +	 */ +	protected $filesystem; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * @var string +	 */ +	protected $php_ext; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\config							$config				Installer's config provider +	 * @param \phpbb\install\helper\database						$db_helper			Installer's database helper +	 * @param \phpbb\filesystem\filesystem_interface				$filesystem			Filesystem service +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler			Installer's input-output handler +	 * @param string												$phpbb_root_path	Path phpBB's root +	 * @param string												$php_ext			Extension of PHP files +	 */ +	public function __construct(\phpbb\install\helper\config $config, +								\phpbb\install\helper\database $db_helper, +								\phpbb\filesystem\filesystem_interface $filesystem, +								\phpbb\install\helper\iohandler\iohandler_interface $iohandler, +								$phpbb_root_path, +								$php_ext) +	{ +		$dbms = $db_helper->get_available_dbms($config->get('dbms')); +		$dbms = $dbms[$config->get('dbms')]['DRIVER']; +		$factory = new \phpbb\db\tools\factory(); + +		$this->db				= new $dbms(); +		$this->db->sql_connect( +			$config->get('dbhost'), +			$config->get('dbuser'), +			$config->get('dbpasswd'), +			$config->get('dbname'), +			$config->get('dbport'), +			false, +			false +		); + +		$this->config			= $config; +		$this->db_tools			= $factory->get($this->db); +		$this->database_helper	= $db_helper; +		$this->filesystem		= $filesystem; +		$this->iohandler		= $iohandler; +		$this->phpbb_root_path	= $phpbb_root_path; +		$this->php_ext			= $php_ext; + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		// As this task may take a large amount of time to complete refreshing the page might be necessary for some +		// server configurations with limited resources +		if (!$this->config->get('pre_schema_forced_refresh')) +		{ +			if ($this->config->get_time_remaining() < 5) +			{ +				$this->config->set('pre_schema_forced_refresh', true); +				throw new resource_limit_reached_exception(); +			} +		} + +		$this->db->sql_return_on_error(true); + +		$dbms = $this->config->get('dbms'); +		$dbms_info = $this->database_helper->get_available_dbms($dbms); +		$schema_name = $dbms_info[$dbms]['SCHEMA']; +		$delimiter = $dbms_info[$dbms]['DELIM']; +		$table_prefix = $this->config->get('table_prefix'); + +		if ($dbms === 'mysql') +		{ +			if (version_compare($this->db->sql_server_info(true), '4.1.3', '>=')) +			{ +				$schema_name .= '_41'; +			} +			else +			{ +				$schema_name .= '_40'; +			} +		} + +		$db_schema_path = $this->phpbb_root_path . 'install/schemas/' . $schema_name . '_schema.sql'; + +		// Load database vendor specific code if there is any +		if ($this->filesystem->exists($db_schema_path)) +		{ +			$sql_query = @file_get_contents($db_schema_path); +			$sql_query = preg_replace('#phpbb_#i', $table_prefix, $sql_query); +			$sql_query = $this->database_helper->remove_comments($sql_query); +			$sql_query = $this->database_helper->split_sql_file($sql_query, $delimiter); + +			foreach ($sql_query as $sql) +			{ +				if (!$this->db->sql_query($sql)) +				{ +					$error = $this->db->sql_error($this->db->get_sql_error_sql()); +					$this->iohandler->add_error_message('INST_ERR_DB', $error['message']); +				} +			} + +			unset($sql_query); +		} + +		$change_prefix = false; + +		// Generate database schema +		if ($this->filesystem->exists($this->phpbb_root_path . 'install/schemas/schema.json')) +		{ +			$db_table_schema = @file_get_contents($this->phpbb_root_path . 'install/schemas/schema.json'); +			$db_table_schema = json_decode($db_table_schema, true); +			$change_prefix = true; +		} +		else +		{ +			global $table_prefix; + +			$table_prefix = $this->config->get('table_prefix'); + +			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 ($this->phpbb_root_path . 'includes/constants.' . $this->php_ext); +			} + +			$finder = new \phpbb\finder($this->filesystem, $this->phpbb_root_path, null, $this->php_ext); +			$migrator_classes = $finder->core_path('phpbb/db/migration/data/')->get_classes(); +			$factory = new \phpbb\db\tools\factory(); +			$db_tools = $factory->get($this->db, true); +			$schema_generator = new \phpbb\db\migration\schema_generator( +				$migrator_classes, +				new \phpbb\config\config(array()), +				$this->db, +				$db_tools, +				$this->phpbb_root_path, +				$this->php_ext, +				$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', $table_prefix . 'config'); +		} + +		foreach ($db_table_schema as $table_name => $table_data) +		{ +			$this->db_tools->sql_create_table( +				( ($change_prefix) ? ($table_prefix . substr($table_name, 6)) : $table_name ), +				$table_data +			); +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 1; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return 'TASK_CREATE_DATABASE_SCHEMA'; +	} +} diff --git a/phpBB/phpbb/install/module/install_database/task/create_schema_file.php b/phpBB/phpbb/install/module/install_database/task/create_schema_file.php new file mode 100644 index 0000000000..b6d6ece17f --- /dev/null +++ b/phpBB/phpbb/install/module/install_database/task/create_schema_file.php @@ -0,0 +1,164 @@ +<?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\install\module\install_database\task; + +use phpbb\install\exception\resource_limit_reached_exception; + +/** + * Create database schema + */ +class create_schema_file extends \phpbb\install\task_base +{ +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $config; + +	/** +	 * @var \phpbb\db\driver\driver_interface +	 */ +	protected $db; + +	/** +	 * @var \phpbb\filesystem\filesystem_interface +	 */ +	protected $filesystem; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * @var string +	 */ +	protected $php_ext; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\config							$config				Installer's config provider +	 * @param \phpbb\install\helper\database						$db_helper			Installer's database helper +	 * @param \phpbb\filesystem\filesystem_interface				$filesystem			Filesystem service +	 * @param string												$phpbb_root_path	Path phpBB's root +	 * @param string												$php_ext			Extension of PHP files +	 */ +	public function __construct(\phpbb\install\helper\config $config, +								\phpbb\install\helper\database $db_helper, +								\phpbb\filesystem\filesystem_interface $filesystem, +								$phpbb_root_path, +								$php_ext) +	{ +		$dbms = $db_helper->get_available_dbms($config->get('dbms')); +		$dbms = $dbms[$config->get('dbms')]['DRIVER']; + +		$this->db				= new $dbms(); +		$this->db->sql_connect( +			$config->get('dbhost'), +			$config->get('dbuser'), +			$config->get('dbpasswd'), +			$config->get('dbname'), +			$config->get('dbport'), +			false, +			false +		); + +		$this->config			= $config; +		$this->filesystem		= $filesystem; +		$this->phpbb_root_path	= $phpbb_root_path; +		$this->php_ext			= $php_ext; + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		// Generate database schema +		if ($this->filesystem->exists($this->phpbb_root_path . 'install/schemas/schema.json')) +		{ +			$db_table_schema = @file_get_contents($this->phpbb_root_path . 'install/schemas/schema.json'); +			$this->config->set('change_table_prefix', true); +		} +		else +		{ +			global $table_prefix; + +			// As this task may take a large amount of time to complete refreshing the page might be necessary for some +			// server configurations with limited resources +			if (!$this->config->get('pre_schema_forced_refresh', false)) +			{ +				if ($this->config->get_time_remaining() < 5) +				{ +					$this->config->set('pre_schema_forced_refresh', true); +					throw new resource_limit_reached_exception(); +				} +			} + +			$table_prefix = $this->config->get('table_prefix'); + +			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 ($this->phpbb_root_path . 'includes/constants.' . $this->php_ext); +			} + +			$finder = new \phpbb\finder($this->filesystem, $this->phpbb_root_path, null, $this->php_ext); +			$migrator_classes = $finder->core_path('phpbb/db/migration/data/')->get_classes(); +			$factory = new \phpbb\db\tools\factory(); +			$db_tools = $factory->get($this->db, true); +			$schema_generator = new \phpbb\db\migration\schema_generator( +				$migrator_classes, +				new \phpbb\config\config(array()), +				$this->db, +				$db_tools, +				$this->phpbb_root_path, +				$this->php_ext, +				$table_prefix +			); +			$db_table_schema = $schema_generator->get_schema(); +			$db_table_schema = json_encode($db_table_schema, JSON_PRETTY_PRINT); + +			$this->config->set('change_table_prefix', false); +		} + +		$fp = @fopen($this->phpbb_root_path . 'store/schema.json', 'wb'); +		if (!$fp) +		{ +			throw new \Exception('INST_SCHEMA_FILE_NOT_WRITABLE'); +		} + +		fwrite($fp, $db_table_schema); +		fclose($fp); +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 1; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return 'TASK_CREATE_DATABASE_SCHEMA_FILE'; +	} +} diff --git a/phpBB/phpbb/install/module/install_database/task/set_up_database.php b/phpBB/phpbb/install/module/install_database/task/set_up_database.php new file mode 100644 index 0000000000..49c8ea23ad --- /dev/null +++ b/phpBB/phpbb/install/module/install_database/task/set_up_database.php @@ -0,0 +1,164 @@ +<?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\install\module\install_database\task; + +/** + * Set up database for table generation + */ +class set_up_database extends \phpbb\install\task_base +{ +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $config; + +	/** +	 * @var \phpbb\db\driver\driver_interface +	 */ +	protected $db; + +	/** +	 * @var \phpbb\install\helper\database +	 */ +	protected $database_helper; + +	/** +	 * @var \phpbb\filesystem\filesystem_interface +	 */ +	protected $filesystem; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var string +	 */ +	protected $schema_file_path; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\config							$config +	 * @param \phpbb\install\helper\database						$db_helper +	 * @param \phpbb\filesystem\filesystem_interface				$filesystem +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler +	 * @param string												$phpbb_root_path +	 */ +	public function __construct(\phpbb\install\helper\config $config, +								\phpbb\install\helper\database $db_helper, +								\phpbb\filesystem\filesystem_interface $filesystem, +								\phpbb\install\helper\iohandler\iohandler_interface $iohandler, +								$phpbb_root_path) +	{ +		$dbms = $db_helper->get_available_dbms($config->get('dbms')); +		$dbms = $dbms[$config->get('dbms')]['DRIVER']; + +		$this->db				= new $dbms(); +		$this->db->sql_connect( +			$config->get('dbhost'), +			$config->get('dbuser'), +			$config->get('dbpasswd'), +			$config->get('dbname'), +			$config->get('dbport'), +			false, +			false +		); + +		$this->config			= $config; +		$this->database_helper	= $db_helper; +		$this->filesystem		= $filesystem; +		$this->iohandler		= $iohandler; +		$this->phpbb_root_path	= $phpbb_root_path; + +		parent::__construct(false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function check_requirements() +	{ +		$dbms = $this->config->get('dbms'); +		$dbms_info = $this->database_helper->get_available_dbms($dbms); +		$schema_name = $dbms_info[$dbms]['SCHEMA']; + +		if ($dbms === 'mysql') +		{ +			if (version_compare($this->db->sql_server_info(true), '4.1.3', '>=')) +			{ +				$schema_name .= '_41'; +			} +			else +			{ +				$schema_name .= '_40'; +			} +		} + +		$this->schema_file_path = $this->phpbb_root_path . 'install/schemas/' . $schema_name . '_schema.sql'; + +		return $this->filesystem->exists($this->schema_file_path); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		$this->db->sql_return_on_error(true); + +		$dbms = $this->config->get('dbms'); +		$dbms_info = $this->database_helper->get_available_dbms($dbms); +		$delimiter = $dbms_info[$dbms]['DELIM']; +		$table_prefix = $this->config->get('table_prefix'); + +		$sql_query = @file_get_contents($this->schema_file_path); +		$sql_query = preg_replace('#phpbb_#i', $table_prefix, $sql_query); +		$sql_query = $this->database_helper->remove_comments($sql_query); +		$sql_query = $this->database_helper->split_sql_file($sql_query, $delimiter); + +		foreach ($sql_query as $sql) +		{ +			if (!$this->db->sql_query($sql)) +			{ +				$error = $this->db->sql_error($this->db->get_sql_error_sql()); +				$this->iohandler->add_error_message('INST_ERR_DB', $error['message']); +			} +		} + +		unset($sql_query); +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 1; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return 'TASK_SETUP_DATABASE'; +	} +} diff --git a/phpBB/phpbb/install/module/install_filesystem/module.php b/phpBB/phpbb/install/module/install_filesystem/module.php new file mode 100644 index 0000000000..7215449664 --- /dev/null +++ b/phpBB/phpbb/install/module/install_filesystem/module.php @@ -0,0 +1,28 @@ +<?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\install\module\install_filesystem; + +/** + * Installer module for filesystem installation + */ +class module extends \phpbb\install\module_base +{ +	/** +	 * {@inheritdoc} +	 */ +	public function get_navigation_stage_path() +	{ +		return array('install', 0, 'install'); +	} +} diff --git a/phpBB/phpbb/install/module/install_filesystem/task/create_config_file.php b/phpBB/phpbb/install/module/install_filesystem/task/create_config_file.php new file mode 100644 index 0000000000..5bc425b929 --- /dev/null +++ b/phpBB/phpbb/install/module/install_filesystem/task/create_config_file.php @@ -0,0 +1,244 @@ +<?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\install\module\install_filesystem\task; + +use phpbb\install\exception\user_interaction_required_exception; + +/** + * Dumps config file + */ +class create_config_file extends \phpbb\install\task_base +{ +	/** +	 * @var \phpbb\filesystem\filesystem_interface +	 */ +	protected $filesystem; + +	/** +	 * @var \phpbb\install\helper\database +	 */ +	protected $db_helper; + +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $install_config; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * @var string +	 */ +	protected $php_ext; + +	/** +	 * @var array +	 */ +	protected $options; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\filesystem\filesystem_interface				$filesystem +	 * @param \phpbb\install\helper\config							$install_config +	 * @param \phpbb\install\helper\database						$db_helper +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler +	 * @param string												$phpbb_root_path +	 * @param string												$php_ext +	 * @param array													$options +	 */ +	public function __construct(\phpbb\filesystem\filesystem_interface $filesystem, +								\phpbb\install\helper\config $install_config, +								\phpbb\install\helper\database $db_helper, +								\phpbb\install\helper\iohandler\iohandler_interface $iohandler, +								$phpbb_root_path, +								$php_ext, +								$options = array()) +	{ +		$this->install_config	= $install_config; +		$this->db_helper		= $db_helper; +		$this->filesystem		= $filesystem; +		$this->iohandler		= $iohandler; +		$this->phpbb_root_path	= $phpbb_root_path; +		$this->php_ext			= $php_ext; +		$this->options			= array_merge(array( +			'debug' => false, +			'debug_container' => false, +			'environment' => null, +		), $options); + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		$config_written = true; + +		// Create config.php +		$path_to_config = $this->phpbb_root_path . 'config.' . $this->php_ext; + +		$fp = @fopen($path_to_config, 'w'); +		if (!$fp) +		{ +			$config_written = false; +		} + +		$config_content = $this->get_config_data($this->options['debug'], $this->options['debug_container'], $this->options['environment']); + +		if (!@fwrite($fp, $config_content)) +		{ +			$config_written = false; +		} + +		@fclose($fp); + +		// chmod config.php to be only readable +		if ($config_written) +		{ +			try +			{ +				$this->filesystem->phpbb_chmod($path_to_config, \phpbb\filesystem\filesystem_interface::CHMOD_READ); +			} +			catch (\phpbb\filesystem\exception\filesystem_exception $e) +			{ +				// Do nothing, the user will get a notice later +			} +		} +		else +		{ +			$this->iohandler->add_error_message('UNABLE_TO_WRITE_CONFIG_FILE'); +			throw new user_interaction_required_exception(); +		} + +		// Create a lock file to indicate that there is an install in progress +		$fp = @fopen($this->phpbb_root_path . 'cache/install_lock', 'wb'); +		if ($fp === false) +		{ +			// We were unable to create the lock file - abort +			$this->iohandler->add_error_message('UNABLE_TO_WRITE_LOCK'); +			throw new user_interaction_required_exception(); +		} +		@fclose($fp); + +		try +		{ +			$this->filesystem->phpbb_chmod($this->phpbb_root_path . 'cache/install_lock', 0777); +		} +		catch (\phpbb\filesystem\exception\filesystem_exception $e) +		{ +			// Do nothing, the user will get a notice later +		} +	} + +	/** +	 * Returns the content which should be dumped to config.php +	 * +	 * @param bool		$debug 				If the debug constants should be enabled by default or not +	 * @param bool		$debug_container 	If the container should be compiled on +	 *										every page load or not +	 * @param string	$environment		The environment to use +	 * +	 * @return string	content to be written to the config file +	 */ +	protected function get_config_data($debug = false, $debug_container = false, $environment = null) +	{ +		$config_content = "<?php\n"; +		$config_content .= "// phpBB 3.2.x auto-generated configuration file\n// Do not change anything in this file!\n"; + +		$dbms = $this->install_config->get('dbms'); +		$db_driver = $this->db_helper->get_available_dbms($dbms); +		$db_driver = $db_driver[$dbms]['DRIVER']; + +		$config_data_array = array( +			'dbms'			=> $db_driver, +			'dbhost'		=> $this->install_config->get('dbhost'), +			'dbport'		=> $this->install_config->get('dbport'), +			'dbname'		=> $this->install_config->get('dbname'), +			'dbuser'		=> $this->install_config->get('dbuser'), +			'dbpasswd'		=> $this->install_config->get('dbpasswd'), +			'table_prefix'	=> $this->install_config->get('table_prefix'), + +			'phpbb_adm_relative_path'	=> 'adm/', + +			'acm_type'		=> 'phpbb\cache\driver\file', +		); + +		foreach ($config_data_array as $key => $value) +		{ +			$config_content .= "\${$key} = '" . str_replace("'", "\\'", str_replace('\\', '\\\\', $value)) . "';\n"; +		} + +		$config_content .= "\n@define('PHPBB_INSTALLED', true);\n"; +		$config_content .= "// @define('PHPBB_DISPLAY_LOAD_TIME', true);\n"; + +		if ($environment) +		{ +			$config_content .= "@define('PHPBB_ENVIRONMENT', 'test');\n"; +		} +		else if ($debug) +		{ +			$config_content .= "@define('PHPBB_ENVIRONMENT', 'development');\n"; +		} +		else +		{ +			$config_content .= "@define('PHPBB_ENVIRONMENT', 'production');\n"; +		} + +		if ($debug_container) +		{ +			$config_content .= "@define('DEBUG_CONTAINER', true);\n"; +		} +		else +		{ +			$config_content .= "// @define('DEBUG_CONTAINER', true);\n"; +		} + +		if ($environment === 'test') +		{ +			$config_content .= "@define('DEBUG_TEST', true);\n"; + +			// Mandatory for the functional tests, will be removed by PHPBB3-12623 +			$config_content .= "@define('DEBUG', true);\n"; +		} + +		return $config_content; +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 1; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return 'TASK_CREATE_CONFIG_FILE'; +	} +} diff --git a/phpBB/phpbb/install/module/install_finish/module.php b/phpBB/phpbb/install/module/install_finish/module.php new file mode 100644 index 0000000000..3a7544b84f --- /dev/null +++ b/phpBB/phpbb/install/module/install_finish/module.php @@ -0,0 +1,28 @@ +<?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\install\module\install_finish; + +/** + * Installer module for filesystem installation + */ +class module extends \phpbb\install\module_base +{ +	/** +	 * {@inheritdoc} +	 */ +	public function get_navigation_stage_path() +	{ +		return array('install', 0, 'install'); +	} +} diff --git a/phpBB/phpbb/install/module/install_finish/task/notify_user.php b/phpBB/phpbb/install/module/install_finish/task/notify_user.php new file mode 100644 index 0000000000..292be57f5f --- /dev/null +++ b/phpBB/phpbb/install/module/install_finish/task/notify_user.php @@ -0,0 +1,174 @@ +<?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\install\module\install_finish\task; + +use phpbb\config\db; + +/** + * Logs installation and sends an email to the admin + */ +class notify_user extends \phpbb\install\task_base +{ +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $install_config; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var \phpbb\auth\auth +	 */ +	protected $auth; + +	/** +	 * @var \phpbb\config\db +	 */ +	protected $config; + +	/** +	 * @var \phpbb\language\language +	 */ +	protected $language; + +	/** +	 * @var \phpbb\log\log_interface +	 */ +	protected $log; + +	/** +	 * @var \phpbb\user +	 */ +	protected $user; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * @var string +	 */ +	protected $php_ext; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\container_factory				$container +	 * @param \phpbb\install\helper\config							$install_config +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler +	 * @param string												$phpbb_root_path +	 * @param string												$php_ext +	 */ +	public function __construct(\phpbb\install\helper\container_factory $container, \phpbb\install\helper\config $install_config, \phpbb\install\helper\iohandler\iohandler_interface $iohandler, $phpbb_root_path, $php_ext) +	{ +		$this->install_config	= $install_config; +		$this->iohandler		= $iohandler; + +		$this->auth				= $container->get('auth'); +		$this->language			= $container->get('language'); +		$this->log				= $container->get('log'); +		$this->user				= $container->get('user'); +		$this->phpbb_root_path	= $phpbb_root_path; +		$this->php_ext			= $php_ext; + +		// We need to reload config for cases when it doesn't have all values +		/** @var \phpbb\cache\driver\driver_interface $cache */ +		$cache = $container->get('cache.driver'); +		$cache->destroy('config'); + +		$this->config = new db( +			$container->get('dbal.conn'), +			$cache, +			$container->get_parameter('tables.config') +		); + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		$this->user->session_begin(); +		$this->user->setup('common'); + +		if ($this->config['email_enable']) +		{ +			include ($this->phpbb_root_path . 'includes/functions_messenger.' . $this->php_ext); + +			// functions_messenger.php uses config to determine language paths +			// Remove when able +			global $config; +			$config = $this->config; + +			$messenger = new \messenger(false); +			$messenger->template('installed', $this->install_config->get('user_language', 'en')); +			$messenger->to($this->config['board_email'], $this->install_config->get('admin_name')); +			$messenger->anti_abuse_headers($this->config, $this->user); +			$messenger->assign_vars(array( +					'USERNAME'		=> htmlspecialchars_decode($this->install_config->get('admin_name')), +					'PASSWORD'		=> htmlspecialchars_decode($this->install_config->get('admin_passwd'))) +			); +			$messenger->send(NOTIFY_EMAIL); +		} + +		// Login admin +		// Ugly but works +		$this->auth->login( +			$this->install_config->get('admin_name'), +			$this->install_config->get('admin_passwd'), +			false, +			true, +			true +		); + +		$this->iohandler->set_cookie($this->config['cookie_name'] . '_sid', $this->user->session_id); +		$this->iohandler->set_cookie($this->config['cookie_name'] . '_u', $this->user->cookie_data['u']); +		$this->iohandler->set_cookie($this->config['cookie_name'] . '_k', $this->user->cookie_data['k']); + +		// Create log +		$this->log->add( +			'admin', +			$this->user->data['user_id'], +			$this->user->ip, +			'LOG_INSTALL_INSTALLED', +			false, +			array($this->config['version']) +		); + +		// Remove install_lock +		@unlink($this->phpbb_root_path . 'cache/install_lock'); +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 1; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return 'TASK_NOTIFY_USER'; +	} +} diff --git a/phpBB/phpbb/install/module/install_finish/task/populate_migrations.php b/phpBB/phpbb/install/module/install_finish/task/populate_migrations.php new file mode 100644 index 0000000000..34541c361e --- /dev/null +++ b/phpBB/phpbb/install/module/install_finish/task/populate_migrations.php @@ -0,0 +1,92 @@ +<?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\install\module\install_finish\task; + +use phpbb\install\exception\resource_limit_reached_exception; +use phpbb\install\helper\config; +use phpbb\install\helper\container_factory; + +/** + * Populates migrations + */ +class populate_migrations extends \phpbb\install\task_base +{ +	/** +	 * @var config +	 */ +	protected $config; + +	/** +	 * @var \phpbb\extension\manager +	 */ +	protected $extension_manager; + +	/** +	 * @var \phpbb\db\migrator +	 */ +	protected $migrator; + +	/** +	 * Constructor +	 * +	 * @param config			$config		Installer's config +	 * @param container_factory	$container	phpBB's DI contianer +	 */ +	public function __construct(config $config, container_factory $container) +	{ +		$this->config				= $config; +		$this->extension_manager	= $container->get('ext.manager'); +		$this->migrator				= $container->get('migrator'); + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		if (!$this->config->get('populate_migration_refresh_before', false)) +		{ +			if ($this->config->get_time_remaining() < 1) +			{ +				$this->config->set('populate_migration_refresh_before', true); +				throw new resource_limit_reached_exception(); +			} +		} + +		$finder = $this->extension_manager->get_finder(); + +		$migrations = $finder +			->core_path('phpbb/db/migration/data/') +			->get_classes(); +		$this->migrator->populate_migrations($migrations); +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 1; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return 'TASK_POPULATE_MIGRATIONS'; +	} +} diff --git a/phpBB/phpbb/install/module/obtain_data/install_module.php b/phpBB/phpbb/install/module/obtain_data/install_module.php new file mode 100644 index 0000000000..deb4be90d8 --- /dev/null +++ b/phpBB/phpbb/install/module/obtain_data/install_module.php @@ -0,0 +1,33 @@ +<?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\install\module\obtain_data; + +class install_module extends \phpbb\install\module_base +{ +	/** +	 * {@inheritdoc} +	 */ +	public function get_navigation_stage_path() +	{ +		return array('install', 0, 'obtain_data'); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_step_count() +	{ +		return 0; +	} +} diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_admin_data.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_admin_data.php new file mode 100644 index 0000000000..d1f1af6b83 --- /dev/null +++ b/phpBB/phpbb/install/module/obtain_data/task/obtain_admin_data.php @@ -0,0 +1,218 @@ +<?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\install\module\obtain_data\task; + +use phpbb\install\exception\user_interaction_required_exception; + +/** + * This class requests and validates admin account data from the user + */ +class obtain_admin_data extends \phpbb\install\task_base implements \phpbb\install\task_interface +{ +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $install_config; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $io_handler; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\config							$install_config	Installer's config helper +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler		Installer's input-output handler +	 */ +	public function __construct(\phpbb\install\helper\config $install_config, +								\phpbb\install\helper\iohandler\iohandler_interface $iohandler) +	{ +		$this->install_config	= $install_config; +		$this->io_handler		= $iohandler; + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		// Check if data is sent +		if ($this->io_handler->get_input('submit_admin', false)) +		{ +			$this->process_form(); +		} +		else +		{ +			$this->request_form_data(); +		} +	} + +	/** +	 * Process form data +	 */ +	protected function process_form() +	{ +		// Admin data +		$admin_name		= $this->io_handler->get_input('admin_name', '', true); +		$admin_pass1	= $this->io_handler->get_input('admin_pass1', '', true); +		$admin_pass2	= $this->io_handler->get_input('admin_pass2', '', true); +		$board_email	= $this->io_handler->get_input('board_email', '', true); + +		$admin_data_valid = $this->check_admin_data($admin_name, $admin_pass1, $admin_pass2, $board_email); + +		if ($admin_data_valid) +		{ +			$this->install_config->set('admin_name', $admin_name); +			$this->install_config->set('admin_passwd', $admin_pass1); +			$this->install_config->set('board_email', $board_email); +		} +		else +		{ +			$this->request_form_data(true); +		} +	} + +	/** +	 * Request data from the user +	 * +	 * @param bool $use_request_data Whether to use submited data +	 * +	 * @throws \phpbb\install\exception\user_interaction_required_exception When the user is required to provide data +	 */ +	protected function request_form_data($use_request_data = false) +	{ +		if ($use_request_data) +		{ +			$admin_username	= $this->io_handler->get_input('admin_name', '', true); +			$admin_email	= $this->io_handler->get_input('board_email', '', true); +		} +		else +		{ +			$admin_username	= ''; +			$admin_email	= ''; +		} + +		$admin_form = array( +			'admin_name'	=> array( +				'label'			=> 'ADMIN_USERNAME', +				'description'	=> 'ADMIN_USERNAME_EXPLAIN', +				'type'			=> 'text', +				'default'		=> $admin_username, +			), +			'board_email'	=> array( +				'label'		=> 'CONTACT_EMAIL', +				'type'		=> 'email', +				'default'	=> $admin_email, +			), +			'admin_pass1'	=> array( +				'label'			=> 'ADMIN_PASSWORD', +				'description'	=> 'ADMIN_PASSWORD_EXPLAIN', +				'type'			=> 'password', +			), +			'admin_pass2'	=> array( +				'label'	=> 'ADMIN_PASSWORD_CONFIRM', +				'type'	=> 'password', +			), +			'submit_admin'	=> array( +				'label'	=> 'SUBMIT', +				'type'	=> 'submit', +			), +		); + +		$this->io_handler->add_user_form_group('ADMIN_CONFIG', $admin_form); + +		// Require user interaction +		throw new user_interaction_required_exception(); +	} + +	/** +	 * Check admin data +	 * +	 * @param string	$username	Admin username +	 * @param string	$pass1		Admin password +	 * @param string	$pass2		Admin password confirmation +	 * @param string	$email		Admin e-mail address +	 * +	 * @return bool	True if data is valid, false otherwise +	 */ +	protected function check_admin_data($username, $pass1, $pass2, $email) +	{ +		$data_valid = true; + +		// Check if none of admin data is empty +		if (in_array('', array($username, $pass1, $pass2, $email), true)) +		{ +			$this->io_handler->add_error_message('INST_ERR_MISSING_DATA'); +			$data_valid = false; +		} + +		if (utf8_strlen($username) < 3) +		{ +			$this->io_handler->add_error_message('INST_ERR_USER_TOO_SHORT'); +			$data_valid = false; +		} + +		if (utf8_strlen($username) > 20) +		{ +			$this->io_handler->add_error_message('INST_ERR_USER_TOO_LONG'); +			$data_valid = false; +		} + +		if ($pass1 !== $pass2 && $pass1 !== '') +		{ +			$this->io_handler->add_error_message('INST_ERR_PASSWORD_MISMATCH'); +			$data_valid = false; +		} + +		// Test against the default password rules +		if (utf8_strlen($pass1) < 6) +		{ +			$this->io_handler->add_error_message('INST_ERR_PASSWORD_TOO_SHORT'); +			$data_valid = false; +		} + +		if (utf8_strlen($pass1) > 30) +		{ +			$this->io_handler->add_error_message('INST_ERR_PASSWORD_TOO_LONG'); +			$data_valid = false; +		} + +		if (!preg_match('/^' . get_preg_expression('email') . '$/i', $email)) +		{ +			$this->io_handler->add_error_message('INST_ERR_EMAIL_INVALID'); +			$data_valid = false; +		} + +		return $data_valid; +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_board_data.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_board_data.php new file mode 100644 index 0000000000..ff2a0a2f86 --- /dev/null +++ b/phpBB/phpbb/install/module/obtain_data/task/obtain_board_data.php @@ -0,0 +1,185 @@ +<?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\install\module\obtain_data\task; + +use phpbb\install\exception\user_interaction_required_exception; + +/** + * This class obtains default data from the user related to board (Board name, Board descritpion, etc...) + */ +class obtain_board_data extends \phpbb\install\task_base implements \phpbb\install\task_interface +{ +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $install_config; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $io_handler; + +	/** +	 * @var \phpbb\language\language_file_helper +	 */ +	protected $language_helper; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\config							$config			Installer's config +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler		Installer's input-output handler +	 * @param \phpbb\language\language_file_helper					$lang_helper	Language file helper +	 */ +	public function __construct(\phpbb\install\helper\config $config, +								\phpbb\install\helper\iohandler\iohandler_interface $iohandler, +								\phpbb\language\language_file_helper $lang_helper) +	{ +		$this->install_config	= $config; +		$this->io_handler		= $iohandler; +		$this->language_helper	= $lang_helper; + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		// Check if data is sent +		if ($this->io_handler->get_input('submit_board', false)) +		{ +			$this->process_form(); +		} +		else +		{ +			$this->request_form_data(); +		} +	} + +	/** +	 * Process form data +	 */ +	protected function process_form() +	{ +		// Board data +		$default_lang	= $this->io_handler->get_input('default_lang', ''); +		$board_name		= $this->io_handler->get_input('board_name', '', true); +		$board_desc		= $this->io_handler->get_input('board_description', '', true); + +		// Check default lang +		$langs = $this->language_helper->get_available_languages(); +		$lang_valid = false; + +		foreach ($langs as $lang) +		{ +			if ($lang['iso'] === $default_lang) +			{ +				$lang_valid = true; +				break; +			} +		} + +		$this->install_config->set('board_name', $board_name); +		$this->install_config->set('board_description', $board_desc); + +		if ($lang_valid) +		{ +			$this->install_config->set('default_lang', $default_lang); +		} +		else +		{ +			$this->request_form_data(true); +		} +	} + +	/** +	 * Request data from the user +	 * +	 * @param bool $use_request_data Whether to use submited data +	 * +	 * @throws \phpbb\install\exception\user_interaction_required_exception When the user is required to provide data +	 */ +	protected function request_form_data($use_request_data = false) +	{ +		if ($use_request_data) +		{ +			$board_name		= $this->io_handler->get_input('board_name', '', true); +			$board_desc		= $this->io_handler->get_input('board_description', '', true); +		} +		else +		{ +			$board_name		= '{L_CONFIG_SITENAME}'; +			$board_desc		= '{L_CONFIG_SITE_DESC}'; +		} + +		// Use language because we only check this to be valid +		$default_lang	= $this->install_config->get('user_language', 'en'); + +		$langs = $this->language_helper->get_available_languages(); +		$lang_options = array(); + +		foreach ($langs as $lang) +		{ +			$lang_options[] = array( +				'value'		=> $lang['iso'], +				'label'		=> $lang['local_name'], +				'selected'	=> ($default_lang === $lang['iso']), +			); +		} + +		$board_form = array( +			'default_lang' => array( +				'label'		=> 'DEFAULT_LANGUAGE', +				'type'		=> 'select', +				'options'	=> $lang_options, +			), +			'board_name' => array( +				'label'		=> 'BOARD_NAME', +				'type'		=> 'text', +				'default'	=> $board_name, +			), +			'board_description' => array( +				'label'		=> 'BOARD_DESCRIPTION', +				'type'		=> 'text', +				'default'	=> $board_desc, +			), +			'submit_board'	=> array( +				'label'	=> 'SUBMIT', +				'type'	=> 'submit', +			), +		); + +		$this->io_handler->add_user_form_group('BOARD_CONFIG', $board_form); + +		throw new user_interaction_required_exception(); +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_database_data.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_database_data.php new file mode 100644 index 0000000000..ce720dbf76 --- /dev/null +++ b/phpBB/phpbb/install/module/obtain_data/task/obtain_database_data.php @@ -0,0 +1,270 @@ +<?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\install\module\obtain_data\task; + +use phpbb\install\exception\user_interaction_required_exception; + +/** + * This class requests and validates database information from the user + */ +class obtain_database_data extends \phpbb\install\task_base implements \phpbb\install\task_interface +{ +	/** +	 * @var \phpbb\install\helper\database +	 */ +	protected $database_helper; + +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $install_config; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $io_handler; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\database						$database_helper	Installer's database helper +	 * @param \phpbb\install\helper\config							$install_config		Installer's config helper +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler			Installer's input-output handler +	 */ +	public function __construct(\phpbb\install\helper\database $database_helper, +								\phpbb\install\helper\config $install_config, +								\phpbb\install\helper\iohandler\iohandler_interface $iohandler) +	{ +		$this->database_helper	= $database_helper; +		$this->install_config	= $install_config; +		$this->io_handler		= $iohandler; + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		// Check if data is sent +		if ($this->io_handler->get_input('submit_database', false)) +		{ +			$this->process_form(); +		} +		else +		{ +			$this->request_form_data(); +		} +	} + +	/** +	 * Process form data +	 */ +	protected function process_form() +	{ +		// Collect database data +		$dbms			= $this->io_handler->get_input('dbms', ''); +		$dbhost			= $this->io_handler->get_input('dbhost', '', true); +		$dbport			= $this->io_handler->get_input('dbport', ''); +		$dbuser			= $this->io_handler->get_input('dbuser', ''); +		$dbpasswd		= $this->io_handler->get_input('dbpasswd', '', true); +		$dbname			= $this->io_handler->get_input('dbname', ''); +		$table_prefix	= $this->io_handler->get_input('table_prefix', ''); + +		// Check database data +		$user_data_vaild = $this->check_database_data($dbms, $dbhost, $dbport, $dbuser, $dbpasswd, $dbname, $table_prefix); + +		// Save database data if it is correct +		if ($user_data_vaild) +		{ +			$this->install_config->set('dbms', $dbms); +			$this->install_config->set('dbhost', $dbhost); +			$this->install_config->set('dbport', $dbport); +			$this->install_config->set('dbuser', $dbuser); +			$this->install_config->set('dbpasswd', $dbpasswd); +			$this->install_config->set('dbname', $dbname); +			$this->install_config->set('table_prefix', $table_prefix); +		} +		else +		{ +			$this->request_form_data(true); +		} +	} + +	/** +	 * Request data from the user +	 * +	 * @param bool $use_request_data Whether to use submited data +	 * +	 * @throws \phpbb\install\exception\user_interaction_required_exception When the user is required to provide data +	 */ +	protected function request_form_data($use_request_data = false) +	{ +		if ($use_request_data) +		{ +			$dbms			= $this->io_handler->get_input('dbms', ''); +			$dbhost			= $this->io_handler->get_input('dbhost', '', true); +			$dbport			= $this->io_handler->get_input('dbport', ''); +			$dbuser			= $this->io_handler->get_input('dbuser', ''); +			$dbname			= $this->io_handler->get_input('dbname', ''); +			$table_prefix	= $this->io_handler->get_input('table_prefix', 'phpbb_'); +		} +		else +		{ +			$dbms			= ''; +			$dbhost			= ''; +			$dbport			= ''; +			$dbuser			= ''; +			$dbname			= ''; +			$table_prefix	= 'phpbb_'; +		} + +		$dbms_select = array(); +		foreach ($this->database_helper->get_available_dbms() as $dbms_key => $dbms_array) +		{ +			$dbms_select[] = array( +				'value'		=> $dbms_key, +				'label'		=> 'DB_OPTION_' . strtoupper($dbms_key), +				'selected'	=> ($dbms_key === $dbms), +			); +		} + +		$database_form = array( +			'dbms' => array( +				'label'		=> 'DBMS', +				'type'		=> 'select', +				'options'	=> $dbms_select, +			), +			'dbhost' => array( +				'label'			=> 'DB_HOST', +				'description'	=> 'DB_HOST_EXPLAIN', +				'type'			=> 'text', +				'default'		=> $dbhost, +			), +			'dbport' => array( +				'label'			=> 'DB_PORT', +				'description'	=> 'DB_PORT_EXPLAIN', +				'type'			=> 'text', +				'default'		=> $dbport, +			), +			'dbuser' => array( +				'label'		=> 'DB_USERNAME', +				'type'		=> 'text', +				'default'	=> $dbuser, +			), +			'dbpasswd' => array( +				'label'		=> 'DB_PASSWORD', +				'type'	=> 'password', +			), +			'dbname' => array( +				'label'		=> 'DB_NAME', +				'type'		=> 'text', +				'default'	=> $dbname, +			), +			'table_prefix' => array( +				'label'			=> 'TABLE_PREFIX', +				'description'	=> 'TABLE_PREFIX_EXPLAIN', +				'type'			=> 'text', +				'default'		=> $table_prefix, +			), +			'submit_database' => array( +				'label'	=> 'SUBMIT', +				'type'	=> 'submit', +			), +		); + +		$this->io_handler->add_user_form_group('DB_CONFIG', $database_form); + +		// Require user interaction +		throw new user_interaction_required_exception(); +	} + +	/** +	 * Check database data +	 * +	 * @param string	$dbms			Selected database type +	 * @param string	$dbhost			Database host address +	 * @param int		$dbport			Database port number +	 * @param string	$dbuser			Database username +	 * @param string	$dbpass			Database password +	 * @param string	$dbname			Database name +	 * @param string	$table_prefix	Database table prefix +	 * +	 * @return bool	True if database data is correct, false otherwise +	 */ +	protected function check_database_data($dbms, $dbhost, $dbport, $dbuser, $dbpass, $dbname, $table_prefix) +	{ +		$available_dbms = $this->database_helper->get_available_dbms(); +		$data_valid = true; + +		// Check if PHP has the database extensions for the specified DBMS +		if (!isset($available_dbms[$dbms])) +		{ +			$this->io_handler->add_error_message('INST_ERR_NO_DB'); +			$data_valid = false; +		} + +		// Validate table prefix +		$prefix_valid = $this->database_helper->validate_table_prefix($dbms, $table_prefix); +		if (is_array($prefix_valid)) +		{ +			foreach ($prefix_valid as $error) +			{ +				$this->io_handler->add_error_message( +					$error['title'], +					(isset($error['description'])) ? $error['description'] : false +				); +			} + +			$data_valid = false; +		} + +		// Try to connect to database if all provided data is valid +		if ($data_valid) +		{ +			$connect_test = $this->database_helper->check_database_connection($dbms, $dbhost, $dbport, $dbuser, $dbpass, $dbname, $table_prefix); +			if (is_array($connect_test)) +			{ +				foreach ($connect_test as $error) +				{ +					$this->io_handler->add_error_message( +						$error['title'], +						(isset($error['description'])) ? $error['description'] : false +					); +				} + +				$data_valid = false; +			} +		} + +		return $data_valid; +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_email_data.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_email_data.php new file mode 100644 index 0000000000..606e4a2ddd --- /dev/null +++ b/phpBB/phpbb/install/module/obtain_data/task/obtain_email_data.php @@ -0,0 +1,166 @@ +<?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\install\module\obtain_data\task; + +use phpbb\install\exception\user_interaction_required_exception; + +class obtain_email_data extends \phpbb\install\task_base implements \phpbb\install\task_interface +{ +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $install_config; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $io_handler; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\config							$config		Installer's config +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler	Installer's input-output handler +	 */ +	public function __construct(\phpbb\install\helper\config $config, +								\phpbb\install\helper\iohandler\iohandler_interface $iohandler) +	{ +		$this->install_config	= $config; +		$this->io_handler		= $iohandler; + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		// E-mail data +		$email_enable	= $this->io_handler->get_input('email_enable', true); +		$smtp_delivery	= $this->io_handler->get_input('smtp_delivery', ''); +		$smtp_host		= $this->io_handler->get_input('smtp_host', ''); +		$smtp_auth		= $this->io_handler->get_input('smtp_auth', ''); +		$smtp_user		= $this->io_handler->get_input('smtp_user', ''); +		$smtp_passwd	= $this->io_handler->get_input('smtp_pass', ''); + +		$auth_methods = array('PLAIN', 'LOGIN', 'CRAM-MD5', 'DIGEST-MD5', 'POP-BEFORE-SMTP'); + +		// Check if data is sent +		if ($this->io_handler->get_input('submit_email', false)) +		{ +			$this->install_config->set('email_enable', $email_enable); +			$this->install_config->set('smtp_delivery', $smtp_delivery); +			$this->install_config->set('smtp_host', $smtp_host); +			$this->install_config->set('smtp_auth', $smtp_auth); +			$this->install_config->set('smtp_user', $smtp_user); +			$this->install_config->set('smtp_pass', $smtp_passwd); +		} +		else +		{ +			$auth_options = array(); +			foreach ($auth_methods as $method) +			{ +				$auth_options[] = array( +					'value'		=> $method, +					'label'		=> 'SMTP_' . str_replace('-', '_', $method), +					'selected'	=> false, +				); +			} + +			$email_form = array( +				'email_enable' => array( +					'label'			=> 'ENABLE_EMAIL', +					'description'	=> 'COOKIE_SECURE_EXPLAIN', +					'type'			=> 'radio', +					'options'		=> array( +						array( +							'value'		=> 1, +							'label'		=> 'ENABLE', +							'selected'	=> true, +						), +						array( +							'value'		=> 0, +							'label'		=> 'DISABLE', +							'selected'	=> false, +						), +					), +				), +				'smtp_delivery' => array( +					'label'			=> 'USE_SMTP', +					'description'	=> 'USE_SMTP_EXPLAIN', +					'type'			=> 'radio', +					'options'		=> array( +						array( +							'value'		=> 0, +							'label'		=> 'NO', +							'selected'	=> true, +						), +						array( +							'value'		=> 1, +							'label'		=> 'YES', +							'selected'	=> false, +						), +					), +				), +				'smtp_host' => array( +					'label'			=> 'SMTP_SERVER', +					'type'			=> 'text', +					'default'		=> $smtp_host, +				), +				'smtp_auth' => array( +					'label'			=> 'SMTP_AUTH_METHOD', +					'description'	=> 'SMTP_AUTH_METHOD_EXPLAIN', +					'type'			=> 'select', +					'options'		=> $auth_options, +				), +				'smtp_user' => array( +					'label'			=> 'SMTP_USERNAME', +					'description'	=> 'SMTP_USERNAME_EXPLAIN', +					'type'			=> 'text', +					'default'		=> $smtp_user, +				), +				'smtp_pass' => array( +					'label'			=> 'SMTP_PASSWORD', +					'description'	=> 'SMTP_PASSWORD_EXPLAIN', +					'type'			=> 'password', +				), +				'submit_email' => array( +					'label'	=> 'SUBMIT', +					'type'	=> 'submit', +				), +			); + +			$this->io_handler->add_user_form_group('EMAIL_CONFIG', $email_form); + +			throw new user_interaction_required_exception(); +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_file_updater_method.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_file_updater_method.php new file mode 100644 index 0000000000..d5a8855c37 --- /dev/null +++ b/phpBB/phpbb/install/module/obtain_data/task/obtain_file_updater_method.php @@ -0,0 +1,167 @@ +<?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\install\module\obtain_data\task; + +use phpbb\install\exception\user_interaction_required_exception; +use phpbb\install\helper\config; +use phpbb\install\helper\iohandler\iohandler_interface; +use phpbb\install\task_base; + +class obtain_file_updater_method extends task_base +{ +	/** +	 * @var array	Supported compression methods +	 * +	 * Note: .tar is assumed to be supported, but not in the list +	 */ +	protected $available_methods; + +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $installer_config; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * Constructor +	 * +	 * @param config				$installer_config +	 * @param iohandler_interface	$iohandler +	 */ +	public function __construct(config $installer_config, iohandler_interface $iohandler) +	{ +		$this->installer_config	= $installer_config; +		$this->iohandler		= $iohandler; + +		$this->available_methods = array('.tar.gz' => 'zlib', '.tar.bz2' => 'bz2', '.zip' => 'zlib'); + +		parent::__construct(false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function check_requirements() +	{ +		return $this->installer_config->get('do_update_files', false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		// Check if data is sent +		if ($this->iohandler->get_input('submit_update_file', false)) +		{ +			$supported_methods = array('compression', 'ftp', 'direct_file'); +			$method = $this->iohandler->get_input('method', 'compression'); +			$update_method = (in_array($method, $supported_methods, true)) ? $method : 'compression'; +			$this->installer_config->set('file_update_method', $update_method); + +			$compression = $this->iohandler->get_input('compression_method', '.zip'); +			$supported_methods = array_keys($this->available_methods); +			$supported_methods[] = '.tar'; +			$compression = (in_array($compression, $supported_methods, true)) ? $compression : '.zip'; +			$this->installer_config->set('file_update_compression', $compression); +		} +		else +		{ +			$this->iohandler->add_user_form_group('UPDATE_FILE_METHOD_TITLE', array( +				'method' => array( +					'label'		=> 'UPDATE_FILE_METHOD', +					'type'		=> 'select', +					'options'	=> array( +						array( +							'value'		=> 'compression', +							'label'		=> 'UPDATE_FILE_METHOD_DOWNLOAD', +							'selected'	=> true, +						), +						array( +							'value'		=> 'ftp', +							'label'		=> 'UPDATE_FILE_METHOD_FTP', +							'selected'	=> false, +						), +						array( +							'value'		=> 'direct_file', +							'label'		=> 'UPDATE_FILE_METHOD_FILESYSTEM', +							'selected'	=> false, +						), +					), +				), +				'compression_method' => array( +					'label'		=> 'SELECT_DOWNLOAD_FORMAT', +					'type'		=> 'select', +					'options'	=> $this->get_available_compression_methods(), +				), +				'submit_update_file' => array( +					'label'	=> 'SUBMIT', +					'type'	=> 'submit', +				), +			)); + +			throw new user_interaction_required_exception(); +		} +	} + +	/** +	 * Returns form elements in an array of available compression methods +	 * +	 * @return array +	 */ +	protected function get_available_compression_methods() +	{ +		$methods[] = array( +			'value'		=> '.tar', +			'label'		=> '.tar', +			'selected'	=> true, +		); + +		foreach ($this->available_methods as $type => $module) +		{ +			if (!@extension_loaded($module)) +			{ +				continue; +			} + +			$methods[] = array( +				'value'		=> $type, +				'label'		=> $type, +				'selected'	=> false, +			); +		} + +		return $methods; +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_imagick_path.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_imagick_path.php new file mode 100644 index 0000000000..9f74b61770 --- /dev/null +++ b/phpBB/phpbb/install/module/obtain_data/task/obtain_imagick_path.php @@ -0,0 +1,89 @@ +<?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\install\module\obtain_data\task; + +class obtain_imagick_path extends \phpbb\install\task_base implements \phpbb\install\task_interface +{ +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $config; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\config	$config	Installer's config +	 */ +	public function __construct(\phpbb\install\helper\config $config) +	{ +		$this->config = $config; + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		// 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); +		} + +		$this->config->set('img_imagick', $img_imagick); +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_server_data.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_server_data.php new file mode 100644 index 0000000000..1ef70eae08 --- /dev/null +++ b/phpBB/phpbb/install/module/obtain_data/task/obtain_server_data.php @@ -0,0 +1,202 @@ +<?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\install\module\obtain_data\task; + +use phpbb\install\exception\user_interaction_required_exception; + +/** + * This class requests and saves some information about the server + */ +class obtain_server_data extends \phpbb\install\task_base implements \phpbb\install\task_interface +{ +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $install_config; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $io_handler; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\config							$config		Installer's config +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler	Installer's input-output handler +	 */ +	public function __construct(\phpbb\install\helper\config $config, +								\phpbb\install\helper\iohandler\iohandler_interface $iohandler) +	{ +		$this->install_config	= $config; +		$this->io_handler		= $iohandler; + +		parent::__construct(true); +	} +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		$cookie_secure = $this->io_handler->is_secure(); +		$server_protocol = ($this->io_handler->is_secure()) ? 'https://' : 'http://'; +		$server_port = $this->io_handler->get_server_variable('SERVER_PORT', 0); + +		// HTTP_HOST is having the correct browser url in most cases... +		$server_name = strtolower(htmlspecialchars_decode($this->io_handler->get_header_variable( +			'Host', +			$this->io_handler->get_server_variable('SERVER_NAME') +		))); + +		// HTTP HOST can carry a port number... +		if (strpos($server_name, ':') !== false) +		{ +			$server_name = substr($server_name, 0, strpos($server_name, ':')); +		} + +		$script_path = htmlspecialchars_decode($this->io_handler->get_server_variable('PHP_SELF')); + +		if (!$script_path) +		{ +			$script_path = htmlspecialchars_decode($this->io_handler->get_server_variable('REQUEST_URI')); +		} + +		$script_path = str_replace(array('\\', '//'), '/', $script_path); +		$script_path = trim(dirname(dirname(dirname($script_path)))); // Because we are in install/app.php/route_name + +		// Server data +		$cookie_secure		= $this->io_handler->get_input('cookie_secure', $cookie_secure); +		$server_protocol	= $this->io_handler->get_input('server_protocol', $server_protocol); +		$force_server_vars	= $this->io_handler->get_input('force_server_vars', 0); +		$server_name		= $this->io_handler->get_input('server_name', $server_name); +		$server_port		= $this->io_handler->get_input('server_port', $server_port); +		$script_path		= $this->io_handler->get_input('script_path', $script_path); + +		// Clean up script path +		if ($script_path !== '/') +		{ +			// Adjust destination path (no trailing slash) +			if (substr($script_path, -1) === '/') +			{ +				$script_path = substr($script_path, 0, -1); +			} + +			$script_path = str_replace(array('../', './'), '', $script_path); + +			if ($script_path[0] !== '/') +			{ +				$script_path = '/' . $script_path; +			} +		} + +		// Check if data is sent +		if ($this->io_handler->get_input('submit_server', false)) +		{ +			$this->install_config->set('cookie_secure', $cookie_secure); +			$this->install_config->set('server_protocol', $server_protocol); +			$this->install_config->set('force_server_vars', $force_server_vars); +			$this->install_config->set('server_name', $server_name); +			$this->install_config->set('server_port', $server_port); +			$this->install_config->set('script_path', $script_path); +		} +		else +		{ +			// Render form +			$server_form = array( +				'cookie_secure' => array( +					'label'			=> 'COOKIE_SECURE', +					'description'	=> 'COOKIE_SECURE_EXPLAIN', +					'type'			=> 'radio', +					'options'		=> array( +						array( +							'value'		=> 0, +							'label'		=> 'NO', +							'selected'	=> (!$cookie_secure), +						), +						array( +							'value'		=> 1, +							'label'		=> 'YES', +							'selected'	=> ($cookie_secure), +						), +					), +				), +				'force_server_vars' => array( +					'label'			=> 'FORCE_SERVER_VARS', +					'description'	=> 'FORCE_SERVER_VARS_EXPLAIN', +					'type'			=> 'radio', +					'options'		=> array( +						array( +							'value'		=> 0, +							'label'		=> 'NO', +							'selected'	=> true, +						), +						array( +							'value'		=> 1, +							'label'		=> 'YES', +							'selected'	=> false, +						), +					), +				), +				'server_protocol' => array( +					'label'			=> 'SERVER_PROTOCOL', +					'description'	=> 'SERVER_PROTOCOL_EXPLAIN', +					'type'			=> 'text', +					'default'		=> $server_protocol, +				), +				'server_name' => array( +					'label'			=> 'SERVER_NAME', +					'description'	=> 'SERVER_NAME_EXPLAIN', +					'type'			=> 'text', +					'default'		=> $server_name, +				), +				'server_port' => array( +					'label'			=> 'SERVER_PORT', +					'description'	=> 'SERVER_PORT_EXPLAIN', +					'type'			=> 'text', +					'default'		=> $server_port, +				), +				'script_path' => array( +					'label'			=> 'SCRIPT_PATH', +					'description'	=> 'SCRIPT_PATH_EXPLAIN', +					'type'			=> 'text', +					'default'		=> $script_path, +				), +				'submit_server' => array( +					'label'	=> 'SUBMIT', +					'type'	=> 'submit', +				) +			); + +			$this->io_handler->add_user_form_group('SERVER_CONFIG', $server_form); + +			throw new user_interaction_required_exception(); +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_update_files.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_update_files.php new file mode 100644 index 0000000000..0cb809154e --- /dev/null +++ b/phpBB/phpbb/install/module/obtain_data/task/obtain_update_files.php @@ -0,0 +1,113 @@ +<?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\install\module\obtain_data\task; + +use phpbb\install\exception\user_interaction_required_exception; +use phpbb\install\helper\config; +use phpbb\install\helper\iohandler\iohandler_interface; +use phpbb\install\task_base; + +class obtain_update_files extends task_base +{ +	/** +	 * @var config +	 */ +	protected $installer_config; + +	/** +	 * @var iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * @var string +	 */ +	protected $php_ext; + +	/** +	 * Constructor +	 * +	 * @param config				$config +	 * @param iohandler_interface	$iohandler +	 * @param string				$phpbb_root_path +	 * @param string				$php_ext +	 */ +	public function __construct(config $config, iohandler_interface $iohandler, $phpbb_root_path, $php_ext) +	{ +		$this->installer_config	= $config; +		$this->iohandler		= $iohandler; +		$this->phpbb_root_path	= $phpbb_root_path; +		$this->php_ext			= $php_ext; + +		parent::__construct(false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function check_requirements() +	{ +		return $this->installer_config->get('do_update_files', false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		// Load update info file +		// The file should be checked in the requirements, so we assume that it exists +		$update_info_file = $this->phpbb_root_path . 'install/update/index.' . $this->php_ext; +		include($update_info_file); +		$info = (empty($update_info) || !is_array($update_info)) ? false : $update_info; + +		// If the file is invalid, abort mission +		if (!$info) +		{ +			$this->iohandler->add_error_message('WRONG_INFO_FILE_FORMAT'); +			throw new user_interaction_required_exception(); +		} + +		// Replace .php with $this->php_ext if needed +		if ($this->php_ext !== 'php') +		{ +			$custom_extension = '.' . $this->php_ext; +			$info['files'] = preg_replace('#\.php$#i', $custom_extension, $info['files']); +		} + +		// Save update info +		$this->installer_config->set('update_info_unprocessed', $info); +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_update_ftp_data.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_update_ftp_data.php new file mode 100644 index 0000000000..f31472fc58 --- /dev/null +++ b/phpBB/phpbb/install/module/obtain_data/task/obtain_update_ftp_data.php @@ -0,0 +1,163 @@ +<?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\install\module\obtain_data\task; + +use phpbb\install\exception\user_interaction_required_exception; +use phpbb\install\helper\config; +use phpbb\install\helper\iohandler\iohandler_interface; +use phpbb\install\helper\update_helper; +use phpbb\install\task_base; + +class obtain_update_ftp_data extends task_base +{ +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $installer_config; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var update_helper +	 */ +	protected $update_helper; + +	/** +	 * @var string +	 */ +	protected $php_ext; + +	/** +	 * Constructor +	 * +	 * @param config				$installer_config +	 * @param iohandler_interface	$iohandler +	 * @param update_helper			$update_helper +	 * @param string				$php_ext +	 */ +	public function __construct(config $installer_config, iohandler_interface $iohandler, update_helper $update_helper, $php_ext) +	{ +		$this->installer_config	= $installer_config; +		$this->iohandler		= $iohandler; +		$this->update_helper	= $update_helper; +		$this->php_ext			= $php_ext; + +		parent::__construct(false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function check_requirements() +	{ +		return ($this->installer_config->get('do_update_files', false) && +			($this->installer_config->get('file_update_method', '') === 'ftp') +		); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		if ($this->iohandler->get_input('submit_ftp', false)) +		{ +			$this->update_helper->include_file('includes/functions_transfer.' . $this->php_ext); + +			$method = 'ftp'; +			$methods = \transfer::methods(); +			if (!in_array($method, $methods, true)) +			{ +				$method = $methods[0]; +			} + +			$ftp_host = $this->iohandler->get_input('ftp_host', ''); +			$ftp_user = $this->iohandler->get_input('ftp_user', ''); +			$ftp_pass = htmlspecialchars_decode($this->iohandler->get_input('ftp_pass', '')); +			$ftp_path = $this->iohandler->get_input('ftp_path', ''); +			$ftp_port = $this->iohandler->get_input('ftp_port', 21); +			$ftp_time = $this->iohandler->get_input('ftp_timeout', 10); + +			$this->installer_config->set('ftp_host', $ftp_host); +			$this->installer_config->set('ftp_user', $ftp_user); +			$this->installer_config->set('ftp_pass', $ftp_pass); +			$this->installer_config->set('ftp_path', $ftp_path); +			$this->installer_config->set('ftp_port', (int) $ftp_port); +			$this->installer_config->set('ftp_timeout', (int) $ftp_time); +			$this->installer_config->set('ftp_method', $method); +		} +		else +		{ +			$this->iohandler->add_user_form_group('FTP_SETTINGS', array( +				'ftp_host'	=> array( +					'label'			=> 'FTP_HOST', +					'description'	=> 'FTP_HOST_EXPLAIN', +					'type'			=> 'text', +				), +				'ftp_user'	=> array( +					'label'			=> 'FTP_USERNAME', +					'description'	=> 'FTP_USERNAME_EXPLAIN', +					'type'			=> 'text', +				), +				'ftp_pass'	=> array( +					'label'			=> 'FTP_PASSWORD', +					'description'	=> 'FTP_PASSWORD_EXPLAIN', +					'type'			=> 'password', +				), +				'ftp_path'	=> array( +					'label'			=> 'FTP_ROOT_PATH', +					'description'	=> 'FTP_ROOT_PATH_EXPLAIN', +					'type'			=> 'text', +				), +				'ftp_port'	=> array( +					'label'			=> 'FTP_PORT', +					'description'	=> 'FTP_PORT_EXPLAIN', +					'type'			=> 'text', +					'default'		=> 21, +				), +				'ftp_timeout'	=> array( +					'label'			=> 'FTP_TIMEOUT', +					'description'	=> 'FTP_TIMEOUT_EXPLAIN', +					'type'			=> 'text', +					'default'		=> 10, +				), +				'submit_ftp'	=> array( +					'label'	=> 'SUBMIT', +					'type'	=> 'submit', +				), +			)); + +			throw new user_interaction_required_exception(); +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_update_settings.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_update_settings.php new file mode 100644 index 0000000000..c139b70fa4 --- /dev/null +++ b/phpBB/phpbb/install/module/obtain_data/task/obtain_update_settings.php @@ -0,0 +1,115 @@ +<?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\install\module\obtain_data\task; + +use phpbb\install\exception\user_interaction_required_exception; +use phpbb\install\helper\config; +use phpbb\install\helper\iohandler\iohandler_interface; +use phpbb\install\task_base; + +class obtain_update_settings extends task_base +{ +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $installer_config; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * Constructor +	 * +	 * @param config				$installer_config +	 * @param iohandler_interface	$iohandler +	 */ +	public function __construct(config $installer_config, iohandler_interface $iohandler) +	{ +		$this->installer_config	= $installer_config; +		$this->iohandler		= $iohandler; + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		// Check if data is sent +		if ($this->iohandler->get_input('submit_update', false)) +		{ +			$update_files = $this->iohandler->get_input('update_type', 'all') === 'all'; +			$this->installer_config->set('do_update_files', $update_files); +		} +		else +		{ +			if ($this->installer_config->get('disable_filesystem_update', false)) +			{ +				$options[] = array( +					'value'		=> 'db_only', +					'label'		=> 'UPDATE_TYPE_DB_ONLY', +					'selected'	=> true, +				); +			} +			else +			{ +				$options = array( +					array( +						'value'		=> 'all', +						'label'		=> 'UPDATE_TYPE_ALL', +						'selected'	=> true, +					), +					array( +						'value'		=> 'db_only', +						'label'		=> 'UPDATE_TYPE_DB_ONLY', +						'selected'	=> false, +					), +				); +			} + +			$this->iohandler->add_user_form_group('UPDATE_TYPE', array( +				'update_type' => array( +					'label'		=> 'UPDATE_TYPE', +					'type'		=> 'radio', +					'options'	=> $options, +				), +				'submit_update' => array( +					'label'	=> 'SUBMIT', +					'type'	=> 'submit', +				), +			)); + +			throw new user_interaction_required_exception(); +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/obtain_data/update_module.php b/phpBB/phpbb/install/module/obtain_data/update_module.php new file mode 100644 index 0000000000..c2f9019d34 --- /dev/null +++ b/phpBB/phpbb/install/module/obtain_data/update_module.php @@ -0,0 +1,33 @@ +<?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\install\module\obtain_data; + +class update_module extends \phpbb\install\module_base +{ +	/** +	 * {@inheritdoc} +	 */ +	public function get_navigation_stage_path() +	{ +		return array('update', 0, 'obtain_data'); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_step_count() +	{ +		return 0; +	} +} diff --git a/phpBB/phpbb/install/module/requirements/abstract_requirements_module.php b/phpBB/phpbb/install/module/requirements/abstract_requirements_module.php new file mode 100644 index 0000000000..121b4ff4e5 --- /dev/null +++ b/phpBB/phpbb/install/module/requirements/abstract_requirements_module.php @@ -0,0 +1,71 @@ +<?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\install\module\requirements; + +use phpbb\install\exception\user_interaction_required_exception; +use phpbb\install\module_base; + +/** + * Base class for requirements installer module + */ +abstract class abstract_requirements_module extends module_base +{ +	public function run() +	{ +		$tests_passed = true; +		foreach ($this->task_collection as $name => $task) +		{ +			// Check if we can run the task +			if (!$task->is_essential() && !$task->check_requirements()) +			{ +				continue; +			} + +			if ($this->allow_progress_bar) +			{ +				$this->install_config->increment_current_task_progress(); +			} + +			$test_result = $task->run(); +			$tests_passed = ($tests_passed) ? $test_result : false; +		} + +		// Module finished, so clear task progress +		$this->install_config->set_finished_task(0); + +		// Check if tests have failed +		if (!$tests_passed) +		{ +			// If requirements are not met, exit form installer +			// Set up UI for retesting +			$this->iohandler->add_user_form_group('', array( +				'install'	=> array( +					'label'	=> 'RETEST_REQUIREMENTS', +					'type'	=> 'submit', +				), +			)); + +			// Send the response and quit +			throw new user_interaction_required_exception(); +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_step_count() +	{ +		return 0; +	} +} diff --git a/phpBB/phpbb/install/module/requirements/install_module.php b/phpBB/phpbb/install/module/requirements/install_module.php new file mode 100644 index 0000000000..ed0c5fbd94 --- /dev/null +++ b/phpBB/phpbb/install/module/requirements/install_module.php @@ -0,0 +1,25 @@ +<?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\install\module\requirements; + +class install_module extends abstract_requirements_module +{ +	/** +	 * {@inheritdoc} +	 */ +	public function get_navigation_stage_path() +	{ +		return array('install', 0, 'requirements'); +	} +} diff --git a/phpBB/phpbb/install/module/requirements/task/check_filesystem.php b/phpBB/phpbb/install/module/requirements/task/check_filesystem.php new file mode 100644 index 0000000000..2aec3915e0 --- /dev/null +++ b/phpBB/phpbb/install/module/requirements/task/check_filesystem.php @@ -0,0 +1,275 @@ +<?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\install\module\requirements\task; + +/** + * Checks filesystem requirements + */ +class check_filesystem extends \phpbb\install\task_base +{ +	/** +	 * @var \phpbb\filesystem\filesystem_interface +	 */ +	protected $filesystem; + +	/** +	 * @var array +	 */ +	protected $files_to_check; + +	/** +	 * @var bool +	 */ +	protected $tests_passed; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $response; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\filesystem\filesystem_interface				$filesystem			filesystem handler +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$response			response helper +	 * @param string												$phpbb_root_path	relative path to phpBB's root +	 * @param string												$php_ext			extension of php files +	 * @param bool													$check_config_php	Whether or not to check if config.php is writable +	 */ +	public function __construct(\phpbb\filesystem\filesystem_interface $filesystem, \phpbb\install\helper\iohandler\iohandler_interface $response, $phpbb_root_path, $php_ext, $check_config_php = true) +	{ +		parent::__construct(true); + +		$this->filesystem		= $filesystem; +		$this->response			= $response; +		$this->phpbb_root_path	= $phpbb_root_path; + +		$this->tests_passed = false; + +		// Files/Directories to check +		// All file/directory names must be relative to phpBB's root path +		$this->files_to_check = array( +			array( +				'path' => 'cache/', +				'failable' => false, +				'is_file' => false, +			), +			array( +				'path' => 'store/', +				'failable' => false, +				'is_file' => false, +			), +			array( +				'path' => 'files/', +				'failable' => false, +				'is_file' => false, +			), +			array( +				'path' => 'images/avatars/upload/', +				'failable' => true, +				'is_file' => false, +			), +		); + +		if ($check_config_php) +		{ +			$this->files_to_check[] = array( +				'path' => "config.$php_ext", +				'failable' => false, +				'is_file' => true, +			); +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		$this->tests_passed = true; + +		// Check files/directories to be writable +		foreach ($this->files_to_check as $file) +		{ +			if ($file['is_file']) +			{ +				$this->check_file($file['path'], $file['failable']); +			} +			else +			{ +				$this->check_dir($file['path'], $file['failable']); +			} +		} + +		return $this->tests_passed; +	} + +	/** +	 * Sets $this->tests_passed +	 * +	 * @param	bool	$is_passed +	 */ +	protected function set_test_passed($is_passed) +	{ +		// If one test failed, tests_passed should be false +		$this->tests_passed = (!$this->tests_passed) ? false : $is_passed; +	} + +	/** +	 * Check if a file is readable and writable +	 * +	 * @param string	$file		Filename +	 * @param bool		$failable	Whether failing test should interrupt installation process +	 */ +	protected function check_file($file, $failable = false) +	{ +		$path = $this->phpbb_root_path . $file; +		$exists = $writable = true; + +		// Try to create file if it does not exists +		if (!file_exists($path)) +		{ +			$fp = @fopen($path, 'w'); +			@fclose($fp); +			try +			{ +				$this->filesystem->phpbb_chmod($path, +					\phpbb\filesystem\filesystem_interface::CHMOD_READ | \phpbb\filesystem\filesystem_interface::CHMOD_WRITE +				); +				$exists = true; +			} +			catch (\phpbb\filesystem\exception\filesystem_exception $e) +			{ +				// Do nothing +			} +		} + +		if (file_exists($path)) +		{ +			if (!$this->filesystem->is_writable($path)) +			{ +				$writable = false; +			} +		} +		else +		{ +			$exists = $writable = false; +		} + +		$this->set_test_passed(($exists && $writable) || $failable); + +		if (!($exists && $writable)) +		{ +			$title = ($exists) ? 'FILE_NOT_WRITABLE' : 'FILE_NOT_EXISTS'; +			$description = array($title . '_EXPLAIN', $file); + +			if ($failable) +			{ +				$this->response->add_warning_message($title, $description); +			} +			else +			{ +				$this->response->add_error_message($title, $description); +			} +		} +	} + +	/** +	 * Check if a directory is readable and writable +	 * +	 * @param string	$dir		Filename +	 * @param bool		$failable	Whether failing test should abort the installation process +	 */ +	protected function check_dir($dir, $failable = false) +	{ +		$path = $this->phpbb_root_path . $dir; +		$exists = $writable = false; + +		// Try to create the directory if it does not exist +		if (!file_exists($path)) +		{ +			try +			{ +				$this->filesystem->mkdir($path, 0777); +				$this->filesystem->phpbb_chmod($path, +					\phpbb\filesystem\filesystem_interface::CHMOD_READ | \phpbb\filesystem\filesystem_interface::CHMOD_WRITE +				); +				$exists = true; +			} +			catch (\phpbb\filesystem\exception\filesystem_exception $e) +			{ +				// Do nothing +			} +		} + +		// Now really check +		if (file_exists($path) && is_dir($path)) +		{ +			try +			{ +				$exists = true; +				$this->filesystem->phpbb_chmod($path, +					\phpbb\filesystem\filesystem_interface::CHMOD_READ | \phpbb\filesystem\filesystem_interface::CHMOD_WRITE +				); +			} +			catch (\phpbb\filesystem\exception\filesystem_exception $e) +			{ +				// Do nothing +			} +		} + +		if ($this->filesystem->is_writable($path)) +		{ +			$writable = true; +		} + +		$this->set_test_passed(($exists && $writable) || $failable); + +		if (!($exists && $writable)) +		{ +			$title = ($exists) ? 'DIRECTORY_NOT_WRITABLE' : 'DIRECTORY_NOT_EXISTS'; +			$description = array($title . '_EXPLAIN', $dir); + +			if ($failable) +			{ +				$this->response->add_warning_message($title, $description); +			} +			else +			{ +				$this->response->add_error_message($title, $description); +			} +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/requirements/task/check_server_environment.php b/phpBB/phpbb/install/module/requirements/task/check_server_environment.php new file mode 100644 index 0000000000..62485a2097 --- /dev/null +++ b/phpBB/phpbb/install/module/requirements/task/check_server_environment.php @@ -0,0 +1,190 @@ +<?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\install\module\requirements\task; + +/** + * Installer task that checks if the server meats phpBB requirements + */ +class check_server_environment extends \phpbb\install\task_base +{ +	/** +	 * @var \phpbb\install\helper\database +	 */ +	protected $database_helper; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $response_helper; + +	/** +	 * @var bool +	 */ +	protected $tests_passed; + +	/** +	 * Constructor +	 * +	 * @param	\phpbb\install\helper\database	$database_helper +	 * @param	\phpbb\install\helper\iohandler\iohandler_interface	$response +	 */ +	public function __construct(\phpbb\install\helper\database $database_helper, +								\phpbb\install\helper\iohandler\iohandler_interface $response) +	{ +		$this->database_helper	= $database_helper; +		$this->response_helper	= $response; +		$this->tests_passed		= true; + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		// +		// Check requirements +		// The error messages should be set in the check_ functions +		// + +		// Check PHP version +		$this->check_php_version(); + +		// Check for getimagesize() +		$this->check_image_size(); + +		// Check for PCRE support +		$this->check_pcre(); + +		// Check for JSON support +		$this->check_json(); + +		// Check for dbms support +		$this->check_available_dbms(); + +		return $this->tests_passed; +	} + +	/** +	 * Sets $this->tests_passed +	 * +	 * @param	bool	$is_passed +	 */ +	protected function set_test_passed($is_passed) +	{ +		// If one test failed, tests_passed should be false +		$this->tests_passed = (!$this->tests_passed) ? false : $is_passed; +	} + +	/** +	 * Check if the requirements for PHP version is met +	 */ +	protected function check_php_version() +	{ +		$php_version = PHP_VERSION; + +		if (version_compare($php_version, '5.4') < 0) +		{ +			$this->response_helper->add_error_message('PHP_VERSION_REQD', 'PHP_VERSION_REQD_EXPLAIN'); + +			$this->set_test_passed(false); +			return; +		} + +		$this->set_test_passed(true); +	} + +	/** +	 * Checks if the installed PHP has getimagesize() available +	 */ +	protected function check_image_size() +	{ +		if (!@function_exists('getimagesize')) +		{ +			$this->response_helper->add_error_message('PHP_GETIMAGESIZE_SUPPORT', 'PHP_GETIMAGESIZE_SUPPORT_EXPLAIN'); + +			$this->set_test_passed(false); +			return; +		} + +		$this->set_test_passed(true); +	} + +	/** +	 * Checks if the installed PHP supports PCRE +	 */ +	protected function check_pcre() +	{ +		if (@preg_match('//u', '')) +		{ +			$this->set_test_passed(true); +			return; +		} + +		$this->response_helper->add_error_message('PCRE_UTF_SUPPORT', 'PCRE_UTF_SUPPORT_EXPLAIN'); + +		$this->set_test_passed(false); +	} + +	/** +	 * Checks whether PHP's JSON extension is available or not +	 */ +	protected function check_json() +	{ +		if (@extension_loaded('json')) +		{ +			$this->set_test_passed(true); +			return; +		} + +		$this->response_helper->add_error_message('PHP_JSON_SUPPORT', 'PHP_JSON_SUPPORT_EXPLAIN'); + +		$this->set_test_passed(false); +	} + +	/** +	 * Check if any supported DBMS is available +	 */ +	protected function check_available_dbms() +	{ +		$available_dbms = $this->database_helper->get_available_dbms(false, true); + +		if ($available_dbms['ANY_DB_SUPPORT']) +		{ +			$this->set_test_passed(true); +			return; +		} + +		$this->response_helper->add_error_message('PHP_SUPPORTED_DB', 'PHP_SUPPORTED_DB_EXPLAIN'); + +		$this->set_test_passed(false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/requirements/task/check_update.php b/phpBB/phpbb/install/module/requirements/task/check_update.php new file mode 100644 index 0000000000..4e9124ff47 --- /dev/null +++ b/phpBB/phpbb/install/module/requirements/task/check_update.php @@ -0,0 +1,195 @@ +<?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\install\module\requirements\task; + +use phpbb\filesystem\filesystem; +use phpbb\install\helper\config; +use phpbb\install\helper\container_factory; +use phpbb\install\helper\iohandler\iohandler_interface; +use phpbb\install\helper\update_helper; +use phpbb\install\task_base; + +/** + * Check the availability of updater files and update version + */ +class check_update extends task_base +{ +	/** +	 * @var \phpbb\config\db +	 */ +	protected $config; + +	/** +	 * @var filesystem +	 */ +	protected $filesystem; + +	/** +	 * @var config +	 */ +	protected $installer_config; + +	/** +	 * @var iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var update_helper +	 */ +	protected $update_helper; + +	/** +	 * @var \phpbb\version_helper +	 */ +	protected $version_helper; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * @var string +	 */ +	protected $php_ext; + +	/** +	 * @var bool +	 */ +	protected $tests_passed; + +	/** +	 * Constructor +	 * +	 * @param container_factory		$container +	 * @param filesystem			$filesystem +	 * @param config				$config +	 * @param iohandler_interface	$iohandler +	 * @param update_helper			$update_helper +	 * @param string				$phpbb_root_path +	 * @param string				$php_ext +	 */ +	public function __construct(container_factory $container, filesystem $filesystem, config $config, iohandler_interface $iohandler, update_helper $update_helper, $phpbb_root_path, $php_ext) +	{ +		$this->filesystem		= $filesystem; +		$this->installer_config	= $config; +		$this->iohandler		= $iohandler; +		$this->update_helper	= $update_helper; +		$this->phpbb_root_path	= $phpbb_root_path; +		$this->php_ext			= $php_ext; +		$this->tests_passed		= true; + +		$this->config			= $container->get('config'); +		$this->version_helper	= $container->get('version_helper'); + +		parent::__construct(true); +	} + +	/** +	 * Sets $this->tests_passed +	 * +	 * @param	bool	$is_passed +	 */ +	protected function set_test_passed($is_passed) +	{ +		// If one test failed, tests_passed should be false +		$this->tests_passed = $this->tests_passed && $is_passed; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		// Array of update files +		$update_files = array( +			$this->phpbb_root_path . 'install/update', +			$this->phpbb_root_path . 'install/update/index.' . $this->php_ext, +		); + +		// Check for a valid update directory +		if (!$this->filesystem->exists($update_files) || !$this->filesystem->is_readable($update_files)) +		{ +			$this->iohandler->add_error_message('UPDATE_FILES_NOT_FOUND'); +			$this->set_test_passed(false); + +			// If there are no update files, we can't check the version etc +			// However, we can let the users run migrations if they really want to... +			$this->installer_config->set('disable_filesystem_update', true); +			return true; +		} + +		// Recover version numbers +		$update_info = array(); +		@include($this->phpbb_root_path . 'install/update/index.' . $this->php_ext); +		$info = (empty($update_info) || !is_array($update_info)) ? false : $update_info; +		$update_version = false; + +		if ($info !== false) +		{ +			$update_version = (!empty($info['version']['to'])) ? trim($info['version']['to']) : false; +		} + +		// Get current and latest version +		try +		{ +			$latest_version = $this->version_helper->get_latest_on_current_branch(true); +		} +		catch (\RuntimeException $e) +		{ +			$latest_version = $update_version; +		} + +		$current_version = (!empty($this->config['version_update_from'])) ? $this->config['version_update_from'] : $this->config['version']; + +		// Check if the update package +		if (!$this->update_helper->phpbb_version_compare($current_version, $update_version, '<')) +		{ +			$this->iohandler->add_error_message('NO_UPDATE_FILES_UP_TO_DATE'); +			$this->tests_passed = false; +		} + +		// Check if the update package works with the installed version +		if (empty($info['version']['from']) || $info['version']['from'] !== $current_version) +		{ +			$this->iohandler->add_error_message(array('INCOMPATIBLE_UPDATE_FILES', $current_version, $info['version']['from'], $update_version)); +			$this->tests_passed = false; +		} + +		// check if this is the latest update package +		if ($this->update_helper->phpbb_version_compare($update_version, $latest_version, '<')) +		{ +			$this->iohandler->add_warning_message(array('OLD_UPDATE_FILES', $info['version']['from'], $update_version, $latest_version)); +		} + +		return $this->tests_passed; +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/requirements/update_module.php b/phpBB/phpbb/install/module/requirements/update_module.php new file mode 100644 index 0000000000..223d12faf3 --- /dev/null +++ b/phpBB/phpbb/install/module/requirements/update_module.php @@ -0,0 +1,25 @@ +<?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\install\module\requirements; + +class update_module extends abstract_requirements_module +{ +	/** +	 * {@inheritdoc} +	 */ +	public function get_navigation_stage_path() +	{ +		return array('update', 0, 'requirements'); +	} +} diff --git a/phpBB/phpbb/install/module/update_database/module.php b/phpBB/phpbb/install/module/update_database/module.php new file mode 100644 index 0000000000..ee38afe17d --- /dev/null +++ b/phpBB/phpbb/install/module/update_database/module.php @@ -0,0 +1,33 @@ +<?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\install\module\update_database; + +class module extends \phpbb\install\module_base +{ +	/** +	 * {@inheritdoc} +	 */ +	public function get_navigation_stage_path() +	{ +		return array('update', 0, 'update_database'); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_step_count() +	{ +		return 0; +	} +} diff --git a/phpBB/phpbb/install/module/update_database/task/update.php b/phpBB/phpbb/install/module/update_database/task/update.php new file mode 100644 index 0000000000..4b2baf2c23 --- /dev/null +++ b/phpBB/phpbb/install/module/update_database/task/update.php @@ -0,0 +1,212 @@ +<?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\install\module\update_database\task; + +use phpbb\db\migration\exception; +use phpbb\db\output_handler\installer_migrator_output_handler; +use phpbb\db\output_handler\log_wrapper_migrator_output_handler; +use phpbb\install\exception\resource_limit_reached_exception; +use phpbb\install\exception\user_interaction_required_exception; +use phpbb\install\task_base; + +/** + * Database updater task + */ +class update extends task_base +{ +	/** +	 * @var \phpbb\cache\driver\driver_interface +	 */ +	protected $cache; + +	/** +	 * @var \phpbb\config\config +	 */ +	protected $config; + +	/** +	 * @var \phpbb\extension\manager +	 */ +	protected $extension_manager; + +	/** +	 * @var \phpbb\filesystem\filesystem +	 */ +	protected $filesystem; + +	/** +	 * @var \phpbb\install\helper\config +	 */ +	protected $installer_config; + +	/** +	 * @var \phpbb\install\helper\iohandler\iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var \phpbb\language\language +	 */ +	protected $language; + +	/** +	 * @var \phpbb\log\log +	 */ +	protected $log; + +	/** +	 * @var \phpbb\db\migrator +	 */ +	protected $migrator; + +	/** +	 * @var \phpbb\user +	 */ +	protected $user; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * Constructor +	 * +	 * @param \phpbb\install\helper\container_factory				$container +	 * @param \phpbb\filesystem\filesystem							$filesystem +	 * @param \phpbb\install\helper\config							$installer_config +	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler +	 * @param \phpbb\language\language								$language +	 * @param string												$phpbb_root_path +	 */ +	public function __construct(\phpbb\install\helper\container_factory $container, \phpbb\filesystem\filesystem $filesystem, \phpbb\install\helper\config $installer_config, \phpbb\install\helper\iohandler\iohandler_interface $iohandler, \phpbb\language\language $language, $phpbb_root_path) +	{ +		$this->filesystem			= $filesystem; +		$this->installer_config		= $installer_config; +		$this->iohandler			= $iohandler; +		$this->language				= $language; +		$this->phpbb_root_path		= $phpbb_root_path; + +		$this->cache				= $container->get('cache.driver'); +		$this->config				= $container->get('config'); +		$this->extension_manager	= $container->get('ext.manager'); +		$this->log					= $container->get('log'); +		$this->migrator				= $container->get('migrator'); +		$this->user					= $container->get('user'); + +		parent::__construct(true); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		$this->language->add_lang('migrator'); + +		if (!isset($this->config['version_update_from'])) +		{ +			$this->config->set('version_update_from', $this->config['version']); +		} + +		$original_version = $this->config['version_update_from']; + +		$this->migrator->set_output_handler( +			new log_wrapper_migrator_output_handler( +				$this->language, +				new installer_migrator_output_handler($this->iohandler), +				$this->phpbb_root_path . 'store/migrations_' . time() . '.log', +				$this->filesystem +			) +		); + +		$this->migrator->create_migrations_table(); + +		$migrations = $this->extension_manager +			->get_finder() +			->core_path('phpbb/db/migration/data/') +			->extension_directory('/migrations') +			->get_classes(); + +		$this->migrator->set_migrations($migrations); +		$migration_count = count($this->migrator->get_migrations()); +		$this->iohandler->set_task_count($migration_count, true); +		$progress_count = $this->installer_config->get('database_update_count', 0); + +		while (!$this->migrator->finished()) +		{ +			try +			{ +				$this->migrator->update(); +				$progress_count++; +				$this->iohandler->set_progress('STAGE_UPDATE_DATABASE', $progress_count); +			} +			catch (exception $e) +			{ +				$msg = $e->getParameters(); +				array_unshift($msg, $e->getMessage()); + +				$this->iohandler->add_error_message($msg); +				throw new user_interaction_required_exception(); +			} + +			if ($this->installer_config->get_time_remaining() <= 0 || $this->installer_config->get_memory_remaining() <= 0) +			{ +				$this->installer_config->set('database_update_count', $progress_count); +				throw new resource_limit_reached_exception(); +			} +		} + +		if ($original_version !== $this->config['version']) +		{ +			$this->log->add( +				'admin', +				(isset($this->user->data['user_id'])) ? $this->user->data['user_id'] : ANONYMOUS, +				$this->user->ip, +				'LOG_UPDATE_DATABASE', +				false, +				array( +					$original_version, +					$this->config['version'] +				) +			); +		} + +		$this->iohandler->finish_progress('INLINE_UPDATE_SUCCESSFUL'); + +		$this->iohandler->add_success_message('INLINE_UPDATE_SUCCESSFUL'); + +		$this->config->delete('version_update_from'); + +		$this->cache->purge(); + +		$this->config->increment('assets_version', 1); +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/update_filesystem/module.php b/phpBB/phpbb/install/module/update_filesystem/module.php new file mode 100644 index 0000000000..157c78a1ac --- /dev/null +++ b/phpBB/phpbb/install/module/update_filesystem/module.php @@ -0,0 +1,33 @@ +<?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\install\module\update_filesystem; + +class module extends \phpbb\install\module_base +{ +	/** +	 * {@inheritdoc} +	 */ +	public function get_navigation_stage_path() +	{ +		return array('update', 0, 'update_files'); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_step_count() +	{ +		return 0; +	} +} diff --git a/phpBB/phpbb/install/module/update_filesystem/task/diff_files.php b/phpBB/phpbb/install/module/update_filesystem/task/diff_files.php new file mode 100644 index 0000000000..e3e6db6263 --- /dev/null +++ b/phpBB/phpbb/install/module/update_filesystem/task/diff_files.php @@ -0,0 +1,205 @@ +<?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\install\module\update_filesystem\task; + +use phpbb\install\exception\resource_limit_reached_exception; +use phpbb\install\exception\user_interaction_required_exception; +use phpbb\install\helper\config; +use phpbb\install\helper\container_factory; +use phpbb\install\helper\iohandler\iohandler_interface; +use phpbb\install\helper\update_helper; +use phpbb\install\task_base; + +/** + * Merges user made changes into the files + */ +class diff_files extends task_base +{ +	/** +	 * @var \phpbb\cache\driver\driver_interface +	 */ +	protected $cache; + +	/** +	 * @var config +	 */ +	protected $installer_config; + +	/** +	 * @var iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * @var string +	 */ +	protected $php_ext; + +	/** +	 * @var update_helper +	 */ +	protected $update_helper; + +	/** +	 * Constructor +	 * +	 * @param container_factory		$container +	 * @param config				$config +	 * @param iohandler_interface	$iohandler +	 * @param update_helper			$update_helper +	 * @param string				$phpbb_root_path +	 * @param string				$php_ext +	 */ +	public function __construct(container_factory $container, config $config, iohandler_interface $iohandler, update_helper $update_helper, $phpbb_root_path, $php_ext) +	{ +		$this->installer_config	= $config; +		$this->iohandler		= $iohandler; +		$this->update_helper	= $update_helper; +		$this->phpbb_root_path	= $phpbb_root_path; +		$this->php_ext			= $php_ext; + +		$this->cache			= $container->get('cache.driver'); + +		parent::__construct(false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function check_requirements() +	{ +		$files_to_diff = $this->installer_config->get('update_files', array()); +		$files_to_diff = (isset($files_to_diff['update_with_diff'])) ? $files_to_diff['update_with_diff'] : array(); + +		return $this->installer_config->get('do_update_files', false) && count($files_to_diff) > 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		// Include diff engine +		$this->update_helper->include_file('includes/diff/diff.' . $this->php_ext); +		$this->update_helper->include_file('includes/diff/engine.' . $this->php_ext); + +		// Set up basic vars +		$old_path = $this->update_helper->get_path_to_old_update_files(); +		$new_path = $this->update_helper->get_path_to_new_update_files(); + +		$files_to_diff = $this->installer_config->get('update_files', array()); +		$files_to_diff = $files_to_diff['update_with_diff']; + +		// Set progress bar +		$this->iohandler->set_task_count(count($files_to_diff), true); +		$this->iohandler->set_progress('UPDATE_FILE_DIFF', 0); +		$progress_count = $this->installer_config->get('file_diff_update_count', 0); + +		// Recover progress +		$progress_key = $this->installer_config->get('differ_progress_key', -1); +		$progress_recovered = ($progress_key === -1); +		$merge_conflicts = $this->installer_config->get('merge_conflict_list', array()); + +		foreach ($files_to_diff as $key => $filename) +		{ +			if ($progress_recovered === false) +			{ +				if ($progress_key === $key) +				{ +					$progress_recovered = true; +				} + +				continue; +			} + +			// Read in files' content +			$file_contents = array(); + +			// Handle the special case when user created a file with the filename that is now new in the core +			$file_contents[0] = (file_exists($old_path . $filename)) ? file_get_contents($old_path . $filename) : ''; + +			$filenames = array( +				$this->phpbb_root_path . $filename, +				$new_path . $filename +			); + +			foreach ($filenames as $file_to_diff) +			{ +				$file_contents[] = file_get_contents($file_to_diff); + +				if ($file_contents[sizeof($file_contents) - 1] === false) +				{ +					$this->iohandler->add_error_message(array('FILE_DIFFER_ERROR_FILE_CANNOT_BE_READ', $files_to_diff)); +					unset($file_contents); +					throw new user_interaction_required_exception(); +				} +			} + +			$diff = new \diff3($file_contents[0], $file_contents[1], $file_contents[2]); +			unset($file_contents); + +			// Handle conflicts +			if ($diff->get_num_conflicts() !== 0) +			{ +				$merge_conflicts[] = $filename; +			} + +			// Save merged output +			$this->cache->put( +				'_file_' . md5($filename), +				base64_encode(implode("\n", $diff->merged_output())) +			); + +			unset($diff); + +			$progress_count++; +			$this->iohandler->set_progress('UPDATE_FILE_DIFF', $progress_count); + +			if ($this->installer_config->get_time_remaining() <= 0 || $this->installer_config->get_memory_remaining() <= 0) +			{ +				// Save differ progress +				$this->installer_config->set('differ_progress_key', $key); +				$this->installer_config->set('merge_conflict_list', $merge_conflicts); +				$this->installer_config->set('file_diff_update_count', $progress_count); + +				// Request refresh +				throw new resource_limit_reached_exception(); +			} +		} + +		$this->iohandler->finish_progress('ALL_FILES_DIFFED'); +		$this->installer_config->set('merge_conflict_list', $merge_conflicts); +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/update_filesystem/task/download_updated_files.php b/phpBB/phpbb/install/module/update_filesystem/task/download_updated_files.php new file mode 100644 index 0000000000..f911b7ac62 --- /dev/null +++ b/phpBB/phpbb/install/module/update_filesystem/task/download_updated_files.php @@ -0,0 +1,123 @@ +<?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\install\module\update_filesystem\task; + +use phpbb\filesystem\filesystem; +use phpbb\install\exception\jump_to_restart_point_exception; +use phpbb\install\exception\user_interaction_required_exception; +use phpbb\install\helper\config; +use phpbb\install\helper\iohandler\iohandler_interface; +use phpbb\install\task_base; + +class download_updated_files extends task_base +{ +	/** +	 * @var config +	 */ +	protected $installer_config; + +	/** +	 * @var filesystem +	 */ +	protected $filesystem; + +	/** +	 * @var iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * Constructor +	 * +	 * @param config				$config +	 * @param iohandler_interface	$iohandler +	 * @param filesystem			$filesystem +	 */ +	public function __construct(config $config, iohandler_interface $iohandler, filesystem $filesystem) +	{ +		$this->installer_config	= $config; +		$this->iohandler		= $iohandler; +		$this->filesystem		= $filesystem; + +		parent::__construct(false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function check_requirements() +	{ +		return $this->installer_config->get('do_update_files', false) +			&& $this->installer_config->get('file_update_method', '') === 'compression'; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		if ($this->iohandler->get_input('database_update_submit', false)) +		{ +			// Remove archive +			$this->filesystem->remove( +				$this->installer_config->get('update_file_archive', null) +			); + +			$this->installer_config->set('update_file_archive', null); +		} +		else if ($this->iohandler->get_input('update_recheck_files_submit', false)) +		{ +			throw new jump_to_restart_point_exception('check_update_files'); +		} +		else +		{ +			// Render download box +			$this->iohandler->add_download_link( +				'phpbb_installer_update_file_download', +				'DOWNLOAD_UPDATE_METHOD', +				'DOWNLOAD_UPDATE_METHOD_EXPLAIN' +			); + +			// Add form to continue update +			$this->iohandler->add_user_form_group('UPDATE_CONTINUE_UPDATE_PROCESS', array( +				'update_recheck_files_submit'	=> array( +					'label'	=> 'UPDATE_RECHECK_UPDATE_FILES', +					'type'	=> 'submit', +				), +				'database_update_submit'	=> array( +					'label'	=> 'UPDATE_CONTINUE_UPDATE_PROCESS', +					'type'	=> 'submit', +				), +			)); + +			throw new user_interaction_required_exception(); +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/update_filesystem/task/file_check.php b/phpBB/phpbb/install/module/update_filesystem/task/file_check.php new file mode 100644 index 0000000000..5dbee6c259 --- /dev/null +++ b/phpBB/phpbb/install/module/update_filesystem/task/file_check.php @@ -0,0 +1,186 @@ +<?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\install\module\update_filesystem\task; + +use phpbb\filesystem\filesystem; +use phpbb\install\exception\resource_limit_reached_exception; +use phpbb\install\helper\config; +use phpbb\install\helper\iohandler\iohandler_interface; +use phpbb\install\helper\update_helper; +use phpbb\install\task_base; + +/** + * Updater task performing file checking + */ +class file_check extends task_base +{ +	/** +	 * @var filesystem +	 */ +	protected $filesystem; + +	/** +	 * @var config +	 */ +	protected $installer_config; + +	/** +	 * @var iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var update_helper +	 */ +	protected $update_helper; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * Construct +	 * +	 * @param filesystem			$filesystem +	 * @param config				$config +	 * @param iohandler_interface	$iohandler +	 * @param update_helper			$update_helper +	 * @param string				$phpbb_root_path +	 */ +	public function __construct(filesystem $filesystem, config $config, iohandler_interface $iohandler, update_helper $update_helper, $phpbb_root_path) +	{ +		$this->filesystem		= $filesystem; +		$this->installer_config	= $config; +		$this->iohandler		= $iohandler; +		$this->update_helper	= $update_helper; +		$this->phpbb_root_path	= $phpbb_root_path; + +		parent::__construct(false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function check_requirements() +	{ +		return $this->installer_config->get('do_update_files', false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		if (!$this->installer_config->has_restart_point('check_update_files')) +		{ +			$this->installer_config->create_progress_restart_point('check_update_files'); +		} + +		$old_path = $this->update_helper->get_path_to_old_update_files(); +		$new_path = $this->update_helper->get_path_to_new_update_files(); + +		$update_info = $this->installer_config->get('update_info', array()); +		$file_update_info = $this->installer_config->get('update_files', array()); + +		if (empty($update_info)) +		{ +			$root_path = $this->phpbb_root_path; + +			$update_info = $this->installer_config->get('update_info_unprocessed', array()); + +			$file_update_info = array(); +			$file_update_info['update_without_diff'] = array_diff($update_info['binary'], $update_info['deleted']); + +			// Filter out files that are already deleted +			$file_update_info['delete'] = array_filter( +				$update_info['deleted'], +				function ($filename) use ($root_path) +				{ +					return file_exists($root_path . $filename); +				} +			); +		} + +		$progress_count = $this->installer_config->get('file_check_progress_count', 0); +		$task_count = count($update_info['files']); +		$this->iohandler->set_task_count($task_count); +		$this->iohandler->set_progress('UPDATE_CHECK_FILES', 0); + +		foreach ($update_info['files'] as $key => $filename) +		{ +			$old_file = $old_path . $filename; +			$new_file = $new_path . $filename; +			$file = $this->phpbb_root_path . $filename; + +			if ($this->installer_config->get_time_remaining() <= 0 || $this->installer_config->get_memory_remaining() <= 0) +			{ +				// Save progress +				$this->installer_config->set('update_info', $update_info); +				$this->installer_config->set('file_check_progress_count', $progress_count); +				$this->installer_config->set('update_files', $file_update_info); + +				// Request refresh +				throw new resource_limit_reached_exception(); +			} + +			$progress_count++; +			$this->iohandler->set_progress('UPDATE_CHECK_FILES', $progress_count); + +			if (!$this->filesystem->exists($file)) +			{ +				$file_update_info['new'][] = $filename; +			} +			else +			{ +				$file_checksum = md5_file($file); + +				if ($file_checksum === md5_file($new_file)) +				{ +					// File already up to date +					continue; +				} +				else if ($this->filesystem->exists($old_file) && $file_checksum === md5_file($old_file)) +				{ +					// No need to diff the file +					$file_update_info['update_without_diff'][] = $filename; +				} +				else +				{ +					$file_update_info['update_with_diff'][] = $filename; +				} +			} + +			unset($update_info['files'][$key]); +		} + +		$this->installer_config->set('update_files', $file_update_info); +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/update_filesystem/task/show_file_status.php b/phpBB/phpbb/install/module/update_filesystem/task/show_file_status.php new file mode 100644 index 0000000000..c46c05500a --- /dev/null +++ b/phpBB/phpbb/install/module/update_filesystem/task/show_file_status.php @@ -0,0 +1,167 @@ +<?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\install\module\update_filesystem\task; + +use phpbb\filesystem\filesystem; +use phpbb\install\exception\user_interaction_required_exception; +use phpbb\install\helper\config; +use phpbb\install\helper\container_factory; +use phpbb\install\helper\file_updater\factory; +use phpbb\install\helper\iohandler\iohandler_interface; +use phpbb\install\task_base; + +class show_file_status extends task_base +{ +	/** +	 * @var \phpbb\cache\driver\driver_interface +	 */ +	protected $cache; + +	/** +	 * @var filesystem +	 */ +	protected $filesystem; + +	/** +	 * @var config +	 */ +	protected $installer_config; + +	/** +	 * @var iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var \phpbb\install\helper\file_updater\compression_file_updater +	 */ +	protected $file_updater; + +	/** +	 * Constructor +	 * +	 * @param container_factory		$container +	 * @param config				$config +	 * @param iohandler_interface	$iohandler +	 * @param filesystem			$filesystem +	 * @param factory				$file_updater_factory +	 */ +	public function __construct(container_factory $container, config $config, iohandler_interface $iohandler, filesystem $filesystem, factory $file_updater_factory) +	{ +		$this->installer_config	= $config; +		$this->iohandler		= $iohandler; +		$this->filesystem		= $filesystem; + +		$this->cache = $container->get('cache.driver'); + +		// Initialize compression file updater +		$compression_method = $this->installer_config->get('compression_method', ''); +		$this->file_updater = $file_updater_factory->get('compression'); +		$conflict_archive = $this->file_updater->init($compression_method); + +		$this->installer_config->set('update_file_conflict_archive', $conflict_archive); + +		parent::__construct(false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function check_requirements() +	{ +		return $this->installer_config->get('do_update_files', false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		if (!$this->iohandler->get_input('submit_continue_file_update', false)) +		{ +			// Handle merge conflicts +			$merge_conflicts = $this->installer_config->get('merge_conflict_list', array()); + +			// Create archive for merge conflicts +			if (!empty($merge_conflicts)) +			{ +				foreach ($merge_conflicts as $filename) +				{ +					$this->file_updater->create_new_file( +						$filename, +						base64_decode($this->cache->get('_file_' . md5($filename))), +						true +					); +				} + +				// Render download box +				$this->iohandler->add_download_link( +					'phpbb_installer_update_conflict_download', +					'DOWNLOAD_CONFLICTS', +					'DOWNLOAD_CONFLICTS_EXPLAIN' +				); +			} + +			$this->file_updater->close(); + +			// Render update file statuses +			$file_update_info = $this->installer_config->get('update_files', array()); +			$file_status = array( +				'deleted'		=> (!isset($file_update_info['delete'])) ? array() : $file_update_info['delete'], +				'new'			=> (!isset($file_update_info['new'])) ? array() : $file_update_info['new'], +				'conflict'		=> $this->installer_config->get('merge_conflict_list', array()), +				'modified'		=> (!isset($file_update_info['update_with_diff'])) ? array() : $file_update_info['update_with_diff'], +				'not_modified'	=> (!isset($file_update_info['update_without_diff'])) ? array() : $file_update_info['update_without_diff'], +			); + +			$this->iohandler->render_update_file_status($file_status); + +			// Add form to continue update +			$this->iohandler->add_user_form_group('UPDATE_CONTINUE_FILE_UPDATE', array( +				'submit_continue_file_update'	=> array( +					'label'	=> 'UPDATE_CONTINUE_FILE_UPDATE', +					'type'	=> 'submit', +				), +			)); + +			// Show results to the user +			throw new user_interaction_required_exception(); +		} +		else +		{ +			// Remove archive +			$this->filesystem->remove( +				$this->installer_config->get('update_file_conflict_archive', null) +			); + +			$this->installer_config->set('update_file_conflict_archive', null); +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} diff --git a/phpBB/phpbb/install/module/update_filesystem/task/update_files.php b/phpBB/phpbb/install/module/update_filesystem/task/update_files.php new file mode 100644 index 0000000000..fbb465cc66 --- /dev/null +++ b/phpBB/phpbb/install/module/update_filesystem/task/update_files.php @@ -0,0 +1,294 @@ +<?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\install\module\update_filesystem\task; + +use phpbb\exception\runtime_exception; +use phpbb\install\exception\resource_limit_reached_exception; +use phpbb\install\helper\config; +use phpbb\install\helper\container_factory; +use phpbb\install\helper\file_updater\factory; +use phpbb\install\helper\file_updater\file_updater_interface; +use phpbb\install\helper\iohandler\iohandler_interface; +use phpbb\install\helper\update_helper; +use phpbb\install\task_base; + +/** + * File updater task + */ +class update_files extends task_base +{ +	/** +	 * @var \phpbb\cache\driver\driver_interface +	 */ +	protected $cache; + +	/** +	 * @var config +	 */ +	protected $installer_config; + +	/** +	 * @var iohandler_interface +	 */ +	protected $iohandler; + +	/** +	 * @var factory +	 */ +	protected $factory; + +	/** +	 * @var file_updater_interface +	 */ +	protected $file_updater; + +	/** +	 * @var update_helper +	 */ +	protected $update_helper; + +	/** +	 * @var string +	 */ +	protected $phpbb_root_path; + +	/** +	 * Constructor +	 * +	 * @param container_factory		$container +	 * @param config				$config +	 * @param iohandler_interface	$iohandler +	 * @param factory				$file_updater_factory +	 * @param update_helper			$update_helper +	 * @param string				$phpbb_root_path +	 */ +	public function __construct(container_factory $container, config $config, iohandler_interface $iohandler, factory $file_updater_factory, update_helper $update_helper, $phpbb_root_path) +	{ +		$this->factory			= $file_updater_factory; +		$this->installer_config	= $config; +		$this->iohandler		= $iohandler; +		$this->update_helper	= $update_helper; +		$this->phpbb_root_path	= $phpbb_root_path; + +		$this->cache			= $container->get('cache.driver'); +		$this->file_updater		= null; + +		parent::__construct(false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function check_requirements() +	{ +		return $this->installer_config->get('do_update_files', false); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function run() +	{ +		$new_path = $this->update_helper->get_path_to_new_update_files(); + +		$file_update_info = $this->installer_config->get('update_files', array()); + +		$update_type_progress = $this->installer_config->get('file_updater_type_progress', ''); +		$update_elem_progress = $this->installer_config->get('file_updater_elem_progress', ''); +		$type_progress_found = false; +		$elem_progress_found = false; + +		// Progress bar +		$task_count = 0; +		foreach ($file_update_info as $sub_array) +		{ +			$task_count += count($sub_array); +		} + +		// Everything is up to date, so just continue +		if ($task_count === 0) +		{ +			return; +		} + +		$progress_count = $this->installer_config->get('file_update_progress_count', 0); +		$this->iohandler->set_task_count($task_count, true); +		$this->iohandler->set_progress('UPDATE_UPDATING_FILES', 0); + +		$this->file_updater = $this->get_file_updater(); + +		// File updater fallback logic +		try +		{ +			// Update files +			foreach ($file_update_info as $type => $file_update_vector) +			{ +				if (!$type_progress_found) +				{ +					if ($type === $update_type_progress || empty($update_elem_progress)) +					{ +						$type_progress_found = true; +					} +					else +					{ +						continue; +					} +				} + +				foreach ($file_update_vector as $path) +				{ +					if (!$elem_progress_found) +					{ +						if ($path === $update_elem_progress || empty($update_elem_progress)) +						{ +							$elem_progress_found = true; +						} +						else +						{ +							continue; +						} +					} + +					switch ($type) +					{ +						case 'delete': +							$this->file_updater->delete_file($path); +						break; +						case 'new': +							$this->file_updater->create_new_file($path, $new_path . $path); +						break; +						case 'update_without_diff': +							$this->file_updater->update_file($path, $new_path . $path); +						break; +						case 'update_with_diff': +							$this->file_updater->update_file( +								$path, +								base64_decode($this->cache->get('_file_' . md5($path))), +								true +							); +						break; +					} + +					// Save progress +					$this->installer_config->set('file_updater_type_progress', $type); +					$this->installer_config->set('file_updater_elem_progress', $path); +					$progress_count++; +					$this->iohandler->set_progress('UPDATE_UPDATING_FILES', $progress_count); + +					if ($this->installer_config->get_time_remaining() <= 0 || $this->installer_config->get_memory_remaining() <= 0) +					{ +						// Request refresh +						throw new resource_limit_reached_exception(); +					} +				} +			} + +			$this->iohandler->finish_progress('UPDATE_UPDATING_FILES'); +		} +		catch (runtime_exception $e) +		{ +			if ($e instanceof resource_limit_reached_exception) +			{ +				throw new resource_limit_reached_exception(); +			} + +			$current_method = $this->installer_config->get('file_update_method', ''); + +			// File updater failed, try to fallback to download file update mode +			if ($current_method !== 'compression') +			{ +				$this->iohandler->add_warning_message(array( +					'UPDATE_FILE_UPDATER_HAS_FAILED', +					$current_method, +					'compression' +				)); +				$this->installer_config->set('file_update_method', 'compression'); + +				// We only want a simple refresh here +				throw new resource_limit_reached_exception(); +			} +			else +			{ +				// Nowhere to fallback to :( +				// Due to the way the installer handles fatal errors, we need to throw a low level exception +				throw new runtime_exception('UPDATE_FILE_UPDATERS_HAVE_FAILED'); +			} +		} + +		$file_updater_method = $this->installer_config->get('file_update_method', ''); +		if ($file_updater_method === 'compression' || $file_updater_method === 'ftp') +		{ +			$this->file_updater->close(); +		} +	} + +	/** +	 * Get file updater +	 * +	 * @param null|string	$file_updater_method	Name of the file updater to use +	 * +	 * @return file_updater_interface	File updater +	 */ +	protected function get_file_updater($file_updater_method = null) +	{ +		$file_updater_method = ($file_updater_method === null) ? $this->installer_config->get('file_update_method', '') : $file_updater_method; + +		if ($file_updater_method === 'compression') +		{ +			$compression_method = $this->installer_config->get('file_update_compression', ''); + +			/** @var \phpbb\install\helper\file_updater\compression_file_updater $file_updater */ +			$file_updater = $this->factory->get('compression'); +			$archive_path = $file_updater->init($compression_method); +			$this->installer_config->set('update_file_archive', $archive_path); +		} +		else if ($file_updater_method === 'ftp') +		{ +			/** @var \phpbb\install\helper\file_updater\ftp_file_updater $file_updater */ +			$file_updater = $this->factory->get('ftp'); +			$file_updater->init( +				$this->installer_config->get('ftp_method', ''), +				$this->installer_config->get('ftp_host', ''), +				$this->installer_config->get('ftp_user', ''), +				$this->installer_config->get('ftp_pass', ''), +				$this->installer_config->get('ftp_path', ''), +				$this->installer_config->get('ftp_port', 0), +				$this->installer_config->get('ftp_timeout', 10) +			); +		} +		else +		{ +			/** @var file_updater_interface $file_updater */ +			$file_updater = $this->factory->get('direct_file'); +		} + +		return $file_updater; +	} + +	/** +	 * {@inheritdoc} +	 */ +	static public function get_step_count() +	{ +		return 0; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_task_lang_name() +	{ +		return ''; +	} +} | 
