Source for file configtest.php

Documentation is available at configtest.php

  1. <?php
  2.  
  3. /**
  4.  * SquirrelMail configtest script
  5.  *
  6.  * @copyright 2003-2014 The SquirrelMail Project Team
  7.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  8.  * @version $Id: configtest.php 14422 2014-01-01 20:59:43Z pdontthink $
  9.  * @package squirrelmail
  10.  * @subpackage config
  11.  */
  12.  
  13. /************************************************************
  14.  * NOTE: you do not need to change this script!             *
  15.  * If it throws errors you need to adjust your config.      *
  16.  ************************************************************/
  17.  
  18. function do_err($str$exit TRUE{
  19.     global $IND;
  20.     echo '<p>'.$IND.'<font color="red"><b>ERROR:</b></font> ' .$str"</p>\n";
  21.     if($exit{
  22.          echo '</body></html>';
  23.          exit;
  24.     }
  25. }
  26.  
  27. /** This is the configtest page */
  28. define('PAGE_NAME''configtest');
  29.  
  30. /** @ignore */
  31. define('SM_PATH''../');
  32.  
  33. /*
  34.  * Load config before output begins.
  35.  * functions/global.php cleans environment, then loads
  36.  * functions/strings.php and config/config.php
  37.  */
  38. if (file_exists(SM_PATH 'config/config.php')) {
  39.     include(SM_PATH 'functions/global.php');
  40. }
  41. $IND str_repeat('&nbsp;',4);
  42.  
  43. // this must be done before the output is started because it may use the
  44. // session
  45. $test_location get_location();
  46. ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  47. <html>
  48. <head>
  49.   <meta name="robots" content="noindex,nofollow">
  50.   <title>SquirrelMail configtest</title>
  51. </head>
  52. <body>
  53. <h1>SquirrelMail configtest</h1>
  54.  
  55. <p>This script will try to check some aspects of your SquirrelMail configuration
  56. and point you to errors whereever it can find them. You need to go run <tt>conf.pl</tt>
  57. in the <tt>config/</tt> directory first before you run this script.</p>
  58.  
  59. <?php
  60.  
  61. $included array_map('basename'get_included_files() );
  62. if(!in_array('config.php'$included)) {
  63.     if(!file_exists(SM_PATH 'config/config.php')) {
  64.         do_err('Config file '.SM_PATH 'config/config.php does not exist!<br />'.
  65.                 'You need to run <tt>conf.pl</tt> first.');
  66.     }
  67.     do_err('Could not read '.SM_PATH.'config/config.php! Check file permissions.');
  68. }
  69. if(!in_array('strings.php'$included)) {
  70.     do_err('Could not include '.SM_PATH.'functions/strings.php!<br />'.
  71.             'Check permissions on that file.');
  72. }
  73.  
  74. /* checking PHP specs */
  75.  
  76. echo "<p><table>\n<tr><td>SquirrelMail version:</td><td><b>" $version "</b></td></tr>\n" .
  77.      '<tr><td>Config file version:</td><td><b>' $config_version "</b></td></tr>\n" .
  78.      '<tr><td>Config file last modified:</td><td><b>' .
  79.          date ('d F Y H:i:s'filemtime(SM_PATH 'config/config.php')) .
  80.          "</b></td></tr>\n</table>\n</p>\n\n";
  81.  
  82. echo "Checking PHP configuration...<br />\n";
  83.  
  84. if(!check_php_version(4,1,0)) {
  85.     do_err('Insufficient PHP version: 'PHP_VERSION '! Minimum required: 4.1.0');
  86. }
  87.  
  88. echo $IND 'PHP version ' PHP_VERSION " OK.<br />\n";
  89.  
  90. // try to determine information about the user and group the web server is running as
  91. //
  92. $webOwnerID 'N/A';
  93. $webOwnerInfo array('name' => 'N/A');
  94. if (function_exists('posix_getuid'))
  95.     $webOwnerID posix_getuid();
  96. if ($webOwnerID === FALSE)
  97.     $webOwnerID 'N/A';
  98. if ($webOwnerID !== 'N/A' && function_exists('posix_getpwuid'))
  99.     $webOwnerInfo posix_getpwuid($webOwnerID);
  100. if (!$webOwnerInfo)
  101.     $webOwnerInfo array('name' => 'N/A');
  102. $webGroupID 'N/A';
  103. $webGroupInfo array('name' => 'N/A');
  104. if (function_exists('posix_getgid'))
  105.     $webGroupID posix_getgid();
  106. if ($webGroupID === FALSE)
  107.     $webGroupID 'N/A';
  108. if ($webGroupID !== 'N/A' && function_exists('posix_getgrgid'))
  109.     $webGroupInfo posix_getgrgid($webGroupID);
  110. if (!$webGroupInfo)
  111.     $webGroupInfo array('name' => 'N/A');
  112.  
  113. echo $IND 'Running as ' $webOwnerInfo['name''(' $webOwnerID
  114.           . ') / ' $webGroupInfo['name''(' $webGroupID ")<br />\n";
  115.  
  116. echo $IND 'display_errors: ' ini_get('display_errors'"<br />\n";
  117.  
  118. echo $IND 'error_reporting: ' ini_get('error_reporting'"<br />\n";
  119.  
  120. if ((bool) ini_get('session.auto_start'&& ini_get('session.auto_start'!= 'off'{
  121.     $msg 'session.auto_start is turned on in your PHP configuration, but SquirrelMail'
  122.          . ' 1.4.x will not work with it (otherwise valid logins will usually'
  123.          . ' result in "You must be logged in to access this page" errors).'
  124.          . ' You can disable session.auto_start only in the squirrelmail directory' 
  125.          . ' if you need to leave it turned on for other applications.';
  126.     do_err($msgtrue);
  127. }
  128.  
  129. $safe_mode ini_get('safe_mode');
  130. if ($safe_mode{
  131.     echo $IND 'safe_mode: ' $safe_mode;
  132.     if (empty($prefs_dsn|| empty($addrbook_dsn))
  133.         echo ' (<font color="red">double check data and attachment directory ownership, etc!</font>)';
  134.     if (!empty($addrbook_dsn|| !empty($prefs_dsn|| !empty($addrbook_global_dsn))
  135.         echo ' (<font color="red">does PHP have access to database interface?</font>)';
  136.     echo "<br />\n";
  137.     $safe_mode_exec_dir ini_get('safe_mode_exec_dir');
  138.     echo $IND 'safe_mode_exec_dir: ' $safe_mode_exec_dir "<br />\n";
  139. }
  140.  
  141. /* variables_order check */
  142.  
  143. // FIXME(?): Hmm, how do we distinguish between when an ini setting is
  144. //           not available (ini_set() returns empty string) and when
  145. //           the administrator set the value to an empty string?  The
  146. //           latter is sure to be highly rare, so for now, just assume
  147. //           that empty value means the setting isn't even available
  148. //           (could also check PHP version when this setting was implemented)
  149. //           although, we'll also warn the user if it is empty, with
  150. //           a non-fatal error
  151. $variables_order strtoupper(ini_get('variables_order'));
  152. if (empty($variables_order))
  153.     do_err('Your variables_order setting seems to be empty.  Make sure it is undefined in any PHP ini files, .htaccess files, etc. and not specifically set to an empty value or SquirrelMail may not function correctly'false);
  154. else if (strpos($variables_order'G'=== FALSE
  155.  || strpos($variables_order'P'=== FALSE
  156.  || strpos($variables_order'C'=== FALSE
  157.  || strpos($variables_order'S'=== FALSE{
  158.     do_err('Your variables_order setting is insufficient for SquirrelMail to function.  It needs at least "GPCS", but you have it set to "' sm_encode_html_special_chars($variables_order'"'true);
  159. else {
  160.     echo $IND "variables_order OK: $variables_order.<br />\n";
  161. }
  162.  
  163.  
  164. /* gpc_order check (removed from PHP as of v5.0) */
  165.  
  166. if (!check_php_version(5)) {
  167.     // FIXME(?): Hmm, how do we distinguish between when an ini setting is
  168.     //           not available (ini_set() returns empty string) and when
  169.     //           the administrator set the value to an empty string?  The
  170.     //           latter is sure to be highly rare, so for now, just assume
  171.     //           that empty value means the setting isn't even available
  172.     //           (could also check PHP version when this setting was implemented)
  173.     //           although, we'll also warn the user if it is empty, with
  174.     //           a non-fatal error
  175.     $gpc_order strtoupper(ini_get('gpc_order'));
  176.     if (empty($gpc_order))
  177.         do_err('Your gpc_order setting seems to be empty.  Make sure it is undefined in any PHP ini files, .htaccess files, etc. and not specifically set to an empty value or SquirrelMail may not function correctly'false);
  178.     else if (strpos($gpc_order'G'=== FALSE
  179.      || strpos($gpc_order'P'=== FALSE
  180.      || strpos($gpc_order'C'=== FALSE{
  181.         do_err('Your gpc_order setting is insufficient for SquirrelMail to function.  It needs to be set to "GPC", but you have it set to "' sm_encode_html_special_chars($gpc_order'"'true);
  182.     else {
  183.         echo $IND "gpc_order OK: $gpc_order.<br />\n";
  184.     }
  185. }
  186.  
  187.  
  188. $php_exts array('session','pcre');
  189. $diff array_diff($php_extsget_loaded_extensions());
  190. if(count($diff)) {
  191.     do_err('Required PHP extensions missing: '.implode(', ',$diff) );
  192. }
  193.  
  194. echo $IND "PHP extensions OK. Dynamic loading is ";
  195.  
  196. if (!(bool)ini_get('enable_dl'|| (bool)ini_get('safe_mode')) {
  197.     echo "disabled.<br />\n";
  198. else {
  199.     echo "enabled.<br />\n";
  200. }
  201.  
  202.  
  203. /* dangerous php settings */
  204. /** mbstring.func_overload<>0 fix. See cvs HEAD comments. */
  205. if (function_exists('mb_internal_encoding'&&
  206.     check_php_version(4,2,0&&
  207.     (int)ini_get('mbstring.func_overload')!=0{
  208.     $mb_error='You have enabled mbstring overloading.'
  209.         .' It can cause problems with SquirrelMail scripts that rely on single byte string functions.';
  210.     do_err($mb_error);
  211. }
  212.  
  213. /**
  214.  * We code with register_globals = off. SquirrelMail should work in such setup
  215.  * since 1.2.9 and 1.3.0. Running SquirrelMail with register_globals = on can
  216.  * cause variable corruption and security issues. Globals can be turned off in
  217.  * php.ini, webserver config and .htaccess files. Scripts can turn off globals only
  218.  * in php 4.2.3 or older.
  219.  */
  220. if ((bool) ini_get('register_globals'&&
  221.     ini_get('register_globals'!= 'off'{
  222.     $rg_error='You have enabled PHP register_globals.'
  223.         .' Running PHP installation with register_globals=on can cause problems.'
  224.         .' See <a href="http://www.php.net/manual/en/security.registerglobals.php">'
  225.         .'security information about register_globals</a>.';
  226.     do_err($rg_error,false);
  227. }
  228.  
  229. /**
  230.  * Do not use SquirrelMail with magic_quotes_* on.
  231.  */
  232. if ( (function_exists('get_magic_quotes_runtime'&&  @get_magic_quotes_runtime()) ||
  233.      (function_exists('get_magic_quotes_gpc'&& @get_magic_quotes_gpc()) ||
  234.     (bool) ini_get('magic_quotes_sybase'&& ini_get('magic_quotes_sybase'!= 'off' )
  235.     {
  236.     $magic_quotes_warning='You have enabled any one of <tt>magic_quotes_runtime</tt>, '
  237.         .'<tt>magic_quotes_gpc</tt> or <tt>magic_quotes_sybase</tt> in your PHP '
  238.         .'configuration. We recommend all those settings to be off. SquirrelMail '
  239.         .'may work with them on, but when experiencing stray backslashes in your mail '
  240.         .'or other strange behaviour, it may be advisable to turn them off.';
  241.     do_err($magic_quotes_warning,false);
  242. }
  243.  
  244. if (ini_get('short_open_tag'== 0{
  245.     $short_open_tag_warning 'You have configured PHP not to allow short tags '
  246.         . '(<tt>short_open_tag=off</tt>). This shouldn\'t be a problem with '
  247.         . 'SquirrelMail or any plugin coded coded according to the '
  248.         . 'SquirrelMail Coding Guidelines, but if you experience problems with '
  249.         . 'PHP code being displayed in some of the pages and changing setting '
  250.         . 'to "on" solves the problem, please file a bug report against the '
  251.         . 'failing plugin. The correct contact information is most likely '
  252.         . 'to be found in the plugin documentation.';
  253.     do_err($short_open_tag_warningfalse);
  254. }
  255.  
  256. /* checking paths */
  257.  
  258. echo "Checking paths...<br />\n";
  259.  
  260. if(!file_exists($data_dir)) {
  261.     do_err("Data dir ($data_dir) does not exist!");
  262. }
  263. if(!is_dir($data_dir)) {
  264.     do_err("Data dir ($data_dir) is not a directory!");
  265. }
  266. // datadir should be executable - but no clean way to test on that
  267. if(!is_writable($data_dir)) {
  268.     do_err("I cannot write to data dir ($data_dir)!");
  269. }
  270.  
  271. // todo_ornot: actually write something and read it back.
  272. echo $IND "Data dir OK.<br />\n";
  273.  
  274.  
  275. if($data_dir == $attachment_dir{
  276.     echo $IND "Attachment dir is the same as data dir.<br />\n";
  277. else {
  278.     if(!file_exists($attachment_dir)) {
  279.         do_err("Attachment dir ($attachment_dir) does not exist!");
  280.     }
  281.     if (!is_dir($attachment_dir)) {
  282.         do_err("Attachment dir ($attachment_dir) is not a directory!");
  283.     }
  284.     if (!is_writable($attachment_dir)) {
  285.         do_err("I cannot write to attachment dir ($attachment_dir)!");
  286.     }
  287.     echo $IND "Attachment dir OK.<br />\n";
  288. }
  289.  
  290.  
  291. /* check plugins and themes */
  292. if (isset($plugins[0])) {
  293.     foreach($plugins as $plugin{
  294.         if(!file_exists(SM_PATH .'plugins/'.$plugin)) {
  295.             do_err('You have enabled the <i>'.$plugin.'</i> plugin, but I cannot find it.'FALSE);
  296.         elseif (!is_readable(SM_PATH .'plugins/'.$plugin.'/setup.php')) {
  297.             do_err('You have enabled the <i>'.$plugin.'</i> plugin, but I cannot read its setup.php file.'FALSE);
  298.         }
  299.     }
  300.     // load plugin functions
  301.     include_once(SM_PATH 'functions/plugin.php');
  302.     // turn on output buffering in order to prevent output of new lines
  303.     ob_start();
  304.     foreach ($plugins as $name{
  305.         use_plugin($name);
  306.     }
  307.     // get output and remove whitespace
  308.     $output trim(ob_get_contents());
  309.     ob_end_clean();
  310.     // if plugins output more than newlines and spacing, stop script execution.
  311.     if (!empty($output)) {
  312.         $plugin_load_error 'Some output is produced when plugins are loaded. Usually this means there is an error in one of the plugin setup or configuration files. The output was: '.sm_encode_html_special_chars($output);
  313.         do_err($plugin_load_error);
  314.     }
  315.     /**
  316.      * This hook was added in 1.5.2 and 1.4.10. Each plugins should print an error
  317.      * message and return TRUE if there are any errors in its setup/configuration.
  318.      */
  319.     $plugin_err boolean_hook_function('configtest'NULL1);
  320.     if($plugin_err{
  321.         do_err('Some plugin tests failed.');
  322.     else {
  323.         echo $IND "Plugins OK.<br />\n";
  324.     }
  325. else {
  326.     echo $IND "Plugins are not enabled in config.<br />\n";
  327. }
  328. foreach($theme as $thm{
  329.     if(!file_exists($thm['PATH'])) {
  330.         do_err('You have enabled the <i>'.$thm['NAME'].'</i> theme but I cannot find it ('.$thm['PATH'].').'FALSE);
  331.     elseif(!is_readable($thm['PATH'])) {
  332.         do_err('You have enabled the <i>'.$thm['NAME'].'</i> theme but I cannot read it ('.$thm['PATH'].').'FALSE);
  333.     }
  334. }
  335.  
  336. echo $IND "Themes OK.<br />\n";
  337.  
  338. if $squirrelmail_default_language != 'en_US' {
  339.     $loc_path SM_PATH .'locale/'.$squirrelmail_default_language.'/LC_MESSAGES/squirrelmail.mo';
  340.     iffile_exists$loc_path ) ) {
  341.         do_err('You have set <i>' $squirrelmail_default_language .
  342.                 '</i> as your default language, but I cannot find this translation (should be '.
  343.                 'in <tt>' $loc_path '</tt>). Please note that you have to download translations '.
  344.                 'separately from the main SquirrelMail package.'FALSE);
  345.     elseif is_readable$loc_path ) ) {
  346.         do_err('You have set <i>' $squirrelmail_default_language .
  347.                 '</i> as your default language, but I cannot read this translation (file '.
  348.                 'in <tt>' $loc_path '</tt> unreadable).'FALSE);
  349.     else {
  350.         echo $IND "Default language OK.<br />\n";
  351.     }
  352. else {
  353.     echo $IND "Default language OK.<br />\n";
  354. }
  355.  
  356. echo $IND "Base URL detected as: <tt>" sm_encode_html_special_chars($test_location.
  357.     "</tt> (location base " (empty($config_location_base'autodetected' 'set to <tt>' .
  358.     sm_encode_html_special_chars($config_location_base)."</tt>"")<br />\n";
  359.  
  360. /* check outgoing mail */
  361.  
  362. if($use_smtp_tls || $use_imap_tls{
  363.     if(!check_php_version(4,3,0)) {
  364.         do_err('You need at least PHP 4.3.0 for SMTP/IMAP TLS!');
  365.     }
  366.     if(!extension_loaded('openssl')) {
  367.         do_err('You need the openssl PHP extension to use SMTP/IMAP TLS!');
  368.     }
  369. }
  370.  
  371. echo "Checking outgoing mail service....<br />\n";
  372.  
  373. if($useSendmail{
  374.     // is_executable also checks for existance, but we want to be as precise as possible with the errors
  375.     if(!file_exists($sendmail_path)) {
  376.         do_err("Location of sendmail program incorrect ($sendmail_path)!");
  377.     }
  378.     if(!is_executable($sendmail_path)) {
  379.         do_err("I cannot execute the sendmail program ($sendmail_path)!");
  380.     }
  381.  
  382.     echo $IND "sendmail OK<br />\n";
  383. else {
  384.     $stream fsockopen( ($use_smtp_tls?'tls://':'').$smtpServerAddress$smtpPort,
  385.             $errorNumber$errorString);
  386.     if(!$stream{
  387.         do_err("Error connecting to SMTP server \"$smtpServerAddress:$smtpPort\".".
  388.                 "Server error: ($errorNumber".sm_encode_html_special_chars($errorString));
  389.     }
  390.  
  391.     // check for SMTP code; should be 2xx to allow us access
  392.     $smtpline fgets($stream1024);
  393.     if(((int) $smtpline{0}3{
  394.         do_err("Error connecting to SMTP server. Server error: ".
  395.                 sm_encode_html_special_chars($smtpline));
  396.     }
  397.  
  398.     fputs($stream'QUIT');
  399.     fclose($stream);
  400.     echo $IND 'SMTP server OK (<tt><small>'.
  401.             trim(sm_encode_html_special_chars($smtpline))."</small></tt>)<br />\n";
  402.  
  403.     /* POP before SMTP */
  404.     if($pop_before_smtp{
  405.         if (empty($pop_before_smtp_host)) $pop_before_smtp_host $smtpServerAddress;
  406.         $stream fsockopen($pop_before_smtp_host110$err_no$err_str);
  407.         if (!$stream{
  408.             do_err("Error connecting to POP Server ($pop_before_smtp_host:110) "
  409.                 . $err_no ' : ' sm_encode_html_special_chars($err_str));
  410.         }
  411.  
  412.         $tmp fgets($stream1024);
  413.         if (substr($tmp03!= '+OK'{
  414.             do_err("Error connecting to POP Server ($pop_before_smtp_host:110)"
  415.                 . ' '.sm_encode_html_special_chars($tmp));
  416.         }
  417.         fputs($stream'QUIT');
  418.         fclose($stream);
  419.         echo $IND "POP-before-SMTP OK.<br />\n";
  420.     }
  421. }
  422.  
  423. /**
  424.  * Check the IMAP server
  425.  */
  426. echo "Checking IMAP service....<br />\n";
  427.  
  428. /** Can we open a connection? */
  429. $stream fsockopen( ($use_imap_tls?'tls://':'').$imapServerAddress$imapPort,
  430.         $errorNumber$errorString);
  431. if(!$stream{
  432.     do_err("Error connecting to IMAP server \"$imapServerAddress:$imapPort\".".
  433.             "Server error: ($errorNumber".
  434.             sm_encode_html_special_chars($errorString));
  435. }
  436.  
  437. /** Is the first response 'OK'? */
  438. $imapline fgets($stream1024);
  439. if(substr($imapline0,4!= '* OK'{
  440.     do_err('Error connecting to IMAP server. Server error: '.
  441.             sm_encode_html_special_chars($imapline));
  442. }
  443.  
  444. echo $IND 'IMAP server ready (<tt><small>'.
  445.     sm_encode_html_special_chars(trim($imapline))."</small></tt>)<br />\n";
  446.  
  447. /** Check capabilities */
  448. fputs($stream"A001 CAPABILITY\r\n");
  449. $capline fgets($stream1024);
  450.  
  451. echo $IND 'Capabilities: <tt>'.sm_encode_html_special_chars($capline)."</tt><br />\n";
  452.  
  453. if($imap_auth_mech == 'login' && stristr($capline'LOGINDISABLED'!== FALSE{
  454.     do_err('Your server doesn\'t allow plaintext logins. '.
  455.             'Try enabling another authentication mechanism like CRAM-MD5, DIGEST-MD5 or TLS-encryption '.
  456.             'in the SquirrelMail configuration.'FALSE);
  457. }
  458.  
  459. if (stristr($capline'XMAGICTRASH'!== false{
  460.     $magic_trash 'It looks like IMAP_MOVE_EXPUNGE_TO_TRASH option is turned on '
  461.         .'in your Courier IMAP configuration. Courier does not provide tools that '
  462.         .'allow to detect folder used for Trash or commands are not documented. '
  463.         .'SquirrelMail can\'t detect special trash folder. SquirrelMail manages '
  464.         .'all message deletion or move operations internally and '
  465.         .'IMAP_MOVE_EXPUNGE_TO_TRASH option can cause errors in message and '
  466.         .'folder management operations. Please turn off IMAP_MOVE_EXPUNGE_TO_TRASH '
  467.         .'option in Courier imapd configuration.';
  468.     do_err($magic_trash,false);
  469. }
  470.  
  471. /* add warning about IMAP delivery */
  472. if (stristr($capline'XCOURIEROUTBOX'!== false{
  473.     $courier_outbox 'OUTBOX setting is enabled in your Courier imapd '
  474.         .'configuration. SquirrelMail uses standard SMTP protocol or sendmail '
  475.         .'binary to send emails. Courier IMAP delivery method is not supported'
  476.         .' and can create duplicate email messages.';
  477.     do_err($courier_outbox,false);
  478. }
  479.  
  480. /** OK, close connection */
  481. fputs($stream"A002 LOGOUT\r\n");
  482. fclose($stream);
  483.  
  484. echo "Checking internationalization (i18n) settings...<br />\n";
  485. echo "$IND gettext - ";
  486. if (function_exists('gettext')) {
  487.     echo 'Gettext functions are available.'
  488.         .' On some systems you must have appropriate system locales compiled.'
  489.         ."<br />\n";
  490. else {
  491.     echo 'Gettext functions are unavailable.'
  492.         .' SquirrelMail will use slower internal gettext functions.'
  493.         ."<br />\n";
  494. }
  495. echo "$IND mbstring - ";
  496. if (function_exists('mb_detect_encoding')) {
  497.     echo "Mbstring functions are available.<br />\n";
  498. else {
  499.     echo 'Mbstring functions are unavailable.'
  500.         ." Japanese translation won't work.<br />\n";
  501. }
  502. echo "$IND recode - ";
  503. if (function_exists('recode')) {
  504.     echo "Recode functions are available.<br />\n";
  505. elseif (isset($use_php_recode&& $use_php_recode{
  506.     echo "Recode functions are unavailable.<br />\n";
  507.     do_err('Your configuration requires recode support, but recode support is missing.');
  508. else {
  509.     echo "Recode functions are unavailable.<br />\n";
  510. }
  511. echo "$IND iconv - ";
  512. if (function_exists('iconv')) {
  513.     echo "Iconv functions are available.<br />\n";
  514. elseif (isset($use_php_iconv&& $use_php_iconv{
  515.     echo "Iconv functions are unavailable.<br />\n";
  516.     do_err('Your configuration requires iconv support, but iconv support is missing.');
  517. else {
  518.     echo "Iconv functions are unavailable.<br />\n";
  519. }
  520. // same test as in include/validate.php
  521. echo "$IND timezone - ";
  522. if ( (!ini_get('safe_mode')) ||
  523.     !strcmp(ini_get('safe_mode_allowed_env_vars'),''||
  524.     preg_match('/^([\w_]+,)*TZ/'ini_get('safe_mode_allowed_env_vars')) ) {
  525.         echo "Webmail users can change their time zone settings.<br />\n";
  526. else {
  527.     echo "Webmail users can't change their time zone settings.<br />\n";
  528. }
  529.  
  530. // Pear DB tests
  531. echo "Checking database functions...<br />\n";
  532. if(!empty($addrbook_dsn|| !empty($prefs_dsn|| !empty($addrbook_global_dsn)) {
  533.     @include_once('DB.php');
  534.     if (class_exists('DB')) {
  535.         echo "$IND PHP Pear DB support is present.<br />\n";
  536.         $db_functions=array(
  537.                 'dbase' => 'dbase_open',
  538.                 'fbsql' => 'fbsql_connect',
  539.                 'interbase' => 'ibase_connect',
  540.                 'informix' => 'ifx_connect',
  541.                 'msql' => 'msql_connect',
  542.                 'mssql' => 'mssql_connect',
  543.                 'mysql' => 'mysql_connect',
  544.                 'mysqli' => 'mysqli_connect',
  545.                 'oci8' => 'ocilogon',
  546.                 'odbc' => 'odbc_connect',
  547.                 'pgsql' => 'pg_connect',
  548.                 'sqlite' => 'sqlite_open',
  549.                 'sybase' => 'sybase_connect'
  550.                 );
  551.  
  552.         $dsns array();
  553.         if($prefs_dsn{
  554.             $dsns['preferences'$prefs_dsn;
  555.         }
  556.         if($addrbook_dsn{
  557.             $dsns['addressbook'$addrbook_dsn;
  558.         }
  559.         if($addrbook_global_dsn{
  560.             $dsns['global addressbook'$addrbook_global_dsn;
  561.         }
  562.  
  563.         foreach($dsns as $type => $dsn{
  564.             $aDsn explode(':'$dsn);
  565.             $dbtype array_shift($aDsn);
  566.  
  567.             if(isset($db_functions[$dbtype]&& function_exists($db_functions[$dbtype])) {
  568.                 echo "$IND$dbtype database support present.<br />\n";
  569.             elseif(!(bool)ini_get('enable_dl'|| (bool)ini_get('safe_mode')) {
  570.                 do_err($dbtype.' database support not present!');
  571.             else {
  572.                 // Non-fatal error
  573.                 do_err($dbtype.' database support not present or not configured!
  574.                     Trying to dynamically load '.$dbtype.' extension.
  575.                     Please note that it is advisable to not rely on dynamic loading of extensions.'FALSE);
  576.             }
  577.  
  578.  
  579.             // now, test this interface:
  580.  
  581.             $dbh DB::connect($dsntrue);
  582.             if (DB::isError($dbh)) {
  583.                 do_err('Database error: 'sm_encode_html_special_chars(DB::errorMessage($dbh)) .
  584.                         ' in ' .$type .' DSN.');
  585.             }
  586.             $dbh->disconnect();
  587.             echo "$IND$type database connect successful.<br />\n";
  588.         }
  589.     else {
  590.         $db_error='Required PHP PEAR DB support is not available.'
  591.             .' Is PEAR installed and is the include path set correctly to find <tt>DB.php</tt>?'
  592.             .' The include path is now: "<tt>' ini_get('include_path''</tt>".';
  593.         do_err($db_error);
  594.     }
  595. else {
  596.     echo $IND."not using database functionality.<br />\n";
  597. }
  598. ?>
  599.  
  600. <p>Congratulations, your SquirrelMail setup looks fine to me!</p>
  601.  
  602. <p><a href="login.php">Login now</a></p>
  603.  
  604. </body>
  605. </html>

Documentation generated on Tue, 21 Oct 2014 04:20:32 +0200 by phpDocumentor 1.4.3