| +-----------------------------------------------------------------------+ */ if (!class_exists('rcmail_install', false) || !is_object($RCI)) { die("Not allowed! Please open installer/index.php instead."); } ?>

Check config file

load_config_file(RCUBE_CONFIG_DIR . 'defaults.inc.php'); if (!empty($config)) { $RCI->pass('defaults.inc.php'); } else { $RCI->fail('defaults.inc.php', 'Syntax error'); } } else { $RCI->fail('defaults.inc.php', 'Unable to read default config file?'); } echo '
'; if ($read_config = is_readable(RCUBE_CONFIG_DIR . 'config.inc.php')) { $config = $RCI->load_config_file(RCUBE_CONFIG_DIR . 'config.inc.php'); if (!empty($config)) { $RCI->pass('config.inc.php'); } else { $RCI->fail('config.inc.php', 'Syntax error'); } } else { $RCI->fail('config.inc.php', 'Unable to read file. Did you create the config file?'); } echo '
'; if ($RCI->configured && ($messages = $RCI->check_config())) { 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 file here: '; echo html::a(array('href' => './?_mergeconfig=1'), 'config.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

config['temp_dir'] ? $RCI->config['temp_dir'] : 'temp'; if ($RCI->config['log_driver'] != 'syslog') $dirs[] = $RCI->config['log_dir'] ? $RCI->config['log_dir'] : 'logs'; foreach ($dirs as $dir) { $dirpath = rcube_utils::is_absolute_path($dir) ? $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

'; } ?>

Check DB config

configured) { if (!empty($RCI->config['db_dsnw'])) { $DB = rcube_db::factory($RCI->config['db_dsnw'], '', false); $DB->set_debug((bool)$RCI->config['sql_debug']); $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('DSN (write)', 'Could not read config file'); } // initialize db with schema found in /SQL/* if ($db_working && $_POST['initdb']) { if (!$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

'; } } else if ($db_working && $_POST['updatedb']) { if (!$RCI->update_db($_POST['version'])) { echo '

Database schema update failed.

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

'; $db_working = false; } else if ($err = $RCI->db_schema_check($DB, $update = !empty($_POST['updatedb']))) { $RCI->fail('DB Schema', "Database schema differs"); echo '"; $select = $RCI->versions_select(array('name' => 'version')); $select->add('0.9 or newer', ''); echo '

You should run the update queries to get the schema fixed.

Version to update from: ' . $select->show('') . ' 

'; $db_working = false; } else { $RCI->pass('DB Schema'); echo '
'; } } // more database tests if ($db_working) { // Using transactions to workaround SQLite bug (#7064) if ($DB->db_provider == 'sqlite') { $DB->startTransaction(); } // write test $insert_id = md5(uniqid()); $db_write = $DB->query("INSERT INTO " . $DB->quote_identifier($RCI->config['db_prefix'] . 'session') . " (`sess_id`, `changed`, `ip`, `vars`) VALUES (?, ".$DB->now().", '127.0.0.1', 'foo')", $insert_id); if ($db_write) { $RCI->pass('DB Write'); $DB->query("DELETE FROM " . $DB->quote_identifier($RCI->config['db_prefix'] . 'session') . " WHERE `sess_id` = ?", $insert_id); } else { $RCI->fail('DB Write', $RCI->get_error()); } echo '
'; // Transaction end if ($DB->db_provider == 'sqlite') { $DB->rollbackTransaction(); } // 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 filetype detection

check_mime_detection()) { $RCI->fail('Fileinfo/mime_content_type configuration'); if (!empty($RCI->config['mime_magic'])) { echo '

Try setting the mime_magic config option to null.

'; } else { echo '

Check the Fileinfo functions of your PHP installation.
'; echo 'The path to the magic.mime file can be set using the mime_magic config option in Roundcube.

'; } } else { $RCI->pass('Fileinfo/mime_content_type configuration'); echo "
"; } if ($errors = $RCI->check_mime_extensions()) { $RCI->fail('Mimetype to file extension mapping'); echo '

Please set a valid path to your webserver\'s mime.types file to the mime_types config option.
'; echo 'If you can\'t find such a file, download it from svn.apache.org.

'; } else { $RCI->pass('Mimetype to file extension mapping'); echo "
"; } $user = $RCI->getprop('smtp_user', '(none)'); $pass = $RCI->getprop('smtp_pass', '(none)'); if ($user == '%u') { $user_field = new html_inputfield(array('name' => '_smtp_user', 'id' => 'smtp_user')); $user = $user_field->show($_POST['_smtp_user']); } if ($pass == '%p') { $pass_field = new html_passwordfield(array('name' => '_smtp_pass', 'id' => 'smtp_pass')); $pass = $pass_field->show(); } ?>

Test SMTP config

getprop('smtp_server', 'localhost')); ?>
getprop('smtp_port'); ?>

'_from', 'id' => 'sendmailfrom')); $to_field = new html_inputfield(array('name' => '_to', 'id' => 'sendmailto')); if (isset($_POST['sendmail'])) { echo '

Trying to send email...
'; $from = rcube_utils::idn_to_ascii(trim($_POST['_from'])); $to = rcube_utils::idn_to_ascii(trim($_POST['_to'])); if (preg_match('/^' . $RCI->email_pattern . '$/i', $from) && preg_match('/^' . $RCI->email_pattern . '$/i', $to) ) { $headers = array( 'From' => $from, 'To' => $to, 'Subject' => 'Test message from Roundcube', ); $body = 'This is a test to confirm that Roundcube can send email.'; // send mail using configured 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 Mail_mime(); $send_headers = $mail_object->headers($headers); $head = $mail_object->txtHeaders($send_headers); $SMTP = new rcube_smtp(); $SMTP->connect(rcube_utils::parse_host($RCI->getprop('smtp_server')), $RCI->getprop('smtp_port'), $CONFIG['smtp_user'], $CONFIG['smtp_pass']); $status = $SMTP->send_mail($headers['From'], $headers['To'], $head, $body); $smtp_response = $SMTP->get_response(); 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 config

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 ' . rcube::Q($_POST['_host']) . '...
'; $imap_host = trim($_POST['_host']); $imap_port = $RCI->getprop('default_port'); $a_host = parse_url($imap_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; if (isset($a_host['port'])) $imap_port = $a_host['port']; else if ($imap_ssl && $imap_ssl != 'tls' && (!$imap_port || $imap_port == 143)) $imap_port = 993; } $imap_host = rcube_utils::idn_to_ascii($imap_host); $imap_user = rcube_utils::idn_to_ascii($_POST['_user']); $imap = new rcube_imap(null); $imap->set_options(array( 'auth_type' => $RCI->getprop('imap_auth_type'), 'debug' => $RCI->getprop('imap_debug'), 'socket_options' => $RCI->getprop('imap_conn_options'), )); if ($imap->connect($imap_host, $imap_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 or make sure that enable_installer option in config.inc.php is disabled.

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.