diff --git a/plugins/phorum/config.default.php b/plugins/phorum/config.default.php index ec0bbaa9..952291f7 100644 --- a/plugins/phorum/config.default.php +++ b/plugins/phorum/config.default.php @@ -9,7 +9,7 @@ $config->set('HTML', 'Allowed', // common semantic markup 'del,ins,strong,em,'. // commmon presentational markup - 's,strike,sub,sup,u,br,tt,div[class],'. // div because bbcode [quote] uses it + 's,strike,sub,sup,u,br,tt,div[class],img[src|alt|title|class],'. // div because bbcode [quote] uses it, img for smileys // uncommon semantic markup 'abbr[title],acronym[title],caption,code,dfn,cite,kbd,var,'. // lists diff --git a/plugins/phorum/htmlpurifier.php b/plugins/phorum/htmlpurifier.php index 34cbddca..af4aa84d 100644 --- a/plugins/phorum/htmlpurifier.php +++ b/plugins/phorum/htmlpurifier.php @@ -18,39 +18,10 @@ if(!defined('PHORUM')) exit; -// load library -require_once (dirname(__FILE__).'/htmlpurifier/HTMLPurifier.auto.php'); - -$config_exists = file_exists(dirname(__FILE__) . '/config.php'); -if ($config_exists || !isset($PHORUM['mod_htmlpurifier']['config'])) { - $config = HTMLPurifier_Config::createDefault(); - include(dirname(__FILE__) . '/config.default.php'); - if ($config_exists) { - include(dirname(__FILE__) . '/config.php'); - } -} else { - // used cached version that was constructed from web interface - $config = HTMLPurifier_Config::create($PHORUM['mod_htmlpurifier']['config']); -} -HTMLPurifier::getInstance($config); - -// increment revision.txt if you want to invalidate the cache -$GLOBALS['PHORUM']['mod_htmlpurifier']['body_cache_serial'] = $config->getSerial(); - -// load migration -if (file_exists(dirname(__FILE__) . '/migrate.php')) { - include(dirname(__FILE__) . '/migrate.php'); -} else { - echo 'Error: No migration path specified for HTML Purifier, please check - modes/htmlpurifier/migrate.bbcode.php for instructions on - how to migrate from your previous markup language.'; - exit; -} - /** * Purifies a data array */ -function phorum_htmlpurifier($data) +function phorum_htmlpurifier_format($data) { $PHORUM = $GLOBALS["PHORUM"]; @@ -58,7 +29,13 @@ function phorum_htmlpurifier($data) $cache_serial = $PHORUM['mod_htmlpurifier']['body_cache_serial']; foreach($data as $message_id => $message){ - if(isset($message['body'])){ + if(isset($message['body'])) { + if (isset($message['meta']['htmlpurifier_light'])) { + // format hook was called outside of Phorum's normal + // functions, do the abridged purification + $data[$message_id]['body'] = $purifier->purify($message['body']); + continue; + } if ( isset($message['meta']['body_cache']) && @@ -120,8 +97,11 @@ function phorum_htmlpurifier($data) */ function phorum_htmlpurifier_posting($message) { $PHORUM = $GLOBALS["PHORUM"]; - $purifier =& HTMLPurifier::getInstance(); - $message['meta']['body_cache'] = $purifier->purify($message['body']); + $fake_data = array($message); + // this is a temporary attribute + $fake_data[0]['meta']['htmlpurifier_light'] = true; // only purify, please + list($changed_message) = phorum_hook('format', $fake_data); + $message['meta']['body_cache'] = $changed_message['body']; $message['meta']['body_cache_serial'] = $PHORUM['mod_htmlpurifier']['body_cache_serial']; return $message; } @@ -137,29 +117,56 @@ function phorum_htmlpurifier_quote($array) { } /** - * Ensure that our format hook is processed last + * Ensure that our format hook is processed last. Also, loads the library. * @credits */ function phorum_htmlpurifier_common() { - global $PHORUM; - if (! isset($PHORUM['hooks']['format']['mods'])) return; + require_once (dirname(__FILE__).'/htmlpurifier/HTMLPurifier.auto.php'); - $hp_idx = null; - $last_idx = null; - foreach ($PHORUM['hooks']['format']['mods'] as $idx => $mod) { - if ($mod == 'htmlpurifier') $hp_idx = $idx; - $last_idx = $idx; + $config_exists = file_exists(dirname(__FILE__) . '/config.php'); + if ($config_exists || !isset($PHORUM['mod_htmlpurifier']['config'])) { + $config = HTMLPurifier_Config::createDefault(); + include(dirname(__FILE__) . '/config.default.php'); + if ($config_exists) { + include(dirname(__FILE__) . '/config.php'); + } + } else { + // used cached version that was constructed from web interface + $config = HTMLPurifier_Config::create($PHORUM['mod_htmlpurifier']['config']); + } + HTMLPurifier::getInstance($config); + + // increment revision.txt if you want to invalidate the cache + $GLOBALS['PHORUM']['mod_htmlpurifier']['body_cache_serial'] = $config->getSerial(); + + // load migration + if (file_exists(dirname(__FILE__) . '/migrate.php')) { + include(dirname(__FILE__) . '/migrate.php'); + } else { + echo 'Error: No migration path specified for HTML Purifier, please check + modes/htmlpurifier/migrate.bbcode.php for instructions on + how to migrate from your previous markup language.'; + exit; } - if ($hp_idx !== null && $hp_idx != $last_idx) { - - $hp_mod = array_splice($PHORUM['hooks']['format']['mods'], $hp_idx, 1); - $PHORUM['hooks']['format']['mods'][] = $hp_mod; - - $hp_func = array_splice($PHORUM['hooks']['format']['funcs'], $hp_idx, 1); - $PHORUM['hooks']['format']['funcs'][] = $hp_func; - - } + // see if our hooks need to be bubbled to the end + phorum_htmlpurifier_bubble_hook('format'); + +} + +function phorum_htmlpurifier_bubble_hook($hook) { + global $PHORUM; + $our_idx = null; + $last_idx = null; + if (!isset($PHORUM['hooks'][$hook]['mods'])) return; + foreach ($PHORUM['hooks'][$hook]['mods'] as $idx => $mod) { + if ($mod == 'htmlpurifier') $our_idx = $idx; + $last_idx = $idx; + } + list($mod) = array_splice($PHORUM['hooks'][$hook]['mods'], $our_idx, 1); + $PHORUM['hooks'][$hook]['mods'][] = $mod; + list($func) = array_splice($PHORUM['hooks'][$hook]['funcs'], $our_idx, 1); + $PHORUM['hooks'][$hook]['funcs'][] = $func; } diff --git a/plugins/phorum/info.txt b/plugins/phorum/info.txt index 7a6d995a..c59a6133 100644 --- a/plugins/phorum/info.txt +++ b/plugins/phorum/info.txt @@ -1,4 +1,4 @@ -hook: format|phorum_htmlpurifier +hook: format|phorum_htmlpurifier_format hook: quote|phorum_htmlpurifier_quote hook: posting_custom_action|phorum_htmlpurifier_posting hook: common|phorum_htmlpurifier_common diff --git a/plugins/phorum/settings.php b/plugins/phorum/settings.php index 93ab956b..e0eb379f 100644 --- a/plugins/phorum/settings.php +++ b/plugins/phorum/settings.php @@ -32,6 +32,10 @@ $directives = array( 'Output.TidyFormat', ); +if (isset($_POST['reset'])) { + unset($PHORUM['mod_htmlpurifier']['config']); +} + // instantiate $config object $config_exists = file_exists(dirname(__FILE__) . '/config.php'); if ($config_exists || !isset($PHORUM['mod_htmlpurifier']['config'])) { @@ -51,7 +55,7 @@ if(!empty($_POST)){ echo "Cannot update settings, mods/htmlpurifier/config.php already exists. To change settings, edit that file. To use the web form, delete that file.
"; } else { - $config->mergeArrayFromForm($_POST, 'config', $directives); + if (!isset($_POST['reset'])) $config->mergeArrayFromForm($_POST, 'config', $directives); $PHORUM['mod_htmlpurifier']['config'] = $config->getAll(); if(!phorum_db_update_settings(array("mod_htmlpurifier"=>$PHORUM["mod_htmlpurifier"]))){ $error="Database error while updating settings."; @@ -114,6 +118,8 @@ if ($config_exists) { $frm->addMessage($htmlpurifier_form->render($config, $directives, false)); $frm->addMessage($warning); + + $frm->addrow('Reset to defaults:', $frm->checkbox("reset", "1", "", false)); // hack to include extra styling echo '