X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=src%2Fconfigtest.php;h=99201f6dbc9ddd0c9692af122ac74913b9707ee1;hp=b3f6324e1b99c2ee64c694268dbe96554f521c5a;hb=9211bcef4d591ce3cf59cee202c24311d06849fd;hpb=13721b47460857d52fab789c75a42ad280cb8150 diff --git a/src/configtest.php b/src/configtest.php index b3f6324e..99201f6d 100644 --- a/src/configtest.php +++ b/src/configtest.php @@ -1,11 +1,14 @@ ERROR: ' .$str. "

\n"; + global $IND; + echo '

'.$IND.'ERROR: ' .$str. "

\n"; if($exit) { echo ''; exit; @@ -24,12 +31,13 @@ function do_err($str, $exit = TRUE) { $IND = str_repeat(' ',4); ob_implicit_flush(); +/** @ignore */ define('SM_PATH', '../'); /* - * Load config before output begins. functions/strings.php depends on + * Load config before output begins. functions/strings.php depends on * functions/globals.php. functions/global.php needs to be run before - * any html output starts. If config.php is missing, error will be displayed + * any html output starts. If config.php is missing, error will be displayed * later. */ if (file_exists(SM_PATH . 'config/config.php')) { @@ -46,7 +54,7 @@ if (file_exists(SM_PATH . 'config/config.php')) {

This script will try to check some aspects of your SquirrelMail configuration and point you to errors whereever it can find them. You need to go run conf.pl -in this directory first before you run this script.

+in the config/ directory first before you run this script.

SquirrelMail version: '.$version.'
'. - 'Config file version: '.$config_version . '
'. - 'Config file last modified: '.date ('d F Y H:i:s', filemtime(SM_PATH . 'config/config.php')).'

'; +echo "

\n\n" . + '\n" . + '\n
SquirrelMail version:" . $version . "
Config file version:' . $config_version . "
Config file last modified:' . + date ('d F Y H:i:s', filemtime(SM_PATH . 'config/config.php')) . + "
\n

\n\n"; echo "Checking PHP configuration...
\n"; -if(!check_php_version(4,0,6)) { - do_err('Insufficient PHP version: '. PHP_VERSION . '! Minimum required: 4.0.6'); +if(!check_php_version(4,1,0)) { + do_err('Insufficient PHP version: '. PHP_VERSION . '! Minimum required: 4.1.0'); } -echo $IND . 'PHP version '.PHP_VERSION.' OK.
'; +echo $IND . 'PHP version ' . PHP_VERSION . " OK.
\n"; $php_exts = array('session','pcre'); $diff = array_diff($php_exts, get_loaded_extensions()); @@ -84,8 +94,23 @@ if(count($diff)) { do_err('Required PHP extensions missing: '.implode(', ',$diff) ); } -echo $IND . 'PHP extensions OK.
'; +echo $IND . "PHP extensions OK.
\n"; +/* dangerous php settings */ +/** + * mbstring.func_overload allows to replace original string and regexp functions + * with their equivalents from php mbstring extension. It causes problems when + * scripts analyse 8bit strings byte after byte or use 8bit strings in regexp tests. + * Setting can be controlled in php.ini (php 4.2.0), webserver config (php 4.2.0) + * and .htaccess files (php 4.3.5). + */ +if (function_exists('mb_internal_encoding') && + check_php_version(4,2,0) && + (int)ini_get('mbstring.func_overload')!=0) { + $mb_error='You have enabled mbstring overloading.' + .' It can cause problems with SquirrelMail scripts that rely on single byte string functions.'; + do_err($mb_error); +} /* checking paths */ @@ -93,13 +118,13 @@ echo "Checking paths...
\n"; if(!file_exists($data_dir)) { do_err("Data dir ($data_dir) does not exist!"); -} +} if(!is_dir($data_dir)) { do_err("Data dir ($data_dir) is not a directory!"); -} +} if(!is_readable($data_dir)) { do_err("I cannot read from data dir ($data_dir)!"); -} +} if(!is_writable($data_dir)) { do_err("I cannot write to data dir ($data_dir)!"); } @@ -113,13 +138,10 @@ if($data_dir == $attachment_dir) { } else { if(!file_exists($attachment_dir)) { do_err("Attachment dir ($attachment_dir) does not exist!"); - } + } if (!is_dir($attachment_dir)) { do_err("Attachment dir ($attachment_dir) is not a directory!"); - } - if (!is_readable($attachment_dir)) { - do_err("I cannot read from attachment dir ($attachment_dir)!"); - } + } if (!is_writable($attachment_dir)) { do_err("I cannot write to attachment dir ($attachment_dir)!"); } @@ -150,6 +172,8 @@ foreach($theme as $thm) { echo $IND . "Themes OK.
\n"; +echo $IND . "Base URL detected as: " . htmlspecialchars(get_location()) . "
\n"; + /* check outgoing mail */ @@ -168,7 +192,7 @@ if($useSendmail) { // is_executable also checks for existance, but we want to be as precise as possible with the errors if(!file_exists($sendmail_path)) { do_err("Location of sendmail program incorrect ($sendmail_path)!"); - } + } if(!is_executable($sendmail_path)) { do_err("I cannot execute the sendmail program ($sendmail_path)!"); } @@ -179,31 +203,33 @@ if($useSendmail) { $errorNumber, $errorString); if(!$stream) { do_err("Error connecting to SMTP server \"$smtpServerAddress:$smtpPort\".". - "Server error: ($errorNumber) $errorString"); + "Server error: ($errorNumber) ".htmlspecialchars($errorString)); } // check for SMTP code; should be 2xx to allow us access $smtpline = fgets($stream, 1024); if(((int) $smtpline{0}) > 3) { - do_err("Error connecting to SMTP server. Server error: ".$smtpline); + do_err("Error connecting to SMTP server. Server error: ". + htmlspecialchars($smtpline)); } fputs($stream, 'QUIT'); fclose($stream); - echo $IND . 'SMTP server OK ('.trim($smtpline).")
\n"; + echo $IND . 'SMTP server OK ('. + trim(htmlspecialchars($smtpline)).")
\n"; /* POP before SMTP */ if($pop_before_smtp) { $stream = fsockopen($smtpServerAddress, 110, $err_no, $err_str); if (!$stream) { - do_err("Error connecting to POP Server ($smtpServerAddress:110)" - . " $err_no : $err_str"); + do_err("Error connecting to POP Server ($smtpServerAddress:110) " + . $err_no . ' : ' . htmlspecialchars($err_str)); } $tmp = fgets($stream, 1024); if (substr($tmp, 0, 3) != '+OK') { do_err("Error connecting to POP Server ($smtpServerAddress:110)" - . ' '.$tmp); + . ' '.htmlspecialchars($tmp)); } fputs($stream, 'QUIT'); fclose($stream); @@ -211,30 +237,199 @@ if($useSendmail) { } } +/** + * Check the IMAP server + */ echo "Checking IMAP service....
\n"; +/** Can we open a connection? */ $stream = fsockopen( ($use_imap_tls?'tls://':'').$imapServerAddress, $imapPort, $errorNumber, $errorString); if(!$stream) { do_err("Error connecting to IMAP server \"$imapServerAddress:$imapPort\".". - "Server error: ($errorNumber) $errorString"); + "Server error: ($errorNumber) ". + htmlspecialchars($errorString)); } +/** Is the first response 'OK'? */ $imapline = fgets($stream, 1024); if(substr($imapline, 0,4) != '* OK') { - do_err('Error connecting to IMAP server. Server error: '.$imapline); + do_err('Error connecting to IMAP server. Server error: '. + htmlspecialchars($imapline)); +} + +echo $IND . 'IMAP server ready ('. + htmlspecialchars(trim($imapline)).")
\n"; + +/** Check capabilities */ +fputs($stream, "A001 CAPABILITY\r\n"); +$capline = fgets($stream, 1024); + +echo $IND . 'Capabilities: '.htmlspecialchars($capline)."
\n"; + +if($imap_auth_mech == 'login' && stristr($capline, 'LOGINDISABLED') !== FALSE) { + do_err('Your server doesn\'t allow plaintext logins. '. + 'Try enabling another authentication mechanism like CRAM-MD5, DIGEST-MD5 or TLS-encryption '. + 'in the SquirrelMail configuration.', FALSE); +} +if($use_imap_tls && stristr($capline, 'STARTTLS') === FALSE) { + do_err('You have enabled TLS encryption in the config, but the server does not '. + 'report STARTTLS capability. TLS is probably not supported.', FALSE); } -fputs($stream, '001 LOGOUT'); +/** OK, close connection */ +fputs($stream, "A002 LOGOUT\r\n"); fclose($stream); -echo $IND . 'IMAP server OK ('.trim($imapline).")
\n"; +echo "Checking internationalization (i18n) settings...
\n"; +echo "$IND gettext - "; +if (function_exists('gettext')) { + echo 'Gettext functions are available.' + .' On some systems you must have appropriate system locales compiled.' + ."
\n"; +} else { + echo 'Gettext functions are unavailable.' + .' SquirrelMail will use slower internal gettext functions.' + ."
\n"; +} +echo "$IND mbstring - "; +if (function_exists('mb_detect_encoding')) { + echo "Mbstring functions are available.
\n"; +} else { + echo 'Mbstring functions are unavailable.' + ." Japanese translation won't work.
\n"; +} +echo "$IND recode - "; +if (function_exists('recode')) { + echo "Recode functions are available.
\n"; +} elseif ($use_php_recode) { + echo "Recode functions are unavailable.
\n"; + do_err('Your configuration requires recode support, but recode support is missing.'); +} else { + echo "Recode functions are unavailable.
\n"; +} +echo "$IND iconv - "; +if (function_exists('iconv')) { + echo "Iconv functions are available.
\n"; +} elseif ($use_php_iconv) { + echo "Iconv functions are unavailable.
\n"; + do_err('Your configuration requires iconv support, but iconv support is missing.'); +} else { + echo "Iconv functions are unavailable.
\n"; +} +// same test as in include/validate.php +echo "$IND timezone - "; +if ( (!ini_get('safe_mode')) || + !strcmp(ini_get('safe_mode_allowed_env_vars'),'') || + preg_match('/^([\w_]+,)*TZ/', ini_get('safe_mode_allowed_env_vars')) ) { + echo "Webmail users can change their time zone settings.
\n"; +} else { + echo "Webmail users can't change their time zone settings.
\n"; +} + + +// Pear DB tests +echo "Checking database functions...
\n"; +if($addrbook_dsn || $prefs_dsn || $addrbook_global_dsn) { + @include_once('DB.php'); + if (class_exists('DB')) { + echo "$IND PHP Pear DB support is present.
\n"; + $db_functions=array( + 'dbase' => 'dbase_open', + 'fbsql' => 'fbsql_connect', + 'interbase' => 'ibase_connect', + 'informix' => 'ifx_connect', + 'msql' => 'msql_connect', + 'mssql' => 'mssql_connect', + 'mysql' => 'mysql_connect', + 'mysqli' => 'mysqli_connect', + 'oci8' => 'ocilogon', + 'odbc' => 'odbc_connect', + 'pgsql' => 'pgsql_connect', + 'sqlite' => 'sqlite_open', + 'sybase' => 'sybase_connect' + ); + + $dsns = array(); + if($prefs_dsn) { + $dsns['preferences'] = $prefs_dsn; + } + if($addrbook_dsn) { + $dsns['addressbook'] = $addrbook_dsn; + } + if($addrbook_global_dsn) { + $dsns['global addressbook'] = $addrbook_global_dsn; + } + + foreach($dsns as $type => $dsn) { + $dbtype = array_shift(explode(':', $dsn)); + if(isset($db_functions[$dbtype]) && function_exists($db_functions[$dbtype])) { + echo "$IND$dbtype database support present.
\n"; -// other possible checks: -// ? prefs/abook DSN -// ? locale/gettext -// ? actually start a session to see if it works -// ? ... + // now, test this interface: + + $dbh = DB::connect($dsn, true); + if (DB::isError($dbh)) { + do_err('Database error: '. htmlspecialchars(DB::errorMessage($dbh)) . + ' in ' .$type .' DSN.'); + } + $dbh->disconnect(); + echo "$IND$type database connect successful.
\n"; + + } else { + do_err($db.' database support not present!'); + } + } + } else { + $db_error='Required PHP PEAR DB support is not available.' + .' Is PEAR installed and is the include path set correctly to find DB.php?' + .' The include path is now:' . ini_get('include_path') . '.'; + do_err($db_error); + } +} else { + echo $IND."not using database functionality.
\n"; +} + +// LDAP DB tests +echo "Checking LDAP functions...
\n"; +if( empty($ldap_server) ) { + echo $IND."not using LDAP functionality.
\n"; +} else { + if ( !function_exists(ldap_connect) ) { + do_err('Required LDAP support is not available.'); + } else { + echo "$IND LDAP support present.
\n"; + foreach ( $ldap_server as $param ) { + + $linkid = ldap_connect($param['host'], (empty($param['port']) ? 389 : $param['port']) ); + + if ( $linkid ) { + echo "$IND LDAP connect to ".$param['host']." successful: ".$linkid."
\n"; + + if ( !empty($param['protocol']) && + !ldap_set_option($linkid, LDAP_OPT_PROTOCOL_VERSION, $param['protocol']) ) { + do_err('Unable to set LDAP protocol'); + } + + if ( empty($param['binddn']) ) { + $bind = ldap_bind($linkid); + } else { + $bind = ldap_bind($param['binddn'], $param['bindpw']); + } + + if ( $bind ) { + echo "$IND LDAP Bind Successful
"; + } else { + do_err('Unable to Bind to LDAP Server'); + } + + ldap_close($linkid); + } else { + do_err('Connection to LDAP failed'); + } + } + } +} ?>

Congratulations, your SquirrelMail setup looks fine to me!

@@ -243,3 +438,6 @@ echo $IND . 'IMAP server OK ('.trim($imapline).")
\ + \ No newline at end of file