X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=src%2Fconfigtest.php;h=e65c147c5707fda2c217349780a0aa75d1e140f8;hp=f60b67abba99b4a5ddafa6a3061767672fcb002d;hb=d4eaadbe7c054eee5d869ff29ffc8775bfcaffe9;hpb=9c94172852694cfc7c4cb64e2ea4cef6c5c3f9d6 diff --git a/src/configtest.php b/src/configtest.php index f60b67ab..e65c147c 100644 --- a/src/configtest.php +++ b/src/configtest.php @@ -1,8 +1,9 @@ '.$IND.'ERROR: ' .$str. "

\n"; @@ -31,9 +35,9 @@ ob_implicit_flush(); 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')) { @@ -70,9 +74,11 @@ if(!in_array('strings.php', $included)) { /* checking PHP specs */ -echo '

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"; @@ -80,7 +86,7 @@ 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()); @@ -88,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 */ @@ -97,13 +118,11 @@ 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)!"); -} +} +// datadir should be executable - but no clean way to test on that if(!is_writable($data_dir)) { do_err("I cannot write to data dir ($data_dir)!"); } @@ -117,10 +136,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_writable($attachment_dir)) { do_err("I cannot write to attachment dir ($attachment_dir)!"); } @@ -151,6 +170,26 @@ foreach($theme as $thm) { echo $IND . "Themes OK.
\n"; +if ( $squirrelmail_default_language != 'en_US' ) { + $loc_path = SM_PATH .'locale/'.$squirrelmail_default_language.'/LC_MESSAGES/squirrelmail.mo'; + if( ! file_exists( $loc_path ) ) { + do_err('You have set ' . $squirrelmail_default_language . + ' as your default language, but I cannot find this translation (should be '. + 'in ' . $loc_path . '). Please note that you have to download translations '. + 'separately from the main SquirrelMail package.', FALSE); + } elseif ( ! is_readable( $loc_path ) ) { + do_err('You have set ' . $squirrelmail_default_language . + ' as your default language, but I cannot read this translation (file '. + 'in ' . $loc_path . ' unreadable).', FALSE); + } else { + echo $IND . "Default language OK.
\n"; + } +} else { + echo $IND . "Default language OK.
\n"; +} + +echo $IND . "Base URL detected as: " . htmlspecialchars(get_location()) . "
\n"; + /* check outgoing mail */ @@ -169,7 +208,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)!"); } @@ -187,7 +226,7 @@ if($useSendmail) { $smtpline = fgets($stream, 1024); if(((int) $smtpline{0}) > 3) { do_err("Error connecting to SMTP server. Server error: ". - htmlspecialchars($smtpline)); + htmlspecialchars($smtpline)); } fputs($stream, 'QUIT'); @@ -214,40 +253,67 @@ 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) ". - htmlspecialchars($errorString)); + 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: '. htmlspecialchars($imapline)); } -fputs($stream, '001 LOGOUT'); -fclose($stream); - -echo $IND . 'IMAP server OK ('. +echo $IND . 'IMAP server ready ('. htmlspecialchars(trim($imapline)).")
\n"; -echo "Checking internationalization (i18n) settings:
\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); +} + +/** OK, close connection */ +fputs($stream, "A002 LOGOUT\r\n"); +fclose($stream); + +echo "Checking internationalization (i18n) settings...
\n"; echo "$IND gettext - "; if (function_exists('gettext')) { - echo "Gettext functions are available. You must have appropriate system locales compiled.
\n"; + 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 '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 'Mbstring functions are unavailable.' + ." Japanese translation won't work.
\n"; } echo "$IND recode - "; if (function_exists('recode')) { @@ -272,7 +338,7 @@ 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"; + echo "Webmail users can change their time zone settings.
\n"; } else { echo "Webmail users can't change their time zone settings.
\n"; } @@ -281,55 +347,105 @@ if ( (!ini_get('safe_mode')) || // 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"; - - // 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!'); - } + @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"; + + // 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 { - do_err('Required PHP Pear DB support is not available.');; - } + } + } 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!

@@ -338,3 +454,6 @@ if($addrbook_dsn || $prefs_dsn || $addrbook_global_dsn) { +