From ab5d8d4e07bb3c8230d0285ef8902ef1979fce51 Mon Sep 17 00:00:00 2001 From: emkael Date: Thu, 18 Oct 2018 02:39:34 +0200 Subject: Updating Smarty --- .../smarty_internal_compile_private_modifier.php | 239 ++++++++++++++------- 1 file changed, 158 insertions(+), 81 deletions(-) (limited to 'lib/smarty/sysplugins/smarty_internal_compile_private_modifier.php') diff --git a/lib/smarty/sysplugins/smarty_internal_compile_private_modifier.php b/lib/smarty/sysplugins/smarty_internal_compile_private_modifier.php index ca4d907..72773ff 100644 --- a/lib/smarty/sysplugins/smarty_internal_compile_private_modifier.php +++ b/lib/smarty/sysplugins/smarty_internal_compile_private_modifier.php @@ -1,81 +1,158 @@ -getAttributes($compiler, $args); - $output = $parameter['value']; - // loop over list of modifiers - foreach ($parameter['modifierlist'] as $single_modifier) { - $modifier = $single_modifier[0]; - $single_modifier[0] = $output; - $params = implode(',', $single_modifier); - // check for registered modifier - if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier])) { - $function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier][0]; - if (!is_array($function)) { - $output = "{$function}({$params})"; - } else { - if (is_object($function[0])) { - $output = '$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][\'' . $modifier . '\'][0][0]->' . $function[1] . '(' . $params . ')'; - } else { - $output = $function[0] . '::' . $function[1] . '(' . $params . ')'; - } - } - } else if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIERCOMPILER][$modifier][0])) { - $output = call_user_func($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIERCOMPILER][$modifier][0], $single_modifier, $compiler->smarty); - // check for plugin modifiercompiler - } else if ($compiler->smarty->loadPlugin('smarty_modifiercompiler_' . $modifier)) { - // check if modifier allowed - if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) { - $plugin = 'smarty_modifiercompiler_' . $modifier; - $output = $plugin($single_modifier, $compiler); - } - // check for plugin modifier - } else if ($function = $compiler->getPlugin($modifier, Smarty::PLUGIN_MODIFIER)) { - // check if modifier allowed - if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) { - $output = "{$function}({$params})"; - } - // check if trusted PHP function - } else if (is_callable($modifier)) { - // check if modifier allowed - if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedPhpModifier($modifier, $compiler)) { - $output = "{$modifier}({$params})"; - } - } else { - $compiler->trigger_template_error("unknown modifier \"" . $modifier . "\"", $compiler->lex->taglineno); - } - } - return $output; - } - -} - -?> \ No newline at end of file +getAttributes($compiler, $args); + $output = $parameter[ 'value' ]; + // loop over list of modifiers + foreach ($parameter[ 'modifierlist' ] as $single_modifier) { + /* @var string $modifier */ + $modifier = $single_modifier[ 0 ]; + $single_modifier[ 0 ] = $output; + $params = implode(',', $single_modifier); + // check if we know already the type of modifier + if (isset($compiler->known_modifier_type[ $modifier ])) { + $modifier_types = array($compiler->known_modifier_type[ $modifier ]); + } else { + $modifier_types = array(1, 2, 3, 4, 5, 6); + } + foreach ($modifier_types as $type) { + switch ($type) { + case 1: + // registered modifier + if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ])) { + if (is_callable($compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ][ 0 ])) { + $output = + sprintf( + 'call_user_func_array($_smarty_tpl->registered_plugins[ \'%s\' ][ %s ][ 0 ], array( %s ))', + Smarty::PLUGIN_MODIFIER, + var_export($modifier, true), + $params + ); + $compiler->known_modifier_type[ $modifier ] = $type; + break 2; + } + } + break; + case 2: + // registered modifier compiler + if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIERCOMPILER ][ $modifier ][ 0 ])) { + $output = + call_user_func( + $compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIERCOMPILER ][ $modifier ][ 0 ], + $single_modifier, + $compiler->smarty + ); + $compiler->known_modifier_type[ $modifier ] = $type; + break 2; + } + break; + case 3: + // modifiercompiler plugin + if ($compiler->smarty->loadPlugin('smarty_modifiercompiler_' . $modifier)) { + // check if modifier allowed + if (!is_object($compiler->smarty->security_policy) + || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler) + ) { + $plugin = 'smarty_modifiercompiler_' . $modifier; + $output = $plugin($single_modifier, $compiler); + } + $compiler->known_modifier_type[ $modifier ] = $type; + break 2; + } + break; + case 4: + // modifier plugin + if ($function = $compiler->getPlugin($modifier, Smarty::PLUGIN_MODIFIER)) { + // check if modifier allowed + if (!is_object($compiler->smarty->security_policy) + || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler) + ) { + $output = "{$function}({$params})"; + } + $compiler->known_modifier_type[ $modifier ] = $type; + break 2; + } + break; + case 5: + // PHP function + if (is_callable($modifier)) { + // check if modifier allowed + if (!is_object($compiler->smarty->security_policy) + || $compiler->smarty->security_policy->isTrustedPhpModifier($modifier, $compiler) + ) { + $output = "{$modifier}({$params})"; + } + $compiler->known_modifier_type[ $modifier ] = $type; + break 2; + } + break; + case 6: + // default plugin handler + if (isset($compiler->default_handler_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ]) + || (is_callable($compiler->smarty->default_plugin_handler_func) + && $compiler->getPluginFromDefaultHandler($modifier, Smarty::PLUGIN_MODIFIER)) + ) { + $function = $compiler->default_handler_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ][ 0 ]; + // check if modifier allowed + if (!is_object($compiler->smarty->security_policy) + || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler) + ) { + if (!is_array($function)) { + $output = "{$function}({$params})"; + } else { + if (is_object($function[ 0 ])) { + $output = $function[ 0 ] . '->' . $function[ 1 ] . '(' . $params . ')'; + } else { + $output = $function[ 0 ] . '::' . $function[ 1 ] . '(' . $params . ')'; + } + } + } + if (isset($compiler->required_plugins[ 'nocache' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ]) + || + isset($compiler->required_plugins[ 'compiled' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ]) + ) { + // was a plugin + $compiler->known_modifier_type[ $modifier ] = 4; + } else { + $compiler->known_modifier_type[ $modifier ] = $type; + } + break 2; + } + } + } + if (!isset($compiler->known_modifier_type[ $modifier ])) { + $compiler->trigger_template_error("unknown modifier '{$modifier}'", null, true); + } + } + return $output; + } +} -- cgit v1.2.3