mirror of
				https://github.com/phpbb/phpbb.git
				synced 2025-10-24 21:26:24 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			866 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			866 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  *
 | |
|  * This file is part of the phpBB Forum Software package.
 | |
|  *
 | |
|  * @copyright (c) phpBB Limited <https://www.phpbb.com>
 | |
|  * @license GNU General Public License, version 2 (GPL-2.0)
 | |
|  *
 | |
|  * For full copyright and license information, please see
 | |
|  * the docs/CREDITS.txt file.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| namespace phpbb\convert\controller;
 | |
| 
 | |
| use phpbb\cache\driver\driver_interface;
 | |
| use phpbb\exception\http_exception;
 | |
| use phpbb\install\controller\helper;
 | |
| use phpbb\install\helper\container_factory;
 | |
| use phpbb\install\helper\database;
 | |
| use phpbb\install\helper\install_helper;
 | |
| use phpbb\install\helper\iohandler\factory;
 | |
| use phpbb\install\helper\iohandler\iohandler_interface;
 | |
| use phpbb\install\helper\navigation\navigation_provider;
 | |
| use phpbb\language\language;
 | |
| use phpbb\request\request_interface;
 | |
| use phpbb\template\template;
 | |
| use Symfony\Component\HttpFoundation\StreamedResponse;
 | |
| 
 | |
| /**
 | |
|  * Controller for forum convertors
 | |
|  *
 | |
|  * WARNING: This file did not meant to be present in a production environment, so moving
 | |
|  * 			this file to a location which is accessible after board installation might
 | |
|  * 			lead to security issues.
 | |
|  */
 | |
| class convertor
 | |
| {
 | |
| 	/**
 | |
| 	 * @var driver_interface
 | |
| 	 */
 | |
| 	protected $cache;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var driver_interface
 | |
| 	 */
 | |
| 	protected $installer_cache;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var \phpbb\config\db
 | |
| 	 */
 | |
| 	protected $config;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var \phpbb\config_php_file
 | |
| 	 */
 | |
| 	protected $config_php_file;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	protected $config_table;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var helper
 | |
| 	 */
 | |
| 	protected $controller_helper;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var database
 | |
| 	 */
 | |
| 	protected $db_helper;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var \phpbb\db\driver\driver_interface
 | |
| 	 */
 | |
| 	protected $db;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var install_helper
 | |
| 	 */
 | |
| 	protected $install_helper;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var iohandler_interface
 | |
| 	 */
 | |
| 	protected $iohandler;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var language
 | |
| 	 */
 | |
| 	protected $language;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var navigation_provider
 | |
| 	 */
 | |
| 	protected $navigation_provider;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var request_interface
 | |
| 	 */
 | |
| 	protected $request;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	protected $session_keys_table;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	protected $session_table;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var template
 | |
| 	 */
 | |
| 	protected $template;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	protected $phpbb_root_path;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	protected $php_ext;
 | |
| 
 | |
| 	/**
 | |
| 	 * Constructor
 | |
| 	 *
 | |
| 	 * @param driver_interface		$cache
 | |
| 	 * @param container_factory		$container
 | |
| 	 * @param database				$db_helper
 | |
| 	 * @param helper				$controller_helper
 | |
| 	 * @param install_helper		$install_helper
 | |
| 	 * @param factory				$iohandler
 | |
| 	 * @param language				$language
 | |
| 	 * @param navigation_provider	$nav
 | |
| 	 * @param request_interface		$request
 | |
| 	 * @param template				$template
 | |
| 	 * @param string				$phpbb_root_path
 | |
| 	 * @param string				$php_ext
 | |
| 	 */
 | |
| 	public function __construct(driver_interface $cache, container_factory $container, database $db_helper, helper $controller_helper, install_helper $install_helper, factory $iohandler, language $language, navigation_provider $nav, request_interface $request, template $template, $phpbb_root_path, $php_ext)
 | |
| 	{
 | |
| 		$this->installer_cache		= $cache;
 | |
| 		$this->controller_helper	= $controller_helper;
 | |
| 		$this->db_helper			= $db_helper;
 | |
| 		$this->install_helper		= $install_helper;
 | |
| 		$this->language				= $language;
 | |
| 		$this->navigation_provider	= $nav;
 | |
| 		$this->request				= $request;
 | |
| 		$this->template				= $template;
 | |
| 		$this->phpbb_root_path		= $phpbb_root_path;
 | |
| 		$this->php_ext				= $php_ext;
 | |
| 
 | |
| 		$iohandler->set_environment('ajax');
 | |
| 		$this->iohandler = $iohandler->get();
 | |
| 
 | |
| 		if (!$this->install_helper->is_phpbb_installed() || !defined('IN_INSTALL'))
 | |
| 		{
 | |
| 			throw new http_exception(403, 'INSTALL_PHPBB_NOT_INSTALLED');
 | |
| 		}
 | |
| 
 | |
| 		$this->controller_helper->handle_language_select();
 | |
| 
 | |
| 		$this->cache	= $container->get('cache.driver');
 | |
| 		$this->config	= $container->get('config');
 | |
| 		$this->config_php_file	= new \phpbb\config_php_file($this->phpbb_root_path, $this->php_ext);
 | |
| 		$this->db		= $container->get('dbal.conn.driver');
 | |
| 
 | |
| 		$this->config_table			= $container->get_parameter('tables.config');
 | |
| 		$this->session_keys_table	= $container->get_parameter('tables.sessions_keys');
 | |
| 		$this->session_table		= $container->get_parameter('tables.sessions');
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Render the intro page
 | |
| 	 *
 | |
| 	 * @param bool|int	$start_new	Whether or not to force to start a new convertor
 | |
| 	 *
 | |
| 	 * @return \Symfony\Component\HttpFoundation\Response
 | |
| 	 */
 | |
| 	public function intro($start_new)
 | |
| 	{
 | |
| 		$this->setup_navigation('intro');
 | |
| 
 | |
| 		if ($start_new)
 | |
| 		{
 | |
| 			if ($this->request->is_ajax())
 | |
| 			{
 | |
| 				$response = new StreamedResponse();
 | |
| 				$iohandler = $this->iohandler;
 | |
| 				$url = $this->controller_helper->route('phpbb_convert_intro', array('start_new' => 'new'));
 | |
| 				$response->setCallback(function() use ($iohandler, $url) {
 | |
| 					$iohandler->redirect($url);
 | |
| 				});
 | |
| 				$response->headers->set('X-Accel-Buffering', 'no');
 | |
| 
 | |
| 				return $response;
 | |
| 			}
 | |
| 
 | |
| 			$this->config['convert_progress'] = '';
 | |
| 			$this->config['convert_db_server'] = '';
 | |
| 			$this->config['convert_db_user'] = '';
 | |
| 			$this->db->sql_query('DELETE FROM ' . $this->config_table . "
 | |
| 				WHERE config_name = 'convert_progress'
 | |
| 					OR config_name = 'convert_db_server'
 | |
| 					OR config_name = 'convert_db_user'"
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		// Let's see if there is a conversion in the works...
 | |
| 		$options = array();
 | |
| 		if (!empty($this->config['convert_progress']) &&
 | |
| 			!empty($this->config['convert_db_server']) &&
 | |
| 			!empty($this->config['convert_db_user']) &&
 | |
| 			!empty($this->config['convert_options']))
 | |
| 		{
 | |
| 			$options = unserialize($this->config['convert_progress']);
 | |
| 			$options = array_merge($options,
 | |
| 				unserialize($this->config['convert_db_server']),
 | |
| 				unserialize($this->config['convert_db_user']),
 | |
| 				unserialize($this->config['convert_options'])
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		// This information should have already been checked once, but do it again for safety
 | |
| 		if (!empty($options) && !empty($options['tag']) &&
 | |
| 			isset($options['dbms']) &&
 | |
| 			isset($options['dbhost']) &&
 | |
| 			isset($options['dbport']) &&
 | |
| 			isset($options['dbuser']) &&
 | |
| 			isset($options['dbpasswd']) &&
 | |
| 			isset($options['dbname']) &&
 | |
| 			isset($options['table_prefix']))
 | |
| 		{
 | |
| 			$this->template->assign_vars(array(
 | |
| 				'TITLE'				=> $this->language->lang('CONTINUE_CONVERT'),
 | |
| 				'BODY'				=> $this->language->lang('CONTINUE_CONVERT_BODY'),
 | |
| 				'S_CONTINUE'		=> true,
 | |
| 				'U_NEW_ACTION'		=> $this->controller_helper->route('phpbb_convert_intro', array('start_new' => 'new')),
 | |
| 				'U_CONTINUE_ACTION'	=> $this->controller_helper->route('phpbb_convert_convert', array('converter' => $options['tag'])),
 | |
| 			));
 | |
| 
 | |
| 			return $this->controller_helper->render('installer_convert.html', 'CONTINUE_CONVERT', true);
 | |
| 		}
 | |
| 
 | |
| 		return $this->render_convert_list();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Obtain convertor settings
 | |
| 	 *
 | |
| 	 * @param string	$converter	Name of the convertor
 | |
| 	 *
 | |
| 	 * @return \Symfony\Component\HttpFoundation\Response|StreamedResponse
 | |
| 	 */
 | |
| 	public function settings($converter)
 | |
| 	{
 | |
| 		$this->setup_navigation('settings');
 | |
| 
 | |
| 		require_once ($this->phpbb_root_path . 'includes/constants.' . $this->php_ext);
 | |
| 		require_once ($this->phpbb_root_path . 'includes/functions_convert.' . $this->php_ext);
 | |
| 
 | |
| 		// Include convertor if available
 | |
| 		$convertor_file_path = $this->phpbb_root_path . 'install/convertors/convert_' . $converter . '.' . $this->php_ext;
 | |
| 		if (!file_exists($convertor_file_path))
 | |
| 		{
 | |
| 			if ($this->request->is_ajax())
 | |
| 			{
 | |
| 				$response = new StreamedResponse();
 | |
| 				$ref = $this;
 | |
| 				$response->setCallback(function() use ($ref) {
 | |
| 					$ref->render_error('CONVERT_NOT_EXIST');
 | |
| 				});
 | |
| 				$response->headers->set('X-Accel-Buffering', 'no');
 | |
| 
 | |
| 				return $response;
 | |
| 			}
 | |
| 
 | |
| 			$this->render_error('CONVERT_NOT_EXIST');
 | |
| 			return $this->controller_helper->render('installer_convert.html', 'STAGE_SETTINGS', true);
 | |
| 		}
 | |
| 
 | |
| 		$get_info = true;
 | |
| 		$phpbb_root_path = $this->phpbb_root_path; // These globals are required
 | |
| 		$phpEx = $this->php_ext; // See above
 | |
| 		include_once ($convertor_file_path);
 | |
| 
 | |
| 		// The test_file is a file that should be present in the location of the old board.
 | |
| 		if (!isset($test_file))
 | |
| 		{
 | |
| 			if ($this->request->is_ajax())
 | |
| 			{
 | |
| 				$response = new StreamedResponse();
 | |
| 				$ref = $this;
 | |
| 				$response->setCallback(function() use ($ref) {
 | |
| 					$ref->render_error('DEV_NO_TEST_FILE');
 | |
| 				});
 | |
| 				$response->headers->set('X-Accel-Buffering', 'no');
 | |
| 
 | |
| 				return $response;
 | |
| 			}
 | |
| 
 | |
| 			$this->render_error('DEV_NO_TEST_FILE');
 | |
| 			return $this->controller_helper->render('installer_convert.html', 'STAGE_SETTINGS', true);
 | |
| 		}
 | |
| 
 | |
| 		if ($this->request->variable('submit', false))
 | |
| 		{
 | |
| 			// It must be an AJAX request at this point
 | |
| 			$response = new StreamedResponse();
 | |
| 			$ref = $this;
 | |
| 			$response->setCallback(function() use ($ref, $converter) {
 | |
| 				$ref->proccess_settings_form($converter);
 | |
| 			});
 | |
| 			$response->headers->set('X-Accel-Buffering', 'no');
 | |
| 
 | |
| 			return $response;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			$this->template->assign_vars(array(
 | |
| 				'U_ACTION'	=> $this->controller_helper->route('phpbb_convert_settings', array(
 | |
| 					'converter'	=> $converter,
 | |
| 				))
 | |
| 			));
 | |
| 
 | |
| 			if ($this->request->is_ajax())
 | |
| 			{
 | |
| 				$response = new StreamedResponse();
 | |
| 				$ref = $this;
 | |
| 				$response->setCallback(function() use ($ref) {
 | |
| 					$ref->render_settings_form();
 | |
| 				});
 | |
| 				$response->headers->set('X-Accel-Buffering', 'no');
 | |
| 
 | |
| 				return $response;
 | |
| 			}
 | |
| 
 | |
| 			$this->render_settings_form();
 | |
| 		}
 | |
| 
 | |
| 		return $this->controller_helper->render('installer_convert.html', 'STAGE_SETTINGS', true);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Run conversion
 | |
| 	 */
 | |
| 	public function convert($converter)
 | |
| 	{
 | |
| 		$this->setup_navigation('convert');
 | |
| 
 | |
| 		if ($this->request->is_ajax())
 | |
| 		{
 | |
| 			$route = $this->controller_helper->route('phpbb_convert_convert', array('converter' => $converter));
 | |
| 			$response = new StreamedResponse();
 | |
| 			$ref = $this;
 | |
| 			$response->setCallback(function() use ($ref, $route) {
 | |
| 				$ref->redirect_to_html($route);
 | |
| 			});
 | |
| 			$response->headers->set('X-Accel-Buffering', 'no');
 | |
| 
 | |
| 			return $response;
 | |
| 		}
 | |
| 
 | |
| 		$convertor = new \phpbb\convert\convertor($this->template, $this->controller_helper);
 | |
| 		$convertor->convert_data($converter);
 | |
| 
 | |
| 		return $this->controller_helper->render('installer_convert.html', 'STAGE_IN_PROGRESS');
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Render the final page of the convertor
 | |
| 	 */
 | |
| 	public function finish()
 | |
| 	{
 | |
| 		$this->setup_navigation('finish');
 | |
| 
 | |
| 		$this->template->assign_vars(array(
 | |
| 			'TITLE'		=> $this->language->lang('CONVERT_COMPLETE'),
 | |
| 			'BODY'		=> $this->language->lang('CONVERT_COMPLETE_EXPLAIN'),
 | |
| 		));
 | |
| 
 | |
| 		// If we reached this step (conversion completed) we want to purge the cache and log the user out.
 | |
| 		// This is for making sure the session get not screwed due to the 3.0.x users table being completely new.
 | |
| 		$this->cache->purge();
 | |
| 		$this->installer_cache->purge();
 | |
| 
 | |
| 		require_once($this->phpbb_root_path . 'includes/constants.' . $this->php_ext);
 | |
| 		require_once($this->phpbb_root_path . 'includes/functions_convert.' . $this->php_ext);
 | |
| 
 | |
| 		$sql = 'SELECT config_value
 | |
| 			FROM ' . $this->config_table . '
 | |
| 			WHERE config_name = \'search_type\'';
 | |
| 		$result = $this->db->sql_query($sql);
 | |
| 
 | |
| 		if ($this->db->sql_fetchfield('config_value') != 'fulltext_mysql')
 | |
| 		{
 | |
| 			$this->template->assign_vars(array(
 | |
| 				'S_ERROR_BOX'	=> true,
 | |
| 				'ERROR_TITLE'	=> $this->language->lang('SEARCH_INDEX_UNCONVERTED'),
 | |
| 				'ERROR_MSG'		=> $this->language->lang('SEARCH_INDEX_UNCONVERTED_EXPLAIN'),
 | |
| 			));
 | |
| 		}
 | |
| 
 | |
| 		$this->db->sql_freeresult($result);
 | |
| 
 | |
| 		switch ($this->db->get_sql_layer())
 | |
| 		{
 | |
| 			case 'sqlite3':
 | |
| 				$this->db->sql_query('DELETE FROM ' . $this->session_keys_table);
 | |
| 				$this->db->sql_query('DELETE FROM ' . $this->session_table);
 | |
| 			break;
 | |
| 
 | |
| 			default:
 | |
| 				$this->db->sql_query('TRUNCATE TABLE ' . $this->session_keys_table);
 | |
| 				$this->db->sql_query('TRUNCATE TABLE ' . $this->session_table);
 | |
| 			break;
 | |
| 		}
 | |
| 
 | |
| 		return $this->controller_helper->render('installer_convert.html', 'CONVERT_COMPLETE');
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Validates settings form
 | |
| 	 *
 | |
| 	 * @param string	$convertor
 | |
| 	 */
 | |
| 	public function proccess_settings_form($convertor)
 | |
| 	{
 | |
| 		global $phpbb_root_path, $phpEx, $get_info;
 | |
| 
 | |
| 		$phpbb_root_path = $this->phpbb_root_path;
 | |
| 		$phpEx = $this->php_ext;
 | |
| 		$get_info = true;
 | |
| 
 | |
| 		require_once($this->phpbb_root_path . 'includes/constants.' . $this->php_ext);
 | |
| 		require_once($this->phpbb_root_path . 'includes/functions_convert.' . $this->php_ext);
 | |
| 
 | |
| 		// Include convertor if available
 | |
| 		$convertor_file_path = $this->phpbb_root_path . 'install/convertors/convert_' . $convertor . '.' . $this->php_ext;
 | |
| 		include ($convertor_file_path);
 | |
| 
 | |
| 		// We expect to have an AJAX request here
 | |
| 		$src_dbms			= $this->request->variable('src_dbms', $convertor_data['dbms']);
 | |
| 		$src_dbhost			= $this->request->variable('src_dbhost', $convertor_data['dbhost']);
 | |
| 		$src_dbport			= $this->request->variable('src_dbport', $convertor_data['dbport']);
 | |
| 		$src_dbuser			= $this->request->variable('src_dbuser', $convertor_data['dbuser']);
 | |
| 		$src_dbpasswd		= $this->request->variable('src_dbpasswd', $convertor_data['dbpasswd']);
 | |
| 		$src_dbname			= $this->request->variable('src_dbname', $convertor_data['dbname']);
 | |
| 		$src_table_prefix	= $this->request->variable('src_table_prefix', $convertor_data['table_prefix']);
 | |
| 		$forum_path			= $this->request->variable('forum_path', $convertor_data['forum_path']);
 | |
| 		$refresh			= $this->request->variable('refresh', 1);
 | |
| 
 | |
| 		// Default URL of the old board
 | |
| 		// @todo Are we going to use this for attempting to convert URL references in posts, or should we remove it?
 | |
| 		//		-> We should convert old urls to the new relative urls format
 | |
| 		// $src_url = $request->variable('src_url', 'Not in use at the moment');
 | |
| 
 | |
| 		// strip trailing slash from old forum path
 | |
| 		$forum_path = (strlen($forum_path) && $forum_path[strlen($forum_path) - 1] == '/') ? substr($forum_path, 0, -1) : $forum_path;
 | |
| 
 | |
| 		$error = array();
 | |
| 		if (!file_exists($this->phpbb_root_path . $forum_path . '/' . $test_file))
 | |
| 		{
 | |
| 			$error[] = $this->language->lang('COULD_NOT_FIND_PATH', $forum_path);
 | |
| 		}
 | |
| 
 | |
| 		$connect_test = false;
 | |
| 		$available_dbms = $this->db_helper->get_available_dbms(false, true, true);
 | |
| 		if (!isset($available_dbms[$src_dbms]) || !$available_dbms[$src_dbms]['AVAILABLE'])
 | |
| 		{
 | |
| 			$error[] = $this->language->lang('INST_ERR_NO_DB');
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			$connect_test = $this->db_helper->check_database_connection($src_dbms, $src_dbhost, $src_dbport, $src_dbuser, $src_dbpasswd, $src_dbname, $src_table_prefix);
 | |
| 		}
 | |
| 
 | |
| 		extract($this->config_php_file->get_all());
 | |
| 
 | |
| 		// The forum prefix of the old and the new forum can only be the same if two different databases are used.
 | |
| 		if ($src_table_prefix === $table_prefix && $src_dbms === $dbms && $src_dbhost === $dbhost && $src_dbport === $dbport && $src_dbname === $dbname)
 | |
| 		{
 | |
| 			$error[] = $this->language->lang('TABLE_PREFIX_SAME', $src_table_prefix);
 | |
| 		}
 | |
| 
 | |
| 		if (!$connect_test)
 | |
| 		{
 | |
| 			$error[] = $this->language->lang('INST_ERR_DB_CONNECT');
 | |
| 		}
 | |
| 
 | |
| 		$src_dbms = $this->config_php_file->convert_30_dbms_to_31($src_dbms);
 | |
| 
 | |
| 		// Check table prefix
 | |
| 		if (empty($error))
 | |
| 		{
 | |
| 			// initiate database connection to old db if old and new db differ
 | |
| 			global $src_db, $same_db;
 | |
| 			$src_db = $same_db = false;
 | |
| 
 | |
| 			if ($src_dbms != $dbms || $src_dbhost != $dbhost || $src_dbport != $dbport || $src_dbname != $dbname || $src_dbuser != $dbuser)
 | |
| 			{
 | |
| 				/** @var \phpbb\db\driver\driver_interface $src_db */
 | |
| 				$src_db = new $src_dbms();
 | |
| 				$src_db->sql_connect($src_dbhost, $src_dbuser, htmlspecialchars_decode($src_dbpasswd), $src_dbname, $src_dbport, false, true);
 | |
| 				$same_db = false;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				$src_db = $this->db;
 | |
| 				$same_db = true;
 | |
| 			}
 | |
| 
 | |
| 			$src_db->sql_return_on_error(true);
 | |
| 			$this->db->sql_return_on_error(true);
 | |
| 
 | |
| 			// Try to select one row from the first table to see if the prefix is OK
 | |
| 			$result = $src_db->sql_query_limit('SELECT * FROM ' . $src_table_prefix . $tables[0], 1);
 | |
| 
 | |
| 			if (!$result)
 | |
| 			{
 | |
| 				$prefixes = array();
 | |
| 
 | |
| 				$db_tools_factory = new \phpbb\db\tools\factory();
 | |
| 				$db_tools = $db_tools_factory->get($src_db);
 | |
| 				$tables_existing = $db_tools->sql_list_tables();
 | |
| 				$tables_existing = array_map('strtolower', $tables_existing);
 | |
| 				foreach ($tables_existing as $table_name)
 | |
| 				{
 | |
| 					compare_table($tables, $table_name, $prefixes);
 | |
| 				}
 | |
| 				unset($tables_existing);
 | |
| 
 | |
| 				foreach ($prefixes as $prefix => $count)
 | |
| 				{
 | |
| 					if ($count >= count($tables))
 | |
| 					{
 | |
| 						$possible_prefix = $prefix;
 | |
| 						break;
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				$msg = '';
 | |
| 				if (!empty($convertor_data['table_prefix']))
 | |
| 				{
 | |
| 					$msg .= $this->language->lang_array('DEFAULT_PREFIX_IS', array($convertor_data['forum_name'], $convertor_data['table_prefix']));
 | |
| 				}
 | |
| 
 | |
| 				if (!empty($possible_prefix))
 | |
| 				{
 | |
| 					$msg .= '<br />';
 | |
| 					$msg .= ($possible_prefix == '*') ? $this->language->lang('BLANK_PREFIX_FOUND') : $this->language->lang_array('PREFIX_FOUND', array($possible_prefix));
 | |
| 					$src_table_prefix = ($possible_prefix == '*') ? '' : $possible_prefix;
 | |
| 				}
 | |
| 
 | |
| 				$error[] = $msg;
 | |
| 			}
 | |
| 
 | |
| 			$src_db->sql_freeresult($result);
 | |
| 			$src_db->sql_return_on_error(false);
 | |
| 		}
 | |
| 
 | |
| 		if (empty($error))
 | |
| 		{
 | |
| 			// Save convertor Status
 | |
| 			$this->config->set('convert_progress', serialize(array(
 | |
| 				'step'			=> '',
 | |
| 				'table_prefix'	=> $src_table_prefix,
 | |
| 				'tag'			=> $convertor,
 | |
| 			)), false);
 | |
| 			$this->config->set('convert_db_server', serialize(array(
 | |
| 				'dbms'			=> $src_dbms,
 | |
| 				'dbhost'		=> $src_dbhost,
 | |
| 				'dbport'		=> $src_dbport,
 | |
| 				'dbname'		=> $src_dbname,
 | |
| 			)), false);
 | |
| 			$this->config->set('convert_db_user', serialize(array(
 | |
| 				'dbuser'		=> $src_dbuser,
 | |
| 				'dbpasswd'		=> $src_dbpasswd,
 | |
| 			)), false);
 | |
| 
 | |
| 			// Save options
 | |
| 			$this->config->set('convert_options', serialize(array(
 | |
| 				'forum_path' => $this->phpbb_root_path . $forum_path,
 | |
| 				'refresh' => $refresh
 | |
| 			)), false);
 | |
| 
 | |
| 			$url = $this->controller_helper->route('phpbb_convert_convert', array('converter' => $convertor));
 | |
| 			$this->iohandler->redirect($url);
 | |
| 			$this->iohandler->send_response(true);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			$this->render_settings_form($error);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders settings form
 | |
| 	 *
 | |
| 	 * @param array	$error	Array of errors
 | |
| 	 */
 | |
| 	public function render_settings_form($error = array())
 | |
| 	{
 | |
| 		foreach ($error as $msg)
 | |
| 		{
 | |
| 			$this->iohandler->add_error_message($msg);
 | |
| 		}
 | |
| 
 | |
| 		$dbms_options = array();
 | |
| 		foreach ($this->db_helper->get_available_dbms() as $dbms_key => $dbms_array)
 | |
| 		{
 | |
| 			$dbms_options[] = array(
 | |
| 				'value'		=> $dbms_key,
 | |
| 				'label'		=> 'DB_OPTION_' . strtoupper($dbms_key),
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		$form_title = 'SPECIFY_OPTIONS';
 | |
| 		$form_data = array(
 | |
| 			'src_dbms'	=> array(
 | |
| 				'label'		=> 'DBMS',
 | |
| 				'type'		=> 'select',
 | |
| 				'options'	=> $dbms_options,
 | |
| 			),
 | |
| 			'src_dbhost' => array(
 | |
| 				'label'			=> 'DB_HOST',
 | |
| 				'description'	=> 'DB_HOST_EXPLAIN',
 | |
| 				'type'			=> 'text',
 | |
| 			),
 | |
| 			'src_dbport' => array(
 | |
| 				'label'			=> 'DB_PORT',
 | |
| 				'description'	=> 'DB_PORT_EXPLAIN',
 | |
| 				'type'			=> 'text',
 | |
| 			),
 | |
| 			'src_dbname' => array(
 | |
| 				'label'		=> 'DB_NAME',
 | |
| 				'type'		=> 'text',
 | |
| 			),
 | |
| 			'src_dbuser' => array(
 | |
| 				'label'		=> 'DB_USERNAME',
 | |
| 				'type'		=> 'text',
 | |
| 			),
 | |
| 			'src_dbpasswd' => array(
 | |
| 				'label'	=> 'DB_PASSWORD',
 | |
| 				'type'	=> 'password',
 | |
| 			),
 | |
| 			'src_table_prefix' => array(
 | |
| 				'label'			=> 'TABLE_PREFIX',
 | |
| 				'description'	=> 'TABLE_PREFIX_EXPLAIN',
 | |
| 				'type'			=> 'text',
 | |
| 			),
 | |
| 			'forum_path' => array(
 | |
| 				'label'			=> 'FORUM_PATH',
 | |
| 				'description'	=> 'FORUM_PATH_EXPLAIN',
 | |
| 				'type'			=> 'text',
 | |
| 			),
 | |
| 			'refresh' => array(
 | |
| 				'label'			=> 'REFRESH_PAGE',
 | |
| 				'description'	=> 'REFRESH_PAGE_EXPLAIN',
 | |
| 				'type'			=> 'radio',
 | |
| 				'options'		=> array(
 | |
| 					array(
 | |
| 						'value'		=> 0,
 | |
| 						'label'		=> 'NO',
 | |
| 						'selected'	=> true,
 | |
| 					),
 | |
| 					array(
 | |
| 						'value'		=> 1,
 | |
| 						'label'		=> 'YES',
 | |
| 						'selected'	=> false,
 | |
| 					),
 | |
| 				),
 | |
| 			),
 | |
| 			'submit' => array(
 | |
| 				'label'	=> 'SUBMIT',
 | |
| 				'type'	=> 'submit',
 | |
| 			),
 | |
| 		);
 | |
| 
 | |
| 		if ($this->request->is_ajax())
 | |
| 		{
 | |
| 			$this->iohandler->add_user_form_group($form_title, $form_data);
 | |
| 			$this->iohandler->send_response(true);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			$rendered_form = $this->iohandler->generate_form_render_data($form_title, $form_data);
 | |
| 
 | |
| 			$this->template->assign_vars(array(
 | |
| 				'TITLE'		=> $this->language->lang('STAGE_SETTINGS'),
 | |
| 				'CONTENT'	=> $rendered_form,
 | |
| 			));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Render the list of available convertors
 | |
| 	 *
 | |
| 	 * @return \Symfony\Component\HttpFoundation\Response
 | |
| 	 */
 | |
| 	protected function render_convert_list()
 | |
| 	{
 | |
| 		$this->template->assign_vars(array(
 | |
| 			'TITLE'		=> $this->language->lang('CONVERT_INTRO'),
 | |
| 			'BODY'		=> $this->language->lang('CONVERT_INTRO_BODY'),
 | |
| 			'S_LIST'	=> true,
 | |
| 		));
 | |
| 
 | |
| 		$convertors = $sort = array();
 | |
| 		$get_info = true; // Global flag
 | |
| 
 | |
| 		$handle = @opendir($this->phpbb_root_path . 'install/convertors/');
 | |
| 
 | |
| 		if (!$handle)
 | |
| 		{
 | |
| 			die('Unable to access the convertors directory');
 | |
| 		}
 | |
| 
 | |
| 		while ($entry = readdir($handle))
 | |
| 		{
 | |
| 			if (preg_match('/^convert_([a-z0-9_]+).' . $this->php_ext . '$/i', $entry, $m))
 | |
| 			{
 | |
| 				$phpbb_root_path = $this->phpbb_root_path; // These globals are required
 | |
| 				$phpEx = $this->php_ext; // See above
 | |
| 				include_once($this->phpbb_root_path . 'install/convertors/' . $entry);
 | |
| 				if (isset($convertor_data))
 | |
| 				{
 | |
| 					$sort[strtolower($convertor_data['forum_name'])] = count($convertors);
 | |
| 
 | |
| 					$convertors[] = array(
 | |
| 						'tag'			=>	$m[1],
 | |
| 						'forum_name'	=>	$convertor_data['forum_name'],
 | |
| 						'version'		=>	$convertor_data['version'],
 | |
| 						'dbms'			=>	$convertor_data['dbms'],
 | |
| 						'dbhost'		=>	$convertor_data['dbhost'],
 | |
| 						'dbport'		=>	$convertor_data['dbport'],
 | |
| 						'dbuser'		=>	$convertor_data['dbuser'],
 | |
| 						'dbpasswd'		=>	$convertor_data['dbpasswd'],
 | |
| 						'dbname'		=>	$convertor_data['dbname'],
 | |
| 						'table_prefix'	=>	$convertor_data['table_prefix'],
 | |
| 						'author'		=>	$convertor_data['author']
 | |
| 					);
 | |
| 				}
 | |
| 				unset($convertor_data);
 | |
| 			}
 | |
| 		}
 | |
| 		closedir($handle);
 | |
| 
 | |
| 		@ksort($sort);
 | |
| 
 | |
| 		foreach ($sort as $void => $index)
 | |
| 		{
 | |
| 			$this->template->assign_block_vars('convertors', array(
 | |
| 				'AUTHOR'	=> $convertors[$index]['author'],
 | |
| 				'SOFTWARE'	=> $convertors[$index]['forum_name'],
 | |
| 				'VERSION'	=> $convertors[$index]['version'],
 | |
| 
 | |
| 				'U_CONVERT'	=> $this->controller_helper->route('phpbb_convert_settings', array('converter' => $convertors[$index]['tag'])),
 | |
| 			));
 | |
| 		}
 | |
| 
 | |
| 		return $this->controller_helper->render('installer_convert.html', 'SUB_INTRO', true);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders an error form
 | |
| 	 *
 | |
| 	 * @param string		$msg
 | |
| 	 * @param string|bool	$desc
 | |
| 	 */
 | |
| 	public function render_error($msg, $desc = false)
 | |
| 	{
 | |
| 		if ($this->request->is_ajax())
 | |
| 		{
 | |
| 			$this->iohandler->add_error_message($msg, $desc);
 | |
| 			$this->iohandler->send_response(true);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			$this->template->assign_vars(array(
 | |
| 				'S_ERROR_BOX'	=> true,
 | |
| 				'ERROR_TITLE'	=> $this->language->lang($msg),
 | |
| 			));
 | |
| 
 | |
| 			if ($desc)
 | |
| 			{
 | |
| 				$this->template->assign_var('ERROR_MSG', $this->language->lang($desc));
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Redirects an AJAX request to a non-JS version
 | |
| 	 *
 | |
| 	 * @param string	$url	URL to redirect to
 | |
| 	 */
 | |
| 	public function redirect_to_html($url)
 | |
| 	{
 | |
| 		$this->iohandler->redirect($url);
 | |
| 		$this->iohandler->send_response(true);
 | |
| 	}
 | |
| 
 | |
| 	private function setup_navigation($stage)
 | |
| 	{
 | |
| 		$active = true;
 | |
| 		$completed = false;
 | |
| 
 | |
| 		switch ($stage)
 | |
| 		{
 | |
| 			case 'finish':
 | |
| 				$this->navigation_provider->set_nav_property(
 | |
| 					array('convert', 0, 'finish'),
 | |
| 					array(
 | |
| 						'selected'	=> $active,
 | |
| 						'completed'	=> $completed,
 | |
| 					)
 | |
| 				);
 | |
| 
 | |
| 				$active = false;
 | |
| 				$completed = true;
 | |
| 			// no break;
 | |
| 
 | |
| 			case 'convert':
 | |
| 				$this->navigation_provider->set_nav_property(
 | |
| 					array('convert', 0, 'convert'),
 | |
| 					array(
 | |
| 						'selected'	=> $active,
 | |
| 						'completed'	=> $completed,
 | |
| 					)
 | |
| 				);
 | |
| 
 | |
| 				$active = false;
 | |
| 				$completed = true;
 | |
| 			// no break;
 | |
| 
 | |
| 			case 'settings':
 | |
| 				$this->navigation_provider->set_nav_property(
 | |
| 					array('convert', 0, 'settings'),
 | |
| 					array(
 | |
| 						'selected'	=> $active,
 | |
| 						'completed'	=> $completed,
 | |
| 					)
 | |
| 				);
 | |
| 
 | |
| 				$active = false;
 | |
| 				$completed = true;
 | |
| 			// no break;
 | |
| 
 | |
| 			case 'intro':
 | |
| 				$this->navigation_provider->set_nav_property(
 | |
| 					array('convert', 0, 'intro'),
 | |
| 					array(
 | |
| 						'selected'	=> $active,
 | |
| 						'completed'	=> $completed,
 | |
| 					)
 | |
| 				);
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| }
 |