Responses from servers could legitimately contain < chars, make sure it goes well.
[squirrelmail.git] / src / configtest.php
index bf5887c166633ebe452c223762d15b32597fc317..f60b67abba99b4a5ddafa6a3061767672fcb002d 100644 (file)
@@ -1,11 +1,13 @@
 <?php
-/*
+/**
  * SquirrelMail configtest script
  *
  * Copyright (c) 2003-2004 The SquirrelMail Project Team
  * Licensed under the GNU GPL. For full terms see the file COPYING.
  *
- * $Id$
+ * @version $Id$
+ * @package squirrelmail
+ * @subpackage config
  */
 
 /************************************************************
@@ -14,7 +16,8 @@
  ************************************************************/
 
 function do_err($str, $exit = TRUE) {
-    echo '<p><font color="red"><b>ERROR:</b></font> ' .$str. "</p>\n";
+    global $IND;
+    echo '<p>'.$IND.'<font color="red"><b>ERROR:</b></font> ' .$str. "</p>\n";
     if($exit) {
          echo '</body></html>';
          exit;
@@ -24,6 +27,7 @@ function do_err($str, $exit = TRUE) {
 $IND = str_repeat('&nbsp;',4);
 
 ob_implicit_flush();
+/** @ignore */
 define('SM_PATH', '../');
 
 /*
@@ -46,7 +50,7 @@ if (file_exists(SM_PATH . 'config/config.php')) {
 
 <p>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 <tt>conf.pl</tt>
-in this directory first before you run this script.</p>
+in the <tt>config/</tt> directory first before you run this script.</p>
 
 <?php
 
@@ -176,31 +180,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 (<tt><small>'.trim($smtpline)."</small></tt>)<br />\n";
+    echo $IND . 'SMTP server OK (<tt><small>'.
+        trim(htmlspecialchars($smtpline))."</small></tt>)<br />\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);
@@ -214,20 +220,23 @@ $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));
 }
 
 $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 OK (<tt><small>'.trim($imapline)."</small></tt>)<br />\n";
+echo $IND . 'IMAP server OK (<tt><small>'.
+    htmlspecialchars(trim($imapline))."</small></tt>)<br />\n";
 
-echo "Checking i18n settings:<br />\n";
+echo "Checking internationalization (i18n) settings:<br />\n";
 echo "$IND gettext - ";
 if (function_exists('gettext')) {
     echo "Gettext functions are available. You must have appropriate system locales compiled.<br />\n";
@@ -268,42 +277,59 @@ if ( (!ini_get('safe_mode')) ||
     echo "Webmail users can't change their time zone settings.<br />\n";
 }
 
+
 // Pear DB tests
-echo "Checking PHP Pear DB support:<br />\n";
-@include_once('DB.php');
-if (class_exists('DB')) {
-    echo "$IND PHP Pear DB support is present.<br />\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'
-    );
-    $pear_db_support="";
-    foreach ($db_functions as $db => $function)
-       if (function_exists($function)) $pear_db_support .= $db . " ";
-    if ($pear_db_support!="") {
-       echo "$IND Supported backends: $pear_db_support <br />\n";
-    } else {
-       echo "$IND Pear DB support is present, but none of database backends is supported <br />\n";
-    }
+echo "Checking database functions...<br />\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.<br />\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.<br />\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.<br />\n";
+                   
+               } else {
+                   do_err($db.' database support not present!');
+               }
+            }
+       } else {
+           do_err('Required PHP Pear DB support is not available.');;
+       }
 } else {
-    echo "$IND PHP Pear DB support is not available.<br />\n";
+    echo $IND."not using database functionality.<br />\n";
 }
-
-// other possible checks:
-// ? prefs/abook DSN
-// ? actually start a session to see if it works
-// ? ...
 ?>
 
 <p>Congratulations, your SquirrelMail setup looks fine to me!</p>