Source for file plugin.php

Documentation is available at plugin.php

  1. <?php
  2.  
  3. /**
  4.  * plugin.php
  5.  *
  6.  * This file provides the framework for a plugin architecture.
  7.  *
  8.  * Documentation on how to write plugins might show up some time.
  9.  *
  10.  * @copyright 1999-2020 The SquirrelMail Project Team
  11.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  12.  * @version $Id: plugin.php 14840 2020-01-07 07:42:38Z pdontthink $
  13.  * @package squirrelmail
  14.  */
  15.  
  16. /** Everything needs global.. */
  17. require_once(SM_PATH 'functions/global.php');
  18.  
  19. global $squirrelmail_plugin_hooks;
  20. $squirrelmail_plugin_hooks array();
  21.  
  22. /**
  23.  * This function adds a plugin.
  24.  * @param string $name Internal plugin name (ie. delete_move_next)
  25.  * @return void 
  26.  */
  27. function use_plugin ($name{
  28.     if (file_exists(SM_PATH "plugins/$name/setup.php")) {
  29.         include_once(SM_PATH "plugins/$name/setup.php");
  30.         $function "squirrelmail_plugin_init_$name";
  31.         if (function_exists($function)) {
  32.             $function();
  33.         }
  34.     }
  35. }
  36.  
  37. /**
  38.  * This function executes a hook.
  39.  * @param string $name Name of hook to fire
  40.  * @return mixed $data
  41.  */
  42. function do_hook ($name{
  43.     global $squirrelmail_plugin_hooks;
  44.     $data func_get_args();
  45.     $ret '';
  46.  
  47.     if (isset($squirrelmail_plugin_hooks[$name])
  48.           && is_array($squirrelmail_plugin_hooks[$name])) {
  49.         foreach ($squirrelmail_plugin_hooks[$nameas $function{
  50.             /* Add something to set correct gettext domain for plugin. */
  51.             if (function_exists($function)) {
  52.                 $function($data);
  53.             }
  54.         }
  55.     }
  56.  
  57.     /* Variable-length argument lists have a slight problem when */
  58.     /* passing values by reference. Pity. This is a workaround.  */
  59.     return $data;
  60. }
  61.  
  62. /**
  63.  * This function executes a hook and allows for parameters to be passed.
  64.  *
  65.  * @param string name the name of the hook
  66.  * @param mixed param the parameters to pass to the hook function
  67.  * @return mixed the return value of the hook function
  68.  */
  69. function do_hook_function($name,$parm=NULL{
  70.     $return_value_variable_name 'hook_return_value_' $name;
  71.     global $squirrelmail_plugin_hooks$$return_value_variable_name;
  72.     $$return_value_variable_name NULL;
  73.  
  74.     if (isset($squirrelmail_plugin_hooks[$name])
  75.           && is_array($squirrelmail_plugin_hooks[$name])) {
  76.         foreach ($squirrelmail_plugin_hooks[$nameas $function{
  77.             /* Add something to set correct gettext domain for plugin. */
  78.             if (function_exists($function)) {
  79.                 $$return_value_variable_name $function($parm$$return_value_variable_name);
  80.             }
  81.         }
  82.     }
  83.  
  84.     /* Variable-length argument lists have a slight problem when */
  85.     /* passing values by reference. Pity. This is a workaround.  */
  86.     return $$return_value_variable_name;
  87. }
  88.  
  89. /**
  90.  * This function executes a hook, concatenating the results of each
  91.  * plugin that has the hook defined.
  92.  *
  93.  * @param string name the name of the hook
  94.  * @param mixed parm optional hook function parameters
  95.  * @return string a concatenation of the results of each plugin function
  96.  */
  97. function concat_hook_function($name,$parm=NULL{
  98.     $return_value_variable_name 'hook_return_value_' $name;
  99.     global $squirrelmail_plugin_hooks$$return_value_variable_name;
  100.     $$return_value_variable_name '';
  101.  
  102.     if (isset($squirrelmail_plugin_hooks[$name])
  103.           && is_array($squirrelmail_plugin_hooks[$name])) {
  104.         foreach ($squirrelmail_plugin_hooks[$nameas $function{
  105.             /* Concatenate results from hook. */
  106.             if (function_exists($function)) {
  107.                 $$return_value_variable_name .= $function($parm$$return_value_variable_name);
  108.             }
  109.         }
  110.     }
  111.  
  112.     /* Variable-length argument lists have a slight problem when */
  113.     /* passing values by reference. Pity. This is a workaround.  */
  114.     return $$return_value_variable_name;
  115. }
  116.  
  117. /**
  118.  * This function is used for hooks which are to return true or
  119.  * false. If $priority is > 0, any one or more trues will override
  120.  * any falses. If $priority < 0, then one or more falses will
  121.  * override any trues.
  122.  * Priority 0 means majority rules.  Ties will be broken with $tie
  123.  *
  124.  * @param string name the hook name
  125.  * @param mixed parm the parameters for the hook function
  126.  * @param int priority
  127.  * @param bool tie
  128.  * @return bool the result of the function
  129.  */
  130. function boolean_hook_function($name,$parm=NULL,$priority=0,$tie=false{
  131.     global $squirrelmail_plugin_hooks;
  132.     $yea 0;
  133.     $nay 0;
  134.     $ret $tie;
  135.  
  136.     if (isset($squirrelmail_plugin_hooks[$name]&&
  137.         is_array($squirrelmail_plugin_hooks[$name])) {
  138.  
  139.         /* Loop over the plugins that registered the hook */
  140.         foreach ($squirrelmail_plugin_hooks[$nameas $function{
  141.             if (function_exists($function)) {
  142.                 $ret $function($parm);
  143.                 if ($ret{
  144.                     $yea++;
  145.                 else {
  146.                     $nay++;
  147.                 }
  148.             }
  149.         }
  150.  
  151.         /* Examine the aftermath and assign the return value appropriately */
  152.         if (($priority 0&& ($yea)) {
  153.             $ret true;
  154.         elseif (($priority 0&& ($nay)) {
  155.             $ret false;
  156.         elseif ($yea $nay{
  157.             $ret true;
  158.         elseif ($nay $yea{
  159.             $ret false;
  160.         else {
  161.             // There's a tie, no action needed.
  162.         }
  163.         return $ret;
  164.     }
  165.     // If the code gets here, there was a problem - no hooks, etc.
  166.     return NULL;
  167. }
  168.  
  169. /**
  170.  * This function checks whether the user's USER_AGENT is known to
  171.  * be broken. If so, returns true and the plugin is invisible to the
  172.  * offending browser.
  173.  * *** THIS IS A TEST FOR JAVASCRIPT SUPPORT ***
  174.  * FIXME: This function needs to have its name changed!
  175.  * FIXME: The test in this function is outdated - plenty more browsers support JavaScript, newer browser versions (Mozilla at least) exist, and moreover, we shouldn't be doing user-agent testing - should be trusting our $javascript_on global -- REMOVE THIS FUNCTION IF NOT BEING USED ANYWHERE ELSE
  176.  *
  177.  * @return bool whether this browser properly supports JavaScript
  178.  */
  179. function soupNazi(){
  180.  
  181.     $soup_menu array('Mozilla/3','Mozilla/2','Mozilla/1''Opera 4',
  182.                        'Opera/4''OmniWeb''Lynx');
  183.     sqgetGlobalVar('HTTP_USER_AGENT'$user_agentSQ_SERVER);
  184.     foreach($soup_menu as $browser{
  185.         if(stristr($user_agent$browser)) {
  186.             return 1;
  187.         }
  188.     }
  189.     return 0;
  190. }
  191. /*************************************/
  192. /*** MAIN PLUGIN LOADING CODE HERE ***/
  193. /*************************************/
  194.  
  195. /* On startup, register all plugins configured for use. 
  196.    $plugins needs to be globalized because this file is
  197.    sometimes included inside function (non-global) scope,
  198.    such as for logout_error. */
  199. global $plugins;
  200. if (isset($plugins&& is_array($plugins)) {
  201.     // turn on output buffering in order to prevent output of new lines
  202.     ob_start();
  203.     foreach ($plugins as $name{
  204.         use_plugin($name);
  205.     }
  206.     $output trim(ob_get_contents());
  207.     ob_end_clean();
  208.     // if plugins output more than newlines and spacing, stop script execution.
  209.     if (!empty($output)) {
  210.         die($output);
  211.     }
  212. }

Documentation generated on Mon, 13 Jan 2020 04:25:10 +0100 by phpDocumentor 1.4.3