Back to [[BugTrack2/301]] #contents ----- ** lib/plugin.php [#mdc641cf] - From [[this file>http://sourceforge.jp/tracker/download.php?group_id=166&atid=713&file_id=2259&aid=12174]] -- Fix, PHP errors -- Fix, Not same work some functions ((PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK, PKWK_ENCODING_HINT, and etc.)) <?php // $Id: plugin.php,v 1.15 2005/07/03 14:16:23 henoheno Exp $ /* PukiWiki - Yet another WikiWikiWeb clone, apparently. Copyright (C) 2002-2005 PukiWiki Developers, 2001-2002 yu-ji License: As listed below (GPL v2) or (at your option) any later version, dependant upon compatibility of licenses. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Note from JordanC: If you're licensing under the GPL, you need to implicitly define the GPL in the header so that if code is browsed, you don't run the risk of it being pseudo-legal. */ // Plugin related functions define('PKWK_PLUGIN_CALL_TIME_LIMIT', 768); // Set global variables for plugins function set_plugin_messages($messages) { foreach ($messages as $name=>$val) if (! isset($GLOBALS[$name])) $GLOBALS[$name] = $val; } // Check plugin '$name' is here function exist_plugin($name) { global $vars; static $exist = array(), $count = array(); $name = strtolower($name); if(isset($exist[$name])) { if (++$count[$name] > PKWK_PLUGIN_CALL_TIME_LIMIT) die('Alert: plugin "' . htmlspecialchars($name) . '" was called over ' . PKWK_PLUGIN_CALL_TIME_LIMIT . ' times. SPAM or someting?<br />' . "\n" . '<a href="' . get_script_uri() . '?cmd=edit&page='. rawurlencode($vars['page']) . '">Try to edit this page</a><br />' . "\n" . '<a href="' . get_script_uri() . '">Return to frontpage</a>'); return $exist[$name]; } if (preg_match('/^\w{1,64}$/', $name) && file_exists(PLUGIN_DIR . $name . '.inc.php')) { $exist[$name] = TRUE; $count[$name] = 1; require_once(PLUGIN_DIR . $name . '.inc.php'); return TRUE; } else { $exist[$name] = FALSE; $count[$name] = 1; return FALSE; } } /** * @brief Used to check the existence of a callback function * Since there's only a few function types for callbacks, the array can be * manipulated or expanded to allow/deny other callback functions. * @param string $name * @param string $affix * @return boolean */ function plugin_callback_exists($name, $affix = 'action') { if(in_array($affix, array('action', 'convert', 'inline')) && exist_plugin($name)) { $plugin_name = 'plugin_' . $name . '_' . $affix; return (function_exists($plugin_name)) ? TRUE : FALSE; // Function exists : Function doesn't exist. } else { return FALSE; } } function plugin_do_callback($name, $affix = '', $params = array()) { if(in_array($affix, array('action', 'convert', 'inline')) && is_array($params)) { $func_name = 'plugin_' . $name . '_' . $affix; return call_user_func_array($func_name, $params); } else { return FALSE; } } // Do init the plugin function plugin_do_init($name) { static $checked = array(); // No need for double ternary - returns false on error. if(isset($checked[$name])) { return $checked[$name]; } if (plugin_callback_exists($name,'init')) { if (call_user_func('plugin_' . $name . '_init') !== FALSE) { return $checked[$name] = TRUE; } else { return $checked[$name] = FALSE; // Yeah, your plugin is poop. } } else { return $checked[$name] = TRUE; } } /** * @brief Used to perform the predefined "action" * @param string $name * * @return array * @return string */ function plugin_do_action($name) { if(plugin_callback_exists($name)) { // Cached callback if (! plugin_do_init($name)) return die('Plugin init failed for ' . $name); $retvar = plugin_do_callback($name, 'action'); if(PKWK_ENCODING_HINT != '') { $retvar = preg_replace('/(<form[^>]*>)/', '$1' . "\n" . '<div><input type="hidden" name="encode_hint" value="' . PKWK_ENCODING_HINT . '" /></div>', $retvar); } } else { $retvar = array(); } return $retvar; } /** * @brief Calls the conversion function of the specified plug-in * * @param string $name * @param string (CSV) $args */ function plugin_do_convert($name, $args = '') { global $digest; if(! plugin_do_init($name)) return 'Plugin init failed for ' . $name; if (! PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK) { $pos = strpos($args, "\r"); // "\r" is just a delimiter if ($pos !== FALSE) { // divide multiline strings $body = substr($args, $pos + 1); $args = substr($args, 0, $pos); } $params = ($args == '') ? array() : csv_explode(',',$args); if (isset($body)) $params[] = & $body; // #plugin(){{body}} } else { $params = ($args == '') ? array() : csv_explode(',',$args); } $bc_cache = plugin_do_callback($name, 'convert', $params); if($bc_cache === FALSE) { return htmlspecialchars('#' . $name . ($args != '' ? '(' . $args . ')' : '')); } else { if (PKWK_ENCODING_HINT != '') { return preg_replace('/(<form[^>]*>)/', '$1 ' . "\n" . '<div><input type="hidden" name="encode_hint" value="' . PKWK_ENCODING_HINT . '" /></div>', $bc_cache); } return $bc_cache; } } // Call API 'inline' of the plugin function plugin_do_inline($name, $args, & $body) { global $digest; $params = ($args == '') ? array() : csv_explode(',', $args); $params[] = & $body; if(! plugin_do_init($name)) return 'Plugin init failed for ' .$name; $bc_cache = plugin_do_callback($name, 'inline', $params); if($bc_cache === FALSE) { return htmlspecialchars('&' . $name . ($args ? '(' . $args . ')' : '') . ';'); } else { return $bc_cache; } } ?> ** diff file ? [#oaf70da5] Index: convert_html.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/lib/convert_html.php,v diff -u convert_html.php @@ -141,13 +141,13 @@ if (PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK) { // Usual code if (preg_match('/^\#([^\(]+)(?:\((.*)\))?/', $text, $matches) && - exist_plugin_convert($matches[1])) { + plugin_callback_exists($matches[1], 'convert')) { return new Div($matches); } } else { // Hack code if(preg_match('/^#([^\(\{]+)(?:\(([^\r]*)\))?(\{*)/', $text, $matches) && - exist_plugin_convert($matches[1])) { + plugin_callback_exists($matches[1], 'convert')) { $len = strlen($matches[3]); $body = array(); if ($len == 0) { @@ -783,7 +783,7 @@ function toString() { // Call #plugin - return do_plugin_convert($this->name, $this->param); + return plugin_do_convert($this->name, $this->param); } } Index: html.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/lib/html.php,v diff -u html.php @@ -91,7 +91,7 @@ ' ' . get_pg_passage($_page, FALSE) : ''; // List of attached files to the page - $attaches = ($attach_link && $is_read && exist_plugin_action('attach')) ? + $attaches = ($attach_link && $is_read && plugin_callback_exists('attach', 'action')) ? attach_filelist() : ''; // List of related pages Index: make_link.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/lib/make_link.php,v diff -u make_link.php @@ -264,8 +264,8 @@ $str = FALSE; // Try to call the plugin - if (exist_plugin_inline($this->name)) - $str = do_plugin_inline($this->name, $this->param, $body); + if (plugin_callback_exists($this->name, 'inline')) + $str = plugin_do_inline($this->name, $this->param, $body); if ($str !== FALSE) { return $str; // Succeed Index: pukiwiki.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/lib/pukiwiki.php,v diff -u pukiwiki.php @@ -133,8 +133,8 @@ // Plugin execution if ($plugin != '') { - if (exist_plugin_action($plugin)) { - $retvars = do_plugin_action($plugin); + if (plugin_callback_exists($plugin, 'action')) { + $retvars = plugin_do_action($plugin); if ($retvars === FALSE) exit; // Done // Rescan $vars (Some plugins rewrite it) Index: filelist.inc.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/plugin/filelist.inc.php,v diff -u filelist.inc.php @@ -7,6 +7,6 @@ function plugin_filelist_action() { - return do_plugin_action('list'); + return plugin_do_action('list'); } ?> Index: read.inc.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/plugin/read.inc.php,v diff -u read.inc.php @@ -17,11 +17,11 @@ return array('msg'=>'', 'body'=>''); } else if (! PKWK_SAFE_MODE && is_interwiki($page)) { - return do_plugin_action('interwiki'); // InterWikiNameを処理 + return plugin_do_action('interwiki'); // InterWikiNameを処理 } else if (is_pagename($page)) { $vars['cmd'] = 'edit'; - return do_plugin_action('edit'); // 存在しないので、編集フォームを表示 + return plugin_do_action('edit'); // 存在しないので、編集フォームを表示 } else { // 無効なページ名 Index: rename.inc.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/plugin/rename.inc.php,v diff -u rename.inc.php @@ -310,8 +310,8 @@ { $files = array(); $dirs = array(BACKUP_DIR, DIFF_DIR, DATA_DIR); - if (exist_plugin_convert('attach')) $dirs[] = UPLOAD_DIR; - if (exist_plugin_convert('counter')) $dirs[] = COUNTER_DIR; + if (plugin_callback_exists('attach', 'convert')) $dirs[] = UPLOAD_DIR; + if (plugin_callback_exists('counter', 'convert')) $dirs[] = COUNTER_DIR; // and more ... $matches = array(); Index: pukiwiki.skin.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/skin/pukiwiki.skin.php,v diff -u pukiwiki.skin.php @@ -51,7 +51,7 @@ } // MenuBar -$menu = arg_check('read') && exist_plugin_convert('menu') ? do_plugin_convert('menu') : FALSE; +$menu = arg_check('read') && plugin_callback_exists('menu', 'convert') ? plugin_do_convert('menu') : FALSE; // ------------------------------------------------------------ // Output Index: tdiary.skin.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/skin/tdiary.skin.php,v diff -u tdiary.skin.php @@ -531,11 +531,11 @@ $menu = FALSE; } else { $menu = (arg_check('read') && is_page($GLOBALS['menubar']) && - exist_plugin_convert('menu')); + plugin_callback_exists('menu', 'convert')); if ($menu) { $menu_body = preg_replace('#<h2 ([^>]*)>(.*?)</h2>#', '<h3 $1><span class="sanchor"></span> $2</h3>', - do_plugin_convert('menu')); + plugin_do_convert('menu')); } } ----- Back to [[BugTrack2/301]]