*
* Documentation on how to write plugins might show up some time.
*
- * @copyright © 1999-2007 The SquirrelMail Project Team
+ * @copyright 1999-2012 The SquirrelMail Project Team
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version $Id$
* @package squirrelmail
* independent of) the return value for this hook.
*
* @param string $name Name of hook being executed
- * @param mixed $args A single value or an array of arguments
+ * @param mixed &$args A single value or an array of arguments
* that are to be passed to all plugins
* operating off the hook being called.
* Note that this argument is passed by
* independent of) the return value for this hook.
*
* @param string $name Name of hook being executed
- * @param mixed $args A single value or an array of arguments
+ * @param mixed &$args A single value or an array of arguments
* that are to be passed to all plugins
* operating off the hook being called.
* Note that this argument is passed by
* independent of) the return value for this hook.
*
* @param string $name The hook name
- * @param mixed $args A single value or an array of arguments
+ * @param mixed &$args A single value or an array of arguments
* that are to be passed to all plugins
* operating off the hook being called.
* Note that this argument is passed by
*
* @since 1.5.2
*
- * @param string plugin_name Name of the plugin to
- * check; must precisely
- * match the plugin
- * directory name
- * @param string requirement The desired requirement name
- * @param bool force_inclusion Try to get requirement info
- * for plugins not activated?
- * (default FALSE)
+ * @param string $plugin_name Name of the plugin to
+ * check; must precisely
+ * match the plugin
+ * directory name
+ * @param string $requirement The desired requirement name
+ * @param boolean $ignore_incompatible When TRUE, version incompatibility
+ * information will NOT be returned
+ * if found; when FALSE, it will be
+ * (OPTIONAL; default TRUE)
+ * @param boolean $force_inclusion Try to get requirement info
+ * for plugins not activated?
+ * (OPTIONAL; default FALSE)
*
* @return mixed NULL is returned if the plugin could not be
* found or does not include the given requirement,
- * otherwise the value of the requirement is returned,
- * whatever that may be (varies per requirement type).
+ * the constant SQ_INCOMPATIBLE is returned if the
+ * given plugin is entirely incompatible with the
+ * current SquirrelMail version (unless
+ * $ignore_incompatible is TRUE), otherwise the
+ * value of the requirement is returned, whatever
+ * that may be (varies per requirement type).
*
*/
function get_plugin_requirement($plugin_name, $requirement,
+ $ignore_incompatible = TRUE,
$force_inclusion = FALSE)
{
foreach ($plugin_info['per_version_requirements'] as $version => $requirement_overrides)
{
- $version_array = explode('.', $version);
- if (sizeof($version_array) != 3) continue;
-
- $a = $version_array[0];
- $b = $version_array[1];
- $c = $version_array[2];
-
- if (check_sm_version($a, $b, $c)
- && isset($requirement_overrides[$requirement])
- && !is_null($requirement_overrides[$requirement]))
- {
-
- if (empty($highest_version_array)
- || $highest_version_array[0] < $a
- || ($highest_version_array[0] == $a
- && $highest_version_array[1] < $b)
- || ($highest_version_array[0] == $a
- && $highest_version_array[1] == $b
- && $highest_version_array[2] < $c))
- {
- $highest_version_array = $version_array;
- $requirement_value_override = $requirement_overrides[$requirement];
- }
+ $version_array = explode('.', $version);
+ if (sizeof($version_array) != 3) continue;
+
+ $a = $version_array[0];
+ $b = $version_array[1];
+ $c = $version_array[2];
+
+ // complicated way to say we are interested in these overrides
+ // if the version is applicable to us and if the overrides include
+ // the requirement we are looking for, or if the plugin is not
+ // compatible with this version of SquirrelMail (unless we are
+ // told to ignore such)
+ //
+ if (check_sm_version($a, $b, $c)
+ && ((!$ignore_incompatible
+ && (!empty($requirement_overrides[SQ_INCOMPATIBLE])
+ || $requirement_overrides === SQ_INCOMPATIBLE))
+ || (is_array($requirement_overrides)
+ && isset($requirement_overrides[$requirement])
+ && !is_null($requirement_overrides[$requirement]))))
+ {
+
+ if (empty($highest_version_array)
+ || $highest_version_array[0] < $a
+ || ($highest_version_array[0] == $a
+ && $highest_version_array[1] < $b)
+ || ($highest_version_array[0] == $a
+ && $highest_version_array[1] == $b
+ && $highest_version_array[2] < $c))
+ {
+ $highest_version_array = $version_array;
+ if (!empty($requirement_overrides[SQ_INCOMPATIBLE])
+ || $requirement_overrides === SQ_INCOMPATIBLE)
+ $requirement_value_override = SQ_INCOMPATIBLE;
+ else
+ $requirement_value_override = $requirement_overrides[$requirement];
+ }
}
* @return mixed Boolean FALSE is returned if the plugin
* could not be found or does not indicate
* whether it has other plugin dependencies,
+ * the constant SQ_INCOMPATIBLE is returned if
+ * the given plugin is entirely incompatible
+ * with the current SquirrelMail version,
* otherwise an array is returned where keys
- * are the names of required plugin dependencies,
- * and values are arrays again, where at least
- * the following keys (and corresponding values)
- * will be available: 'version' - value is the
- * minimum version required for that plugin (the
- * format of which might vary per the value of
- * $do_parse), 'activate' - value is boolean:
- * TRUE indicates that the plugin must also be
- * activated, FALSE means that it only needs to
- * be present, but does not need to be activated.
- * Note that the return value might be an empty
- * array, indicating that the plugin has no
- * dependencies.
+ * are the names of required plugin
+ * dependencies, and values are arrays again,
+ * where at least the following keys (and
+ * corresponding values) will be available:
+ * 'version' - value is the minimum version
+ * required for that plugin (the format of
+ * which might vary per the value of $do_parse
+ * as well as if the plugin requires a SquirrelMail
+ * core plugin, in which case it is "CORE" or
+ * "CORE:1.5.2" or similar, or, if the plugin is
+ * actually incompatible (not required) with this
+ * one, the constant SQ_INCOMPATIBLE will be found
+ * here), 'activate' - value is boolean: TRUE
+ * indicates that the plugin must also be activated,
+ * FALSE means that it only needs to be present,
+ * but does not need to be activated. Note that
+ * the return value might be an empty array,
+ * indicating that the plugin has no dependencies.
*
*/
function get_plugin_dependencies($plugin_name, $force_inclusion = FALSE,
$plugin_dependencies = get_plugin_requirement($plugin_name,
'required_plugins',
+ FALSE,
$force_inclusion);
+ // the plugin is simply incompatible, no need to continue here
+ //
+ if ($plugin_dependencies === SQ_INCOMPATIBLE)
+ return $plugin_dependencies;
+
// not an array of requirements? wrong format, just return FALSE
//
// parse version into something we understand?
//
- if ($do_parse)
+ if ($do_parse && $plugin_requirements['version'] != SQ_INCOMPATIBLE)
{
// massage version number into something we understand
// the regexps are wrapped in a trim that makes sure the version
// does not start or end with a decimal point
//
- $plugin_requirements['version']
- = trim(preg_replace(array('/[^0-9.]+.*$/', '/[^0-9.]/'),
- '', $plugin_requirements['version']),
- '.');
+ if (strpos(strtoupper($plugin_requirements['version']), 'CORE') === 0)
+ {
+ if (strpos($plugin_requirements['version'], ':') === FALSE)
+ $plugin_requirements['version'] = 'CORE';
+ else
+ $plugin_requirements['version']
+ = 'CORE:' . trim(preg_replace(array('/[^0-9.]+.*$/', '/[^0-9.]/'),
+ '', substr($plugin_requirements['version'], strpos($plugin_requirements['version'], ':') + 1)),
+ '.');
+ }
+ else
+ $plugin_requirements['version']
+ = trim(preg_replace(array('/[^0-9.]+.*$/', '/[^0-9.]/'),
+ '', $plugin_requirements['version']),
+ '.');
}
*
* @return mixed Boolean TRUE if all of the plugin's
* required plugins are correctly installed,
+ * the constant SQ_INCOMPATIBLE is returned if
+ * the given plugin is entirely incompatible
+ * with the current SquirrelMail version,
* otherwise an array of the required plugins
* that are either not installed or not up to
* the minimum required version. The array is
* corresponding values) will be available:
* 'version' - value is the minimum version
* required for that plugin (in printable, non-
- * parsed format), 'activate' - value is boolean:
- * TRUE indicates that the plugin must also be
- * activated, FALSE means that it only needs to
- * be present, but does not need to be activated.
+ * parsed format) or the constant SQ_INCOMPATIBLE,
+ * which indicates that the plugin is actually
+ * incompatible (not required), 'activate' - value
+ * is boolean: TRUE indicates that the plugin must
+ * also be activated, FALSE means that it only needs
+ * to be present, but does not need to be activated.
*
*/
function check_plugin_dependencies($plugin_name, $force_inclusion = FALSE)
$dependencies = get_plugin_dependencies($plugin_name, $force_inclusion);
if (!$dependencies) return TRUE;
+ if ($dependencies === SQ_INCOMPATIBLE) return $dependencies;
$missing_or_bad = array();
foreach ($dependencies as $depend_name => $depend_requirements)
{
- $version = preg_split('/\./', $depend_requirements['version'], 3);
+
+ // check for core plugins first
+ //
+ if (strpos(strtoupper($depend_requirements['version']), 'CORE') === 0)
+ {
+
+ // see if the plugin is in the core (just check if the directory exists)
+ //
+ if (!file_exists(SM_PATH . 'plugins/' . $depend_name))
+ $missing_or_bad[$depend_name] = $depend_requirements;
+
+
+ // check if it is activated if need be
+ //
+ else if ($depend_requirements['activate'] && !is_plugin_enabled($depend_name))
+ $missing_or_bad[$depend_name] = $depend_requirements;
+
+
+ // check if this is the right core version if one is given
+ // (note this is pretty useless - a plugin should specify
+ // whether or not it itself is compatible with this version
+ // of SM in the first place)
+ //
+ else if (strpos($depend_requirements['version'], ':') !== FALSE)
+ {
+ $version = explode('.', substr($depend_requirements['version'], strpos($depend_requirements['version'], ':') + 1), 3);
+ $version[0] = intval($version[0]);
+ if (isset($version[1])) $version[1] = intval($version[1]);
+ else $version[1] = 0;
+ if (isset($version[2])) $version[2] = intval($version[2]);
+ else $version[2] = 0;
+
+ if (!check_sm_version($version[0], $version[1], $version[2]))
+ $missing_or_bad[$depend_name] = $depend_requirements;
+ }
+
+ continue;
+
+ }
+
+ // if the plugin is actually incompatible; check that it
+ // is not activated
+ //
+ if ($depend_requirements['version'] == SQ_INCOMPATIBLE)
+ {
+
+ if (is_plugin_enabled($depend_name))
+ $missing_or_bad[$depend_name] = $depend_requirements;
+
+ continue;
+
+ }
+
+ // check for normal plugins
+ //
+ $version = explode('.', $depend_requirements['version'], 3);
$version[0] = intval($version[0]);
- $version[1] = intval($version[1]);
- $version[2] = intval($version[2]);
+ if (isset($version[1])) $version[1] = intval($version[1]);
+ else $version[1] = 0;
+ if (isset($version[2])) $version[2] = intval($version[2]);
+ else $version[2] = 0;
$force_dependency_inclusion = !$depend_requirements['activate'];