Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 71
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
add_config_settings
0.00% covered (danger)
0.00%
0 / 71
0.00% covered (danger)
0.00%
0 / 5
110
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
2
 run
0.00% covered (danger)
0.00%
0 / 53
0.00% covered (danger)
0.00%
0 / 1
42
 execute_step
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 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\install_database\task;
15
16use Doctrine\DBAL\Driver\Statement as DriverStatement;
17use Doctrine\DBAL\Statement;
18use phpbb\filesystem\filesystem_interface;
19use phpbb\install\database_task;
20use phpbb\install\helper\config;
21use phpbb\install\helper\container_factory;
22use phpbb\install\helper\database;
23use phpbb\install\helper\iohandler\iohandler_interface;
24use phpbb\install\sequential_task;
25use phpbb\language\language;
26
27/**
28 * Create database schema
29 */
30class add_config_settings extends database_task
31{
32    use sequential_task;
33
34    /**
35     * @var \phpbb\db\driver\driver_interface
36     */
37    protected $db;
38
39    /**
40     * @var filesystem_interface
41     */
42    protected $filesystem;
43
44    /**
45     * @var config
46     */
47    protected $install_config;
48
49    /**
50     * @var iohandler_interface
51     */
52    protected $iohandler;
53
54    /**
55     * @var language
56     */
57    protected $language;
58
59    /**
60     * @var string
61     */
62    protected $phpbb_root_path;
63
64    /**
65     * @var string
66     */
67    protected $config_table;
68
69    /**
70     * @var Statement|DriverStatement
71     */
72    protected $stmt;
73
74    /**
75     * Constructor
76     *
77     * @param database                $db_helper            Database helper
78     * @param filesystem_interface    $filesystem            Filesystem service
79     * @param config                $install_config        Installer's config helper
80     * @param iohandler_interface    $iohandler            Installer's input-output handler
81     * @param container_factory        $container            Installer's DI container
82     * @param language                $language            Language service
83     * @param string                $phpbb_root_path    Path to phpBB's root
84     */
85    public function __construct(database $db_helper,
86                                filesystem_interface $filesystem,
87                                config $install_config,
88                                iohandler_interface $iohandler,
89                                container_factory $container,
90                                language $language,
91                                string $phpbb_root_path)
92    {
93        $this->db                = $container->get('dbal.conn');
94        $this->filesystem        = $filesystem;
95        $this->install_config    = $install_config;
96        $this->iohandler        = $iohandler;
97        $this->language            = $language;
98        $this->phpbb_root_path    = $phpbb_root_path;
99
100        // Table names
101        $this->config_table = $container->get_parameter('tables.config');
102
103        parent::__construct(
104            self::get_doctrine_connection($db_helper, $install_config),
105            $this->iohandler,
106            true
107        );
108    }
109
110    /**
111     * {@inheritdoc}
112     */
113    public function run()
114    {
115        $current_time = $this->install_config->get('install_board_time');
116        if ($current_time === false)
117        {
118            $current_time = time();
119            $this->install_config->set('install_board_time', $current_time);
120        }
121
122        $server_name    = $this->install_config->get('server_name');
123        $referer        = $this->iohandler->get_server_variable('REFERER');
124
125        // Calculate cookie domain
126        $cookie_domain = $server_name;
127
128        if (strpos($cookie_domain, 'www.') === 0)
129        {
130            $cookie_domain = substr($cookie_domain, 3);
131        }
132
133        $updates = [
134            'board_startdate' => (string) $current_time,
135            'board_timezone' => $this->install_config->get('admin_timezone'),
136            'default_lang' => $this->install_config->get('default_lang'),
137
138            'server_name' => $this->install_config->get('server_name'),
139            'server_port' => $this->install_config->get('server_port'),
140
141            'board_email' => $this->install_config->get('board_email'),
142            'board_contact' => $this->install_config->get('board_email'),
143
144            'cookie_domain' => $cookie_domain,
145            'cookie_secure' => $this->install_config->get('cookie_secure'),
146
147            'default_dateformat' => $this->language->lang('default_dateformat'),
148
149            'email_enable'        => $this->install_config->get('email_enable'),
150            'smtp_delivery'        => $this->install_config->get('smtp_delivery'),
151            'smtp_host'            => $this->install_config->get('smtp_host'),
152            'smtp_port'            => $this->install_config->get('smtp_port'),
153            'smtp_auth_method'    => $this->install_config->get('smtp_auth'),
154            'smtp_username'        => $this->install_config->get('smtp_user'),
155            'smtp_password'        => $this->install_config->get('smtp_pass'),
156
157            'force_server_vars'    => $this->install_config->get('force_server_vars'),
158            'script_path'        => $this->install_config->get('script_path'),
159            'server_protocol'    => $this->install_config->get('server_protocol'),
160
161            'newest_username' => $this->install_config->get('admin_name'),
162
163            'avatar_salt'    => md5(mt_rand()),
164            'plupload_salt'    => md5(mt_rand()),
165
166            'sitename'    => $this->install_config->get('board_name'),
167            'site_desc'    => $this->install_config->get('board_description'),
168        ];
169
170        $ref = substr($referer, strpos($referer, '://') + 3);
171        if (!(stripos($ref, $server_name) === 0))
172        {
173            $updates['referer_validation'] = '0';
174        }
175
176        // We set a (semi-)unique cookie name to bypass login issues related to the cookie name.
177        $cookie_name = 'phpbb3_';
178        $rand_str = md5(mt_rand());
179        $rand_str = str_replace('0', 'z', base_convert($rand_str, 16, 35));
180        $rand_str = substr($rand_str, 0, 5);
181        $cookie_name .= strtolower($rand_str);
182
183        $updates['cookie_name'] = $cookie_name;
184
185        // Disable avatars if upload directory is not writable
186        if (!$this->filesystem->is_writable($this->phpbb_root_path . 'images/avatars/upload/'))
187        {
188            $updates['allow_avatar'] = '0';
189            $updates['allow_avatar_upload'] = '0';
190        }
191
192        $this->stmt = $this->create_prepared_stmt(
193            'UPDATE ' . $this->config_table . ' SET config_value = :value WHERE config_name = :name'
194        );
195
196        if ($this->stmt !== null)
197        {
198            $this->execute($this->install_config, $updates);
199        }
200    }
201
202    /**
203     * {@inheritdoc}
204     */
205    protected function execute_step($key, $value) : void
206    {
207        $this->exec_prepared_stmt($this->stmt, [
208            'name' => $key,
209            'value' => $value,
210        ]);
211    }
212
213    /**
214     * {@inheritdoc}
215     */
216    public static function get_step_count() : int
217    {
218        return 1;
219    }
220
221    /**
222     * {@inheritdoc}
223     */
224    public function get_task_lang_name() : string
225    {
226        return 'TASK_ADD_CONFIG_SETTINGS';
227    }
228}