|
+-----------------------------------------------------------------------+
*/
if (!class_exists('rcmail_install', false) || !isset($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 (!empty($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 '';
foreach ($messages['replaced'] as $msg) {
echo html::tag('li', null, html::span('propname', $msg['prop']) .
' was replaced by ' . html::span('propname', $msg['replacement']));
}
echo '
';
}
if (!empty($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 '';
foreach ($messages['obsolete'] as $msg) {
echo html::tag('li', null, html::span('propname', $msg['prop'])
. (!empty($msg['explain']) ? ': ' . $msg['explain'] : ''));
}
echo '
';
}
echo 'OK, lazy people can download the updated config file here: ';
echo html::a(['href' => './?_mergeconfig=1'], 'config.inc.php') . ' ';
echo "
";
if (!empty($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 '';
foreach ($messages['dependencies'] as $msg) {
echo html::tag('li', null, html::span('propname', $msg['prop']) . ': ' . $msg['explain']);
}
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 (empty($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: ' . rcube::Q($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 && !empty($_POST['initdb'])) {
if (!$RCI->init_db($DB)) {
$db_working = false;
echo 'Please try to initialize the database manually as described in the INSTALL guide.
Make sure that the configured database exists and that the user as write privileges
';
}
}
else if ($db_working && !empty($_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(['name' => 'version']);
$select->add('0.9 or newer', '');
echo '';
$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 {$tz_diff}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 "
";
}
$smtp_hosts = $RCI->get_hostlist('smtp_host');
if (!empty($smtp_hosts)) {
$smtp_host_field = new html_select(['name' => '_smtp_host', 'id' => 'smtp_host']);
$smtp_host_field->add($smtp_hosts, $smtp_hosts);
}
else {
$smtp_host_field = new html_inputfield(['name' => '_smtp_host', 'id' => 'smtp_host']);
}
$user = $RCI->getprop('smtp_user', '(none)');
$pass = $RCI->getprop('smtp_pass', '(none)');
if ($user == '%u') {
$user_field = new html_inputfield(['name' => '_smtp_user', 'id' => 'smtp_user']);
$user = $user_field->show(isset($_POST['_smtp_user']) ? $_POST['_smtp_user'] : '');
}
else {
$user = html::quote($user);
}
if ($pass == '%p') {
$pass_field = new html_passwordfield(['name' => '_smtp_pass', 'id' => 'smtp_pass']);
$pass = $pass_field->show();
}
else {
$pass = html::quote($pass);
}
?>
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.