Check config files

config)) { $RCI->pass('main.inc.php'); } else if ($read_main) { $RCI->fail('main.inc.php', 'Syntax error'); } else if (!$read_main) { $RCI->fail('main.inc.php', 'Unable to read file. Did you create the config files?'); } echo '
'; if ($read_db && !empty($RCI->config['db_table_users'])) { $RCI->pass('db.inc.php'); } else if ($read_db) { $RCI->fail('db.inc.php', 'Syntax error'); } else if (!$read_db) { $RCI->fail('db.inc.php', 'Unable to read file. Did you create the config files?'); } if ($RCI->configured && ($messages = $RCI->check_config())) { if (is_array($messages['missing'])) { echo '

Missing config options

'; echo '

The following config options are not present in the current configuration.
'; echo 'Please check the default config files and add the missing properties to your local config files.

'; echo ''; } if (is_array($messages['replaced'])) { echo '

Replaced config options

'; echo '

The following config options have been replaced or renamed. '; echo 'Please update them accordingly in your config files.

'; echo ''; } if (is_array($messages['obsolete'])) { echo '

Obsolete config options

'; echo '

You still have some obsolete or inexistent properties set. This isn\'t a problem but should be noticed.

'; echo ''; } echo '

OK, lazy people can download the updated config files here: '; echo html::a(array('href' => './?_mergeconfig=main'), 'main.inc.php') . '  '; echo html::a(array('href' => './?_mergeconfig=db'), 'db.inc.php'); echo "

"; if (is_array($messages['dependencies'])) { echo '

Dependency check failed

'; echo '

Some of your configuration settings require other options to be configured or additional PHP modules to be installed

'; echo ''; } } ?>

Check if directories are writable

RoundCube may need to write/save files into these directories

configured) { $pass = false; $dirs[] = $RCI->config['temp_dir']; if($RCI->config['log_driver'] != 'syslog') $dirs[] = $RCI->config['log_dir']; foreach ($dirs as $dir) { $dirpath = $dir{0} == '/' ? $dir : INSTALL_PATH . $dir; if (is_writable(realpath($dirpath))) { $RCI->pass($dir); $pass = true; } else { $RCI->fail($dir, 'not writeable for the webserver'); } echo '
'; } if (!$pass) echo '

Use chmod or chown to grant write privileges to the webserver

'; } else { $RCI->fail('Config', 'Could not read config files'); } ?>

Check configured database settings

configured) { if (!empty($RCI->config['db_dsnw'])) { $DB = new rcube_mdb2($RCI->config['db_dsnw'], '', false); $DB->db_connect('w'); if (!($db_error_msg = $DB->is_error())) { $RCI->pass('DSN (write)'); echo '
'; $db_working = true; } else { $RCI->fail('DSN (write)', $db_error_msg); echo '

Make sure that the configured database exists and that the user has write privileges
'; echo 'DSN: ' . $RCI->config['db_dsnw'] . '

'; } } else { $RCI->fail('DSN (write)', 'not set'); } } else { $RCI->fail('Config', 'Could not read config files'); } // initialize db with schema found in /SQL/* if ($db_working && $_POST['initdb']) { if (!($success = $RCI->init_db($DB))) { $db_working = false; echo '

Please try to inizialize the database manually as described in the INSTALL guide. Make sure that the configured database extists and that the user as write privileges

'; } } // test database if ($db_working) { $db_read = $DB->query("SELECT count(*) FROM {$RCI->config['db_table_users']}"); if ($DB->db_error) { $RCI->fail('DB Schema', "Database not initialized"); echo '

'; $db_working = false; } /* else if (!$RCI->db_schema_check($update = !empty($_POST['updatedb']))) { $RCI->fail('DB Schema', "Database schema differs"); echo $update ? '

Failed to update the database schema! Please manually execute the SQL statements from the SQL/*.update.sql file on your database

' : '

'; $db_working = false; } */ else { $RCI->pass('DB Schema'); echo '
'; } } // more database tests if ($db_working) { // write test $insert_id = md5(uniqid()); $db_write = $DB->query("INSERT INTO {$RCI->config['db_table_session']} (sess_id, created, ip, vars) VALUES (?, ".$DB->now().", '127.0.0.1', 'foo')", $insert_id); if ($db_write) { $RCI->pass('DB Write'); $DB->query("DELETE FROM {$RCI->config['db_table_session']} WHERE sess_id=?", $insert_id); } else { $RCI->fail('DB Write', $RCI->get_error()); } echo '
'; // check timezone settings $tz_db = 'SELECT ' . $DB->unixtimestamp($DB->now()) . ' AS tz_db'; $tz_db = $DB->query($tz_db); $tz_db = $DB->fetch_assoc($tz_db); $tz_db = (int) $tz_db['tz_db']; $tz_local = (int) time(); $tz_diff = $tz_local - $tz_db; // sometimes db and web servers are on separate hosts, so allow a 30 minutes delta if (abs($tz_diff) > 1800) { $RCI->fail('DB Time', "Database time differs {$td_ziff}s from PHP time"); } else { $RCI->pass('DB Time'); } } ?>

Test SMTP settings

Server: getprop('smtp_server', 'PHP mail()'); ?>
Port: getprop('smtp_port'); ?>
getprop('smtp_server')) { $user = $RCI->getprop('smtp_user', '(none)'); $pass = $RCI->getprop('smtp_pass', '(none)'); if ($user == '%u') { $user_field = new html_inputfield(array('name' => '_smtp_user')); $user = $user_field->show($_POST['_smtp_user']); } if ($pass == '%p') { $pass_field = new html_passwordfield(array('name' => '_smtp_pass')); $pass = $pass_field->show(); } echo "User: $user
"; echo "Password: $pass
"; } $from_field = new html_inputfield(array('name' => '_from', 'id' => 'sendmailfrom')); $to_field = new html_inputfield(array('name' => '_to', 'id' => 'sendmailto')); ?>

Trying to send email...
'; if (preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_from'])) && preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_to']))) { $headers = array( 'From' => trim($_POST['_from']), 'To' => trim($_POST['_to']), 'Subject' => 'Test message from RoundCube', ); $body = 'This is a test to confirm that RoundCube can send email.'; $smtp_response = array(); // send mail using configured SMTP server if ($RCI->getprop('smtp_server')) { $CONFIG = $RCI->config; if (!empty($_POST['_smtp_user'])) { $CONFIG['smtp_user'] = $_POST['_smtp_user']; } if (!empty($_POST['_smtp_pass'])) { $CONFIG['smtp_pass'] = $_POST['_smtp_pass']; } $mail_object = new rcube_mail_mime(); $send_headers = $mail_object->headers($headers); $SMTP = new rcube_smtp(); $SMTP->connect(); $status = $SMTP->send_mail($headers['From'], $headers['To'], ($foo = $mail_object->txtHeaders($send_headers)), $body); $smtp_response = $SMTP->get_response(); } else { // use mail() $header_str = 'From: ' . $headers['From']; if (ini_get('safe_mode')) $status = mail($headers['To'], $headers['Subject'], $body, $header_str); else $status = mail($headers['To'], $headers['Subject'], $body, $header_str, '-f'.$headers['From']); if (!$status) $smtp_response[] = 'Mail delivery with mail() failed. Check your error logs for details'; } if ($status) { $RCI->pass('SMTP send'); } else { $RCI->fail('SMTP send', join('; ', $smtp_response)); } } else { $RCI->fail('SMTP send', 'Invalid sender or recipient'); } echo '

'; } ?>
show($_POST['_from']); ?>
show($_POST['_to']); ?>

Test IMAP configuration

get_hostlist(); if (!empty($default_hosts)) { $host_field = new html_select(array('name' => '_host', 'id' => 'imaphost')); $host_field->add($default_hosts); } else { $host_field = new html_inputfield(array('name' => '_host', 'id' => 'imaphost')); } $user_field = new html_inputfield(array('name' => '_user', 'id' => 'imapuser')); $pass_field = new html_passwordfield(array('name' => '_pass', 'id' => 'imappass')); ?>
show($_POST['_host']); ?>
Port getprop('default_port'); ?>
show($_POST['_user']); ?>
show(); ?>
Connecting to ' . Q($_POST['_host']) . '...
'; $a_host = parse_url($_POST['_host']); if ($a_host['host']) { $imap_host = $a_host['host']; $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? $a_host['scheme'] : null; $imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : $CONFIG['default_port']); } else { $imap_host = trim($_POST['_host']); $imap_port = $RCI->getprop('default_port'); } $imap = new rcube_imap(null); if ($imap->connect($imap_host, $_POST['_user'], $_POST['_pass'], $imap_port, $imap_ssl)) { $RCI->pass('IMAP connect', 'SORT capability: ' . ($imap->get_capability('SORT') ? 'yes' : 'no')); $imap->close(); } else { $RCI->fail('IMAP connect', $RCI->get_error()); } } ?>


After completing the installation and the final tests please remove the whole installer folder from the document root of the webserver.

These files may expose sensitive configuration data like server passwords and encryption keys to the public. Make sure you cannot access this installer from your browser.