Show spam aliases #
This commit is contained in:
263
data/web/rc/installer/check.php
Normal file
263
data/web/rc/installer/check.php
Normal file
@@ -0,0 +1,263 @@
|
||||
<?php
|
||||
|
||||
if (!class_exists('rcmail_install', false) || !is_object($RCI)) {
|
||||
die("Not allowed! Please open installer/index.php instead.");
|
||||
}
|
||||
|
||||
?>
|
||||
<form action="index.php" method="get">
|
||||
<?php
|
||||
|
||||
$required_php_exts = array(
|
||||
'PCRE' => 'pcre',
|
||||
'DOM' => 'dom',
|
||||
'Session' => 'session',
|
||||
'XML' => 'xml',
|
||||
'JSON' => 'json',
|
||||
'PDO' => 'PDO',
|
||||
'Multibyte' => 'mbstring',
|
||||
'OpenSSL' => 'openssl',
|
||||
);
|
||||
|
||||
$optional_php_exts = array(
|
||||
'FileInfo' => 'fileinfo',
|
||||
'Libiconv' => 'iconv',
|
||||
'Intl' => 'intl',
|
||||
'Exif' => 'exif',
|
||||
'LDAP' => 'ldap',
|
||||
);
|
||||
|
||||
$required_libs = array(
|
||||
'PEAR' => 'pear.php.net',
|
||||
'Auth_SASL' => 'pear.php.net',
|
||||
'Net_SMTP' => 'pear.php.net',
|
||||
'Net_IDNA2' => 'pear.php.net',
|
||||
'Mail_mime' => 'pear.php.net',
|
||||
);
|
||||
|
||||
$optional_libs = array(
|
||||
'Net_LDAP3' => 'git.kolab.org',
|
||||
);
|
||||
|
||||
$ini_checks = array(
|
||||
'file_uploads' => 1,
|
||||
'session.auto_start' => 0,
|
||||
'mbstring.func_overload' => 0,
|
||||
'suhosin.session.encrypt' => 0,
|
||||
);
|
||||
|
||||
$optional_checks = array(
|
||||
// required for utils/modcss.inc, should we require this?
|
||||
'allow_url_fopen' => 1,
|
||||
'date.timezone' => '-VALID-',
|
||||
);
|
||||
|
||||
$source_urls = array(
|
||||
'Sockets' => 'http://www.php.net/manual/en/book.sockets.php',
|
||||
'Session' => 'http://www.php.net/manual/en/book.session.php',
|
||||
'PCRE' => 'http://www.php.net/manual/en/book.pcre.php',
|
||||
'FileInfo' => 'http://www.php.net/manual/en/book.fileinfo.php',
|
||||
'Libiconv' => 'http://www.php.net/manual/en/book.iconv.php',
|
||||
'Multibyte' => 'http://www.php.net/manual/en/book.mbstring.php',
|
||||
'OpenSSL' => 'http://www.php.net/manual/en/book.openssl.php',
|
||||
'JSON' => 'http://www.php.net/manual/en/book.json.php',
|
||||
'DOM' => 'http://www.php.net/manual/en/book.dom.php',
|
||||
'Intl' => 'http://www.php.net/manual/en/book.intl.php',
|
||||
'Exif' => 'http://www.php.net/manual/en/book.exif.php',
|
||||
'oci8' => 'http://www.php.net/manual/en/book.oci8.php',
|
||||
'PDO' => 'http://www.php.net/manual/en/book.pdo.php',
|
||||
'LDAP' => 'http://www.php.net/manual/en/book.ldap.php',
|
||||
'pdo_mysql' => 'http://www.php.net/manual/en/ref.pdo-mysql.php',
|
||||
'pdo_pgsql' => 'http://www.php.net/manual/en/ref.pdo-pgsql.php',
|
||||
'pdo_sqlite' => 'http://www.php.net/manual/en/ref.pdo-sqlite.php',
|
||||
'pdo_sqlite2' => 'http://www.php.net/manual/en/ref.pdo-sqlite.php',
|
||||
'pdo_sqlsrv' => 'http://www.php.net/manual/en/ref.pdo-sqlsrv.php',
|
||||
'pdo_dblib' => 'http://www.php.net/manual/en/ref.pdo-dblib.php',
|
||||
'PEAR' => 'http://pear.php.net',
|
||||
'Net_SMTP' => 'http://pear.php.net/package/Net_SMTP',
|
||||
'Mail_mime' => 'http://pear.php.net/package/Mail_mime',
|
||||
'Net_IDNA2' => 'http://pear.php.net/package/Net_IDNA2',
|
||||
'Net_LDAP3' => 'https://git.kolab.org/diffusion/PNL',
|
||||
);
|
||||
|
||||
echo '<input type="hidden" name="_step" value="' . ($RCI->configured ? 3 : 2) . '" />';
|
||||
?>
|
||||
|
||||
<h3>Checking PHP version</h3>
|
||||
<?php
|
||||
|
||||
define('MIN_PHP_VERSION', '5.4.0');
|
||||
if (version_compare(PHP_VERSION, MIN_PHP_VERSION, '>=')) {
|
||||
$RCI->pass('Version', 'PHP ' . PHP_VERSION . ' detected');
|
||||
} else {
|
||||
$RCI->fail('Version', 'PHP Version ' . MIN_PHP_VERSION . ' or greater is required ' . PHP_VERSION . ' detected');
|
||||
}
|
||||
?>
|
||||
|
||||
<h3>Checking PHP extensions</h3>
|
||||
<p class="hint">The following modules/extensions are <em>required</em> to run Roundcube:</p>
|
||||
<?php
|
||||
|
||||
// get extensions location
|
||||
$ext_dir = ini_get('extension_dir');
|
||||
|
||||
$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
|
||||
foreach ($required_php_exts as $name => $ext) {
|
||||
if (extension_loaded($ext)) {
|
||||
$RCI->pass($name);
|
||||
} else {
|
||||
$_ext = $ext_dir . '/' . $prefix . $ext . '.' . PHP_SHLIB_SUFFIX;
|
||||
$msg = @is_readable($_ext) ? 'Could be loaded. Please add in php.ini' : '';
|
||||
$RCI->fail($name, $msg, $source_urls[$name]);
|
||||
}
|
||||
echo '<br />';
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<p class="hint">The next couple of extensions are <em>optional</em> and recommended to get the best performance:</p>
|
||||
<?php
|
||||
|
||||
foreach ($optional_php_exts as $name => $ext) {
|
||||
if (extension_loaded($ext)) {
|
||||
$RCI->pass($name);
|
||||
}
|
||||
else {
|
||||
$_ext = $ext_dir . '/' . $prefix . $ext . '.' . PHP_SHLIB_SUFFIX;
|
||||
$msg = @is_readable($_ext) ? 'Could be loaded. Please add in php.ini' : '';
|
||||
$RCI->na($name, $msg, $source_urls[$name]);
|
||||
}
|
||||
echo '<br />';
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
|
||||
<h3>Checking available databases</h3>
|
||||
<p class="hint">Check which of the supported extensions are installed. At least one of them is required.</p>
|
||||
|
||||
<?php
|
||||
|
||||
$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
|
||||
foreach ($RCI->supported_dbs as $database => $ext) {
|
||||
if (extension_loaded($ext)) {
|
||||
$RCI->pass($database);
|
||||
$found_db_driver = true;
|
||||
}
|
||||
else {
|
||||
$_ext = $ext_dir . '/' . $prefix . $ext . '.' . PHP_SHLIB_SUFFIX;
|
||||
$msg = @is_readable($_ext) ? 'Could be loaded. Please add in php.ini' : '';
|
||||
$RCI->na($database, $msg, $source_urls[$ext]);
|
||||
}
|
||||
echo '<br />';
|
||||
}
|
||||
if (empty($found_db_driver)) {
|
||||
$RCI->failures++;
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
|
||||
<h3>Check for required 3rd party libs</h3>
|
||||
<p class="hint">This also checks if the include path is set correctly.</p>
|
||||
|
||||
<?php
|
||||
|
||||
foreach ($required_libs as $classname => $vendor) {
|
||||
if (class_exists($classname)) {
|
||||
$RCI->pass($classname);
|
||||
}
|
||||
else {
|
||||
$RCI->fail($classname, "Failed to load class $classname from $vendor", $source_urls[$classname]);
|
||||
}
|
||||
echo "<br />";
|
||||
}
|
||||
|
||||
foreach ($optional_libs as $classname => $vendor) {
|
||||
if (class_exists($classname)) {
|
||||
$RCI->pass($classname);
|
||||
}
|
||||
else {
|
||||
$RCI->na($classname, "Recommended to install $classname from $vendor", $source_urls[$classname]);
|
||||
}
|
||||
echo "<br />";
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<h3>Checking php.ini/.htaccess settings</h3>
|
||||
<p class="hint">The following settings are <em>required</em> to run Roundcube:</p>
|
||||
|
||||
<?php
|
||||
|
||||
foreach ($ini_checks as $var => $val) {
|
||||
$status = ini_get($var);
|
||||
if ($val === '-NOTEMPTY-') {
|
||||
if (empty($status)) {
|
||||
$RCI->fail($var, "empty value detected");
|
||||
}
|
||||
else {
|
||||
$RCI->pass($var);
|
||||
}
|
||||
}
|
||||
else if (filter_var($status, FILTER_VALIDATE_BOOLEAN) == $val) {
|
||||
$RCI->pass($var);
|
||||
}
|
||||
else {
|
||||
$RCI->fail($var, "is '$status', should be '$val'");
|
||||
}
|
||||
echo '<br />';
|
||||
}
|
||||
?>
|
||||
|
||||
<p class="hint">The following settings are <em>optional</em> and recommended:</p>
|
||||
|
||||
<?php
|
||||
|
||||
foreach ($optional_checks as $var => $val) {
|
||||
$status = ini_get($var);
|
||||
if ($val === '-NOTEMPTY-') {
|
||||
if (empty($status)) {
|
||||
$RCI->optfail($var, "Could be set");
|
||||
} else {
|
||||
$RCI->pass($var);
|
||||
}
|
||||
echo '<br />';
|
||||
continue;
|
||||
}
|
||||
if ($val === '-VALID-') {
|
||||
if ($var == 'date.timezone') {
|
||||
try {
|
||||
$tz = new DateTimeZone($status);
|
||||
$RCI->pass($var);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
$RCI->optfail($var, empty($status) ? "not set" : "invalid value detected: $status");
|
||||
}
|
||||
}
|
||||
else {
|
||||
$RCI->pass($var);
|
||||
}
|
||||
}
|
||||
else if (filter_var($status, FILTER_VALIDATE_BOOLEAN) == $val) {
|
||||
$RCI->pass($var);
|
||||
}
|
||||
else {
|
||||
$RCI->optfail($var, "is '$status', could be '$val'");
|
||||
}
|
||||
echo '<br />';
|
||||
}
|
||||
?>
|
||||
|
||||
<?php
|
||||
|
||||
if ($RCI->failures) {
|
||||
echo '<p class="warning">Sorry but your webserver does not meet the requirements for Roundcube!<br />
|
||||
Please install the missing modules or fix the php.ini settings according to the above check results.<br />
|
||||
Hint: only checks showing <span class="fail">NOT OK</span> need to be fixed.</p>';
|
||||
}
|
||||
echo '<p><br /><input type="submit" value="NEXT" ' . ($RCI->failures ? 'disabled' : '') . ' /></p>';
|
||||
|
||||
?>
|
||||
|
||||
</form>
|
51
data/web/rc/installer/client.js
Normal file
51
data/web/rc/installer/client.js
Normal file
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| Roundcube installer cleint function |
|
||||
| |
|
||||
| This file is part of the Roundcube web development suite |
|
||||
| Copyright (C) 2009-2012, The Roundcube Dev Team |
|
||||
| |
|
||||
| Licensed under the GNU General Public License version 3 or |
|
||||
| any later version with exceptions for skins & plugins. |
|
||||
| See the README file for a full license statement. |
|
||||
| |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
function toggleblock(id, link)
|
||||
{
|
||||
var block = document.getElementById(id);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
function addhostfield()
|
||||
{
|
||||
var container = document.getElementById('defaulthostlist');
|
||||
var row = document.createElement('div');
|
||||
var input = document.createElement('input');
|
||||
var link = document.createElement('a');
|
||||
|
||||
input.name = '_default_host[]';
|
||||
input.size = '30';
|
||||
link.href = '#';
|
||||
link.onclick = function() { removehostfield(this.parentNode); return false };
|
||||
link.className = 'removelink';
|
||||
link.innerHTML = 'remove';
|
||||
|
||||
row.appendChild(input);
|
||||
row.appendChild(link);
|
||||
container.appendChild(row);
|
||||
}
|
||||
|
||||
|
||||
function removehostfield(row)
|
||||
{
|
||||
var container = document.getElementById('defaulthostlist');
|
||||
container.removeChild(row);
|
||||
}
|
||||
|
||||
|
696
data/web/rc/installer/config.php
Normal file
696
data/web/rc/installer/config.php
Normal file
@@ -0,0 +1,696 @@
|
||||
<?php
|
||||
|
||||
if (!class_exists('rcmail_install', false) || !is_object($RCI)) {
|
||||
die("Not allowed! Please open installer/index.php instead.");
|
||||
}
|
||||
|
||||
// register these boolean fields
|
||||
$RCI->bool_config_props = array(
|
||||
'ip_check' => 1,
|
||||
'enable_spellcheck' => 1,
|
||||
'auto_create_user' => 1,
|
||||
'smtp_log' => 1,
|
||||
'prefer_html' => 1,
|
||||
'debug_level' => 1,
|
||||
);
|
||||
|
||||
// allow the current user to get to the next step
|
||||
$_SESSION['allowinstaller'] = true;
|
||||
|
||||
if (!empty($_POST['submit'])) {
|
||||
$_SESSION['config'] = $RCI->create_config();
|
||||
|
||||
if ($RCI->save_configfile($_SESSION['config'])) {
|
||||
echo '<p class="notice">The config file was saved successfully into <tt>'.RCMAIL_CONFIG_DIR.'</tt> directory of your Roundcube installation.';
|
||||
|
||||
if ($RCI->legacy_config) {
|
||||
echo '<br/><br/>Afterwards, please <b>remove</b> the old configuration files <tt>main.inc.php</tt> and <tt>db.inc.php</tt> from the config directory.';
|
||||
}
|
||||
|
||||
echo '</p>';
|
||||
}
|
||||
else {
|
||||
if (($dir = sys_get_temp_dir()) && @is_writable($dir)) {
|
||||
echo '<iframe name="getconfig" style="display:none"></iframe>';
|
||||
echo '<form id="getconfig_form" action="index.php" method="get" target="getconfig" style="display:none">';
|
||||
echo '<input name="_getconfig" value="2" /></form>';
|
||||
|
||||
$button_txt = html::quote('Save in ' . $dir);
|
||||
$save_button = ' <input type="button" onclick="document.getElementById(\'getconfig_form\').submit()" value="' . $button_txt . '" />';
|
||||
}
|
||||
|
||||
echo '<p class="notice">Copy or download the following configuration and save it';
|
||||
echo ' as <tt><b>config.inc.php</b></tt> within the <tt>'.RCUBE_CONFIG_DIR.'</tt> directory of your Roundcube installation.<br/>';
|
||||
echo ' Make sure that there are no characters outside the <tt><?php ?></tt> brackets when saving the file.';
|
||||
echo ' <input type="button" onclick="location.href=\'index.php?_getconfig=1\'" value="Download" />';
|
||||
echo $save_button;
|
||||
|
||||
if ($RCI->legacy_config) {
|
||||
echo '<br/><br/>Afterwards, please <b>remove</b> the old configuration files <tt>main.inc.php</tt> and <tt>db.inc.php</tt> from the config directory.';
|
||||
}
|
||||
|
||||
echo '</p>';
|
||||
|
||||
$textbox = new html_textarea(array('rows' => 16, 'cols' => 60, 'class' => "configfile"));
|
||||
echo $textbox->show(($_SESSION['config']));
|
||||
}
|
||||
|
||||
echo '<p class="hint">Of course there are more options to configure.
|
||||
Have a look at the defaults.inc.php file or visit <a href="https://github.com/roundcube/roundcubemail/wiki/Configuration" target="_blank">Howto_Config</a> to find out.</p>';
|
||||
|
||||
echo '<p><input type="button" onclick="location.href=\'./index.php?_step=3\'" value="CONTINUE" /></p>';
|
||||
|
||||
// echo '<style type="text/css"> .configblock { display:none } </style>';
|
||||
echo "\n<hr style='margin-bottom:1.6em' />\n";
|
||||
}
|
||||
|
||||
?>
|
||||
<form action="index.php" method="post">
|
||||
<input type="hidden" name="_step" value="2" />
|
||||
|
||||
<fieldset>
|
||||
<legend>General configuration</legend>
|
||||
<dl class="configblock">
|
||||
|
||||
<dt class="propname">product_name</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$input_prodname = new html_inputfield(array('name' => '_product_name', 'size' => 30, 'id' => "cfgprodname"));
|
||||
echo $input_prodname->show($RCI->getprop('product_name'));
|
||||
|
||||
?>
|
||||
<div>The name of your service (used to compose page titles)</div>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">support_url</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$input_support = new html_inputfield(array('name' => '_support_url', 'size' => 50, 'id' => "cfgsupporturl"));
|
||||
echo $input_support->show($RCI->getprop('support_url'));
|
||||
|
||||
?>
|
||||
<div>Provide an URL where a user can get support for this Roundcube installation.<br/>PLEASE DO NOT LINK TO THE ROUNDCUBE.NET WEBSITE HERE!</div>
|
||||
<p class="hint">Enter an absolute URL (including http://) to a support page/form or a mailto: link.</p>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">skin_logo</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$input_skin = new html_inputfield(array('name' => '_skin_logo', 'size' => 50, 'id' => "cfgskinlogo"));
|
||||
echo $input_skin->show($RCI->getprop('skin_logo'));
|
||||
|
||||
?>
|
||||
<div>Custom image to display instead of the Roundcube logo.</div>
|
||||
<p class="hint">Enter a URL relative to the document root of this Roundcube installation.</p>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">temp_dir</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$input_tempdir = new html_inputfield(array('name' => '_temp_dir', 'size' => 30, 'id' => "cfgtempdir"));
|
||||
echo $input_tempdir->show($RCI->getprop('temp_dir'));
|
||||
|
||||
?>
|
||||
<div>Use this folder to store temp files (must be writeable for webserver)</div>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">des_key</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$input_deskey = new html_inputfield(array('name' => '_des_key', 'size' => 30, 'id' => "cfgdeskey"));
|
||||
echo $input_deskey->show($RCI->getprop('des_key'));
|
||||
|
||||
?>
|
||||
<div>This key is used to encrypt the users imap password before storing in the session record</div>
|
||||
<p class="hint">It's a random generated string to ensure that every installation has its own key.</p>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">ip_check</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$check_ipcheck = new html_checkbox(array('name' => '_ip_check', 'id' => "cfgipcheck"));
|
||||
echo $check_ipcheck->show(intval($RCI->getprop('ip_check')), array('value' => 1));
|
||||
|
||||
?>
|
||||
<label for="cfgipcheck">Check client IP in session authorization</label><br />
|
||||
|
||||
<p class="hint">This increases security but can cause sudden logouts when someone uses a proxy with changing IPs.</p>
|
||||
</dd>
|
||||
|
||||
|
||||
<dt class="propname">enable_spellcheck</dt>
|
||||
<dd>
|
||||
<?php
|
||||
$check_spell = new html_checkbox(array('name' => '_enable_spellcheck', 'id' => "cfgspellcheck"));
|
||||
echo $check_spell->show(intval($RCI->getprop('enable_spellcheck')), array('value' => 1));
|
||||
?>
|
||||
<label for="cfgspellcheck">Make use of the spell checker</label><br />
|
||||
</dd>
|
||||
|
||||
<dt class="propname">spellcheck_engine</dt>
|
||||
<dd>
|
||||
<?php
|
||||
$select_spell = new html_select(array('name' => '_spellcheck_engine', 'id' => "cfgspellcheckengine"));
|
||||
if (extension_loaded('pspell'))
|
||||
$select_spell->add('Pspell', 'pspell');
|
||||
if (extension_loaded('enchant'))
|
||||
$select_spell->add('Enchant', 'enchant');
|
||||
$select_spell->add('Googie', 'googie');
|
||||
$select_spell->add('ATD', 'atd');
|
||||
|
||||
echo $select_spell->show($RCI->is_post ? $_POST['_spellcheck_engine'] : 'pspell');
|
||||
|
||||
?>
|
||||
<label for="cfgspellcheckengine">Which spell checker to use</label><br />
|
||||
|
||||
<p class="hint">Googie implies that the message content will be sent to external server to check the spelling.</p>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">identities_level</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$input_ilevel = new html_select(array('name' => '_identities_level', 'id' => "cfgidentitieslevel"));
|
||||
$input_ilevel->add('many identities with possibility to edit all params', 0);
|
||||
$input_ilevel->add('many identities with possibility to edit all params but not email address', 1);
|
||||
$input_ilevel->add('one identity with possibility to edit all params', 2);
|
||||
$input_ilevel->add('one identity with possibility to edit all params but not email address', 3);
|
||||
$input_ilevel->add('one identity with possibility to edit only signature', 4);
|
||||
echo $input_ilevel->show($RCI->getprop('identities_level'), 0);
|
||||
|
||||
?>
|
||||
<div>Level of identities access</div>
|
||||
<p class="hint">Defines what users can do with their identities.</p>
|
||||
</dd>
|
||||
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>Logging & Debugging</legend>
|
||||
<dl class="loggingblock">
|
||||
|
||||
<dt class="propname">debug_level</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$value = $RCI->getprop('debug_level');
|
||||
$check_debug = new html_checkbox(array('name' => '_debug_level[]'));
|
||||
echo $check_debug->show(($value & 1) ? 1 : 0 , array('value' => 1, 'id' => 'cfgdebug1'));
|
||||
echo '<label for="cfgdebug1">Log errors</label><br />';
|
||||
|
||||
echo $check_debug->show(($value & 4) ? 4 : 0, array('value' => 4, 'id' => 'cfgdebug4'));
|
||||
echo '<label for="cfgdebug4">Print errors (to the browser)</label><br />';
|
||||
|
||||
?>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">log_driver</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$select_log_driver = new html_select(array('name' => '_log_driver', 'id' => "cfglogdriver"));
|
||||
$select_log_driver->add(array('file', 'syslog'), array('file', 'syslog'));
|
||||
echo $select_log_driver->show($RCI->getprop('log_driver', 'file'));
|
||||
|
||||
?>
|
||||
<div>How to do logging? 'file' - write to files in the log directory, 'syslog' - use the syslog facility.</div>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">log_dir</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$input_logdir = new html_inputfield(array('name' => '_log_dir', 'size' => 30, 'id' => "cfglogdir"));
|
||||
echo $input_logdir->show($RCI->getprop('log_dir'));
|
||||
|
||||
?>
|
||||
<div>Use this folder to store log files (must be writeable for webserver). Note that this only applies if you are using the 'file' log_driver.</div>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">syslog_id</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$input_syslogid = new html_inputfield(array('name' => '_syslog_id', 'size' => 30, 'id' => "cfgsyslogid"));
|
||||
echo $input_syslogid->show($RCI->getprop('syslog_id', 'roundcube'));
|
||||
|
||||
?>
|
||||
<div>What ID to use when logging with syslog. Note that this only applies if you are using the 'syslog' log_driver.</div>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">syslog_facility</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$input_syslogfacility = new html_select(array('name' => '_syslog_facility', 'id' => "cfgsyslogfacility"));
|
||||
$input_syslogfacility->add('user-level messages', LOG_USER);
|
||||
$input_syslogfacility->add('mail subsystem', LOG_MAIL);
|
||||
$input_syslogfacility->add('local level 0', LOG_LOCAL0);
|
||||
$input_syslogfacility->add('local level 1', LOG_LOCAL1);
|
||||
$input_syslogfacility->add('local level 2', LOG_LOCAL2);
|
||||
$input_syslogfacility->add('local level 3', LOG_LOCAL3);
|
||||
$input_syslogfacility->add('local level 4', LOG_LOCAL4);
|
||||
$input_syslogfacility->add('local level 5', LOG_LOCAL5);
|
||||
$input_syslogfacility->add('local level 6', LOG_LOCAL6);
|
||||
$input_syslogfacility->add('local level 7', LOG_LOCAL7);
|
||||
echo $input_syslogfacility->show($RCI->getprop('syslog_facility'), LOG_USER);
|
||||
|
||||
?>
|
||||
<div>What ID to use when logging with syslog. Note that this only applies if you are using the 'syslog' log_driver.</div>
|
||||
</dd>
|
||||
|
||||
|
||||
|
||||
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
||||
|
||||
<fieldset>
|
||||
<legend>Database setup</legend>
|
||||
<dl class="configblock" id="cgfblockdb">
|
||||
<dt class="propname">db_dsnw</dt>
|
||||
<dd>
|
||||
<p>Database settings for read/write operations:</p>
|
||||
<?php
|
||||
|
||||
$select_dbtype = new html_select(array('name' => '_dbtype', 'id' => "cfgdbtype"));
|
||||
foreach ($RCI->supported_dbs as $database => $ext) {
|
||||
if (extension_loaded($ext)) {
|
||||
$select_dbtype->add($database, substr($ext, 4));
|
||||
}
|
||||
}
|
||||
|
||||
$input_dbhost = new html_inputfield(array('name' => '_dbhost', 'size' => 20, 'id' => "cfgdbhost"));
|
||||
$input_dbname = new html_inputfield(array('name' => '_dbname', 'size' => 20, 'id' => "cfgdbname"));
|
||||
$input_dbuser = new html_inputfield(array('name' => '_dbuser', 'size' => 20, 'id' => "cfgdbuser"));
|
||||
$input_dbpass = new html_inputfield(array('name' => '_dbpass', 'size' => 20, 'id' => "cfgdbpass"));
|
||||
|
||||
$dsnw = rcube_db::parse_dsn($RCI->getprop('db_dsnw'));
|
||||
|
||||
echo $select_dbtype->show($RCI->is_post ? $_POST['_dbtype'] : $dsnw['phptype']);
|
||||
echo '<label for="cfgdbtype">Database type</label><br />';
|
||||
echo $input_dbhost->show($RCI->is_post ? $_POST['_dbhost'] : $dsnw['hostspec']);
|
||||
echo '<label for="cfgdbhost">Database server (omit for sqlite)</label><br />';
|
||||
echo $input_dbname->show($RCI->is_post ? $_POST['_dbname'] : $dsnw['database']);
|
||||
echo '<label for="cfgdbname">Database name (use absolute path and filename for sqlite)</label><br />';
|
||||
echo $input_dbuser->show($RCI->is_post ? $_POST['_dbuser'] : $dsnw['username']);
|
||||
echo '<label for="cfgdbuser">Database user name (needs write permissions)(omit for sqlite)</label><br />';
|
||||
echo $input_dbpass->show($RCI->is_post ? $_POST['_dbpass'] : $dsnw['password']);
|
||||
echo '<label for="cfgdbpass">Database password (omit for sqlite)</label><br />';
|
||||
|
||||
?>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">db_prefix</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$input_prefix = new html_inputfield(array('name' => '_db_prefix', 'size' => 20, 'id' => "cfgdbprefix"));
|
||||
echo $input_prefix->show($RCI->getprop('db_prefix'));
|
||||
|
||||
?>
|
||||
<div>Optional prefix that will be added to database object names (tables and sequences).</div>
|
||||
</dd>
|
||||
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
||||
|
||||
<fieldset>
|
||||
<legend>IMAP Settings</legend>
|
||||
<dl class="configblock" id="cgfblockimap">
|
||||
<dt class="propname">default_host</dt>
|
||||
<dd>
|
||||
<div>The IMAP host(s) chosen to perform the log-in</div>
|
||||
<div id="defaulthostlist">
|
||||
<?php
|
||||
|
||||
$text_imaphost = new html_inputfield(array('name' => '_default_host[]', 'size' => 30));
|
||||
$default_hosts = $RCI->get_hostlist();
|
||||
|
||||
if (empty($default_hosts))
|
||||
$default_hosts = array('');
|
||||
|
||||
$i = 0;
|
||||
foreach ($default_hosts as $host) {
|
||||
echo '<div id="defaulthostentry'.$i.'">' . $text_imaphost->show($host);
|
||||
if ($i++ > 0)
|
||||
echo '<a href="#" onclick="removehostfield(this.parentNode);return false" class="removelink" title="Remove this entry">remove</a>';
|
||||
echo '</div>';
|
||||
}
|
||||
|
||||
?>
|
||||
</div>
|
||||
<div><a href="javascript:addhostfield()" class="addlink" title="Add another field">add</a></div>
|
||||
|
||||
<p class="hint">Leave blank to show a textbox at login. To use SSL/IMAPS connection, type ssl://hostname</p>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">default_port</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$text_imapport = new html_inputfield(array('name' => '_default_port', 'size' => 6, 'id' => "cfgimapport"));
|
||||
echo $text_imapport->show($RCI->getprop('default_port'));
|
||||
|
||||
?>
|
||||
<div>TCP port used for IMAP connections</div>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">username_domain</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$text_userdomain = new html_inputfield(array('name' => '_username_domain', 'size' => 30, 'id' => "cfguserdomain"));
|
||||
echo $text_userdomain->show($RCI->getprop('username_domain'));
|
||||
|
||||
?>
|
||||
<div>Automatically add this domain to user names for login</div>
|
||||
|
||||
<p class="hint">Only for IMAP servers that require full e-mail addresses for login</p>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">auto_create_user</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$check_autocreate = new html_checkbox(array('name' => '_auto_create_user', 'id' => "cfgautocreate"));
|
||||
echo $check_autocreate->show(intval($RCI->getprop('auto_create_user')), array('value' => 1));
|
||||
|
||||
?>
|
||||
<label for="cfgautocreate">Automatically create a new Roundcube user when log-in the first time</label><br />
|
||||
|
||||
<p class="hint">A user is authenticated by the IMAP server but it requires a local record to store settings
|
||||
and contacts. With this option enabled a new user record will automatically be created once the IMAP login succeeds.</p>
|
||||
|
||||
<p class="hint">If this option is disabled, the login only succeeds if there's a matching user-record in the local Roundcube database
|
||||
what means that you have to create those records manually or disable this option after the first login.</p>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">sent_mbox</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$text_sentmbox = new html_inputfield(array('name' => '_sent_mbox', 'size' => 20, 'id' => "cfgsentmbox"));
|
||||
echo $text_sentmbox->show($RCI->getprop('sent_mbox'));
|
||||
|
||||
?>
|
||||
<div>Store sent messages in this folder</div>
|
||||
|
||||
<p class="hint">Leave blank if sent messages should not be stored. Note: folder must include namespace prefix if any.</p>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">trash_mbox</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$text_trashmbox = new html_inputfield(array('name' => '_trash_mbox', 'size' => 20, 'id' => "cfgtrashmbox"));
|
||||
echo $text_trashmbox->show($RCI->getprop('trash_mbox'));
|
||||
|
||||
?>
|
||||
<div>Move messages to this folder when deleting them</div>
|
||||
|
||||
<p class="hint">Leave blank if they should be deleted directly. Note: folder must include namespace prefix if any.</p>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">drafts_mbox</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$text_draftsmbox = new html_inputfield(array('name' => '_drafts_mbox', 'size' => 20, 'id' => "cfgdraftsmbox"));
|
||||
echo $text_draftsmbox->show($RCI->getprop('drafts_mbox'));
|
||||
|
||||
?>
|
||||
<div>Store draft messages in this folder</div>
|
||||
|
||||
<p class="hint">Leave blank if they should not be stored. Note: folder must include namespace prefix if any.</p>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">junk_mbox</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$text_junkmbox = new html_inputfield(array('name' => '_junk_mbox', 'size' => 20, 'id' => "cfgjunkmbox"));
|
||||
echo $text_junkmbox->show($RCI->getprop('junk_mbox'));
|
||||
|
||||
?>
|
||||
<div>Store spam messages in this folder</div>
|
||||
|
||||
<p class="hint">Note: folder must include namespace prefix if any.</p>
|
||||
</dd>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
||||
|
||||
<fieldset>
|
||||
<legend>SMTP Settings</legend>
|
||||
<dl class="configblock" id="cgfblocksmtp">
|
||||
<dt class="propname">smtp_server</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$text_smtphost = new html_inputfield(array('name' => '_smtp_server', 'size' => 30, 'id' => "cfgsmtphost"));
|
||||
echo $text_smtphost->show($RCI->getprop('smtp_server', 'localhost'));
|
||||
|
||||
?>
|
||||
<div>Use this host for sending mails</div>
|
||||
|
||||
<p class="hint">To use SSL connection, set ssl://smtp.host.com.</p>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">smtp_port</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$text_smtpport = new html_inputfield(array('name' => '_smtp_port', 'size' => 6, 'id' => "cfgsmtpport"));
|
||||
echo $text_smtpport->show($RCI->getprop('smtp_port'));
|
||||
|
||||
?>
|
||||
<div>SMTP port (default is 25; 465 for SSL; 587 for submission)</div>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">smtp_user/smtp_pass</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$text_smtpuser = new html_inputfield(array('name' => '_smtp_user', 'size' => 20, 'id' => "cfgsmtpuser"));
|
||||
$text_smtppass = new html_inputfield(array('name' => '_smtp_pass', 'size' => 20, 'id' => "cfgsmtppass"));
|
||||
echo $text_smtpuser->show($RCI->getprop('smtp_user'));
|
||||
echo $text_smtppass->show($RCI->getprop('smtp_pass'));
|
||||
|
||||
?>
|
||||
<div>SMTP username and password (if required)</div>
|
||||
<p>
|
||||
<?php
|
||||
|
||||
$check_smtpuser = new html_checkbox(array('name' => '_smtp_user_u', 'id' => "cfgsmtpuseru"));
|
||||
echo $check_smtpuser->show($RCI->getprop('smtp_user') == '%u' || $_POST['_smtp_user_u'] ? 1 : 0, array('value' => 1));
|
||||
|
||||
?>
|
||||
<label for="cfgsmtpuseru">Use the current IMAP username and password for SMTP authentication</label>
|
||||
</p>
|
||||
</dd>
|
||||
<!--
|
||||
<dt class="propname">smtp_auth_type</dt>
|
||||
<dd>
|
||||
<?php
|
||||
/*
|
||||
$select_smtpauth = new html_select(array('name' => '_smtp_auth_type', 'id' => "cfgsmtpauth"));
|
||||
$select_smtpauth->add(array('(auto)', 'PLAIN', 'DIGEST-MD5', 'CRAM-MD5', 'LOGIN'), array('0', 'PLAIN', 'DIGEST-MD5', 'CRAM-MD5', 'LOGIN'));
|
||||
echo $select_smtpauth->show(intval($RCI->getprop('smtp_auth_type')));
|
||||
*/
|
||||
?>
|
||||
<div>Method to authenticate at the SMTP server. Choose (auto) if you don't know what this is</div>
|
||||
</dd>
|
||||
-->
|
||||
<dt class="propname">smtp_log</dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$check_smtplog = new html_checkbox(array('name' => '_smtp_log', 'id' => "cfgsmtplog"));
|
||||
echo $check_smtplog->show(intval($RCI->getprop('smtp_log')), array('value' => 1));
|
||||
|
||||
?>
|
||||
<label for="cfgsmtplog">Log sent messages in <tt>{log_dir}/sendmail</tt> or to syslog.</label><br />
|
||||
</dd>
|
||||
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
||||
|
||||
<fieldset>
|
||||
<legend>Display settings & user prefs</legend>
|
||||
<dl class="configblock" id="cgfblockdisplay">
|
||||
|
||||
<dt class="propname">language <span class="userconf">*</span></dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$input_locale = new html_inputfield(array('name' => '_language', 'size' => 6, 'id' => "cfglocale"));
|
||||
echo $input_locale->show($RCI->getprop('language'));
|
||||
|
||||
?>
|
||||
<div>The default locale setting. This also defines the language of the login screen.<br/>Leave it empty to auto-detect the user agent language.</div>
|
||||
<p class="hint">Enter a <a href="http://www.faqs.org/rfcs/rfc1766">RFC1766</a> formatted language name. Examples: en_US, de_DE, de_CH, fr_FR, pt_BR</p>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">skin <span class="userconf">*</span></dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$input_skin = new html_select(array('name' => '_skin', 'id' => "cfgskin"));
|
||||
$input_skin->add($RCI->list_skins());
|
||||
echo $input_skin->show($RCI->getprop('skin'));
|
||||
|
||||
?>
|
||||
<div>Name of interface skin (folder in /skins)</div>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">mail_pagesize <span class="userconf">*</span></dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$pagesize = $RCI->getprop('mail_pagesize');
|
||||
if (!$pagesize) {
|
||||
$pagesize = $RCI->getprop('pagesize');
|
||||
}
|
||||
$input_pagesize = new html_inputfield(array('name' => '_mail_pagesize', 'size' => 6, 'id' => "cfgmailpagesize"));
|
||||
echo $input_pagesize->show($pagesize);
|
||||
|
||||
?>
|
||||
<div>Show up to X items in the mail messages list view.</div>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">addressbook_pagesize <span class="userconf">*</span></dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$pagesize = $RCI->getprop('addressbook_pagesize');
|
||||
if (!$pagesize) {
|
||||
$pagesize = $RCI->getprop('pagesize');
|
||||
}
|
||||
$input_pagesize = new html_inputfield(array('name' => '_addressbook_pagesize', 'size' => 6, 'id' => "cfgabookpagesize"));
|
||||
echo $input_pagesize->show($pagesize);
|
||||
|
||||
?>
|
||||
<div>Show up to X items in the contacts list view.</div>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">prefer_html <span class="userconf">*</span></dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$check_htmlview = new html_checkbox(array('name' => '_prefer_html', 'id' => "cfghtmlview", 'value' => 1));
|
||||
echo $check_htmlview->show(intval($RCI->getprop('prefer_html')));
|
||||
|
||||
?>
|
||||
<label for="cfghtmlview">Prefer displaying HTML messages</label><br />
|
||||
</dd>
|
||||
|
||||
<dt class="propname">htmleditor <span class="userconf">*</span></dt>
|
||||
<dd>
|
||||
<label for="cfghtmlcompose">Compose HTML formatted messages</label>
|
||||
<?php
|
||||
|
||||
$select_htmlcomp = new html_select(array('name' => '_htmleditor', 'id' => "cfghtmlcompose"));
|
||||
$select_htmlcomp->add('never', 0);
|
||||
$select_htmlcomp->add('always', 1);
|
||||
$select_htmlcomp->add('on reply to HTML message only', 2);
|
||||
echo $select_htmlcomp->show(intval($RCI->getprop('htmleditor')));
|
||||
|
||||
?>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">draft_autosave <span class="userconf">*</span></dt>
|
||||
<dd>
|
||||
<label for="cfgautosave">Save compose message every</label>
|
||||
<?php
|
||||
|
||||
$select_autosave = new html_select(array('name' => '_draft_autosave', 'id' => 'cfgautosave'));
|
||||
$select_autosave->add('never', 0);
|
||||
foreach (array(1, 3, 5, 10) as $i => $min)
|
||||
$select_autosave->add("$min min", $min*60);
|
||||
|
||||
echo $select_autosave->show(intval($RCI->getprop('draft_autosave')));
|
||||
|
||||
?>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">mdn_requests <span class="userconf">*</span></dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$mdn_opts = array(
|
||||
0 => 'ask the user',
|
||||
1 => 'send automatically',
|
||||
3 => 'send receipt to user contacts, otherwise ask the user',
|
||||
4 => 'send receipt to user contacts, otherwise ignore',
|
||||
2 => 'ignore',
|
||||
);
|
||||
|
||||
$select_mdnreq = new html_select(array('name' => '_mdn_requests', 'id' => "cfgmdnreq"));
|
||||
$select_mdnreq->add(array_values($mdn_opts), array_keys($mdn_opts));
|
||||
echo $select_mdnreq->show(intval($RCI->getprop('mdn_requests')));
|
||||
|
||||
?>
|
||||
<div>Behavior if a received message requests a message delivery notification (read receipt)</div>
|
||||
</dd>
|
||||
|
||||
<dt class="propname">mime_param_folding <span class="userconf">*</span></dt>
|
||||
<dd>
|
||||
<?php
|
||||
|
||||
$select_param_folding = new html_select(array('name' => '_mime_param_folding', 'id' => "cfgmimeparamfolding"));
|
||||
$select_param_folding->add('Full RFC 2231 (Roundcube, Thunderbird)', '0');
|
||||
$select_param_folding->add('RFC 2047/2231 (MS Outlook, OE)', '1');
|
||||
$select_param_folding->add('Full RFC 2047 (deprecated)', '2');
|
||||
|
||||
echo $select_param_folding->show(strval($RCI->getprop('mime_param_folding')));
|
||||
|
||||
?>
|
||||
<div>How to encode attachment long/non-ascii names</div>
|
||||
</dd>
|
||||
|
||||
</dl>
|
||||
|
||||
<p class="hint"><span class="userconf">*</span> These settings are defaults for the user preferences</p>
|
||||
</fieldset>
|
||||
|
||||
|
||||
<fieldset>
|
||||
<legend>Plugins</legend>
|
||||
<dl class="configblock" id="cgfblockdisplay">
|
||||
|
||||
<?php
|
||||
$plugins = $RCI->list_plugins();
|
||||
foreach($plugins as $p)
|
||||
{
|
||||
$p_check = new html_checkbox(array('name' => '_plugins_'.$p['name'], 'id' => 'cfgplugin_'.$p['name'], 'value' => $p['name']));
|
||||
echo '<dt class="propname"><label>';
|
||||
echo $p_check->show($p['enabled'] ? $p['name'] : 0);
|
||||
echo ' ' . $p['name'] . '</label></dt><dd>';
|
||||
echo '<label for="cfgplugin_'.$p['name'].'" class="hint">' . $p['desc'] . '</label><br/></dd>';
|
||||
}
|
||||
|
||||
?>
|
||||
</dl>
|
||||
|
||||
<p class="hint">Please consider checking dependencies of enabled plugins</p>
|
||||
</fieldset>
|
||||
|
||||
<?php
|
||||
|
||||
echo '<p><input type="submit" name="submit" value="' . ($RCI->configured ? 'UPDATE' : 'CREATE') . ' CONFIG" ' . ($RCI->failures ? 'disabled' : '') . ' /></p>';
|
||||
|
||||
?>
|
||||
</form>
|
BIN
data/web/rc/installer/images/add.png
Executable file
BIN
data/web/rc/installer/images/add.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 653 B |
BIN
data/web/rc/installer/images/banner_gradient.gif
Normal file
BIN
data/web/rc/installer/images/banner_gradient.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 506 B |
BIN
data/web/rc/installer/images/banner_schraffur.gif
Normal file
BIN
data/web/rc/installer/images/banner_schraffur.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
BIN
data/web/rc/installer/images/delete.png
Executable file
BIN
data/web/rc/installer/images/delete.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 637 B |
BIN
data/web/rc/installer/images/error.png
Executable file
BIN
data/web/rc/installer/images/error.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 565 B |
BIN
data/web/rc/installer/images/roundcube_logo.png
Normal file
BIN
data/web/rc/installer/images/roundcube_logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.3 KiB |
183
data/web/rc/installer/index.php
Normal file
183
data/web/rc/installer/index.php
Normal file
@@ -0,0 +1,183 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
+-------------------------------------------------------------------------+
|
||||
| Roundcube Webmail setup tool |
|
||||
| Version 1.3-git |
|
||||
| |
|
||||
| Copyright (C) 2009-2015, The Roundcube Dev Team |
|
||||
| |
|
||||
| This program is free software: you can redistribute it and/or modify |
|
||||
| it under the terms of the GNU General Public License (with exceptions |
|
||||
| for skins & plugins) as published by the Free Software Foundation, |
|
||||
| either version 3 of the License, or (at your option) any later version. |
|
||||
| |
|
||||
| This file forms part of the Roundcube Webmail Software for which the |
|
||||
| following exception is added: Plugins and Skins which merely make |
|
||||
| function calls to the Roundcube Webmail Software, and for that purpose |
|
||||
| include it by reference shall not be considered modifications of |
|
||||
| the software. |
|
||||
| |
|
||||
| If you wish to use this file in another project or create a modified |
|
||||
| version that will not be part of the Roundcube Webmail Software, you |
|
||||
| may remove the exception above and use this source code under the |
|
||||
| original version of the license. |
|
||||
| |
|
||||
| This program is distributed in the hope that it will be useful, |
|
||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
| GNU General Public License for more details. |
|
||||
| |
|
||||
| You should have received a copy of the GNU General Public License |
|
||||
| along with this program. If not, see http://www.gnu.org/licenses/. |
|
||||
| |
|
||||
+-------------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-------------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
ini_set('error_reporting', E_ALL &~ (E_NOTICE | E_STRICT));
|
||||
ini_set('display_errors', 1);
|
||||
|
||||
define('INSTALL_PATH', realpath(__DIR__ . '/../').'/');
|
||||
define('RCUBE_INSTALL_PATH', INSTALL_PATH);
|
||||
define('RCUBE_CONFIG_DIR', INSTALL_PATH . 'config/');
|
||||
|
||||
$include_path = INSTALL_PATH . 'program/lib' . PATH_SEPARATOR;
|
||||
$include_path .= INSTALL_PATH . 'program/include' . PATH_SEPARATOR;
|
||||
$include_path .= ini_get('include_path');
|
||||
|
||||
set_include_path($include_path);
|
||||
|
||||
// include composer autoloader (if available)
|
||||
if (@file_exists(INSTALL_PATH . 'vendor/autoload.php')) {
|
||||
require INSTALL_PATH . 'vendor/autoload.php';
|
||||
}
|
||||
|
||||
require_once 'Roundcube/bootstrap.php';
|
||||
|
||||
if (function_exists('session_start'))
|
||||
session_start();
|
||||
|
||||
$RCI = rcmail_install::get_instance();
|
||||
$RCI->load_config();
|
||||
|
||||
if (isset($_GET['_getconfig'])) {
|
||||
$filename = 'config.inc.php';
|
||||
if (!empty($_SESSION['config']) && $_GET['_getconfig'] == 2) {
|
||||
$path = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $filename;
|
||||
@unlink($path);
|
||||
file_put_contents($path, $_SESSION['config']);
|
||||
exit;
|
||||
}
|
||||
else if (!empty($_SESSION['config'])) {
|
||||
header('Content-type: text/plain');
|
||||
header('Content-Disposition: attachment; filename="'.$filename.'"');
|
||||
echo $_SESSION['config'];
|
||||
exit;
|
||||
}
|
||||
else {
|
||||
header('HTTP/1.0 404 Not found');
|
||||
die("The requested configuration was not found. Please run the installer from the beginning.");
|
||||
}
|
||||
}
|
||||
|
||||
if ($RCI->configured && ($RCI->getprop('enable_installer') || $_SESSION['allowinstaller']) &&
|
||||
!empty($_GET['_mergeconfig'])) {
|
||||
$filename = 'config.inc.php';
|
||||
|
||||
header('Content-type: text/plain');
|
||||
header('Content-Disposition: attachment; filename="'.$filename.'"');
|
||||
|
||||
$RCI->merge_config();
|
||||
echo $RCI->create_config();
|
||||
exit;
|
||||
}
|
||||
|
||||
// go to 'check env' step if we have a local configuration
|
||||
if ($RCI->configured && empty($_REQUEST['_step'])) {
|
||||
header("Location: ./?_step=1");
|
||||
exit;
|
||||
}
|
||||
|
||||
?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>Roundcube Webmail Installer</title>
|
||||
<meta name="Robots" content="noindex,nofollow" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<link rel="stylesheet" type="text/css" href="styles.css" />
|
||||
<script type="text/javascript" src="client.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div id="banner">
|
||||
<div class="banner-bg"></div>
|
||||
<div class="banner-logo"><a href="http://roundcube.net"><img src="images/roundcube_logo.png" width="210" height="55" border="0" alt="Roundcube - open source webmail software" /></a></div>
|
||||
</div>
|
||||
|
||||
<div id="topnav">
|
||||
<a href="https://github.com/roundcube/roundcubemail/wiki/Installation">How-to Wiki</a>
|
||||
</div>
|
||||
|
||||
<div id="content">
|
||||
|
||||
<?php
|
||||
|
||||
// exit if installation is complete
|
||||
if ($RCI->configured && !$RCI->getprop('enable_installer') && !$_SESSION['allowinstaller']) {
|
||||
// header("HTTP/1.0 404 Not Found");
|
||||
if ($RCI->configured && $RCI->legacy_config) {
|
||||
echo '<h2 class="error">Your configuration needs to be migrated!</h2>';
|
||||
echo '<p>We changed the configuration files structure and your installation needs to be updated accordingly.</p>';
|
||||
echo '<p>Please run the <tt>bin/update.sh</tt> script from the command line or set <p> <tt>$rcube_config[\'enable_installer\'] = true;</tt></p>';
|
||||
echo ' in your RCUBE_CONFIG_DIR/main.inc.php to let the installer help you migrating it.</p>';
|
||||
}
|
||||
else {
|
||||
echo '<h2 class="error">The installer is disabled!</h2>';
|
||||
echo '<p>To enable it again, set <tt>$config[\'enable_installer\'] = true;</tt> in RCUBE_CONFIG_DIR/config.inc.php</p>';
|
||||
}
|
||||
echo '</div></body></html>';
|
||||
exit;
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<h1>Roundcube Webmail Installer</h1>
|
||||
|
||||
<ol id="progress">
|
||||
<?php
|
||||
$include_steps = array(
|
||||
1 => './check.php',
|
||||
2 => './config.php',
|
||||
3 => './test.php',
|
||||
);
|
||||
|
||||
if (!in_array($RCI->step, array_keys($include_steps))) {
|
||||
$RCI->step = 1;
|
||||
}
|
||||
|
||||
foreach (array('Check environment', 'Create config', 'Test config') as $i => $item) {
|
||||
$j = $i + 1;
|
||||
$link = ($RCI->step >= $j || $RCI->configured) ? '<a href="./index.php?_step='.$j.'">' . rcube::Q($item) . '</a>' : rcube::Q($item);
|
||||
printf('<li class="step%d%s">%s</li>', $j+1, $RCI->step > $j ? ' passed' : ($RCI->step == $j ? ' current' : ''), $link);
|
||||
}
|
||||
?>
|
||||
</ol>
|
||||
|
||||
<?php
|
||||
|
||||
include $include_steps[$RCI->step];
|
||||
|
||||
?>
|
||||
</div>
|
||||
|
||||
<div id="footer">
|
||||
Installer by the Roundcube Dev Team. Copyright © 2008-2012 – Published under the GNU Public License;
|
||||
Icons by <a href="http://famfamfam.com">famfamfam</a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
235
data/web/rc/installer/styles.css
Normal file
235
data/web/rc/installer/styles.css
Normal file
@@ -0,0 +1,235 @@
|
||||
body {
|
||||
background: white;
|
||||
font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
|
||||
font-size: small;
|
||||
color: black;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#banner {
|
||||
position: relative;
|
||||
height: 58px;
|
||||
margin: 0 0 1em 0;
|
||||
padding: 10px 20px;
|
||||
background: url('images/banner_gradient.gif') top left repeat-x #d8edfd;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#banner .banner-bg {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
width: 630px;
|
||||
height: 78px;
|
||||
background: url('images/banner_schraffur.gif') top right no-repeat;
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
#banner .banner-logo {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 20px;
|
||||
z-index: 4;
|
||||
}
|
||||
|
||||
#banner .banner-logo a {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
#topnav {
|
||||
position: absolute;
|
||||
top: 3.6em;
|
||||
right: 20px;
|
||||
}
|
||||
|
||||
#topnav a {
|
||||
color: #666;
|
||||
}
|
||||
|
||||
#content {
|
||||
margin: 2em 20px;
|
||||
}
|
||||
|
||||
#footer {
|
||||
margin: 2em 20px 1em 20px;
|
||||
padding-top: 0.6em;
|
||||
font-size: smaller;
|
||||
text-align: center;
|
||||
border-top: 1px dotted #999;
|
||||
}
|
||||
|
||||
#progress {
|
||||
margin-bottom: 2em;
|
||||
border: 1px solid #aaa;
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
|
||||
#progress:after {
|
||||
content: ".";
|
||||
display: block;
|
||||
height: 0;
|
||||
font-size: 0;
|
||||
clear: both;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
#progress li {
|
||||
float: left;
|
||||
color: #999;
|
||||
padding: 1em 5em 1em 0.2em;
|
||||
}
|
||||
|
||||
#progress li a {
|
||||
color: #999;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#progress li a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#progress li.current {
|
||||
color: #000;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#progress li.passed,
|
||||
#progress li.passed a,
|
||||
#progress li.current a {
|
||||
color: #333;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
margin-bottom: 1.5em;
|
||||
border: 1px solid #aaa;
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
|
||||
fieldset p.hint {
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
|
||||
legend {
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
textarea.configfile {
|
||||
background-color: #f9f9f9;
|
||||
font-family: monospace;
|
||||
font-size: 9pt;
|
||||
width: 100%;
|
||||
height: 30em;
|
||||
}
|
||||
|
||||
.propname {
|
||||
font-family: monospace;
|
||||
font-size: 9pt;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 0.6em;
|
||||
}
|
||||
|
||||
dd div {
|
||||
margin-top: 0.3em;
|
||||
}
|
||||
|
||||
dd label {
|
||||
padding-left: 0.5em;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
ul li {
|
||||
margin: 0.3em 0 0.4em -1em;
|
||||
}
|
||||
|
||||
ul li ul li {
|
||||
margin-bottom: 0.2em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.1em;
|
||||
margin-top: 1.5em;
|
||||
margin-bottom: 0.6em;
|
||||
}
|
||||
|
||||
h4 {
|
||||
margin-bottom: 0.2em;
|
||||
}
|
||||
|
||||
a.blocktoggle {
|
||||
color: #666;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.addlink {
|
||||
color: #999;
|
||||
font-size: 0.9em;
|
||||
padding: 1px 0 1px 20px;
|
||||
background: url('images/add.png') top left no-repeat;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.removelink {
|
||||
color: #999;
|
||||
font-size: 0.9em;
|
||||
padding: 1px 0 1px 24px;
|
||||
background: url('images/delete.png') 4px 0 no-repeat;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.hint {
|
||||
color: #666;
|
||||
font-size: 0.95em;
|
||||
}
|
||||
|
||||
.success {
|
||||
color: #006400;
|
||||
font-weight: bold !important;
|
||||
}
|
||||
|
||||
.fail {
|
||||
color: #ff0000 !important;
|
||||
font-weight: bold !important;
|
||||
}
|
||||
|
||||
.na {
|
||||
color: #f60;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.indent {
|
||||
padding-left: 0.8em;
|
||||
}
|
||||
|
||||
.notice {
|
||||
padding: 1em;
|
||||
background-color: #f7fdcb;
|
||||
border: 2px solid #c2d071;
|
||||
}
|
||||
|
||||
.suggestion {
|
||||
padding: 0.6em;
|
||||
background-color: #ebebeb;
|
||||
border: 1px solid #999;
|
||||
}
|
||||
|
||||
p.warning,
|
||||
div.warning {
|
||||
padding: 1em;
|
||||
background-color: #ef9398;
|
||||
border: 2px solid #dc5757;
|
||||
}
|
||||
|
||||
h3.warning {
|
||||
color: #c00;
|
||||
background: url('images/error.png') top left no-repeat;
|
||||
padding-left: 24px;
|
||||
}
|
||||
|
||||
.userconf {
|
||||
color: #00c;
|
||||
font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
|
||||
}
|
445
data/web/rc/installer/test.php
Normal file
445
data/web/rc/installer/test.php
Normal file
@@ -0,0 +1,445 @@
|
||||
<?php
|
||||
|
||||
if (!class_exists('rcmail_install', false) || !is_object($RCI)) {
|
||||
die("Not allowed! Please open installer/index.php instead.");
|
||||
}
|
||||
|
||||
?>
|
||||
<form action="index.php?_step=3" method="post">
|
||||
|
||||
<h3>Check config file</h3>
|
||||
<?php
|
||||
|
||||
if ($read_config = is_readable(RCUBE_CONFIG_DIR . 'defaults.inc.php')) {
|
||||
$config = $RCI->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 '<br />';
|
||||
|
||||
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 '<br />';
|
||||
|
||||
|
||||
if ($RCI->configured && ($messages = $RCI->check_config())) {
|
||||
if (is_array($messages['replaced'])) {
|
||||
echo '<h3 class="warning">Replaced config options</h3>';
|
||||
echo '<p class="hint">The following config options have been replaced or renamed. ';
|
||||
echo 'Please update them accordingly in your config files.</p>';
|
||||
|
||||
echo '<ul class="configwarings">';
|
||||
foreach ($messages['replaced'] as $msg) {
|
||||
echo html::tag('li', null, html::span('propname', $msg['prop']) .
|
||||
' was replaced by ' . html::span('propname', $msg['replacement']));
|
||||
}
|
||||
echo '</ul>';
|
||||
}
|
||||
|
||||
if (is_array($messages['obsolete'])) {
|
||||
echo '<h3>Obsolete config options</h3>';
|
||||
echo '<p class="hint">You still have some obsolete or inexistent properties set. This isn\'t a problem but should be noticed.</p>';
|
||||
|
||||
echo '<ul class="configwarings">';
|
||||
foreach ($messages['obsolete'] as $msg) {
|
||||
echo html::tag('li', null, html::span('propname', $msg['prop']) . ($msg['name'] ? ': ' . $msg['name'] : ''));
|
||||
}
|
||||
echo '</ul>';
|
||||
}
|
||||
|
||||
echo '<p class="suggestion">OK, lazy people can download the updated config file here: ';
|
||||
echo html::a(array('href' => './?_mergeconfig=1'), 'config.inc.php') . ' ';
|
||||
echo "</p>";
|
||||
|
||||
if (is_array($messages['dependencies'])) {
|
||||
echo '<h3 class="warning">Dependency check failed</h3>';
|
||||
echo '<p class="hint">Some of your configuration settings require other options to be configured or additional PHP modules to be installed</p>';
|
||||
|
||||
echo '<ul class="configwarings">';
|
||||
foreach ($messages['dependencies'] as $msg) {
|
||||
echo html::tag('li', null, html::span('propname', $msg['prop']) . ': ' . $msg['explain']);
|
||||
}
|
||||
echo '</ul>';
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<h3>Check if directories are writable</h3>
|
||||
<p>Roundcube may need to write/save files into these directories</p>
|
||||
<?php
|
||||
|
||||
$dirs[] = $RCI->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 '<br />';
|
||||
}
|
||||
|
||||
if (!$pass) {
|
||||
echo '<p class="hint">Use <tt>chmod</tt> or <tt>chown</tt> to grant write privileges to the webserver</p>';
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<h3>Check DB config</h3>
|
||||
<?php
|
||||
|
||||
$db_working = false;
|
||||
if ($RCI->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 '<br />';
|
||||
$db_working = true;
|
||||
}
|
||||
else {
|
||||
$RCI->fail('DSN (write)', $db_error_msg);
|
||||
echo '<p class="hint">Make sure that the configured database exists and that the user has write privileges<br />';
|
||||
echo 'DSN: ' . $RCI->config['db_dsnw'] . '</p>';
|
||||
}
|
||||
}
|
||||
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 (!($success = $RCI->init_db($DB))) {
|
||||
$db_working = false;
|
||||
echo '<p class="warning">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</p>';
|
||||
}
|
||||
}
|
||||
|
||||
else if ($db_working && $_POST['updatedb']) {
|
||||
if (!($success = $RCI->update_db($_POST['version']))) {
|
||||
echo '<p class="warning">Database schema update failed.</p>';
|
||||
}
|
||||
}
|
||||
|
||||
// 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 '<p><input type="submit" name="initdb" value="Initialize database" /></p>';
|
||||
$db_working = false;
|
||||
}
|
||||
else if ($err = $RCI->db_schema_check($DB, $update = !empty($_POST['updatedb']))) {
|
||||
$RCI->fail('DB Schema', "Database schema differs");
|
||||
echo '<ul style="margin:0"><li>' . join("</li>\n<li>", $err) . "</li></ul>";
|
||||
$select = $RCI->versions_select(array('name' => 'version'));
|
||||
$select->add('0.9 or newer', '');
|
||||
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>';
|
||||
$db_working = false;
|
||||
}
|
||||
else {
|
||||
$RCI->pass('DB Schema');
|
||||
echo '<br />';
|
||||
}
|
||||
}
|
||||
|
||||
// more database tests
|
||||
if ($db_working) {
|
||||
// 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 '<br />';
|
||||
|
||||
// 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');
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<h3>Test filetype detection</h3>
|
||||
|
||||
<?php
|
||||
|
||||
if ($errors = $RCI->check_mime_detection()) {
|
||||
$RCI->fail('Fileinfo/mime_content_type configuration');
|
||||
if (!empty($RCI->config['mime_magic'])) {
|
||||
echo '<p class="hint">Try setting the <tt>mime_magic</tt> config option to <tt>null</tt>.</p>';
|
||||
}
|
||||
else {
|
||||
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/>';
|
||||
echo 'The path to the magic.mime file can be set using the <tt>mime_magic</tt> config option in Roundcube.</p>';
|
||||
}
|
||||
}
|
||||
else {
|
||||
$RCI->pass('Fileinfo/mime_content_type configuration');
|
||||
echo "<br/>";
|
||||
}
|
||||
|
||||
|
||||
if ($errors = $RCI->check_mime_extensions()) {
|
||||
$RCI->fail('Mimetype to file extension mapping');
|
||||
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/>';
|
||||
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>';
|
||||
}
|
||||
else {
|
||||
$RCI->pass('Mimetype to file extension mapping');
|
||||
echo "<br/>";
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
|
||||
<h3>Test SMTP config</h3>
|
||||
|
||||
<p>
|
||||
Server: <?php echo rcube_utils::parse_host($RCI->getprop('smtp_server', 'localhost')); ?><br />
|
||||
Port: <?php echo $RCI->getprop('smtp_port'); ?><br />
|
||||
|
||||
<?php
|
||||
|
||||
if ($RCI->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<br />";
|
||||
echo "Password: $pass<br />";
|
||||
}
|
||||
|
||||
$from_field = new html_inputfield(array('name' => '_from', 'id' => 'sendmailfrom'));
|
||||
$to_field = new html_inputfield(array('name' => '_to', 'id' => 'sendmailto'));
|
||||
|
||||
?>
|
||||
</p>
|
||||
|
||||
<?php
|
||||
|
||||
if (isset($_POST['sendmail'])) {
|
||||
|
||||
echo '<p>Trying to send email...<br />';
|
||||
|
||||
$from = idn_to_ascii(trim($_POST['_from']));
|
||||
$to = 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 '</p>';
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><label for="sendmailfrom">Sender</label></td>
|
||||
<td><?php echo $from_field->show($_POST['_from']); ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="sendmailto">Recipient</label></td>
|
||||
<td><?php echo $to_field->show($_POST['_to']); ?></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p><input type="submit" name="sendmail" value="Send test mail" /></p>
|
||||
|
||||
|
||||
<h3>Test IMAP config</h3>
|
||||
|
||||
<?php
|
||||
|
||||
$default_hosts = $RCI->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'));
|
||||
|
||||
?>
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><label for="imaphost">Server</label></td>
|
||||
<td><?php echo $host_field->show($_POST['_host']); ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Port</td>
|
||||
<td><?php echo $RCI->getprop('default_port'); ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="imapuser">Username</label></td>
|
||||
<td><?php echo $user_field->show($_POST['_user']); ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="imappass">Password</label></td>
|
||||
<td><?php echo $pass_field->show(); ?></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<?php
|
||||
|
||||
if (isset($_POST['imaptest']) && !empty($_POST['_host']) && !empty($_POST['_user'])) {
|
||||
|
||||
echo '<p>Connecting to ' . rcube::Q($_POST['_host']) . '...<br />';
|
||||
|
||||
$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 = idn_to_ascii($imap_host);
|
||||
$imap_user = 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());
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<p><input type="submit" name="imaptest" value="Check login" /></p>
|
||||
|
||||
</form>
|
||||
|
||||
<hr />
|
||||
|
||||
<p class="warning">
|
||||
|
||||
After completing the installation and the final tests please <b>remove</b> the whole
|
||||
installer folder from the document root of the webserver or make sure that
|
||||
<tt>enable_installer</tt> option in <tt>config.inc.php</tt> is disabled.<br />
|
||||
<br />
|
||||
|
||||
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.
|
||||
|
||||
</p>
|
Reference in New Issue
Block a user