Add ability for plugin to indicate that they are not compatible with a particular...
[squirrelmail.git] / src / configtest.php
index 7d95c357b02a6d80e77ed937fe57c106defb6675..92afb37578d3d82cf66cbba657ca0d856b8fab03 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * SquirrelMail configtest script
  *
- * @copyright © 2003-2006 The SquirrelMail Project Team
+ * @copyright © 2003-2007 The SquirrelMail Project Team
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  * @version $Id$
  * @package squirrelmail
@@ -81,8 +81,11 @@ ob_implicit_flush();
 /** @ignore */
 define('SM_PATH', '../');
 /** load minimal function set */
+require(SM_PATH . 'include/constants.php');
 require(SM_PATH . 'functions/global.php');
 require(SM_PATH . 'functions/strings.php');
+$SQM_INTERNAL_VERSION = preg_split('/\./', SM_VERSION, 3);
+$SQM_INTERNAL_VERSION[2] = intval($SQM_INTERNAL_VERSION[2]);
 
 /** set default value in order to block remote access */
 $allow_remote_configtest=false;
@@ -167,9 +170,8 @@ if (! $allow_remote_configtest) {
         do_err('Enable "Allow remote configtest" option in squirrelmail configuration in order to use this script.');
     }
 }
-/* checking PHP specs */
 
-echo "<p><table>\n<tr><td>SquirrelMail version:</td><td><b>" . $version . "</b></td></tr>\n" .
+echo "<p><table>\n<tr><td>SquirrelMail version:</td><td><b>" . SM_VERSION . "</b></td></tr>\n" .
     '<tr><td>Config file version:</td><td><b>' . $config_version . "</b></td></tr>\n" .
     '<tr><td>Config file last modified:</td><td><b>' .
     date ('d F Y H:i:s', filemtime(SM_PATH . 'config/config.php')) .
@@ -180,6 +182,9 @@ if ($config_version!='1.5.0') {
     do_err('Configuration file version does not match required version. Please update your configuration file.');
 }
 
+
+/* checking PHP specs */
+
 echo "Checking PHP configuration...<br />\n";
 
 if(!check_php_version(4,1,0)) {
@@ -187,11 +192,54 @@ if(!check_php_version(4,1,0)) {
 }
 
 echo $IND . 'PHP version ' . PHP_VERSION . ' OK. (You have: ' . phpversion() . ". Minimum: 4.1.0)<br />\n";
-/* test for boolean false and any string that is not equal to 'off' */
+
+/* register_globals check: test for boolean false and any string that is not equal to 'off' */
+
 if ((bool) ini_get('register_globals') && 
     strtolower(ini_get('register_globals'))!='off') {
     do_err('You have register_globals turned on.  This is not an error, but it CAN be a security hazard.  Consider turning register_globals off.', false);
 }
+
+
+/* variables_order check */
+
+// FIXME(?): Hmm, how do we distinguish between when an ini setting is
+//           not available (ini_set() returns empty string) and when 
+//           the administrator set the value to an empty string?  The
+//           latter is sure to be highly rare, so for now, just assume
+//           that empty value means the setting isn't even available
+//           (could also check PHP version when this setting was implemented)
+$variables_order = ini_get('variables_order');
+if (!empty($variables_order) && (strpos($variables_order, 'G') === FALSE
+ || strpos($variables_order, 'P') === FALSE
+ || strpos($variables_order, 'C') === FALSE
+ || strpos($variables_order, 'S') === FALSE)) {
+    do_err('Your variables_order setting is insufficient for SquirrelMail to function.  It needs at least "GPCS", but you have it set to "' . $variables_order . '"', true);
+} else {
+    echo $IND . "variables_order OK: $variables_order.<br />\n";
+}
+
+
+/* gpc_order check */
+
+// FIXME(?): Hmm, how do we distinguish between when an ini setting is
+//           not available (ini_set() returns empty string) and when 
+//           the administrator set the value to an empty string?  The
+//           latter is sure to be highly rare, so for now, just assume
+//           that empty value means the setting isn't even available
+//           (could also check PHP version when this setting was implemented)
+$gpc_order = ini_get('gpc_order');
+if (!empty($gpc_order) && (strpos($gpc_order, 'G') === FALSE
+ || strpos($gpc_order, 'P') === FALSE
+ || strpos($gpc_order, 'C') === FALSE)) {
+    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 "' . $gpc_order . '"', true);
+} else {
+    echo $IND . "gpc_order OK: $gpc_order.<br />\n";
+}
+
+
+/* check PHP extensions */
+
 $php_exts = array('session','pcre');
 $diff = array_diff($php_exts, get_loaded_extensions());
 if(count($diff)) {
@@ -289,6 +337,8 @@ if($data_dir == $attachment_dir) {
 }
 
 
+echo "Checking plugins...<br />\n";
+
 /* check plugins and themes */
 //FIXME: check requirements given in plugin _info() function, such
 //       as required PHP extensions, Pear packages, other plugins, SM version, etc
@@ -348,11 +398,35 @@ if (isset($plugins[0])) {
         $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: '.htmlspecialchars($output);
         do_err($plugin_load_error);
     }
+    /** 
+     * Print plugin versions
+     */
+    echo $IND . "Plugin versions...<br />\n";
+    foreach ($plugins as $name) {
+        $plugin_version = get_plugin_version($name);
+        echo $IND . $IND . $name . ' ' . (empty($plugin_version) ? '??' : $plugin_version) . "<br />\n";
+
+        // check if this plugin has any other plugin 
+        // dependencies and if they are satisfied
+        //
+        $failed_dependencies = check_plugin_dependencies($name);
+        if ($failed_dependencies === 'INCOMPATIBLE') {
+            do_err($name . ' is NOT COMPATIBLE with this version of SquirrelMail', FALSE);
+        }
+        else if (is_array($failed_dependencies)) {
+            $missing_plugins = '';
+            foreach ($failed_dependencies as $depend_name => $depend_requirements) {
+                $missing_plugins .= ', ' . $depend_name . ' (version ' . $depend_requirements['version'] . ', ' . ($depend_requirements['activate'] ? 'must be activated' : 'need not be activated') . ')';
+            }
+            do_err($name . ' is missing some dependencies: ' . trim($missing_plugins, ', '), FALSE);
+        }
+
+    }
     /**
-     * This hook was added in 1.5.2. Each plugins should print an error 
+     * This hook was added in 1.5.2 and 1.4.10. Each plugins should print an error 
      * message and return TRUE if there are any errors in its setup/configuration.
      */
-    $plugin_err = boolean_hook_function('configtest', $null);
+    $plugin_err = boolean_hook_function('configtest', $null, 1);
     if($plugin_err) {
         do_err('Some plugin tests failed.');
     } else {