diff --git a/INSTALL b/INSTALL index 0e8ae08ce..5b1c21dac 100644 --- a/INSTALL +++ b/INSTALL @@ -60,7 +60,7 @@ CONFIGURATION HINTS =================== Roundcube writes internal errors to the 'errors' log file located in the logs -directory which can be configured in config/main.inc.php. If you want ordinary +directory which can be configured in config/config.inc.php. If you want ordinary PHP errors to be logged there as well, enable the 'php_value error_log' line in the .htaccess file and set the path to the log file accordingly. @@ -132,10 +132,13 @@ Best solution is to install a cronjob running this script daily. MANUAL CONFIGURATION ==================== -First of all, rename the files config/*.inc.php.dist to config/*.inc.php. -You can then change these files according to your environment and your needs. -Details about the config parameters can be found in the config files. -See http://trac.roundcube.net/wiki/Howto_Install for even more guidance. +First of all, copy the sample configuration file config/config.inc.php.sample +to config/config.inc.php and make the necessary adjustments according to your +environment and your needs. More configuration options can be copied from the +config/defaults.inc.php file into your local config.inc.php file as needed. +Read the comments above the individual configuration options to find out what +they do or read http://trac.roundcube.net/wiki/Howto_Install for even more +guidance. You can also modify the default .htaccess file. This is necessary to increase the allowed size of file attachments, for example: diff --git a/UPGRADING b/UPGRADING index 03d549920..4ac0ca3b5 100644 --- a/UPGRADING +++ b/UPGRADING @@ -39,7 +39,7 @@ it on a unix system, you need to do the following operations by hand: 3. Run ./bin/update.sh from the commandline OR open http://url-to-roundcube/installer/ in a browser and choose "3 Test config". To enable the latter one, you have to temporary set 'enable_installer' - to true in your local config/main.inc.php file. + to true in your local config/config.inc.php file. WARNING: See SQLite database upgrade below. 4. Let the update script/installer check your configuration and update your config files and database schema as suggested by the updater. diff --git a/bin/installto.sh b/bin/installto.sh index 8e1ab1fbf..269a5dc06 100755 --- a/bin/installto.sh +++ b/bin/installto.sh @@ -50,7 +50,7 @@ if (strtolower($input) == 'y') { break; } } - foreach (array('index.php','.htaccess','config/main.inc.php.dist','config/db.inc.php.dist','CHANGELOG','README.md','UPGRADING','LICENSE') as $file) { + foreach (array('index.php','.htaccess','config/defaults.inc.php','CHANGELOG','README.md','UPGRADING','LICENSE') as $file) { if (!system("rsync -av " . INSTALL_PATH . "$file $target_dir/$file")) { $err = true; break; diff --git a/bin/update.sh b/bin/update.sh index 15edc2880..71e2c630a 100755 --- a/bin/update.sh +++ b/bin/update.sh @@ -5,7 +5,7 @@ | bin/update.sh | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2010-2011, The Roundcube Dev Team | + | Copyright (C) 2010-2013, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -25,7 +25,7 @@ require_once INSTALL_PATH . 'program/include/clisetup.php'; require_once INSTALL_PATH . 'installer/rcube_install.php'; // get arguments -$opts = rcube_utils::get_opt(array('v' => 'version')); +$opts = rcube_utils::get_opt(array('v' => 'version', 'y' => 'accept')); // ask user if no version is specified if (!$opts['version']) { @@ -36,32 +36,16 @@ if (!$opts['version']) { $opts['version'] = RCMAIL_VERSION; } -if ($opts['version'] && version_compare(version_parse($opts['version']), version_parse(RCMAIL_VERSION), '>=')) - die("Nothing to be done here. Bye!\n"); - - $RCI = rcube_install::get_instance(); $RCI->load_config(); if ($RCI->configured) { $success = true; - - if ($messages = $RCI->check_config()) { + + if (($messages = $RCI->check_config()) || $RCI->legacy_config) { $success = false; $err = 0; - // list missing config options - if (is_array($messages['missing'])) { - echo "WARNING: Missing config options:\n"; - echo "(These config options should be present in the current configuration)\n"; - - foreach ($messages['missing'] as $msg) { - echo "- '" . $msg['prop'] . ($msg['name'] ? "': " . $msg['name'] : "'") . "\n"; - $err++; - } - echo "\n"; - } - // list old/replaced config options if (is_array($messages['replaced'])) { echo "WARNING: Replaced config options:\n"; @@ -86,31 +70,42 @@ if ($RCI->configured) { echo "\n"; } + if (!$err && $RCI->legacy_config) { + echo "WARNING: Your configuration needs to be migrated!\n"; + echo "We changed the configuration files structure and your two config files main.inc.php and db.inc.php have to be merged into one single file.\n"; + $err++; + } + // ask user to update config files if ($err) { - echo "Do you want me to fix your local configuration? (y/N)\n"; - $input = trim(fgets(STDIN)); + if (!$opts['accept']) { + echo "Do you want me to fix your local configuration? (y/N)\n"; + $input = trim(fgets(STDIN)); + } // positive: let's merge the local config with the defaults - if (strtolower($input) == 'y') { - $copy1 = $copy2 = $write1 = $write2 = false; - + if ($opts['accept'] || strtolower($input) == 'y') { + $error = $written = false; + // backup current config - echo ". backing up the current config files...\n"; - $copy1 = copy(RCMAIL_CONFIG_DIR . '/main.inc.php', RCMAIL_CONFIG_DIR . '/main.old.php'); - $copy2 = copy(RCMAIL_CONFIG_DIR . '/db.inc.php', RCMAIL_CONFIG_DIR . '/db.old.php'); - - if ($copy1 && $copy2) { + echo ". backing up the current config file(s)...\n"; + + foreach (array('config', 'main', 'db') as $file) { + if (file_exists(RCMAIL_CONFIG_DIR . '/' . $file . '.inc.php')) { + if (!copy(RCMAIL_CONFIG_DIR . '/' . $file . '.inc.php', RCMAIL_CONFIG_DIR . '/' . $file . '.old.php')) { + $error = true; + } + } + } + + if (!$error) { $RCI->merge_config(); - - echo ". writing " . RCMAIL_CONFIG_DIR . "/main.inc.php...\n"; - $write1 = file_put_contents(RCMAIL_CONFIG_DIR . '/main.inc.php', $RCI->create_config('main', true)); - echo ". writing " . RCMAIL_CONFIG_DIR . "/main.db.php...\n"; - $write2 = file_put_contents(RCMAIL_CONFIG_DIR . '/db.inc.php', $RCI->create_config('db', true)); + echo ". writing " . RCMAIL_CONFIG_DIR . "/config.inc.php...\n"; + $written = file_put_contents(RCMAIL_CONFIG_DIR . '/config.inc.php', $RCI->create_config()); } - + // Success! - if ($write1 && $write2) { + if ($written) { echo "Done.\n"; echo "Your configuration files are now up-to-date!\n"; @@ -119,9 +114,15 @@ if ($RCI->configured) { foreach ($messages['missing'] as $msg) echo "- '" . $msg['prop'] . ($msg['name'] ? "': " . $msg['name'] : "'") . "\n"; } + + if ($RCI->legacy_config) { + foreach (array('main', 'db') as $file) { + @unlink(RCMAIL_CONFIG_DIR . '/' . $file . '.inc.php'); + } + } } else { - echo "Failed to write config files!\n"; + echo "Failed to write config file(s)!\n"; echo "Grant write privileges to the current user or update the files manually according to the above messages.\n"; } } @@ -163,7 +164,7 @@ if ($RCI->configured) { } // index contacts for fulltext searching - if (version_compare(version_parse($opts['version']), '0.6.0', '<')) { + if ($opts['version'] && version_compare(version_parse($opts['version']), '0.6.0', '<')) { system(INSTALL_PATH . 'bin/indexcontacts.sh'); } diff --git a/config/config.inc.php.sample b/config/config.inc.php.sample new file mode 100644 index 000000000..9a42ba9f5 --- /dev/null +++ b/config/config.inc.php.sample @@ -0,0 +1,85 @@ +/sendmail or to syslog -$rcmail_config['smtp_log'] = true; +$config['smtp_log'] = true; // Log successful logins to /userlogins or to syslog -$rcmail_config['log_logins'] = false; +$config['log_logins'] = false; // Log session authentication errors to /session or to syslog -$rcmail_config['log_session'] = false; +$config['log_session'] = false; // Log SQL queries to /sql or to syslog -$rcmail_config['sql_debug'] = false; +$config['sql_debug'] = false; // Log IMAP conversation to /imap or to syslog -$rcmail_config['imap_debug'] = false; +$config['imap_debug'] = false; // Log LDAP conversation to /ldap or to syslog -$rcmail_config['ldap_debug'] = false; +$config['ldap_debug'] = false; // Log SMTP conversation to /smtp or to syslog -$rcmail_config['smtp_debug'] = false; +$config['smtp_debug'] = false; // ---------------------------------- // IMAP @@ -75,18 +97,18 @@ $rcmail_config['smtp_debug'] = false; // For example %n = mail.domain.tld, %t = domain.tld // WARNING: After hostname change update of mail_host column in users table is // required to match old user data records with the new host. -$rcmail_config['default_host'] = ''; +$config['default_host'] = 'localhost'; // TCP port used for IMAP connections -$rcmail_config['default_port'] = 143; +$config['default_port'] = 143; // IMAP AUTH type (DIGEST-MD5, CRAM-MD5, LOGIN, PLAIN or null to use // best server supported one) -$rcmail_config['imap_auth_type'] = null; +$config['imap_auth_type'] = null; // If you know your imap's folder delimiter, you can specify it here. // Otherwise it will be determined automatically -$rcmail_config['imap_delimiter'] = null; +$config['imap_delimiter'] = null; // If IMAP server doesn't support NAMESPACE extension, but you're // using shared folders or personal root folder is non-empty, you'll need to @@ -94,25 +116,25 @@ $rcmail_config['imap_delimiter'] = null; // Folders need to be ended with directory separator, e.g. "INBOX." // (special directory "~" is an exception to this rule) // These can be used also to overwrite server's namespaces -$rcmail_config['imap_ns_personal'] = null; -$rcmail_config['imap_ns_other'] = null; -$rcmail_config['imap_ns_shared'] = null; +$config['imap_ns_personal'] = null; +$config['imap_ns_other'] = null; +$config['imap_ns_shared'] = null; // By default IMAP capabilities are readed after connection to IMAP server // In some cases, e.g. when using IMAP proxy, there's a need to refresh the list // after login. Set to True if you've got this case. -$rcmail_config['imap_force_caps'] = false; +$config['imap_force_caps'] = false; // By default list of subscribed folders is determined using LIST-EXTENDED // extension if available. Some servers (dovecot 1.x) returns wrong results // for shared namespaces in this case. http://trac.roundcube.net/ticket/1486225 // Enable this option to force LSUB command usage instead. // Deprecated: Use imap_disabled_caps = array('LIST-EXTENDED') -$rcmail_config['imap_force_lsub'] = false; +$config['imap_force_lsub'] = false; // Some server configurations (e.g. Courier) doesn't list folders in all namespaces // Enable this option to force listing of folders in all namespaces -$rcmail_config['imap_force_ns'] = false; +$config['imap_force_ns'] = false; // List of disabled imap extensions. // Use if your IMAP server has broken implementation of some feature @@ -122,25 +144,25 @@ $rcmail_config['imap_force_ns'] = false; $rcmail_config['imap_disabled_caps'] = array(); // IMAP connection timeout, in seconds. Default: 0 (no limit) -$rcmail_config['imap_timeout'] = 0; +$config['imap_timeout'] = 0; // Optional IMAP authentication identifier to be used as authorization proxy -$rcmail_config['imap_auth_cid'] = null; +$config['imap_auth_cid'] = null; // Optional IMAP authentication password to be used for imap_auth_cid -$rcmail_config['imap_auth_pw'] = null; +$config['imap_auth_pw'] = null; // Type of IMAP indexes cache. Supported values: 'db', 'apc' and 'memcache'. -$rcmail_config['imap_cache'] = null; +$config['imap_cache'] = null; // Enables messages cache. Only 'db' cache is supported. -$rcmail_config['messages_cache'] = false; +$config['messages_cache'] = false; // Lifetime of IMAP indexes cache. Possible units: s, m, h, d, w -$rcmail_config['imap_cache_ttl'] = '10d'; +$config['imap_cache_ttl'] = '10d'; // Lifetime of messages cache. Possible units: s, m, h, d, w -$rcmail_config['messages_cache_ttl'] = '10d'; +$config['messages_cache_ttl'] = '10d'; // ---------------------------------- // SMTP @@ -156,50 +178,50 @@ $rcmail_config['messages_cache_ttl'] = '10d'; // %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part) // %z - IMAP domain (IMAP hostname without the first part) // For example %n = mail.domain.tld, %t = domain.tld -$rcmail_config['smtp_server'] = ''; +$config['smtp_server'] = ''; // SMTP port (default is 25; use 587 for STARTTLS or 465 for the // deprecated SSL over SMTP (aka SMTPS)) -$rcmail_config['smtp_port'] = 25; +$config['smtp_port'] = 25; // SMTP username (if required) if you use %u as the username Roundcube // will use the current username for login -$rcmail_config['smtp_user'] = ''; +$config['smtp_user'] = ''; // SMTP password (if required) if you use %p as the password Roundcube // will use the current user's password for login -$rcmail_config['smtp_pass'] = ''; +$config['smtp_pass'] = ''; // SMTP AUTH type (DIGEST-MD5, CRAM-MD5, LOGIN, PLAIN or empty to use // best server supported one) -$rcmail_config['smtp_auth_type'] = ''; +$config['smtp_auth_type'] = ''; // Optional SMTP authentication identifier to be used as authorization proxy -$rcmail_config['smtp_auth_cid'] = null; +$config['smtp_auth_cid'] = null; // Optional SMTP authentication password to be used for smtp_auth_cid -$rcmail_config['smtp_auth_pw'] = null; +$config['smtp_auth_pw'] = null; // SMTP HELO host // Hostname to give to the remote server for SMTP 'HELO' or 'EHLO' messages // Leave this blank and you will get the server variable 'server_name' or // localhost if that isn't defined. -$rcmail_config['smtp_helo_host'] = ''; +$config['smtp_helo_host'] = ''; // SMTP connection timeout, in seconds. Default: 0 (no limit) // Note: There's a known issue where using ssl connection with // timeout > 0 causes connection errors (https://bugs.php.net/bug.php?id=54511) -$rcmail_config['smtp_timeout'] = 0; +$config['smtp_timeout'] = 0; // ---------------------------------- // LDAP // ---------------------------------- // Type of LDAP cache. Supported values: 'db', 'apc' and 'memcache'. -$rcmail_config['ldap_cache'] = 'db'; +$config['ldap_cache'] = 'db'; // Lifetime of LDAP cache. Possible units: s, m, h, d, w -$rcmail_config['ldap_cache_ttl'] = '10m'; +$config['ldap_cache_ttl'] = '10m'; // ---------------------------------- // SYSTEM @@ -207,98 +229,98 @@ $rcmail_config['ldap_cache_ttl'] = '10m'; // THIS OPTION WILL ALLOW THE INSTALLER TO RUN AND CAN EXPOSE SENSITIVE CONFIG DATA. // ONLY ENABLE IT IF YOU'RE REALLY SURE WHAT YOU'RE DOING! -$rcmail_config['enable_installer'] = false; +$config['enable_installer'] = false; // don't allow these settings to be overriden by the user -$rcmail_config['dont_override'] = array(); +$config['dont_override'] = array(); // provide an URL where a user can get support for this Roundcube installation // PLEASE DO NOT LINK TO THE ROUNDCUBE.NET WEBSITE HERE! -$rcmail_config['support_url'] = ''; +$config['support_url'] = ''; // replace Roundcube logo with this image // specify an URL relative to the document root of this Roundcube installation -$rcmail_config['skin_logo'] = null; +$config['skin_logo'] = null; // automatically create a new Roundcube user when log-in the first time. // a new user will be created once the IMAP login succeeds. // set to false if only registered users can use this service -$rcmail_config['auto_create_user'] = true; +$config['auto_create_user'] = true; // Enables possibility to log in using email address from user identities -$rcmail_config['user_aliases'] = false; +$config['user_aliases'] = false; // use this folder to store log files (must be writeable for apache user) // This is used by the 'file' log driver. -$rcmail_config['log_dir'] = 'logs/'; +$config['log_dir'] = 'logs/'; // use this folder to store temp files (must be writeable for apache user) -$rcmail_config['temp_dir'] = 'temp/'; +$config['temp_dir'] = 'temp/'; // enforce connections over https // with this option enabled, all non-secure connections will be redirected. // set the port for the ssl connection as value of this option if it differs from the default 443 -$rcmail_config['force_https'] = false; +$config['force_https'] = false; // tell PHP that it should work as under secure connection // even if it doesn't recognize it as secure ($_SERVER['HTTPS'] is not set) // e.g. when you're running Roundcube behind a https proxy // this option is mutually exclusive to 'force_https' and only either one of them should be set to true. -$rcmail_config['use_https'] = false; +$config['use_https'] = false; // Allow browser-autocompletion on login form. // 0 - disabled, 1 - username and host only, 2 - username, host, password -$rcmail_config['login_autocomplete'] = 0; +$config['login_autocomplete'] = 0; // Forces conversion of logins to lower case. // 0 - disabled, 1 - only domain part, 2 - domain and local part. // If users authentication is case-insensitive this must be enabled. // Note: After enabling it all user records need to be updated, e.g. with query: // UPDATE users SET username = LOWER(username); -$rcmail_config['login_lc'] = 2; +$config['login_lc'] = 2; // Includes should be interpreted as PHP files -$rcmail_config['skin_include_php'] = false; +$config['skin_include_php'] = false; // display software version on login screen -$rcmail_config['display_version'] = false; +$config['display_version'] = false; // Session lifetime in minutes -$rcmail_config['session_lifetime'] = 10; +$config['session_lifetime'] = 10; // Session domain: .example.org -$rcmail_config['session_domain'] = ''; +$config['session_domain'] = ''; // Session name. Default: 'roundcube_sessid' -$rcmail_config['session_name'] = null; +$config['session_name'] = null; // Session path. Defaults to PHP session.cookie_path setting. -$rcmail_config['session_path'] = null; +$config['session_path'] = null; // Backend to use for session storage. Can either be 'db' (default), 'memcache' or 'php' // If set to 'memcache', a list of servers need to be specified in 'memcache_hosts' // Make sure the Memcache extension (http://pecl.php.net/package/memcache) version >= 2.0.0 is installed // Setting this value to 'php' will use the default session save handler configured in PHP -$rcmail_config['session_storage'] = 'db'; +$config['session_storage'] = 'db'; // Use these hosts for accessing memcached // Define any number of hosts in the form of hostname:port or unix:///path/to/socket.file -$rcmail_config['memcache_hosts'] = null; // e.g. array( 'localhost:11211', '192.168.1.12:11211', 'unix:///var/tmp/memcached.sock' ); +$config['memcache_hosts'] = null; // e.g. array( 'localhost:11211', '192.168.1.12:11211', 'unix:///var/tmp/memcached.sock' ); // check client IP in session athorization -$rcmail_config['ip_check'] = false; +$config['ip_check'] = false; // check referer of incoming requests -$rcmail_config['referer_check'] = false; +$config['referer_check'] = false; // X-Frame-Options HTTP header value sent to prevent from Clickjacking. // Possible values: sameorigin|deny. Set to false in order to disable sending them -$rcmail_config['x_frame_options'] = 'sameorigin'; +$config['x_frame_options'] = 'sameorigin'; // this key is used to encrypt the users imap password which is stored // in the session record (and the client cookie if remember password is enabled). // please provide a string of exactly 24 chars. -$rcmail_config['des_key'] = 'rcmail-!24ByteDESkey*Str'; +$config['des_key'] = 'rcmail-!24ByteDESkey*Str'; // Automatically add this domain to user names for login // Only for IMAP servers that require full e-mail addresses for login @@ -310,7 +332,7 @@ $rcmail_config['des_key'] = 'rcmail-!24ByteDESkey*Str'; // %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part) // %z - IMAP domain (IMAP hostname without the first part) // For example %n = mail.domain.tld, %t = domain.tld -$rcmail_config['username_domain'] = ''; +$config['username_domain'] = ''; // This domain will be used to form e-mail addresses of new users // Specify an array with 'host' => 'domain' values to support multiple hosts @@ -320,64 +342,64 @@ $rcmail_config['username_domain'] = ''; // %d - domain (http hostname without the first part) // %z - IMAP domain (IMAP hostname without the first part) // For example %n = mail.domain.tld, %t = domain.tld -$rcmail_config['mail_domain'] = ''; +$config['mail_domain'] = ''; // Password charset. // Use it if your authentication backend doesn't support UTF-8. // Defaults to ISO-8859-1 for backward compatibility -$rcmail_config['password_charset'] = 'ISO-8859-1'; +$config['password_charset'] = 'ISO-8859-1'; // How many seconds must pass between emails sent by a user -$rcmail_config['sendmail_delay'] = 0; +$config['sendmail_delay'] = 0; // Maximum number of recipients per message. Default: 0 (no limit) -$rcmail_config['max_recipients'] = 0; +$config['max_recipients'] = 0; // Maximum allowednumber of members of an address group. Default: 0 (no limit) // If 'max_recipients' is set this value should be less or equal -$rcmail_config['max_group_members'] = 0; +$config['max_group_members'] = 0; -// add this user-agent to message headers when sending -$rcmail_config['useragent'] = 'Roundcube Webmail/'.RCMAIL_VERSION; +// Name your service. This is displayed on the login screen and in the window title +$config['product_name'] = 'Roundcube Webmail'; -// use this name to compose page titles -$rcmail_config['product_name'] = 'Roundcube Webmail'; +// Add this user-agent to message headers when sending +$config['useragent'] = 'Roundcube Webmail/'.RCMAIL_VERSION; // try to load host-specific configuration // see http://trac.roundcube.net/wiki/Howto_Config for more details -$rcmail_config['include_host_config'] = false; +$config['include_host_config'] = false; // path to a text file which will be added to each sent message // paths are relative to the Roundcube root folder -$rcmail_config['generic_message_footer'] = ''; +$config['generic_message_footer'] = ''; // path to a text file which will be added to each sent HTML message // paths are relative to the Roundcube root folder -$rcmail_config['generic_message_footer_html'] = ''; +$config['generic_message_footer_html'] = ''; // add a received header to outgoing mails containing the creators IP and hostname -$rcmail_config['http_received_header'] = false; +$config['http_received_header'] = false; // Whether or not to encrypt the IP address and the host name // these could, in some circles, be considered as sensitive information; // however, for the administrator, these could be invaluable help // when tracking down issues. -$rcmail_config['http_received_header_encrypt'] = false; +$config['http_received_header_encrypt'] = false; // This string is used as a delimiter for message headers when sending // a message via mail() function. Leave empty for auto-detection -$rcmail_config['mail_header_delimiter'] = NULL; +$config['mail_header_delimiter'] = NULL; // number of chars allowed for line when wrapping text. // text wrapping is done when composing/sending messages -$rcmail_config['line_length'] = 72; +$config['line_length'] = 72; // send plaintext messages as format=flowed -$rcmail_config['send_format_flowed'] = true; +$config['send_format_flowed'] = true; // According to RFC2298, return receipt envelope sender address must be empty. // If this option is true, Roundcube will use user's identity as envelope sender for MDN responses. -$rcmail_config['mdn_use_from'] = false; +$config['mdn_use_from'] = false; // Set identities access level: // 0 - many identities with possibility to edit all params @@ -385,50 +407,50 @@ $rcmail_config['mdn_use_from'] = false; // 2 - one identity with possibility to edit all params // 3 - one identity with possibility to edit all params but not email address // 4 - one identity with possibility to edit only signature -$rcmail_config['identities_level'] = 0; +$config['identities_level'] = 0; // Mimetypes supported by the browser. // attachments of these types will open in a preview window // either a comma-separated list or an array: 'text/plain,text/html,text/xml,image/jpeg,image/gif,image/png,application/pdf' -$rcmail_config['client_mimetypes'] = null; # null == default +$config['client_mimetypes'] = null; # null == default // Path to a local mime magic database file for PHPs finfo extension. // Set to null if the default path should be used. -$rcmail_config['mime_magic'] = null; +$config['mime_magic'] = null; // Absolute path to a local mime.types mapping table file. // This is used to derive mime-types from the filename extension or vice versa. // Such a file is usually part of the apache webserver. If you don't find a file named mime.types on your system, // download it from http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -$rcmail_config['mime_types'] = null; +$config['mime_types'] = null; // path to imagemagick identify binary -$rcmail_config['im_identify_path'] = null; +$config['im_identify_path'] = null; // path to imagemagick convert binary -$rcmail_config['im_convert_path'] = null; +$config['im_convert_path'] = null; // Size of thumbnails from image attachments displayed below the message content. // Note: whether images are displayed at all depends on the 'inline_images' option. // Set to 0 to display images in full size. -$rcmail_config['image_thumbnail_size'] = 240; +$config['image_thumbnail_size'] = 240; // maximum size of uploaded contact photos in pixel -$rcmail_config['contact_photo_size'] = 160; +$config['contact_photo_size'] = 160; // Enable DNS checking for e-mail address validation -$rcmail_config['email_dns_check'] = false; +$config['email_dns_check'] = false; // Disables saving sent messages in Sent folder (like gmail) (Default: false) // Note: useful when SMTP server stores sent mail in user mailbox -$rcmail_config['no_save_sent_messages'] = false; +$config['no_save_sent_messages'] = false; // ---------------------------------- // PLUGINS // ---------------------------------- // List of active plugins (in plugins/ directory) -$rcmail_config['plugins'] = array(); +$config['plugins'] = array(); // ---------------------------------- // USER INTERFACE @@ -436,125 +458,125 @@ $rcmail_config['plugins'] = array(); // default messages sort column. Use empty value for default server's sorting, // or 'arrival', 'date', 'subject', 'from', 'to', 'fromto', 'size', 'cc' -$rcmail_config['message_sort_col'] = ''; +$config['message_sort_col'] = ''; // default messages sort order -$rcmail_config['message_sort_order'] = 'DESC'; +$config['message_sort_order'] = 'DESC'; // These cols are shown in the message list. Available cols are: // subject, from, to, fromto, cc, replyto, date, size, status, flag, attachment, 'priority' -$rcmail_config['list_cols'] = array('subject', 'status', 'fromto', 'date', 'size', 'flag', 'attachment'); +$config['list_cols'] = array('subject', 'status', 'fromto', 'date', 'size', 'flag', 'attachment'); // the default locale setting (leave empty for auto-detection) // RFC1766 formatted language name like en_US, de_DE, de_CH, fr_FR, pt_BR -$rcmail_config['language'] = null; +$config['language'] = null; // use this format for date display (date or strftime format) -$rcmail_config['date_format'] = 'Y-m-d'; +$config['date_format'] = 'Y-m-d'; // give this choice of date formats to the user to select from -$rcmail_config['date_formats'] = array('Y-m-d', 'd-m-Y', 'Y/m/d', 'm/d/Y', 'd/m/Y', 'd.m.Y', 'j.n.Y'); +$config['date_formats'] = array('Y-m-d', 'd-m-Y', 'Y/m/d', 'm/d/Y', 'd/m/Y', 'd.m.Y', 'j.n.Y'); // use this format for time display (date or strftime format) -$rcmail_config['time_format'] = 'H:i'; +$config['time_format'] = 'H:i'; // give this choice of time formats to the user to select from -$rcmail_config['time_formats'] = array('G:i', 'H:i', 'g:i a', 'h:i A'); +$config['time_formats'] = array('G:i', 'H:i', 'g:i a', 'h:i A'); // use this format for short date display (derived from date_format and time_format) -$rcmail_config['date_short'] = 'D H:i'; +$config['date_short'] = 'D H:i'; // use this format for detailed date/time formatting (derived from date_format and time_format) -$rcmail_config['date_long'] = 'Y-m-d H:i'; +$config['date_long'] = 'Y-m-d H:i'; // store draft message is this mailbox // leave blank if draft messages should not be stored // NOTE: Use folder names with namespace prefix (INBOX. on Courier-IMAP) -$rcmail_config['drafts_mbox'] = 'Drafts'; +$config['drafts_mbox'] = 'Drafts'; // store spam messages in this mailbox // NOTE: Use folder names with namespace prefix (INBOX. on Courier-IMAP) -$rcmail_config['junk_mbox'] = 'Junk'; +$config['junk_mbox'] = 'Junk'; // store sent message is this mailbox // leave blank if sent messages should not be stored // NOTE: Use folder names with namespace prefix (INBOX. on Courier-IMAP) -$rcmail_config['sent_mbox'] = 'Sent'; +$config['sent_mbox'] = 'Sent'; // move messages to this folder when deleting them // leave blank if they should be deleted directly // NOTE: Use folder names with namespace prefix (INBOX. on Courier-IMAP) -$rcmail_config['trash_mbox'] = 'Trash'; +$config['trash_mbox'] = 'Trash'; // display these folders separately in the mailbox list. // these folders will also be displayed with localized names // NOTE: Use folder names with namespace prefix (INBOX. on Courier-IMAP) -$rcmail_config['default_folders'] = array('INBOX', 'Drafts', 'Sent', 'Junk', 'Trash'); +$config['default_folders'] = array('INBOX', 'Drafts', 'Sent', 'Junk', 'Trash'); // Disable localization of the default folder names listed above -$rcmail_config['show_real_foldernames'] = false; +$config['show_real_foldernames'] = false; // automatically create the above listed default folders on first login -$rcmail_config['create_default_folders'] = false; +$config['create_default_folders'] = false; // protect the default folders from renames, deletes, and subscription changes -$rcmail_config['protect_default_folders'] = true; +$config['protect_default_folders'] = true; // if in your system 0 quota means no limit set this option to true -$rcmail_config['quota_zero_as_unlimited'] = false; +$config['quota_zero_as_unlimited'] = false; // Make use of the built-in spell checker. It is based on GoogieSpell. // Since Google only accepts connections over https your PHP installatation // requires to be compiled with Open SSL support -$rcmail_config['enable_spellcheck'] = true; +$config['enable_spellcheck'] = true; // Enables spellchecker exceptions dictionary. // Setting it to 'shared' will make the dictionary shared by all users. -$rcmail_config['spellcheck_dictionary'] = false; +$config['spellcheck_dictionary'] = false; // Set the spell checking engine. 'googie' is the default. // 'pspell' and 'enchant' are also available, but they require // PHP Pspell or Enchant extensions. When using Nox Spell Server, also set 'googie' here. -$rcmail_config['spellcheck_engine'] = 'googie'; +$config['spellcheck_engine'] = 'googie'; // For a locally installed Nox Spell Server, please specify the URI to call it. // Get Nox Spell Server from http://orangoo.com/labs/?page_id=72 // Leave empty to use the Google spell checking service, what means // that the message content will be sent to Google in order to check spelling -$rcmail_config['spellcheck_uri'] = ''; +$config['spellcheck_uri'] = ''; // These languages can be selected for spell checking. // Configure as a PHP style hash array: array('en'=>'English', 'de'=>'Deutsch'); // Leave empty for default set of available language. -$rcmail_config['spellcheck_languages'] = NULL; +$config['spellcheck_languages'] = NULL; // Makes that words with all letters capitalized will be ignored (e.g. GOOGLE) -$rcmail_config['spellcheck_ignore_caps'] = false; +$config['spellcheck_ignore_caps'] = false; // Makes that words with numbers will be ignored (e.g. g00gle) -$rcmail_config['spellcheck_ignore_nums'] = false; +$config['spellcheck_ignore_nums'] = false; // Makes that words with symbols will be ignored (e.g. g@@gle) -$rcmail_config['spellcheck_ignore_syms'] = false; +$config['spellcheck_ignore_syms'] = false; // Use this char/string to separate recipients when composing a new message -$rcmail_config['recipients_separator'] = ','; +$config['recipients_separator'] = ','; // don't let users set pagesize to more than this value if set -$rcmail_config['max_pagesize'] = 200; +$config['max_pagesize'] = 200; // Minimal value of user's 'refresh_interval' setting (in seconds) -$rcmail_config['min_refresh_interval'] = 60; +$config['min_refresh_interval'] = 60; // Enables files upload indicator. Requires APC installed and enabled apc.rfc1867 option. // By default refresh time is set to 1 second. You can set this value to true // or any integer value indicating number of seconds. -$rcmail_config['upload_progress'] = false; +$config['upload_progress'] = false; // Specifies for how many seconds the Undo button will be available // after object delete action. Currently used with supporting address book sources. // Setting it to 0, disables the feature. -$rcmail_config['undo_timeout'] = 0; +$config['undo_timeout'] = 0; // ---------------------------------- // ADDRESSBOOK SETTINGS @@ -567,12 +589,12 @@ $rcmail_config['undo_timeout'] = 0; // SQL address book in the 'Address Book' view. // If set to '' then no address book will be displayed or only the // addressbook which is created by a plugin (like CardDAV). -$rcmail_config['address_book_type'] = 'sql'; +$config['address_book_type'] = 'sql'; // In order to enable public ldap search, configure an array like the Verisign // example further below. if you would like to test, simply uncomment the example. // Array key must contain only safe characters, ie. a-zA-Z0-9_ -$rcmail_config['ldap_public'] = array(); +$config['ldap_public'] = array(); // If you are going to use LDAP for individual address books, you will need to // set 'user_specific' to true and use the variables to generate the appropriate DNs to access it. @@ -590,7 +612,7 @@ $rcmail_config['ldap_public'] = array(); /* * example config for Verisign directory * -$rcmail_config['ldap_public']['Verisign'] = array( +$config['ldap_public']['Verisign'] = array( 'name' => 'Verisign.com', // Replacement variables supported in host names: // %h - user's IMAP hostname @@ -735,213 +757,213 @@ $rcmail_config['ldap_public']['Verisign'] = array( // An ordered array of the ids of the addressbooks that should be searched // when populating address autocomplete fields server-side. ex: array('sql','Verisign'); -$rcmail_config['autocomplete_addressbooks'] = array('sql'); +$config['autocomplete_addressbooks'] = array('sql'); // The minimum number of characters required to be typed in an autocomplete field // before address books will be searched. Most useful for LDAP directories that // may need to do lengthy results building given overly-broad searches -$rcmail_config['autocomplete_min_length'] = 1; +$config['autocomplete_min_length'] = 1; // Number of parallel autocomplete requests. // If there's more than one address book, n parallel (async) requests will be created, // where each request will search in one address book. By default (0), all address // books are searched in one request. -$rcmail_config['autocomplete_threads'] = 0; +$config['autocomplete_threads'] = 0; // Max. numer of entries in autocomplete popup. Default: 15. -$rcmail_config['autocomplete_max'] = 15; +$config['autocomplete_max'] = 15; // show address fields in this order // available placeholders: {street}, {locality}, {zipcode}, {country}, {region} -$rcmail_config['address_template'] = '{street}
{locality} {zipcode}
{country} {region}'; +$config['address_template'] = '{street}
{locality} {zipcode}
{country} {region}'; // Matching mode for addressbook search (including autocompletion) // 0 - partial (*abc*), default // 1 - strict (abc) // 2 - prefix (abc*) // Note: For LDAP sources fuzzy_search must be enabled to use 'partial' or 'prefix' mode -$rcmail_config['addressbook_search_mode'] = 0; +$config['addressbook_search_mode'] = 0; // ---------------------------------- // USER PREFERENCES // ---------------------------------- // Use this charset as fallback for message decoding -$rcmail_config['default_charset'] = 'ISO-8859-1'; +$config['default_charset'] = 'ISO-8859-1'; // skin name: folder from skins/ -$rcmail_config['skin'] = 'larry'; +$config['skin'] = 'larry'; // Enables using standard browser windows (that can be handled as tabs) // instead of popup windows -$rcmail_config['standard_windows'] = false; +$config['standard_windows'] = false; // show up to X items in messages list view -$rcmail_config['mail_pagesize'] = 50; +$config['mail_pagesize'] = 50; // show up to X items in contacts list view -$rcmail_config['addressbook_pagesize'] = 50; +$config['addressbook_pagesize'] = 50; // sort contacts by this col (preferably either one of name, firstname, surname) -$rcmail_config['addressbook_sort_col'] = 'surname'; +$config['addressbook_sort_col'] = 'surname'; // the way how contact names are displayed in the list // 0: display name // 1: (prefix) firstname middlename surname (suffix) // 2: (prefix) surname firstname middlename (suffix) // 3: (prefix) surname, firstname middlename (suffix) -$rcmail_config['addressbook_name_listing'] = 0; +$config['addressbook_name_listing'] = 0; // use this timezone to display date/time // valid timezone identifers are listed here: php.net/manual/en/timezones.php // 'auto' will use the browser's timezone settings -$rcmail_config['timezone'] = 'auto'; +$config['timezone'] = 'auto'; // prefer displaying HTML messages -$rcmail_config['prefer_html'] = true; +$config['prefer_html'] = true; // display remote inline images // 0 - Never, always ask // 1 - Ask if sender is not in address book // 2 - Always show inline images -$rcmail_config['show_images'] = 0; +$config['show_images'] = 0; // open messages in new window -$rcmail_config['message_extwin'] = false; +$config['message_extwin'] = false; // open message compose form in new window -$rcmail_config['compose_extwin'] = false; +$config['compose_extwin'] = false; // compose html formatted messages by default // 0 - never, 1 - always, 2 - on reply to HTML message, 3 - on forward or reply to HTML message -$rcmail_config['htmleditor'] = 0; +$config['htmleditor'] = 0; // show pretty dates as standard -$rcmail_config['prettydate'] = true; +$config['prettydate'] = true; // save compose message every 300 seconds (5min) -$rcmail_config['draft_autosave'] = 300; +$config['draft_autosave'] = 300; // default setting if preview pane is enabled -$rcmail_config['preview_pane'] = false; +$config['preview_pane'] = false; // Mark as read when viewed in preview pane (delay in seconds) // Set to -1 if messages in preview pane should not be marked as read -$rcmail_config['preview_pane_mark_read'] = 0; +$config['preview_pane_mark_read'] = 0; // Clear Trash on logout -$rcmail_config['logout_purge'] = false; +$config['logout_purge'] = false; // Compact INBOX on logout -$rcmail_config['logout_expunge'] = false; +$config['logout_expunge'] = false; // Display attached images below the message body -$rcmail_config['inline_images'] = true; +$config['inline_images'] = true; // Encoding of long/non-ascii attachment names: // 0 - Full RFC 2231 compatible // 1 - RFC 2047 for 'name' and RFC 2231 for 'filename' parameter (Thunderbird's default) // 2 - Full 2047 compatible -$rcmail_config['mime_param_folding'] = 1; +$config['mime_param_folding'] = 1; // Set true if deleted messages should not be displayed // This will make the application run slower -$rcmail_config['skip_deleted'] = false; +$config['skip_deleted'] = false; // Set true to Mark deleted messages as read as well as deleted // False means that a message's read status is not affected by marking it as deleted -$rcmail_config['read_when_deleted'] = true; +$config['read_when_deleted'] = true; // Set to true to never delete messages immediately // Use 'Purge' to remove messages marked as deleted -$rcmail_config['flag_for_deletion'] = false; +$config['flag_for_deletion'] = false; // Default interval for auto-refresh requests (in seconds) // These are requests for system state updates e.g. checking for new messages, etc. // Setting it to 0 disables the feature. -$rcmail_config['refresh_interval'] = 60; +$config['refresh_interval'] = 60; // If true all folders will be checked for recent messages -$rcmail_config['check_all_folders'] = false; +$config['check_all_folders'] = false; // If true, after message delete/move, the next message will be displayed -$rcmail_config['display_next'] = true; +$config['display_next'] = true; // 0 - Do not expand threads // 1 - Expand all threads automatically // 2 - Expand only threads with unread messages -$rcmail_config['autoexpand_threads'] = 0; +$config['autoexpand_threads'] = 0; // When replying: // -1 - don't cite the original message // 0 - place cursor below the original message // 1 - place cursor above original message (top posting) -$rcmail_config['reply_mode'] = 0; +$config['reply_mode'] = 0; // When replying strip original signature from message -$rcmail_config['strip_existing_sig'] = true; +$config['strip_existing_sig'] = true; // Show signature: // 0 - Never // 1 - Always // 2 - New messages only // 3 - Forwards and Replies only -$rcmail_config['show_sig'] = 1; +$config['show_sig'] = 1; // Use MIME encoding (quoted-printable) for 8bit characters in message body -$rcmail_config['force_7bit'] = false; +$config['force_7bit'] = false; // Defaults of the search field configuration. // The array can contain a per-folder list of header fields which should be considered when searching // The entry with key '*' stands for all folders which do not have a specific list set. -// Please note that folder names should to be in sync with $rcmail_config['default_folders'] -$rcmail_config['search_mods'] = null; // Example: array('*' => array('subject'=>1, 'from'=>1), 'Sent' => array('subject'=>1, 'to'=>1)); +// Please note that folder names should to be in sync with $config['default_folders'] +$config['search_mods'] = null; // Example: array('*' => array('subject'=>1, 'from'=>1), 'Sent' => array('subject'=>1, 'to'=>1)); // Defaults of the addressbook search field configuration. -$rcmail_config['addressbook_search_mods'] = null; // Example: array('name'=>1, 'firstname'=>1, 'surname'=>1, 'email'=>1, '*'=>1); +$config['addressbook_search_mods'] = null; // Example: array('name'=>1, 'firstname'=>1, 'surname'=>1, 'email'=>1, '*'=>1); // 'Delete always' // This setting reflects if mail should be always deleted // when moving to Trash fails. This is necessary in some setups // when user is over quota and Trash is included in the quota. -$rcmail_config['delete_always'] = false; +$config['delete_always'] = false; // Directly delete messages in Junk instead of moving to Trash -$rcmail_config['delete_junk'] = false; +$config['delete_junk'] = false; // Behavior if a received message requests a message delivery notification (read receipt) // 0 = ask the user, 1 = send automatically, 2 = ignore (never send or ask) // 3 = send automatically if sender is in addressbook, otherwise ask the user // 4 = send automatically if sender is in addressbook, otherwise ignore -$rcmail_config['mdn_requests'] = 0; +$config['mdn_requests'] = 0; // Return receipt checkbox default state -$rcmail_config['mdn_default'] = 0; +$config['mdn_default'] = 0; // Delivery Status Notification checkbox default state -$rcmail_config['dsn_default'] = 0; +$config['dsn_default'] = 0; // Place replies in the folder of the message being replied to -$rcmail_config['reply_same_folder'] = false; +$config['reply_same_folder'] = false; // Sets default mode of Forward feature to "forward as attachment" -$rcmail_config['forward_attachment'] = false; +$config['forward_attachment'] = false; // Defines address book (internal index) to which new contacts will be added // By default it is the first writeable addressbook. // Note: Use '0' for built-in address book. -$rcmail_config['default_addressbook'] = null; +$config['default_addressbook'] = null; // Enables spell checking before sending a message. -$rcmail_config['spellcheck_before_send'] = false; +$config['spellcheck_before_send'] = false; // Skip alternative email addresses in autocompletion (show one address per contact) -$rcmail_config['autocomplete_single'] = false; +$config['autocomplete_single'] = false; // Default font for composed HTML message. // Supported values: Andale Mono, Arial, Arial Black, Book Antiqua, Courier New, // Georgia, Helvetica, Impact, Tahoma, Terminal, Times New Roman, Trebuchet MS, Verdana -$rcmail_config['default_font'] = 'Verdana'; +$config['default_font'] = 'Verdana'; // Enables display of email address with name instead of a name (and address in title) -$rcmail_config['message_show_email'] = false; +$config['message_show_email'] = false; diff --git a/installer/config.php b/installer/config.php index bfeb677ee..f990fc23f 100644 --- a/installer/config.php +++ b/installer/config.php @@ -9,9 +9,6 @@ if (!class_exists('rcube_install') || !is_object($RCI)) { load_defaults(); - // register these boolean fields $RCI->bool_config_props = array( 'ip_check' => 1, @@ -27,24 +24,24 @@ $RCI->bool_config_props = array( $_SESSION['allowinstaller'] = true; if (!empty($_POST['submit'])) { - - echo '

Copy or download the following configurations and save them in two files'; - echo ' (names above the text box) within the '.RCMAIL_CONFIG_DIR.' directory of your Roundcube installation.'; + echo '

Copy or download the following configuration and save it'; + echo ' as config.inc.php within the '.RCUBE_CONFIG_DIR.' directory of your Roundcube installation.
'; + echo ' Make sure that there are no characters outside the <?php ?> brackets when saving the file.'; + echo ' '; + if ($RCI->legacy_config) { + echo '

Afterwards, please remove the old configuration files main.inc.php and db.inc.php'; + echo ' from the config directory.'; + } echo '

'; - + $textbox = new html_textarea(array('rows' => 16, 'cols' => 60, 'class' => "configfile")); - - echo '
main.inc.php (download)
'; - echo $textbox->show(($_SESSION['main.inc.php'] = $RCI->create_config('main'))); - - echo '
db.inc.php (download)
'; - echo $textbox->show($_SESSION['db.inc.php'] = $RCI->create_config('db')); + echo $textbox->show(($_SESSION['config'] = $RCI->create_config())); echo '

Of course there are more options to configure. - Have a look at the config files or visit Howto_Config to find out.

'; + Have a look at the defaults.inc.php file or visit Howto_Config to find out.

'; echo '

'; - + // echo ''; echo "\n
\n"; } @@ -648,7 +645,7 @@ $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(intval($RCI->getprop('mime_param_folding'))); +echo $select_param_folding->show(strval($RCI->getprop('mime_param_folding'))); ?>
How to encode attachment long/non-ascii names
diff --git a/installer/index.php b/installer/index.php index 0e80b1cd6..d084c8aa5 100644 --- a/installer/index.php +++ b/installer/index.php @@ -5,7 +5,7 @@ | Roundcube Webmail setup tool | | Version 0.9-git | | | - | Copyright (C) 2009-2012, The Roundcube Dev Team | + | Copyright (C) 2009-2013, 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 | @@ -54,17 +54,18 @@ require_once 'rcube_install.php'; // deprecated aliases (to be removed) require_once 'bc.php'; -session_start(); +if (function_exists('session_start')) + session_start(); $RCI = rcube_install::get_instance(); $RCI->load_config(); -if (isset($_GET['_getfile']) && in_array($_GET['_getfile'], array('main', 'db'))) { - $filename = $_GET['_getfile'] . '.inc.php'; - if (!empty($_SESSION[$filename])) { +if (isset($_GET['_getconfig'])) { + $filename = 'config.inc.php'; + if (!empty($_SESSION['config'])) { header('Content-type: text/plain'); header('Content-Disposition: attachment; filename="'.$filename.'"'); - echo $_SESSION[$filename]; + echo $_SESSION['config']; exit; } else { @@ -74,14 +75,14 @@ if (isset($_GET['_getfile']) && in_array($_GET['_getfile'], array('main', 'db')) } if ($RCI->configured && ($RCI->getprop('enable_installer') || $_SESSION['allowinstaller']) && - isset($_GET['_mergeconfig']) && in_array($_GET['_mergeconfig'], array('main', 'db'))) { - $filename = $_GET['_mergeconfig'] . '.inc.php'; + !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($_GET['_mergeconfig'], true); + echo $RCI->create_config(); exit; } @@ -121,8 +122,16 @@ if ($RCI->configured && empty($_REQUEST['_step'])) { // exit if installation is complete if ($RCI->configured && !$RCI->getprop('enable_installer') && !$_SESSION['allowinstaller']) { // header("HTTP/1.0 404 Not Found"); - echo '

The installer is disabled!

'; - echo '

To enable it again, set $rcmail_config[\'enable_installer\'] = true; in RCUBE_CONFIG_DIR/main.inc.php

'; + if ($RCI->configured && $RCI->legacy_config) { + echo '

Your configuration needs to be migrated!

'; + echo '

We changed the configuration files structure and your installation needs to be updated accordingly.

'; + echo '

Please run the bin/update.sh script from the command line or set

  $rcmail_config[\'enable_installer\'] = true;

'; + echo ' in your RCUBE_CONFIG_DIR/main.inc.php to let the installer help you migrating it.

'; + } + else { + echo '

The installer is disabled!

'; + echo '

To enable it again, set $rcmail_config[\'enable_installer\'] = true; in RCUBE_CONFIG_DIR/config.inc.php

'; + } echo ''; exit; } diff --git a/installer/rcube_install.php b/installer/rcube_install.php index ab7967708..600db34ab 100644 --- a/installer/rcube_install.php +++ b/installer/rcube_install.php @@ -28,10 +28,12 @@ class rcube_install var $failures = 0; var $config = array(); var $configured = false; + var $legacy_config = false; var $last_error = null; var $email_pattern = '([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9]([a-z0-9\-][.]?)*[a-z0-9])'; var $bool_config_props = array(); + var $local_config = array('db_dsnw', 'default_host', 'support_url', 'des_key', 'plugins'); var $obsolete_config = array('db_backend', 'double_auth'); var $replaced_config = array( 'skin_path' => 'skin', @@ -44,11 +46,6 @@ class rcube_install 'top_posting' => 'reply_mode', ); - // these config options are required for a working system - var $required_config = array( - 'db_dsnw', 'des_key', 'session_lifetime', - ); - // list of supported database drivers var $supported_dbs = array( 'MySQL' => 'pdo_mysql', @@ -82,44 +79,76 @@ class rcube_install return $inst; } - /** - * Read the default config files and store properties - */ - function load_defaults() - { - $this->_load_config('.php.dist'); - } - - /** * Read the local config files and store properties */ function load_config() { - $this->config = array(); - $this->_load_config('.php'); - $this->configured = !empty($this->config); + // defaults + if ($config = $this->load_config_file(RCUBE_CONFIG_DIR . 'defaults.inc.php')) { + $this->config = (array) $config; + $this->defaults = $this->config; + } + + $config = null; + + // config + if ($config = $this->load_config_file(RCUBE_CONFIG_DIR . 'config.inc.php')) { + $this->config = array_merge($this->config, $config); + } + else { + if ($config = $this->load_config_file(RCUBE_CONFIG_DIR . 'main.inc.php')) { + $this->config = array_merge($this->config, $config); + $this->legacy_config = true; + } + if ($config = $this->load_config_file(RCUBE_CONFIG_DIR . 'db.inc.php')) { + $this->config = array_merge($this->config, $config); + $this->legacy_config = true; + } + } + + $this->configured = !empty($config); } /** * Read the default config file and store properties - * @access private */ - function _load_config($suffix) + public function load_config_file($file) { - if (is_readable($main_inc = RCUBE_CONFIG_DIR . 'main.inc' . $suffix)) { - include($main_inc); - if (is_array($rcmail_config)) - $this->config += $rcmail_config; - } - if (is_readable($db_inc = RCUBE_CONFIG_DIR . 'db.inc'. $suffix)) { - include($db_inc); - if (is_array($rcmail_config)) - $this->config += $rcmail_config; + if (is_readable($file)) { + include $file; + + // read comments from config file + if (function_exists('token_get_all')) { + $tokens = token_get_all(file_get_contents($file)); + $in_config = false; + $buffer = ''; + for ($i=0; $i < count($tokens); $i++) { + $token = $tokens[$i]; + if ($token[0] == T_VARIABLE && $token[1] == '$config' || $token[1] == '$rcmail_config') { + $in_config = true; + if ($buffer && $tokens[$i+1] == '[' && $tokens[$i+2][0] == T_CONSTANT_ENCAPSED_STRING) { + $propname = trim($tokens[$i+2][1], "'\""); + $this->comments[$propname] = $buffer; + $buffer = ''; + $i += 3; + } + } + else if ($in_config && $token[0] == T_COMMENT) { + $buffer .= strtr($token[1], array('\n' => "\n")); + } + } + } + + // deprecated name of config variable + if (is_array($rcmail_config)) { + return $rcmail_config; + } + + return $config; } } - /** * Getter for a certain config property * @@ -139,24 +168,22 @@ class rcube_install /** - * Take the default config file and replace the parameters - * with the submitted form data + * Create configuration file that contains parameters + * that differ from default values. * - * @param string Which config file (either 'main' or 'db') * @return string The complete config file content */ - function create_config($which, $force = false) + function create_config() { - $out = @file_get_contents(RCUBE_CONFIG_DIR . $which . '.inc.php.dist'); - - if (!$out) - return '[Warning: could not read the config template file]'; + $config = array(); foreach ($this->config as $prop => $default) { - $is_default = !isset($_POST["_$prop"]); $value = !$is_default || $this->bool_config_props[$prop] ? $_POST["_$prop"] : $default; + if ($prop == 'enable_installer') + $value = false; + // convert some form data if ($prop == 'debug_level' && !$is_default) { if (is_array($value)) { @@ -166,7 +193,7 @@ class rcube_install $value = $val; } } - else if ($which == 'db' && $prop == 'db_dsnw' && !empty($_POST['_dbtype'])) { + else if ($prop == 'db_dsnw' && !empty($_POST['_dbtype'])) { if ($_POST['_dbtype'] == 'sqlite') $value = sprintf('%s://%s?mode=0646', $_POST['_dbtype'], $_POST['_dbname']{0} == '/' ? '/' . $_POST['_dbname'] : $_POST['_dbname']); else if ($_POST['_dbtype']) @@ -211,22 +238,24 @@ class rcube_install } // skip this property - if (!$force && !$this->configured && ($value == $default)) + if ((!array_key_exists($prop, $this->defaults) || ($value == $this->defaults[$prop])) && !in_array($prop, $this->local_config)) { continue; + } // save change $this->config[$prop] = $value; + $config[$prop] = $value; + } - $dump = self::_dump_var($value, $prop); - - // replace the matching line in config file - $out = preg_replace( - '/(\$rcmail_config\[\''.preg_quote($prop).'\'\])\s+=\s+(.+);/Ui', - "\\1 = $dump;", - $out); + $out = " $value) { + // copy option descriptions from existing config or defaults.inc.php + $out .= $this->comments[$prop]; + $out .= "\$config['$prop'] = " . rcube_install::_dump_var($value, $prop) . ";\n\n"; } - return trim($out); + return $out; } @@ -238,16 +267,13 @@ class rcube_install */ function check_config() { - $this->config = array(); - $this->load_defaults(); - $defaults = $this->config; - $this->load_config(); - if (!$this->configured) + + if (!$this->configured) { return null; + } $out = $seen = array(); - $required = array_flip($this->required_config); // iterate over the current configuration foreach ($this->config as $prop => $value) { @@ -266,12 +292,6 @@ class rcube_install $out['obsolete'][] = array('prop' => 'mime_magic', 'explain' => "Set value to null in order to use system default"); } - // iterate over default config - foreach ($defaults as $prop => $value) { - if (!isset($seen[$prop]) && isset($required[$prop]) && !(is_bool($this->config[$prop]) || strlen($this->config[$prop]))) - $out['missing'][] = array('prop' => $prop); - } - // check config dependencies and contradictions if ($this->config['enable_spellcheck'] && $this->config['spellcheck_engine'] == 'pspell') { if (!extension_loaded('pspell')) { @@ -319,7 +339,6 @@ class rcube_install { $current = $this->config; $this->config = array(); - $this->load_defaults(); foreach ($this->replaced_config as $prop => $replacement) { if (isset($current[$prop])) { @@ -347,7 +366,7 @@ class rcube_install } } - $this->config = array_merge($this->config, $current); + $this->config = array_merge($this->config, $current); foreach (array_keys((array)$current['ldap_public']) as $key) { $this->config['ldap_public'][$key] = $current['ldap_public'][$key]; @@ -613,7 +632,8 @@ class rcube_install } - static function _dump_var($var, $name=null) { + static function _dump_var($var, $name=null) + { // special values switch ($name) { case 'syslog_facility': @@ -626,8 +646,20 @@ class rcube_install if ($val = $list[$var]) return $val; break; - } + case 'mail_header_delimiter': + $var = str_replace(array("\r", "\n"), array('\r', '\n'), $var); + return '"' . $var. '"'; + break; +/* + // RCMAIL_VERSION is undefined here + case 'useragent': + if (preg_match('|^(.*)/('.preg_quote(RCMAIL_VERSION, '|').')$|i', $var, $m)) { + return '"' . addcslashes($var, '"') . '/" . RCMAIL_VERSION'; + } + break; +*/ + } if (is_array($var)) { if (empty($var)) { diff --git a/installer/test.php b/installer/test.php index 75dac47aa..f834308ad 100644 --- a/installer/test.php +++ b/installer/test.php @@ -7,52 +7,44 @@ if (!class_exists('rcube_install') || !is_object($RCI)) { ?>
-

Check config files

+

Check config file

config)) { - $RCI->pass('main.inc.php'); -} -else if ($read_main) { - $RCI->fail('main.inc.php', 'Syntax error'); +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 if (!$read_main) { - $RCI->fail('main.inc.php', 'Unable to read file. Did you create the config files?'); +else { + $RCI->fail('defaults.inc.php', 'Unable to read default config file?'); } echo '
'; -if ($read_db && !empty($RCI->config['db_dsnw'])) { - $RCI->pass('db.inc.php'); -} -else if ($read_db) { - $RCI->fail('db.inc.php', 'Syntax error'); +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 if (!$read_db) { - $RCI->fail('db.inc.php', 'Unable to read file. Did you create the config files?'); +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['missing'])) { - echo '

Missing config options

'; - echo '

The following config options are not set (not present or empty) in the current configuration.
'; - echo 'Please check the default config files and set the missing properties in your local config files.

'; - - echo '
    '; - foreach ($messages['missing'] as $msg) { - echo html::tag('li', null, html::span('propname', $msg['prop']) . ($msg['name'] ? ': ' . $msg['name'] : '')); - } - 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 '
    '; foreach ($messages['replaced'] as $msg) { echo html::tag('li', null, html::span('propname', $msg['prop']) . @@ -64,32 +56,28 @@ if ($RCI->configured && ($messages = $RCI->check_config())) { 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 '
      '; foreach ($messages['obsolete'] as $msg) { echo html::tag('li', null, html::span('propname', $msg['prop']) . ($msg['name'] ? ': ' . $msg['name'] : '')); } 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 '

    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 '
      '; foreach ($messages['dependencies'] as $msg) { echo html::tag('li', null, html::span('propname', $msg['prop']) . ': ' . $msg['explain']); } echo '
    '; } - - } ?> @@ -98,30 +86,24 @@ if ($RCI->configured && ($messages = $RCI->check_config())) {

    Roundcube may need to write/save files into these directories

    configured) { - $pass = false; - - $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'; +$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 = $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 '
    '; +foreach ($dirs as $dir) { + $dirpath = $dir[0] == '/' ? $dir : INSTALL_PATH . $dir; + if (is_writable(realpath($dirpath))) { + $RCI->pass($dir); + $pass = true; } - - if (!$pass) - echo '

    Use chmod or chown to grant write privileges to the webserver

    '; + else { + $RCI->fail($dir, 'not writeable for the webserver'); + } + echo '
    '; } -else { - $RCI->fail('Config', 'Could not read config files'); + +if (!$pass) { + echo '

    Use chmod or chown to grant write privileges to the webserver

    '; } ?> @@ -151,7 +133,7 @@ if ($RCI->configured) { } } else { - $RCI->fail('Config', 'Could not read config files'); + $RCI->fail('DSN (write)', 'Could not read config file'); } // initialize db with schema found in /SQL/* @@ -463,7 +445,7 @@ if (isset($_POST['imaptest']) && !empty($_POST['_host']) && !empty($_POST['_user 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/main.inc.php is disabled.
    +enable_installer option in config.inc.php is disabled.

    These files may expose sensitive configuration data like server passwords and encryption keys diff --git a/plugins/additional_message_headers/additional_message_headers.php b/plugins/additional_message_headers/additional_message_headers.php index 80c58d58b..a43018176 100644 --- a/plugins/additional_message_headers/additional_message_headers.php +++ b/plugins/additional_message_headers/additional_message_headers.php @@ -6,7 +6,7 @@ * Very simple plugin which will add additional headers * to or remove them from outgoing messages. * - * Enable the plugin in config/main.inc.php and add your desired headers: + * Enable the plugin in config.inc.php and add your desired headers: * $rcmail_config['additional_message_headers'] = array('User-Agent'); * * @version @package_version@ @@ -24,7 +24,7 @@ class additional_message_headers extends rcube_plugin function message_headers($args) { - $this->load_config(); + $this->load_config(); // additional email headers $additional_headers = rcmail::get_instance()->config->get('additional_message_headers',array()); @@ -39,5 +39,3 @@ class additional_message_headers extends rcube_plugin return $args; } } - -?> diff --git a/plugins/debug_logger/debug_logger.php b/plugins/debug_logger/debug_logger.php index 87a163785..deb6deb91 100644 --- a/plugins/debug_logger/debug_logger.php +++ b/plugins/debug_logger/debug_logger.php @@ -12,7 +12,7 @@ * which can redirect messages to files. The resulting log files * provide timing and tag quantity results. * - * Enable the plugin in config/main.inc.php and add your desired + * Enable the plugin in config.inc.php and add your desired * log types and files. * * @version @package_version@ @@ -21,7 +21,7 @@ * * Example: * - * config/main.inc.php: + * config.inc.php: * * // $rcmail_config['debug_logger'][type of logging] = name of file in log_dir * // The 'master' log includes timing information diff --git a/plugins/password/README b/plugins/password/README index 9286bee7b..af70156a6 100644 --- a/plugins/password/README +++ b/plugins/password/README @@ -63,7 +63,7 @@ ------------------- You can specify which database to connect by 'password_db_dsn' option and - what SQL query to execute by 'password_query'. See main.inc.php.dist file for + what SQL query to execute by 'password_query'. See config.inc.php.dist file for more info. Example implementations of an update_passwd function: diff --git a/plugins/show_additional_headers/show_additional_headers.php b/plugins/show_additional_headers/show_additional_headers.php index dcc384be8..c2b0ca1d3 100644 --- a/plugins/show_additional_headers/show_additional_headers.php +++ b/plugins/show_additional_headers/show_additional_headers.php @@ -6,7 +6,7 @@ * Proof-of-concept plugin which will fetch additional headers * and display them in the message view. * - * Enable the plugin in config/main.inc.php and add your desired headers: + * Enable the plugin in config.inc.php and add your desired headers: * $rcmail_config['show_additional_headers'] = array('User-Agent'); * * @version @package_version@ diff --git a/plugins/subscriptions_option/subscriptions_option.php b/plugins/subscriptions_option/subscriptions_option.php index 49adc377b..284c048df 100644 --- a/plugins/subscriptions_option/subscriptions_option.php +++ b/plugins/subscriptions_option/subscriptions_option.php @@ -7,7 +7,7 @@ * It includes a toggle on the settings page under "Server Settings". * The preference can also be locked * - * Add it to the plugins list in config/main.inc.php to enable the user option + * Add it to the plugins list in config.inc.php to enable the user option * The user option can be hidden and set globally by adding 'use_subscriptions' * to the 'dont_override' configure line: * $rcmail_config['dont_override'] = array('use_subscriptions'); diff --git a/plugins/virtuser_file/virtuser_file.php b/plugins/virtuser_file/virtuser_file.php index 974f33d3d..ed0eba189 100644 --- a/plugins/virtuser_file/virtuser_file.php +++ b/plugins/virtuser_file/virtuser_file.php @@ -3,7 +3,7 @@ /** * File based User-to-Email and Email-to-User lookup * - * Add it to the plugins list in config/main.inc.php and set + * Add it to the plugins list in config.inc.php and set * path to a virtuser table file to resolve user names and e-mail * addresses * $rcmail_config['virtuser_file'] = ''; diff --git a/plugins/virtuser_query/virtuser_query.php b/plugins/virtuser_query/virtuser_query.php index db3c5197b..04dcaf131 100644 --- a/plugins/virtuser_query/virtuser_query.php +++ b/plugins/virtuser_query/virtuser_query.php @@ -3,7 +3,7 @@ /** * DB based User-to-Email and Email-to-User lookup * - * Add it to the plugins list in config/main.inc.php and set + * Add it to the plugins list in config.inc.php and set * SQL queries to resolve usernames, e-mail addresses and hostnames from the database * %u will be replaced with the current username for login. * %m will be replaced with the current e-mail address for login. diff --git a/program/lib/Roundcube/rcube_config.php b/program/lib/Roundcube/rcube_config.php index 18055f77d..90bb85348 100644 --- a/program/lib/Roundcube/rcube_config.php +++ b/program/lib/Roundcube/rcube_config.php @@ -69,13 +69,22 @@ class rcube_config */ private function load() { - // load main config file - if (!$this->load_from_file(RCUBE_CONFIG_DIR . 'main.inc.php')) - $this->errors[] = 'main.inc.php was not found.'; + // Load default settings + if (!$this->load_from_file(RCUBE_CONFIG_DIR . 'defaults.inc.php')) { + $this->errors[] = 'defaults.inc.php was not found.'; + } - // load database config - if (!$this->load_from_file(RCUBE_CONFIG_DIR . 'db.inc.php')) - $this->errors[] = 'db.inc.php was not found.'; + // load main config file + if (!$this->load_from_file(RCUBE_CONFIG_DIR . 'config.inc.php')) { + // Old configuration files + if (!$this->load_from_file(RCUBE_CONFIG_DIR . 'main.inc.php') || + !$this->load_from_file(RCUBE_CONFIG_DIR . 'db.inc.php')) { + $this->errors[] = 'config.inc.php was not found.'; + } + else if (rand(1,100) == 10) { // log warning on every 100th request (average) + trigger_error("config.inc.php was not found. Please migrate your config by running bin/update.sh", E_USER_WARNING); + } + } // load host-specific configuration $this->load_host_config(); @@ -175,7 +184,12 @@ class rcube_config include($fpath); ob_end_clean(); - if (is_array($rcmail_config)) { + if (is_array($config)) { + $this->merge($config); + return true; + } + // deprecated name of config variable + else if (is_array($rcmail_config)) { $this->merge($rcmail_config); return true; }