X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2Fconfigtest.php;h=2c7cfeabfaa0975e12b0777bd7778e1b2e890b6c;hb=d3018c7beb7d7638f775ee4ff006ec107c645418;hp=2a50d2e6acb6c03b7207582ec30d1c43f8d293c7;hpb=5fbc3f186a583d0ed1c55d01f428caccb316420c;p=squirrelmail.git diff --git a/src/configtest.php b/src/configtest.php index 2a50d2e6..2c7cfeab 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,16 @@ function do_err($str, $exit = TRUE) { $IND = str_repeat(' ',4); ob_implicit_flush(); +/** @ignore */ define('SM_PATH', '../'); +/* set default value in order to block remote access to script */ +$allow_remote_configtest=false; + /* - * 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')) { @@ -39,6 +50,7 @@ if (file_exists(SM_PATH . 'config/config.php')) { ?> + SquirrelMail configtest @@ -46,11 +58,10 @@ 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"; @@ -76,7 +96,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()); @@ -84,39 +104,75 @@ 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 analyze 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 */ 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)!"); + // data_dir is not that important in db_setups. + if (isset($prefs_dsn) && ! empty($prefs_dsn)) { + $data_dir_error = "Data dir ($data_dir) does not exist!\n"; + echo $IND .'ERROR: ' . $data_dir_error; + } else { + do_err("Data dir ($data_dir) does not exist!"); + } +} +// don't check if errors +if(!isset($data_dir_error) && !is_dir($data_dir)) { + if (isset($prefs_dsn) && ! empty($prefs_dsn)) { + $data_dir_error = "Data dir ($data_dir) is not a directory!\n"; + echo $IND . 'ERROR: ' . $data_dir_error; + } else { + do_err("Data dir ($data_dir) is not a directory!"); + } +} +// datadir should be executable - but no clean way to test on that +if(!isset($data_dir_error) && !is_writable($data_dir)) { + if (isset($prefs_dsn) && ! empty($prefs_dsn)) { + $data_dir_error = "Data dir ($data_dir) is not writable!\n"; + echo $IND . 'ERROR: ' . $data_dir_error; + } else { + do_err("Data dir ($data_dir) is not writable!"); + } } -// todo_ornot: actually write something and read it back. -echo $IND . "Data dir OK.
\n"; - +if (isset($data_dir_error)) { + echo " Some plugins might need access to data directory.
\n"; +} else { + // todo_ornot: actually write something and read it back. + echo $IND . "Data dir OK.
\n"; +} if($data_dir == $attachment_dir) { echo $IND . "Attachment dir is the same as data dir.
\n"; + if (isset($data_dir_error)) { + do_err($data_dir_error); + } } 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)!"); } @@ -147,6 +203,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 */ @@ -165,7 +241,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)!"); } @@ -176,31 +252,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); @@ -208,37 +286,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) $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)); } -fputs($stream, '001 LOGOUT'); -fclose($stream); +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); +} -echo $IND . 'IMAP server OK ('.trim($imapline).")
\n"; +/** OK, close connection */ +fputs($stream, "A002 LOGOUT\r\n"); +fclose($stream); -echo "Checking i18n settings:
\n"; +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')) { @@ -263,15 +371,114 @@ 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."; + echo "Webmail users can change their time zone settings.
\n"; } else { - echo "Webmail users can't change their time zone settings."; + echo "Webmail users can't change their time zone settings.
\n"; } -// other possible checks: -// ? prefs/abook DSN -// ? actually start a session to see if it works -// ? ... + +// 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' => 'pg_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 { + $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!

@@ -280,3 +487,6 @@ if ( (!ini_get('safe_mode')) || +