PDF rausgenommen

This commit is contained in:
aschwarz
2023-01-23 11:03:31 +01:00
parent 82d562a322
commit a6523903eb
28078 changed files with 4247552 additions and 2 deletions

View File

@ -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');
}
}

View File

@ -0,0 +1,263 @@
<?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');
$i++;
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 < count($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';
}
}

View File

@ -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';
}
}

View File

@ -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 = count($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';
}
}

View File

@ -0,0 +1,134 @@
<?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\auth\auth;
use phpbb\db\driver\driver_interface;
use phpbb\event\dispatcher;
use phpbb\config\config;
use phpbb\install\helper\container_factory;
use phpbb\language\language;
use phpbb\search\fulltext_native;
use phpbb\user;
class create_search_index extends \phpbb\install\task_base
{
/**
* @var auth
*/
protected $auth;
/**
* @var config
*/
protected $config;
/**
* @var driver_interface
*/
protected $db;
/**
* @var dispatcher
*/
protected $phpbb_dispatcher;
/**
* @var language
*/
protected $language;
/**
* @var user
*/
protected $user;
/**
* @var string phpBB root path
*/
protected $phpbb_root_path;
/**
* @var string PHP file extension
*/
protected $php_ext;
/**
* Constructor
*
* @param config $config phpBB config
* @param container_factory $container Installer's DI container
* @param string $phpbb_root_path phpBB root path
* @param string $php_ext PHP file extension
*/
public function __construct(config $config, container_factory $container,
$phpbb_root_path, $php_ext)
{
$this->auth = $container->get('auth');
$this->config = $config;
$this->db = $container->get('dbal.conn');
$this->language = $container->get('language');
$this->phpbb_dispatcher = $container->get('dispatcher');
$this->user = $container->get('user');
parent::__construct(true);
}
/**
* {@inheritdoc}
*/
public function run()
{
// Make sure fulltext native load update is set
$this->config->set('fulltext_native_load_upd', 1);
$error = false;
$search = new fulltext_native(
$error,
$this->phpbb_root_path,
$this->php_ext,
$this->auth,
$this->config,
$this->db,
$this->user,
$this->phpbb_dispatcher
);
$sql = 'SELECT post_id, post_subject, post_text, poster_id, forum_id
FROM ' . POSTS_TABLE;
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$search->index('post', $row['post_id'], $row['post_text'], $row['post_subject'], $row['poster_id'], $row['forum_id']);
}
$this->db->sql_freeresult($result);
}
/**
* {@inheritdoc}
*/
static public function get_step_count()
{
return 1;
}
/**
* {@inheritdoc}
*/
public function get_task_lang_name()
{
return 'TASK_CREATE_SEARCH_INDEX';
}
}

View File

@ -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');
}
}

View File

@ -0,0 +1,368 @@
<?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');
$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');
// Calculate cookie domain
$cookie_domain = $server_name;
if (strpos($cookie_domain, 'www.') === 0)
{
$cookie_domain = substr($cookie_domain, 3);
}
// 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('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_port')) . "'
WHERE config_name = 'smtp_port'",
'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 = count($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';
}
}

View File

@ -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 = count($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)
{
$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';
}
}

View File

@ -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 = count($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';
}
}

View File

@ -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';
}
}

View File

@ -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';
}
}

View File

@ -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';
}
}

View File

@ -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');
}
}

View File

@ -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';
}
}

View File

@ -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');
}
}

View File

@ -0,0 +1,207 @@
<?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;
/**
* Installs extensions that exist in ext folder upon install
*/
class install_extensions extends \phpbb\install\task_base
{
/**
* @var \phpbb\install\helper\config
*/
protected $install_config;
/**
* @var \phpbb\install\helper\iohandler\iohandler_interface
*/
protected $iohandler;
/**
* @var \phpbb\config\db
*/
protected $config;
/**
* @var \phpbb\log\log_interface
*/
protected $log;
/**
* @var \phpbb\user
*/
protected $user;
/** @var \phpbb\extension\manager */
protected $extension_manager;
/** @var \Symfony\Component\Finder\Finder */
protected $finder;
/** @var string Extension table */
protected $extension_table;
/** @var \phpbb\db\driver\driver_interface */
protected $db;
/**
* 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 phpBB root path
*/
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)
{
$this->install_config = $install_config;
$this->iohandler = $iohandler;
$this->extension_table = $container->get_parameter('tables.ext');
$this->log = $container->get('log');
$this->user = $container->get('user');
$this->extension_manager = $container->get('ext.manager');
$this->config = $container->get('config');
$this->db = $container->get('dbal.conn');
$this->finder = new \Symfony\Component\Finder\Finder();
$this->finder->in($phpbb_root_path . 'ext/')
->ignoreUnreadableDirs()
->depth('< 3')
->files()
->name('composer.json');
// Make sure asset version exists in config. Otherwise we might try to
// insert the assets_version setting into the database and cause a
// duplicate entry error.
if (!isset($this->config['assets_version']))
{
$this->config['assets_version'] = 0;
}
parent::__construct(true);
}
/**
* {@inheritdoc}
*/
public function run()
{
$this->user->session_begin();
$this->user->setup(array('common', 'acp/common', 'cli'));
$install_extensions = $this->iohandler->get_input('install-extensions', array());
$all_available_extensions = $this->extension_manager->all_available();
$i = $this->install_config->get('install_extensions_index', 0);
$available_extensions = array_slice($all_available_extensions, $i);
// Install extensions
foreach ($available_extensions as $ext_name => $ext_path)
{
if (!empty($install_extensions) && $install_extensions !== ['all'] && !in_array($ext_name, $install_extensions))
{
continue;
}
try
{
$extension = $this->extension_manager->get_extension($ext_name);
if (!$extension->is_enableable())
{
$this->iohandler->add_log_message(array('CLI_EXTENSION_NOT_ENABLEABLE', $ext_name));
continue;
}
$this->extension_manager->enable($ext_name);
$extensions = $this->get_extensions();
if (isset($extensions[$ext_name]) && $extensions[$ext_name]['ext_active'])
{
// Create log
$this->log->add('admin', ANONYMOUS, '', 'LOG_EXT_ENABLE', time(), array($ext_name));
$this->iohandler->add_success_message(array('CLI_EXTENSION_ENABLE_SUCCESS', $ext_name));
}
else
{
$this->iohandler->add_log_message(array('CLI_EXTENSION_ENABLE_FAILURE', $ext_name));
}
}
catch (\Exception $e)
{
// Add fail log and continue
$this->iohandler->add_log_message(array('CLI_EXTENSION_ENABLE_FAILURE', $ext_name));
}
$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('install_extensions_index', $i);
if ($i < count($all_available_extensions))
{
throw new resource_limit_reached_exception();
}
}
/**
* {@inheritdoc}
*/
static public function get_step_count()
{
return 1;
}
/**
* {@inheritdoc}
*/
public function get_task_lang_name()
{
return 'TASK_INSTALL_EXTENSIONS';
}
/**
* Get extensions from database
*
* @return array List of extensions
*/
private function get_extensions()
{
$sql = 'SELECT *
FROM ' . $this->extension_table;
$result = $this->db->sql_query($sql);
$extensions_row = $this->db->sql_fetchrowset($result);
$this->db->sql_freeresult($result);
$extensions = array();
foreach ($extensions_row as $extension)
{
$extensions[$extension['ext_name']] = $extension;
}
ksort($extensions);
return $extensions;
}
}

View File

@ -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';
}
}

View File

@ -0,0 +1,93 @@
<?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/')
->set_extensions(array())
->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';
}
}

View File

@ -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;
}
}

View File

@ -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 '';
}
}

View File

@ -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 '';
}
}

View File

@ -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_raw_input('dbpasswd', '');
$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 '';
}
}

View File

@ -0,0 +1,173 @@
<?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_port = $this->io_handler->get_input('smtp_port', '');
$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_port', $smtp_port);
$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' => 'ENABLE_EMAIL_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_port' => array(
'label' => 'SMTP_PORT',
'type' => 'text',
'default' => $smtp_port,
),
'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 '';
}
}

View File

@ -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 '';
}
}

View File

@ -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 '';
}
}

View File

@ -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 '';
}
}

View File

@ -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 '';
}
}

View File

@ -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\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';
if ($this->installer_config->get('disable_filesystem_update', false) && $update_files)
{
$this->iohandler->add_error_message('UPDATE_FILES_NOT_FOUND');
throw new user_interaction_required_exception();
}
$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 '';
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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');
}
}

View File

@ -0,0 +1,279 @@
<?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';
$lang_suffix = '_EXPLAIN';
$lang_suffix .= ($failable) ? '_OPTIONAL' : '';
$description = array($title . $lang_suffix, $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';
$lang_suffix = '_EXPLAIN';
$lang_suffix .= ($failable) ? '_OPTIONAL' : '';
$description = array($title . $lang_suffix, $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 '';
}
}

View File

@ -0,0 +1,209 @@
<?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();
// XML extension support check
$this->check_xml();
// 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);
}
/**
* Checks whether or not the XML PHP extension is available (Required by the text formatter)
*/
protected function check_xml()
{
if (class_exists('DOMDocument'))
{
$this->set_test_passed(true);
return;
}
$this->response_helper->add_error_message('PHP_XML_SUPPORT', 'PHP_XML_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 '';
}
}

View File

@ -0,0 +1,198 @@
<?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))
{
if ($this->iohandler->get_input('update_type', 'all') === 'all')
{
$this->iohandler->add_warning_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 '';
}
}

View File

@ -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');
}
}

View File

@ -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;
}
}

View File

@ -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\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_step_count = $this->installer_config->get('database_update_migration_steps', -1);
if ($migration_step_count < 0)
{
$migration_step_count = count($this->migrator->get_installable_migrations()) * 2;
$this->installer_config->set('database_update_migration_steps', $migration_step_count);
}
$progress_count = $this->installer_config->get('database_update_count', 0);
$restart_progress_bar = ($progress_count === 0); // Only "restart" when the update runs for the first time
$this->iohandler->set_task_count($migration_step_count, $restart_progress_bar);
$this->installer_config->set_task_progress_count($migration_step_count);
while (!$this->migrator->finished())
{
try
{
$this->migrator->update();
$progress_count++;
$last_run_migration = $this->migrator->get_last_run_migration();
if (isset($last_run_migration['effectively_installed']) && $last_run_migration['effectively_installed'])
{
// We skipped two step, so increment $progress_count by another one
$progress_count++;
}
else if (($last_run_migration['task'] === 'process_schema_step' && !$last_run_migration['state']['migration_schema_done']) ||
($last_run_migration['task'] === 'process_data_step' && !$last_run_migration['state']['migration_data_done']))
{
// We just run a step that wasn't counted yet so make it count
$migration_step_count++;
}
$this->iohandler->set_task_count($migration_step_count);
$this->installer_config->set_task_progress_count($migration_step_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);
$this->installer_config->set('database_update_migration_steps', $migration_step_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->add_success_message('INLINE_UPDATE_SUCCESSFUL');
$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 '';
}
}

View File

@ -0,0 +1,263 @@
<?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\install\exception\resource_limit_reached_exception;
use phpbb\install\helper\container_factory;
use phpbb\install\helper\config;
use phpbb\install\helper\iohandler\iohandler_interface;
use phpbb\install\helper\update_helper;
use phpbb\install\task_base;
use Symfony\Component\Finder\Finder;
/**
* Installs extensions that exist in ext folder upon install
*/
class update_extensions extends task_base
{
/**
* @var \phpbb\cache\driver\driver_interface
*/
protected $cache;
/**
* @var config
*/
protected $install_config;
/**
* @var iohandler_interface
*/
protected $iohandler;
/** @var update_helper */
protected $update_helper;
/**
* @var \phpbb\config\db
*/
protected $config;
/**
* @var \phpbb\log\log_interface
*/
protected $log;
/**
* @var \phpbb\user
*/
protected $user;
/** @var \phpbb\extension\manager */
protected $extension_manager;
/** @var Finder */
protected $finder;
/** @var string Extension table */
protected $extension_table;
/** @var \phpbb\db\driver\driver_interface */
protected $db;
/**
* @var array List of default extensions to update, grouped by version
* they were added
*/
static public $default_extensions_update = [
'3.2.0-RC2' => ['phpbb/viglink']
];
/**
* Constructor
*
* @param container_factory $container
* @param config $install_config
* @param iohandler_interface $iohandler
* @param $update_helper $update_helper
* @param string $phpbb_root_path phpBB root path
*/
public function __construct(container_factory $container, config $install_config, iohandler_interface $iohandler, update_helper $update_helper, $phpbb_root_path)
{
$this->install_config = $install_config;
$this->iohandler = $iohandler;
$this->extension_table = $container->get_parameter('tables.ext');
$this->log = $container->get('log');
$this->user = $container->get('user');
$this->extension_manager = $container->get('ext.manager');
$this->cache = $container->get('cache.driver');
$this->config = $container->get('config');
$this->db = $container->get('dbal.conn');
$this->update_helper = $update_helper;
$this->finder = new Finder();
$this->finder->in($phpbb_root_path . 'ext/')
->ignoreUnreadableDirs()
->depth('< 3')
->files()
->name('composer.json');
// Make sure asset version exists in config. Otherwise we might try to
// insert the assets_version setting into the database and cause a
// duplicate entry error.
if (!isset($this->config['assets_version']))
{
$this->config['assets_version'] = 0;
}
parent::__construct(true);
}
/**
* {@inheritdoc}
*/
public function run()
{
$this->user->session_begin();
$this->user->setup(array('common', 'acp/common', 'cli'));
$update_info = $this->install_config->get('update_info_unprocessed', []);
$version_from = !empty($update_info) ? $update_info['version']['from'] : $this->config['version_update_from'];
if (!empty($version_from))
{
$update_extensions = $this->iohandler->get_input('update-extensions', []);
// Create list of default extensions that need to be enabled in update
$default_update_extensions = [];
foreach (self::$default_extensions_update as $version => $extensions)
{
if ($this->update_helper->phpbb_version_compare($version_from, $version, '<'))
{
$default_update_extensions = array_merge($default_update_extensions, $extensions);
}
}
$all_available_extensions = $this->extension_manager->all_available();
$i = $this->install_config->get('update_extensions_index', 0);
$available_extensions = array_slice($all_available_extensions, $i);
// Update available extensions
foreach ($available_extensions as $ext_name => $ext_path)
{
// Update extensions if:
// 1) Extension is currently enabled
// 2) Extension was implicitly defined as needing an update
// 3) Extension was newly added as default phpBB extension in
// this update and should be enabled by default.
if ($this->extension_manager->is_enabled($ext_name) ||
in_array($ext_name, $update_extensions) ||
in_array($ext_name, $default_update_extensions)
)
{
try
{
$extension_enabled = $this->extension_manager->is_enabled($ext_name);
if ($extension_enabled)
{
$this->extension_manager->disable($ext_name);
}
$this->extension_manager->enable($ext_name);
$extensions = $this->get_extensions();
if (isset($extensions[$ext_name]) && $extensions[$ext_name]['ext_active'])
{
// Create log
$this->log->add('admin', ANONYMOUS, '', 'LOG_EXT_UPDATE', time(), array($ext_name));
$this->iohandler->add_success_message(array('CLI_EXTENSION_UPDATE_SUCCESS', $ext_name));
}
else
{
$this->iohandler->add_log_message('CLI_EXTENSION_UPDATE_FAILURE', array($ext_name));
}
// Disable extensions if it was disabled by the admin before
if (!$extension_enabled && !in_array($ext_name, $default_update_extensions))
{
$this->extension_manager->disable($ext_name);
}
}
catch (\Exception $e)
{
// Add fail log and continue
$this->iohandler->add_log_message('CLI_EXTENSION_UPDATE_FAILURE', array($ext_name));
}
}
$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('update_extensions_index', $i);
if ($i < count($all_available_extensions))
{
throw new resource_limit_reached_exception();
}
}
$this->config->delete('version_update_from');
$this->cache->purge();
$this->config->increment('assets_version', 1);
}
/**
* {@inheritdoc}
*/
static public function get_step_count()
{
return 1;
}
/**
* {@inheritdoc}
*/
public function get_task_lang_name()
{
return 'TASK_UPDATE_EXTENSIONS';
}
/**
* Get extensions from database
*
* @return array List of extensions
*/
private function get_extensions()
{
$sql = 'SELECT *
FROM ' . $this->extension_table;
$result = $this->db->sql_query($sql);
$extensions_row = $this->db->sql_fetchrowset($result);
$this->db->sql_freeresult($result);
$extensions = array();
foreach ($extensions_row as $extension)
{
$extensions[$extension['ext_name']] = $extension;
}
ksort($extensions);
return $extensions;
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1,253 @@
<?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();
$update_files = $this->installer_config->get('update_files', array());
$files_to_diff = $update_files['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
if (file_exists($old_path . $filename))
{
$file_contents[0] = 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[count($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]);
// Handle conflicts
if ($diff->get_num_conflicts() !== 0)
{
$merge_conflicts[] = $filename;
}
if ($diff->merged_output() !== $file_contents[1])
{
// Save merged output
$this->cache->put(
'_file_' . md5($filename),
base64_encode(implode("\n", $diff->merged_output()))
);
}
else
{
unset($update_files['update_with_diff'][$key]);
}
unset($file_contents);
unset($diff);
}
else
{
$new_file_content = file_get_contents($new_path . $filename);
if ($new_file_content === false)
{
$this->iohandler->add_error_message(array('FILE_DIFFER_ERROR_FILE_CANNOT_BE_READ', $files_to_diff));
unset($new_file_content );
throw new user_interaction_required_exception();
}
// Save new file content to cache
$this->cache->put(
'_file_' . md5($filename),
base64_encode($new_file_content)
);
unset($new_file_content);
}
$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);
foreach ($update_files as $type => $files)
{
if (empty($files))
{
unset($update_files[$type]);
}
}
$this->installer_config->set('update_files', $update_files);
// Request refresh
throw new resource_limit_reached_exception();
}
}
$this->iohandler->finish_progress('ALL_FILES_DIFFED');
$this->installer_config->set('merge_conflict_list', $merge_conflicts);
foreach ($update_files as $type => $files)
{
if (empty($files))
{
unset($update_files[$type]);
}
}
$this->installer_config->set('update_files', $update_files);
}
/**
* {@inheritdoc}
*/
static public function get_step_count()
{
return 0;
}
/**
* {@inheritdoc}
*/
public function get_task_lang_name()
{
return '';
}
}

View File

@ -0,0 +1,133 @@
<?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))
{
$this->installer_config->set('file_updater_elem_progress', '');
$this->installer_config->set('update_files', array());
throw new jump_to_restart_point_exception('check_update_files');
}
else
{
$file_update_info = $this->installer_config->get('update_files', array());
// Display download box only if the archive won't be empty
if (!empty($file_update_info) && !(isset($file_update_info['delete']) && count($file_update_info) == 1))
{
// 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',
'is_secondary' => empty($file_update_info),
),
'database_update_submit' => array(
'label' => 'UPDATE_CONTINUE_UPDATE_PROCESS',
'type' => 'submit',
'disabled' => !empty($file_update_info),
),
));
throw new user_interaction_required_exception();
}
}
/**
* {@inheritdoc}
*/
static public function get_step_count()
{
return 0;
}
/**
* {@inheritdoc}
*/
public function get_task_lang_name()
{
return '';
}
}

View File

@ -0,0 +1,248 @@
<?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']);
foreach ($file_update_info['update_without_diff'] as $key => $binary_file)
{
$new_file = $new_path . $binary_file;
$file = $this->phpbb_root_path . $binary_file;
if (!$this->filesystem->exists($file))
{
continue;
}
if (md5_file($file) === md5_file($new_file))
{
// File already up to date
unset($file_update_info['update_without_diff'][$key]);
}
}
// Remove update without diff info if empty
if (count($file_update_info['update_without_diff']) < 1)
{
unset($file_update_info['update_without_diff']);
}
// 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);
}
);
// Remove files to delete list if empty
if (count($file_update_info['delete']) < 1)
{
unset($file_update_info['delete']);
}
}
$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);
// Create list of default extensions that should have been added prior
// to this update
$default_update_extensions = [];
foreach (\phpbb\install\module\update_database\task\update_extensions::$default_extensions_update as $version => $extensions)
{
if ($this->update_helper->phpbb_version_compare($update_info['version']['from'], $version, '>='))
{
$default_update_extensions = array_merge($default_update_extensions, $extensions);
}
}
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);
// Do not copy default extension again if the previous version was
// packaged with it but it does not exist (e.g. deleted by admin)
if (strpos($file, $this->phpbb_root_path . 'ext/') !== false)
{
$skip_file = false;
foreach ($default_update_extensions as $ext_name)
{
if (strpos($file, $this->phpbb_root_path . 'ext/' . $ext_name) !== false &&
!$this->filesystem->exists($this->phpbb_root_path . 'ext/' . $ext_name . '/composer.json'))
{
$skip_file = true;
break;
}
}
if ($skip_file)
{
continue;
}
}
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);
$this->installer_config->set('update_info', array());
}
/**
* {@inheritdoc}
*/
static public function get_step_count()
{
return 0;
}
/**
* {@inheritdoc}
*/
public function get_task_lang_name()
{
return '';
}
}

View File

@ -0,0 +1,170 @@
<?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
$this->file_updater = $file_updater_factory->get('compression');
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))
{
$compression_method = $this->installer_config->get('file_update_compression', '');
$conflict_archive = $this->file_updater->init($compression_method);
$this->installer_config->set('update_file_conflict_archive', $conflict_archive);
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
{
$conflict_archive_path = $this->installer_config->get('update_file_conflict_archive', null);
// Remove archive
if ($conflict_archive_path !== null && $this->filesystem->exists($conflict_archive_path))
{
$this->filesystem->remove($conflict_archive_path);
}
$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 '';
}
}

View File

@ -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 '';
}
}