Mercurial > hg > rc1
comparison installer/test.php @ 0:1e000243b222
vanilla 1.3.3 distro, I hope
| author | Charlie Root |
|---|---|
| date | Thu, 04 Jan 2018 15:50:29 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:1e000243b222 |
|---|---|
| 1 <?php | |
| 2 | |
| 3 if (!class_exists('rcmail_install', false) || !is_object($RCI)) { | |
| 4 die("Not allowed! Please open installer/index.php instead."); | |
| 5 } | |
| 6 | |
| 7 ?> | |
| 8 <form action="index.php?_step=3" method="post"> | |
| 9 | |
| 10 <h3>Check config file</h3> | |
| 11 <?php | |
| 12 | |
| 13 if ($read_config = is_readable(RCUBE_CONFIG_DIR . 'defaults.inc.php')) { | |
| 14 $config = $RCI->load_config_file(RCUBE_CONFIG_DIR . 'defaults.inc.php'); | |
| 15 if (!empty($config)) { | |
| 16 $RCI->pass('defaults.inc.php'); | |
| 17 } | |
| 18 else { | |
| 19 $RCI->fail('defaults.inc.php', 'Syntax error'); | |
| 20 } | |
| 21 } | |
| 22 else { | |
| 23 $RCI->fail('defaults.inc.php', 'Unable to read default config file?'); | |
| 24 } | |
| 25 echo '<br />'; | |
| 26 | |
| 27 if ($read_config = is_readable(RCUBE_CONFIG_DIR . 'config.inc.php')) { | |
| 28 $config = $RCI->load_config_file(RCUBE_CONFIG_DIR . 'config.inc.php'); | |
| 29 if (!empty($config)) { | |
| 30 $RCI->pass('config.inc.php'); | |
| 31 } | |
| 32 else { | |
| 33 $RCI->fail('config.inc.php', 'Syntax error'); | |
| 34 } | |
| 35 } | |
| 36 else { | |
| 37 $RCI->fail('config.inc.php', 'Unable to read file. Did you create the config file?'); | |
| 38 } | |
| 39 echo '<br />'; | |
| 40 | |
| 41 | |
| 42 if ($RCI->configured && ($messages = $RCI->check_config())) { | |
| 43 if (is_array($messages['replaced'])) { | |
| 44 echo '<h3 class="warning">Replaced config options</h3>'; | |
| 45 echo '<p class="hint">The following config options have been replaced or renamed. '; | |
| 46 echo 'Please update them accordingly in your config files.</p>'; | |
| 47 | |
| 48 echo '<ul class="configwarings">'; | |
| 49 foreach ($messages['replaced'] as $msg) { | |
| 50 echo html::tag('li', null, html::span('propname', $msg['prop']) . | |
| 51 ' was replaced by ' . html::span('propname', $msg['replacement'])); | |
| 52 } | |
| 53 echo '</ul>'; | |
| 54 } | |
| 55 | |
| 56 if (is_array($messages['obsolete'])) { | |
| 57 echo '<h3>Obsolete config options</h3>'; | |
| 58 echo '<p class="hint">You still have some obsolete or inexistent properties set. This isn\'t a problem but should be noticed.</p>'; | |
| 59 | |
| 60 echo '<ul class="configwarings">'; | |
| 61 foreach ($messages['obsolete'] as $msg) { | |
| 62 echo html::tag('li', null, html::span('propname', $msg['prop']) . ($msg['name'] ? ': ' . $msg['name'] : '')); | |
| 63 } | |
| 64 echo '</ul>'; | |
| 65 } | |
| 66 | |
| 67 echo '<p class="suggestion">OK, lazy people can download the updated config file here: '; | |
| 68 echo html::a(array('href' => './?_mergeconfig=1'), 'config.inc.php') . ' '; | |
| 69 echo "</p>"; | |
| 70 | |
| 71 if (is_array($messages['dependencies'])) { | |
| 72 echo '<h3 class="warning">Dependency check failed</h3>'; | |
| 73 echo '<p class="hint">Some of your configuration settings require other options to be configured or additional PHP modules to be installed</p>'; | |
| 74 | |
| 75 echo '<ul class="configwarings">'; | |
| 76 foreach ($messages['dependencies'] as $msg) { | |
| 77 echo html::tag('li', null, html::span('propname', $msg['prop']) . ': ' . $msg['explain']); | |
| 78 } | |
| 79 echo '</ul>'; | |
| 80 } | |
| 81 } | |
| 82 | |
| 83 ?> | |
| 84 | |
| 85 <h3>Check if directories are writable</h3> | |
| 86 <p>Roundcube may need to write/save files into these directories</p> | |
| 87 <?php | |
| 88 | |
| 89 $dirs[] = $RCI->config['temp_dir'] ? $RCI->config['temp_dir'] : 'temp'; | |
| 90 if ($RCI->config['log_driver'] != 'syslog') | |
| 91 $dirs[] = $RCI->config['log_dir'] ? $RCI->config['log_dir'] : 'logs'; | |
| 92 | |
| 93 foreach ($dirs as $dir) { | |
| 94 $dirpath = rcube_utils::is_absolute_path($dir) ? $dir : INSTALL_PATH . $dir; | |
| 95 if (is_writable(realpath($dirpath))) { | |
| 96 $RCI->pass($dir); | |
| 97 $pass = true; | |
| 98 } | |
| 99 else { | |
| 100 $RCI->fail($dir, 'not writeable for the webserver'); | |
| 101 } | |
| 102 echo '<br />'; | |
| 103 } | |
| 104 | |
| 105 if (!$pass) { | |
| 106 echo '<p class="hint">Use <tt>chmod</tt> or <tt>chown</tt> to grant write privileges to the webserver</p>'; | |
| 107 } | |
| 108 | |
| 109 ?> | |
| 110 | |
| 111 <h3>Check DB config</h3> | |
| 112 <?php | |
| 113 | |
| 114 $db_working = false; | |
| 115 if ($RCI->configured) { | |
| 116 if (!empty($RCI->config['db_dsnw'])) { | |
| 117 $DB = rcube_db::factory($RCI->config['db_dsnw'], '', false); | |
| 118 $DB->set_debug((bool)$RCI->config['sql_debug']); | |
| 119 $DB->db_connect('w'); | |
| 120 | |
| 121 if (!($db_error_msg = $DB->is_error())) { | |
| 122 $RCI->pass('DSN (write)'); | |
| 123 echo '<br />'; | |
| 124 $db_working = true; | |
| 125 } | |
| 126 else { | |
| 127 $RCI->fail('DSN (write)', $db_error_msg); | |
| 128 echo '<p class="hint">Make sure that the configured database exists and that the user has write privileges<br />'; | |
| 129 echo 'DSN: ' . $RCI->config['db_dsnw'] . '</p>'; | |
| 130 } | |
| 131 } | |
| 132 else { | |
| 133 $RCI->fail('DSN (write)', 'not set'); | |
| 134 } | |
| 135 } | |
| 136 else { | |
| 137 $RCI->fail('DSN (write)', 'Could not read config file'); | |
| 138 } | |
| 139 | |
| 140 // initialize db with schema found in /SQL/* | |
| 141 if ($db_working && $_POST['initdb']) { | |
| 142 if (!($success = $RCI->init_db($DB))) { | |
| 143 $db_working = false; | |
| 144 echo '<p class="warning">Please try to inizialize the database manually as described in the INSTALL guide. | |
| 145 Make sure that the configured database extists and that the user as write privileges</p>'; | |
| 146 } | |
| 147 } | |
| 148 | |
| 149 else if ($db_working && $_POST['updatedb']) { | |
| 150 if (!($success = $RCI->update_db($_POST['version']))) { | |
| 151 echo '<p class="warning">Database schema update failed.</p>'; | |
| 152 } | |
| 153 } | |
| 154 | |
| 155 // test database | |
| 156 if ($db_working) { | |
| 157 $db_read = $DB->query("SELECT count(*) FROM " . $DB->quote_identifier($RCI->config['db_prefix'] . 'users')); | |
| 158 if ($DB->is_error()) { | |
| 159 $RCI->fail('DB Schema', "Database not initialized"); | |
| 160 echo '<p><input type="submit" name="initdb" value="Initialize database" /></p>'; | |
| 161 $db_working = false; | |
| 162 } | |
| 163 else if ($err = $RCI->db_schema_check($DB, $update = !empty($_POST['updatedb']))) { | |
| 164 $RCI->fail('DB Schema', "Database schema differs"); | |
| 165 echo '<ul style="margin:0"><li>' . join("</li>\n<li>", $err) . "</li></ul>"; | |
| 166 $select = $RCI->versions_select(array('name' => 'version')); | |
| 167 $select->add('0.9 or newer', ''); | |
| 168 echo '<p class="suggestion">You should run the update queries to get the schema fixed.<br/><br/>Version to update from: ' . $select->show() . ' <input type="submit" name="updatedb" value="Update" /></p>'; | |
| 169 $db_working = false; | |
| 170 } | |
| 171 else { | |
| 172 $RCI->pass('DB Schema'); | |
| 173 echo '<br />'; | |
| 174 } | |
| 175 } | |
| 176 | |
| 177 // more database tests | |
| 178 if ($db_working) { | |
| 179 // write test | |
| 180 $insert_id = md5(uniqid()); | |
| 181 $db_write = $DB->query("INSERT INTO " . $DB->quote_identifier($RCI->config['db_prefix'] . 'session') | |
| 182 . " (`sess_id`, `changed`, `ip`, `vars`) VALUES (?, ".$DB->now().", '127.0.0.1', 'foo')", $insert_id); | |
| 183 | |
| 184 if ($db_write) { | |
| 185 $RCI->pass('DB Write'); | |
| 186 $DB->query("DELETE FROM " . $DB->quote_identifier($RCI->config['db_prefix'] . 'session') | |
| 187 . " WHERE `sess_id` = ?", $insert_id); | |
| 188 } | |
| 189 else { | |
| 190 $RCI->fail('DB Write', $RCI->get_error()); | |
| 191 } | |
| 192 echo '<br />'; | |
| 193 | |
| 194 // check timezone settings | |
| 195 $tz_db = 'SELECT ' . $DB->unixtimestamp($DB->now()) . ' AS tz_db'; | |
| 196 $tz_db = $DB->query($tz_db); | |
| 197 $tz_db = $DB->fetch_assoc($tz_db); | |
| 198 $tz_db = (int) $tz_db['tz_db']; | |
| 199 $tz_local = (int) time(); | |
| 200 $tz_diff = $tz_local - $tz_db; | |
| 201 | |
| 202 // sometimes db and web servers are on separate hosts, so allow a 30 minutes delta | |
| 203 if (abs($tz_diff) > 1800) { | |
| 204 $RCI->fail('DB Time', "Database time differs {$td_ziff}s from PHP time"); | |
| 205 } | |
| 206 else { | |
| 207 $RCI->pass('DB Time'); | |
| 208 } | |
| 209 } | |
| 210 | |
| 211 ?> | |
| 212 | |
| 213 <h3>Test filetype detection</h3> | |
| 214 | |
| 215 <?php | |
| 216 | |
| 217 if ($errors = $RCI->check_mime_detection()) { | |
| 218 $RCI->fail('Fileinfo/mime_content_type configuration'); | |
| 219 if (!empty($RCI->config['mime_magic'])) { | |
| 220 echo '<p class="hint">Try setting the <tt>mime_magic</tt> config option to <tt>null</tt>.</p>'; | |
| 221 } | |
| 222 else { | |
| 223 echo '<p class="hint">Check the <a href="http://www.php.net/manual/en/function.finfo-open.php">Fileinfo functions</a> of your PHP installation.<br/>'; | |
| 224 echo 'The path to the magic.mime file can be set using the <tt>mime_magic</tt> config option in Roundcube.</p>'; | |
| 225 } | |
| 226 } | |
| 227 else { | |
| 228 $RCI->pass('Fileinfo/mime_content_type configuration'); | |
| 229 echo "<br/>"; | |
| 230 } | |
| 231 | |
| 232 | |
| 233 if ($errors = $RCI->check_mime_extensions()) { | |
| 234 $RCI->fail('Mimetype to file extension mapping'); | |
| 235 echo '<p class="hint">Please set a valid path to your webserver\'s mime.types file to the <tt>mime_types</tt> config option.<br/>'; | |
| 236 echo 'If you can\'t find such a file, download it from <a href="http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types">svn.apache.org</a>.</p>'; | |
| 237 } | |
| 238 else { | |
| 239 $RCI->pass('Mimetype to file extension mapping'); | |
| 240 echo "<br/>"; | |
| 241 } | |
| 242 | |
| 243 ?> | |
| 244 | |
| 245 | |
| 246 <h3>Test SMTP config</h3> | |
| 247 | |
| 248 <p> | |
| 249 Server: <?php echo rcube_utils::parse_host($RCI->getprop('smtp_server', 'localhost')); ?><br /> | |
| 250 Port: <?php echo $RCI->getprop('smtp_port'); ?><br /> | |
| 251 | |
| 252 <?php | |
| 253 | |
| 254 if ($RCI->getprop('smtp_server')) { | |
| 255 $user = $RCI->getprop('smtp_user', '(none)'); | |
| 256 $pass = $RCI->getprop('smtp_pass', '(none)'); | |
| 257 | |
| 258 if ($user == '%u') { | |
| 259 $user_field = new html_inputfield(array('name' => '_smtp_user')); | |
| 260 $user = $user_field->show($_POST['_smtp_user']); | |
| 261 } | |
| 262 if ($pass == '%p') { | |
| 263 $pass_field = new html_passwordfield(array('name' => '_smtp_pass')); | |
| 264 $pass = $pass_field->show(); | |
| 265 } | |
| 266 | |
| 267 echo "User: $user<br />"; | |
| 268 echo "Password: $pass<br />"; | |
| 269 } | |
| 270 | |
| 271 $from_field = new html_inputfield(array('name' => '_from', 'id' => 'sendmailfrom')); | |
| 272 $to_field = new html_inputfield(array('name' => '_to', 'id' => 'sendmailto')); | |
| 273 | |
| 274 ?> | |
| 275 </p> | |
| 276 | |
| 277 <?php | |
| 278 | |
| 279 if (isset($_POST['sendmail'])) { | |
| 280 | |
| 281 echo '<p>Trying to send email...<br />'; | |
| 282 | |
| 283 $from = idn_to_ascii(trim($_POST['_from'])); | |
| 284 $to = idn_to_ascii(trim($_POST['_to'])); | |
| 285 | |
| 286 if (preg_match('/^' . $RCI->email_pattern . '$/i', $from) && | |
| 287 preg_match('/^' . $RCI->email_pattern . '$/i', $to) | |
| 288 ) { | |
| 289 $headers = array( | |
| 290 'From' => $from, | |
| 291 'To' => $to, | |
| 292 'Subject' => 'Test message from Roundcube', | |
| 293 ); | |
| 294 | |
| 295 $body = 'This is a test to confirm that Roundcube can send email.'; | |
| 296 | |
| 297 // send mail using configured SMTP server | |
| 298 $CONFIG = $RCI->config; | |
| 299 | |
| 300 if (!empty($_POST['_smtp_user'])) { | |
| 301 $CONFIG['smtp_user'] = $_POST['_smtp_user']; | |
| 302 } | |
| 303 if (!empty($_POST['_smtp_pass'])) { | |
| 304 $CONFIG['smtp_pass'] = $_POST['_smtp_pass']; | |
| 305 } | |
| 306 | |
| 307 $mail_object = new Mail_mime(); | |
| 308 $send_headers = $mail_object->headers($headers); | |
| 309 $head = $mail_object->txtHeaders($send_headers); | |
| 310 | |
| 311 $SMTP = new rcube_smtp(); | |
| 312 $SMTP->connect(rcube_utils::parse_host($RCI->getprop('smtp_server')), | |
| 313 $RCI->getprop('smtp_port'), $CONFIG['smtp_user'], $CONFIG['smtp_pass']); | |
| 314 | |
| 315 $status = $SMTP->send_mail($headers['From'], $headers['To'], $head, $body); | |
| 316 $smtp_response = $SMTP->get_response(); | |
| 317 | |
| 318 if ($status) { | |
| 319 $RCI->pass('SMTP send'); | |
| 320 } | |
| 321 else { | |
| 322 $RCI->fail('SMTP send', join('; ', $smtp_response)); | |
| 323 } | |
| 324 } | |
| 325 else { | |
| 326 $RCI->fail('SMTP send', 'Invalid sender or recipient'); | |
| 327 } | |
| 328 | |
| 329 echo '</p>'; | |
| 330 } | |
| 331 | |
| 332 ?> | |
| 333 | |
| 334 <table> | |
| 335 <tbody> | |
| 336 <tr> | |
| 337 <td><label for="sendmailfrom">Sender</label></td> | |
| 338 <td><?php echo $from_field->show($_POST['_from']); ?></td> | |
| 339 </tr> | |
| 340 <tr> | |
| 341 <td><label for="sendmailto">Recipient</label></td> | |
| 342 <td><?php echo $to_field->show($_POST['_to']); ?></td> | |
| 343 </tr> | |
| 344 </tbody> | |
| 345 </table> | |
| 346 | |
| 347 <p><input type="submit" name="sendmail" value="Send test mail" /></p> | |
| 348 | |
| 349 | |
| 350 <h3>Test IMAP config</h3> | |
| 351 | |
| 352 <?php | |
| 353 | |
| 354 $default_hosts = $RCI->get_hostlist(); | |
| 355 if (!empty($default_hosts)) { | |
| 356 $host_field = new html_select(array('name' => '_host', 'id' => 'imaphost')); | |
| 357 $host_field->add($default_hosts); | |
| 358 } | |
| 359 else { | |
| 360 $host_field = new html_inputfield(array('name' => '_host', 'id' => 'imaphost')); | |
| 361 } | |
| 362 | |
| 363 $user_field = new html_inputfield(array('name' => '_user', 'id' => 'imapuser')); | |
| 364 $pass_field = new html_passwordfield(array('name' => '_pass', 'id' => 'imappass')); | |
| 365 | |
| 366 ?> | |
| 367 | |
| 368 <table> | |
| 369 <tbody> | |
| 370 <tr> | |
| 371 <td><label for="imaphost">Server</label></td> | |
| 372 <td><?php echo $host_field->show($_POST['_host']); ?></td> | |
| 373 </tr> | |
| 374 <tr> | |
| 375 <td>Port</td> | |
| 376 <td><?php echo $RCI->getprop('default_port'); ?></td> | |
| 377 </tr> | |
| 378 <tr> | |
| 379 <td><label for="imapuser">Username</label></td> | |
| 380 <td><?php echo $user_field->show($_POST['_user']); ?></td> | |
| 381 </tr> | |
| 382 <tr> | |
| 383 <td><label for="imappass">Password</label></td> | |
| 384 <td><?php echo $pass_field->show(); ?></td> | |
| 385 </tr> | |
| 386 </tbody> | |
| 387 </table> | |
| 388 | |
| 389 <?php | |
| 390 | |
| 391 if (isset($_POST['imaptest']) && !empty($_POST['_host']) && !empty($_POST['_user'])) { | |
| 392 | |
| 393 echo '<p>Connecting to ' . rcube::Q($_POST['_host']) . '...<br />'; | |
| 394 | |
| 395 $imap_host = trim($_POST['_host']); | |
| 396 $imap_port = $RCI->getprop('default_port'); | |
| 397 $a_host = parse_url($imap_host); | |
| 398 | |
| 399 if ($a_host['host']) { | |
| 400 $imap_host = $a_host['host']; | |
| 401 $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? $a_host['scheme'] : null; | |
| 402 if (isset($a_host['port'])) | |
| 403 $imap_port = $a_host['port']; | |
| 404 else if ($imap_ssl && $imap_ssl != 'tls' && (!$imap_port || $imap_port == 143)) | |
| 405 $imap_port = 993; | |
| 406 } | |
| 407 | |
| 408 $imap_host = idn_to_ascii($imap_host); | |
| 409 $imap_user = idn_to_ascii($_POST['_user']); | |
| 410 | |
| 411 $imap = new rcube_imap(null); | |
| 412 $imap->set_options(array( | |
| 413 'auth_type' => $RCI->getprop('imap_auth_type'), | |
| 414 'debug' => $RCI->getprop('imap_debug'), | |
| 415 'socket_options' => $RCI->getprop('imap_conn_options'), | |
| 416 )); | |
| 417 | |
| 418 if ($imap->connect($imap_host, $imap_user, $_POST['_pass'], $imap_port, $imap_ssl)) { | |
| 419 $RCI->pass('IMAP connect', 'SORT capability: ' . ($imap->get_capability('SORT') ? 'yes' : 'no')); | |
| 420 $imap->close(); | |
| 421 } | |
| 422 else { | |
| 423 $RCI->fail('IMAP connect', $RCI->get_error()); | |
| 424 } | |
| 425 } | |
| 426 | |
| 427 ?> | |
| 428 | |
| 429 <p><input type="submit" name="imaptest" value="Check login" /></p> | |
| 430 | |
| 431 </form> | |
| 432 | |
| 433 <hr /> | |
| 434 | |
| 435 <p class="warning"> | |
| 436 | |
| 437 After completing the installation and the final tests please <b>remove</b> the whole | |
| 438 installer folder from the document root of the webserver or make sure that | |
| 439 <tt>enable_installer</tt> option in <tt>config.inc.php</tt> is disabled.<br /> | |
| 440 <br /> | |
| 441 | |
| 442 These files may expose sensitive configuration data like server passwords and encryption keys | |
| 443 to the public. Make sure you cannot access this installer from your browser. | |
| 444 | |
| 445 </p> |
