Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 114
0.00% covered (danger)
0.00%
0 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
obtain_database_data
0.00% covered (danger)
0.00%
0 / 114
0.00% covered (danger)
0.00%
0 / 7
380
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 run
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 process_form
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 1
6
 request_form_data
0.00% covered (danger)
0.00%
0 / 65
0.00% covered (danger)
0.00%
0 / 1
12
 check_database_data
0.00% covered (danger)
0.00%
0 / 23
0.00% covered (danger)
0.00%
0 / 1
90
 get_step_count
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 get_task_lang_name
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 *
4 * This file is part of the phpBB Forum Software package.
5 *
6 * @copyright (c) phpBB Limited <https://www.phpbb.com>
7 * @license GNU General Public License, version 2 (GPL-2.0)
8 *
9 * For full copyright and license information, please see
10 * the docs/CREDITS.txt file.
11 *
12 */
13
14namespace phpbb\install\module\obtain_data\task;
15
16use phpbb\install\exception\user_interaction_required_exception;
17
18/**
19 * This class requests and validates database information from the user
20 */
21class obtain_database_data extends \phpbb\install\task_base implements \phpbb\install\task_interface
22{
23    /**
24     * @var \phpbb\install\helper\database
25     */
26    protected $database_helper;
27
28    /**
29     * @var \phpbb\install\helper\config
30     */
31    protected $install_config;
32
33    /**
34     * @var \phpbb\install\helper\iohandler\iohandler_interface
35     */
36    protected $io_handler;
37
38    /**
39     * Constructor
40     *
41     * @param \phpbb\install\helper\database                        $database_helper    Installer's database helper
42     * @param \phpbb\install\helper\config                            $install_config        Installer's config helper
43     * @param \phpbb\install\helper\iohandler\iohandler_interface    $iohandler            Installer's input-output handler
44     */
45    public function __construct(\phpbb\install\helper\database $database_helper,
46                                \phpbb\install\helper\config $install_config,
47                                \phpbb\install\helper\iohandler\iohandler_interface $iohandler)
48    {
49        $this->database_helper    = $database_helper;
50        $this->install_config    = $install_config;
51        $this->io_handler        = $iohandler;
52
53        parent::__construct(true);
54    }
55
56    /**
57     * {@inheritdoc}
58     */
59    public function run()
60    {
61        // Check if data is sent
62        if ($this->io_handler->get_input('submit_database', false))
63        {
64            $this->process_form();
65        }
66        else
67        {
68            $this->request_form_data();
69        }
70    }
71
72    /**
73     * Process form data
74     */
75    protected function process_form()
76    {
77        // Collect database data
78        $dbms            = $this->io_handler->get_input('dbms', '');
79        $dbhost            = $this->io_handler->get_input('dbhost', '', true);
80        $dbport            = $this->io_handler->get_input('dbport', '');
81        $dbuser            = $this->io_handler->get_input('dbuser', '', true);
82        $dbpasswd        = $this->io_handler->get_raw_input('dbpasswd', '');
83        $dbname            = $this->io_handler->get_input('dbname', '', true);
84        $table_prefix    = $this->io_handler->get_input('table_prefix', '', true);
85
86        // Check database data
87        $user_data_vaild = $this->check_database_data($dbms, $dbhost, $dbport, $dbuser, $dbpasswd, $dbname, $table_prefix);
88
89        // Save database data if it is correct
90        if ($user_data_vaild)
91        {
92            $this->install_config->set('dbms', $dbms);
93            $this->install_config->set('dbhost', $dbhost);
94            $this->install_config->set('dbport', $dbport);
95            $this->install_config->set('dbuser', $dbuser);
96            $this->install_config->set('dbpasswd', $dbpasswd);
97            $this->install_config->set('dbname', $dbname);
98            $this->install_config->set('table_prefix', $table_prefix);
99        }
100        else
101        {
102            $this->request_form_data(true);
103        }
104    }
105
106    /**
107     * Request data from the user
108     *
109     * @param bool $use_request_data Whether to use submited data
110     *
111     * @throws user_interaction_required_exception When the user is required to provide data
112     */
113    protected function request_form_data($use_request_data = false)
114    {
115        if ($use_request_data)
116        {
117            $dbms            = $this->io_handler->get_input('dbms', '');
118            $dbhost            = $this->io_handler->get_input('dbhost', '', true);
119            $dbport            = $this->io_handler->get_input('dbport', '');
120            $dbuser            = $this->io_handler->get_input('dbuser', '');
121            $dbname            = $this->io_handler->get_input('dbname', '');
122            $table_prefix    = $this->io_handler->get_input('table_prefix', 'phpbb_');
123        }
124        else
125        {
126            $dbms            = '';
127            $dbhost            = '';
128            $dbport            = '';
129            $dbuser            = '';
130            $dbname            = '';
131            $table_prefix    = 'phpbb_';
132        }
133
134        $dbms_select = array();
135        foreach ($this->database_helper->get_available_dbms() as $dbms_key => $dbms_array)
136        {
137            $dbms_select[] = array(
138                'value'        => $dbms_key,
139                'label'        => 'DB_OPTION_' . strtoupper($dbms_key),
140                'selected'    => ($dbms_key === $dbms),
141            );
142        }
143
144        $database_form = array(
145            'dbms' => array(
146                'label'        => 'DBMS',
147                'type'        => 'select',
148                'options'    => $dbms_select,
149            ),
150            'dbhost' => array(
151                'label'            => 'DB_HOST',
152                'description'    => 'DB_HOST_EXPLAIN',
153                'type'            => 'text',
154                'default'        => $dbhost,
155            ),
156            'dbport' => array(
157                'label'            => 'DB_PORT',
158                'description'    => 'DB_PORT_EXPLAIN',
159                'type'            => 'text',
160                'default'        => $dbport,
161            ),
162            'dbuser' => array(
163                'label'        => 'DB_USERNAME',
164                'type'        => 'text',
165                'default'    => $dbuser,
166            ),
167            'dbpasswd' => array(
168                'label'        => 'DB_PASSWORD',
169                'type'    => 'password',
170            ),
171            'dbname' => array(
172                'label'        => 'DB_NAME',
173                'type'        => 'text',
174                'default'    => $dbname,
175            ),
176            'table_prefix' => array(
177                'label'            => 'TABLE_PREFIX',
178                'description'    => 'TABLE_PREFIX_EXPLAIN',
179                'type'            => 'text',
180                'default'        => $table_prefix,
181            ),
182            'submit_database' => array(
183                'label'    => 'SUBMIT',
184                'type'    => 'submit',
185            ),
186        );
187
188        $this->io_handler->add_user_form_group('DB_CONFIG', $database_form);
189
190        // Require user interaction
191        throw new user_interaction_required_exception();
192    }
193
194    /**
195     * Check database data
196     *
197     * @param string    $dbms            Selected database type
198     * @param string    $dbhost            Database host address
199     * @param int        $dbport            Database port number
200     * @param string    $dbuser            Database username
201     * @param string    $dbpass            Database password
202     * @param string    $dbname            Database name
203     * @param string    $table_prefix    Database table prefix
204     *
205     * @return bool    True if database data is correct, false otherwise
206     */
207    protected function check_database_data($dbms, $dbhost, $dbport, $dbuser, $dbpass, $dbname, $table_prefix)
208    {
209        $available_dbms = $this->database_helper->get_available_dbms();
210        $data_valid = true;
211
212        // Check if PHP has the database extensions for the specified DBMS
213        if (!isset($available_dbms[$dbms]))
214        {
215            $this->io_handler->add_error_message('INST_ERR_NO_DB');
216            $data_valid = false;
217        }
218
219        // Validate table prefix
220        $prefix_valid = $this->database_helper->validate_table_prefix($dbms, $table_prefix);
221        if (is_array($prefix_valid))
222        {
223            foreach ($prefix_valid as $error)
224            {
225                $this->io_handler->add_error_message(
226                    $error['title'],
227                    (isset($error['description'])) ? $error['description'] : false
228                );
229            }
230
231            $data_valid = false;
232        }
233
234        // Try to connect to database if all provided data is valid
235        if ($data_valid)
236        {
237            $connect_test = $this->database_helper->check_database_connection($dbms, $dbhost, $dbport, $dbuser, $dbpass, $dbname, $table_prefix);
238            if (is_array($connect_test))
239            {
240                foreach ($connect_test as $error)
241                {
242                    $this->io_handler->add_error_message(
243                        $error['title'],
244                        (isset($error['description'])) ? $error['description'] : false
245                    );
246                }
247
248                $data_valid = false;
249            }
250        }
251
252        return $data_valid;
253    }
254
255    /**
256     * {@inheritdoc}
257     */
258    public static function get_step_count()
259    {
260        return 0;
261    }
262
263    /**
264     * {@inheritdoc}
265     */
266    public function get_task_lang_name()
267    {
268        return '';
269    }
270}