X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=functions%2Fplugin.php;h=2d1528ac45e52c544baf63a7cee480aae9fd0d85;hp=adf98accea725bfe8dc001ff896a72d7b7a0eb72;hb=8b56e2825d7082b5168da6167b85ef66d8e0f042;hpb=94ba79cee857030579852f5cd2b00a57dd71e967 diff --git a/functions/plugin.php b/functions/plugin.php index adf98acc..2d1528ac 100644 --- a/functions/plugin.php +++ b/functions/plugin.php @@ -3,24 +3,16 @@ /** * plugin.php * - * Copyright (c) 1999-2004 The SquirrelMail Project Team - * Licensed under the GNU GPL. For full terms see the file COPYING. - * * This file provides the framework for a plugin architecture. * * Documentation on how to write plugins might show up some time. * + * @copyright © 1999-2006 The SquirrelMail Project Team + * @license http://opensource.org/licenses/gpl-license.php GNU Public License * @version $Id$ * @package squirrelmail */ -/** Everything needs global.. */ -require_once(SM_PATH . 'functions/global.php'); -require_once(SM_PATH . 'functions/prefs.php'); - -global $squirrelmail_plugin_hooks; -$squirrelmail_plugin_hooks = array(); - /** * This function adds a plugin. * @param string $name Internal plugin name (ie. delete_move_next) @@ -29,10 +21,18 @@ $squirrelmail_plugin_hooks = array(); function use_plugin ($name) { if (file_exists(SM_PATH . "plugins/$name/setup.php")) { include_once(SM_PATH . "plugins/$name/setup.php"); - $function = "squirrelmail_plugin_init_$name"; - if (function_exists($function)) { - $function(); - } + + /** + * As of SM 1.5.2, plugin hook registration is statically + * accomplished using the configuration utility (config/conf.pl). + * And this code is deprecated (but let's keep it until + * the new registration system is proven). + * + */ + //$function = "squirrelmail_plugin_init_$name"; + //if (function_exists($function)) { + // $function(); + //} } } @@ -42,13 +42,14 @@ function use_plugin ($name) { * @return mixed $data */ function do_hook ($name) { - global $squirrelmail_plugin_hooks; + global $squirrelmail_plugin_hooks, $currentHookName; $data = func_get_args(); - $ret = ''; + $currentHookName = $name; if (isset($squirrelmail_plugin_hooks[$name]) && is_array($squirrelmail_plugin_hooks[$name])) { - foreach ($squirrelmail_plugin_hooks[$name] as $function) { + foreach ($squirrelmail_plugin_hooks[$name] as $plugin_name => $function) { + use_plugin($plugin_name); /* Add something to set correct gettext domain for plugin. */ if (function_exists($function)) { $function($data); @@ -56,11 +57,47 @@ function do_hook ($name) { } } + $currentHookName = ''; + /* Variable-length argument lists have a slight problem when */ /* passing values by reference. Pity. This is a workaround. */ return $data; } +/** + * This function executes a hook and allows for parameters to be + * passed, wherein each plugin can modify the parameters before + * they are passed to the next funciton. Whether or not the + * parameters are modified, plugins on this hook should always + * return the given parameters. + * + * @param string name the name of the hook + * @param mixed param the parameters to pass to the hook function + * @return mixed the possibly modified hook parameters + */ +function filter_hook_function($name,$parm=NULL) { + global $squirrelmail_plugin_hooks, $currentHookName; + $ret = ''; + $currentHookName = $name; + + if (isset($squirrelmail_plugin_hooks[$name]) + && is_array($squirrelmail_plugin_hooks[$name])) { + foreach ($squirrelmail_plugin_hooks[$name] as $plugin_name => $function) { + use_plugin($plugin_name); + /* Add something to set correct gettext domain for plugin. */ + if (function_exists($function)) { + $parm = $function($parm); + } + } + } + + $currentHookName = ''; + + /* Variable-length argument lists have a slight problem when */ + /* passing values by reference. Pity. This is a workaround. */ + return $parm; +} + /** * This function executes a hook and allows for parameters to be passed. * @@ -69,12 +106,14 @@ function do_hook ($name) { * @return mixed the return value of the hook function */ function do_hook_function($name,$parm=NULL) { - global $squirrelmail_plugin_hooks; + global $squirrelmail_plugin_hooks, $currentHookName; $ret = ''; + $currentHookName = $name; if (isset($squirrelmail_plugin_hooks[$name]) && is_array($squirrelmail_plugin_hooks[$name])) { - foreach ($squirrelmail_plugin_hooks[$name] as $function) { + foreach ($squirrelmail_plugin_hooks[$name] as $plugin_name => $function) { + use_plugin($plugin_name); /* Add something to set correct gettext domain for plugin. */ if (function_exists($function)) { $ret = $function($parm); @@ -82,33 +121,56 @@ function do_hook_function($name,$parm=NULL) { } } + $currentHookName = ''; + /* Variable-length argument lists have a slight problem when */ /* passing values by reference. Pity. This is a workaround. */ return $ret; } /** - * This function executes a hook, concatenating the results of each - * plugin that has the hook defined. + * This function executes a hook, allows for parameters to be passed, + * and looks for an array returned from each plugin: each array is + * then merged into one and returned to the core hook location. + * + * Note that unlike PHP's array_merge function, matching array keys + * will not overwrite each other, instead, values under such keys + * will be concatenated if they are both strings, or merged if they + * are arrays (in the same (non-overwrite) manner recursively). + * + * Plugins returning non-arrays (strings, objects, etc) will have + * their output added to the end of the ultimate return array, + * unless ALL values returned are strings, in which case one string + * with all returned strings concatenated together is returned. * * @param string name the name of the hook - * @param mixed parm optional hook function parameters - * @return string a concatenation of the results of each plugin function + * @param mixed param the parameters to pass to the hook function + * + * @return mixed the merged return arrays or strings of each + * plugin on this hook + * */ function concat_hook_function($name,$parm=NULL) { - global $squirrelmail_plugin_hooks; + global $squirrelmail_plugin_hooks, $currentHookName; $ret = ''; + $currentHookName = $name; if (isset($squirrelmail_plugin_hooks[$name]) && is_array($squirrelmail_plugin_hooks[$name])) { - foreach ($squirrelmail_plugin_hooks[$name] as $function) { - /* Concatenate results from hook. */ + foreach ($squirrelmail_plugin_hooks[$name] as $plugin_name => $function) { + use_plugin($plugin_name); + /* Add something to set correct gettext domain for plugin. */ if (function_exists($function)) { - $ret .= $function($parm); + $plugin_ret = $function($parm); + if (!empty($plugin_ret)) { + $ret = sqm_array_merge($ret, $plugin_ret); + } } } } + $currentHookName = ''; + /* Variable-length argument lists have a slight problem when */ /* passing values by reference. Pity. This is a workaround. */ return $ret; @@ -128,7 +190,7 @@ function concat_hook_function($name,$parm=NULL) { * @return bool the result of the function */ function boolean_hook_function($name,$parm=NULL,$priority=0,$tie=false) { - global $squirrelmail_plugin_hooks; + global $squirrelmail_plugin_hooks, $currentHookName; $yea = 0; $nay = 0; $ret = $tie; @@ -137,7 +199,9 @@ function boolean_hook_function($name,$parm=NULL,$priority=0,$tie=false) { is_array($squirrelmail_plugin_hooks[$name])) { /* Loop over the plugins that registered the hook */ - foreach ($squirrelmail_plugin_hooks[$name] as $function) { + $currentHookName = $name; + foreach ($squirrelmail_plugin_hooks[$name] as $plugin_name => $function) { + use_plugin($plugin_name); if (function_exists($function)) { $ret = $function($parm); if ($ret) { @@ -147,6 +211,7 @@ function boolean_hook_function($name,$parm=NULL,$priority=0,$tie=false) { } } } + $currentHookName = ''; /* Examine the aftermath and assign the return value appropriately */ if (($priority > 0) && ($yea)) { @@ -174,19 +239,142 @@ function boolean_hook_function($name,$parm=NULL,$priority=0,$tie=false) { * FIXME: This function needs to have its name changed! * * @return bool whether this browser properly supports JavaScript + * @deprecated use checkForJavascript() since 1.5.1 */ function soupNazi(){ return !checkForJavascript(); } -/*************************************/ -/*** MAIN PLUGIN LOADING CODE HERE ***/ -/*************************************/ - -/* On startup, register all plugins configured for use. */ -if (isset($plugins) && is_array($plugins)) { - foreach ($plugins as $name) { - use_plugin($name); - } + +/** + * Check if plugin is enabled + * @param string $plugin_name plugin name + * @since 1.5.1 + * @return boolean + */ +function is_plugin_enabled($plugin_name) { + global $plugins; + + /** + * check if variable is empty. if var is not set, php empty + * returns true without error notice. + * + * then check if it is an array + */ + if (empty($plugins) || ! is_array($plugins)) + return false; + + if ( in_array($plugin_name,$plugins) ) { + return true; + } else { + return false; + } +} + +/** + * Check a plugin's version. + * + * Returns TRUE if the given plugin is installed, + * activated and is at minimum version $a.$b.$c. + * If any one of those conditions fails, FALSE + * will be returned (careful of plugins that are + * sufficiently versioned but are not activated). + * + * By overriding the default value of $force_inclusion, + * this function will attempt to grab versioning + * information from the given plugin even if it + * is not activated (plugin still has to be + * unpackaged and set in place in the plugins + * directory). Use with care - some plugins + * might break SquirrelMail when this is used. + * + * Note that this function assumes plugin + * versioning is consistently applied in the same + * fashion that SquirrelMail versions are, with the + * exception that an applicable SquirrelMail + * version may be appended to the version number + * (which will be ignored herein). That is, plugin + * version number schemes are expected in the following + * format: 1.2.3, or 1.2.3-1.4.0. + * + * Any characters after the third number are discarded, + * so formats such as the following will also work, + * although extra information about beta versions can + * possibly confuse the desired results of the version + * check: 1.2.3-beta4, 1.2.3.RC2, and so forth. + * + * @since 1.5.2 + * + * @param string plugin_name name of the plugin to + * check; must precisely + * match the plugin + * directory name + * @param int a major version number + * @param int b minor version number + * @param int c release number + * @param bool force_inclusion try to get version info + * for plugins not activated? + * (default FALSE) + * + * @return bool + * + */ +function check_plugin_version($plugin_name, + $a = 0, $b = 0, $c = 0, + $force_inclusion = FALSE) +{ + + $info_function = $plugin_name . '_info'; + $version_function = $plugin_name . '_version'; + $plugin_info = array(); + $plugin_version = FALSE; + + + // first attempt to find the plugin info function, wherein + // the plugin version should be available + // + if (function_exists($info_function)) + $plugin_info = $info_function(); + else if ($force_inclusion + && file_exists(SM_PATH . 'plugins/' . $plugin_name . '/setup.php')) + { + include_once(SM_PATH . 'plugins/' . $plugin_name . '/setup.php'); + if (function_exists($info_function)) + $plugin_info = $info_function(); + } + if (!empty($plugin_info['version'])) + $plugin_version = $plugin_info['version']; + + + // otherwise, look for older version function + // + if (!$plugin_version && function_exists($version_function)) + $plugin_version = $version_function(); + + + if (!$plugin_version) return FALSE; + + + // now massage version number into something we understand + // + $plugin_version = trim(preg_replace(array('/[^0-9.]+.*$/', '/[^0-9.]/'), + '', $plugin_version), + '.'); + $plugin_version = explode('.', $plugin_version); + if (!isset($plugin_version[0])) $plugin_version[0] = 0; + if (!isset($plugin_version[1])) $plugin_version[1] = 0; + if (!isset($plugin_version[2])) $plugin_version[2] = 0; +// sm_print_r($plugin_version); + + + // now test the version number + // + if ($plugin_version[0] < $a || + ($plugin_version[0] == $a && $plugin_version[1] < $b) || + ($plugin_version[0] == $a && $plugin_version[1] == $b && $plugin_version[2] < $c)) + return FALSE; + + + return TRUE; + } -?> \ No newline at end of file