Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 159
obtain_database_data
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 7
380
0.00% covered (danger)
0.00%
0 / 159
 __construct
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 8
 run
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 10
 process_form
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 24
 request_form_data
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 74
 check_database_data
0.00% covered (danger)
0.00%
0 / 1
90
0.00% covered (danger)
0.00%
0 / 37
 get_step_count
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 3
 get_task_lang_name
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 3
<?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', '', true);
        $dbpasswd        = $this->io_handler->get_raw_input('dbpasswd', '', true);
        $dbname            = $this->io_handler->get_input('dbname', '', true);
        $table_prefix    = $this->io_handler->get_input('table_prefix', '', true);
        // 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 '';
    }
}