#155 Adapt Smarty upper/lower functions to be codesafe (e.g. for Turkish locale)

This commit is contained in:
Alec Smecher
2020-04-14 15:03:31 -07:00
parent e1c050a32c
commit 0124bc3aa0
8 changed files with 28 additions and 18 deletions

View File

@@ -93,7 +93,7 @@ class Smarty_Autoloader
if ($class[ 0 ] !== 'S' || strpos($class, 'Smarty') !== 0) { if ($class[ 0 ] !== 'S' || strpos($class, 'Smarty') !== 0) {
return; return;
} }
$_class = strtolower($class); $_class = strtr($class, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
if (isset(self::$rootClasses[ $_class ])) { if (isset(self::$rootClasses[ $_class ])) {
$file = self::$SMARTY_DIR . self::$rootClasses[ $_class ]; $file = self::$SMARTY_DIR . self::$rootClasses[ $_class ];
if (is_file($file)) { if (is_file($file)) {

View File

@@ -194,6 +194,7 @@ abstract class Smarty_CacheResource
if (!isset($type)) { if (!isset($type)) {
$type = $smarty->caching_type; $type = $smarty->caching_type;
} }
$typeUcfirst = strtr(substr($type,0,1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') . substr($type,1);
// try smarty's cache // try smarty's cache
if (isset($smarty->_cache[ 'cacheresource_handlers' ][ $type ])) { if (isset($smarty->_cache[ 'cacheresource_handlers' ][ $type ])) {
return $smarty->_cache[ 'cacheresource_handlers' ][ $type ]; return $smarty->_cache[ 'cacheresource_handlers' ][ $type ];
@@ -205,11 +206,11 @@ abstract class Smarty_CacheResource
} }
// try sysplugins dir // try sysplugins dir
if (isset(self::$sysplugins[ $type ])) { if (isset(self::$sysplugins[ $type ])) {
$cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type); $cache_resource_class = 'Smarty_Internal_CacheResource_' . $typeUcfirst;
return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = new $cache_resource_class(); return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = new $cache_resource_class();
} }
// try plugins dir // try plugins dir
$cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type); $cache_resource_class = 'Smarty_CacheResource_' . $typeUcfirst;
if ($smarty->loadPlugin($cache_resource_class)) { if ($smarty->loadPlugin($cache_resource_class)) {
return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = new $cache_resource_class(); return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = new $cache_resource_class();
} }

View File

@@ -143,7 +143,8 @@ class Smarty_Internal_Compile_Private_ForeachSection extends Smarty_Internal_Com
foreach ($this->resultOffsets as $key => $offset) { foreach ($this->resultOffsets as $key => $offset) {
foreach ($match[ $offset ] as $m) { foreach ($match[ $offset ] as $m) {
if (!empty($m)) { if (!empty($m)) {
$this->matchResults[ $key ][ strtolower($m) ] = true; $m = strtr($m, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
$this->matchResults[ $key ][ $m ] = true;
} }
} }
} }
@@ -213,12 +214,12 @@ class Smarty_Internal_Compile_Private_ForeachSection extends Smarty_Internal_Com
*/ */
public function compileSpecialVariable($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) public function compileSpecialVariable($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
{ {
$tag = strtolower(trim($parameter[ 0 ], '"\'')); $tag = strtr(trim($parameter[ 0 ], '"\''), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
$name = isset($parameter[ 1 ]) ? $compiler->getId($parameter[ 1 ]) : false; $name = isset($parameter[ 1 ]) ? $compiler->getId($parameter[ 1 ]) : false;
if (!$name) { if (!$name) {
$compiler->trigger_template_error("missing or illegal \$smarty.{$tag} name attribute", null, true); $compiler->trigger_template_error("missing or illegal \$smarty.{$tag} name attribute", null, true);
} }
$property = isset($parameter[ 2 ]) ? strtolower($compiler->getId($parameter[ 2 ])) : false; $property = isset($parameter[ 2 ]) ? strtr($compiler->getId($parameter[ 2 ]), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') : false;
if (!$property || !in_array($property, $this->nameProperties)) { if (!$property || !in_array($property, $this->nameProperties)) {
$compiler->trigger_template_error("missing or illegal \$smarty.{$tag} property attribute", null, true); $compiler->trigger_template_error("missing or illegal \$smarty.{$tag} property attribute", null, true);
} }

View File

@@ -29,7 +29,7 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
{ {
$_index = preg_split("/\]\[/", substr($parameter, 1, strlen($parameter) - 2)); $_index = preg_split("/\]\[/", substr($parameter, 1, strlen($parameter) - 2));
$variable = strtolower($compiler->getId($_index[ 0 ])); $variable = strtr($compiler->getId($_index[ 0 ]), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
if ($variable === false) { if ($variable === false) {
$compiler->trigger_template_error("special \$Smarty variable name index can not be variable", null, true); $compiler->trigger_template_error("special \$Smarty variable name index can not be variable", null, true);
} }
@@ -40,7 +40,8 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
case 'foreach': case 'foreach':
case 'section': case 'section':
if (!isset(Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ])) { if (!isset(Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ])) {
$class = 'Smarty_Internal_Compile_' . ucfirst($variable); $variableUcfirst = strtr(substr($variable,0,1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') . substr($variable,1);
$class = 'Smarty_Internal_Compile_' . $variableUcfirst;
Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ] = new $class; Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ] = new $class;
} }
return Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ]->compileSpecialVariable( return Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ]->compileSpecialVariable(
@@ -76,7 +77,8 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
$compiler->trigger_template_error("(secure mode) super globals not permitted"); $compiler->trigger_template_error("(secure mode) super globals not permitted");
break; break;
} }
$compiled_ref = '$_' . strtoupper($variable); $variableToUpper = strtr($variable, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
$compiled_ref = '$_' . $variableUpper;
break; break;
case 'template': case 'template':
return 'basename($_smarty_tpl->source->filepath)'; return 'basename($_smarty_tpl->source->filepath)';

View File

@@ -90,7 +90,7 @@ class Smarty_Internal_Extension_Handler
if (!isset($this->resolvedProperties[ $match[ 0 ] ][ $objType ])) { if (!isset($this->resolvedProperties[ $match[ 0 ] ][ $objType ])) {
$property = isset($this->resolvedProperties[ 'property' ][ $basename ]) ? $property = isset($this->resolvedProperties[ 'property' ][ $basename ]) ?
$this->resolvedProperties[ 'property' ][ $basename ] : $this->resolvedProperties[ 'property' ][ $basename ] :
$property = $this->resolvedProperties[ 'property' ][ $basename ] = strtolower( $property = $this->resolvedProperties[ 'property' ][ $basename ] = strtr(
join( join(
'_', '_',
preg_split( preg_split(
@@ -100,7 +100,8 @@ class Smarty_Internal_Extension_Handler
PREG_SPLIT_NO_EMPTY | PREG_SPLIT_NO_EMPTY |
PREG_SPLIT_DELIM_CAPTURE PREG_SPLIT_DELIM_CAPTURE
) )
) ),
'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'
); );
if ($property !== false) { if ($property !== false) {
if (property_exists($data, $property)) { if (property_exists($data, $property)) {
@@ -145,7 +146,9 @@ class Smarty_Internal_Extension_Handler
public function upperCase($name) public function upperCase($name)
{ {
$_name = explode('_', $name); $_name = explode('_', $name);
$_name = array_map('ucfirst', $_name); foreach ($_name as &$namePart) {
$namePart = strtr(substr($namePart,0,1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') . substr($namePart,1);
}
return implode('_', $_name); return implode('_', $_name);
} }

View File

@@ -40,7 +40,7 @@ class Smarty_Internal_Method_LoadPlugin
throw new SmartyException("plugin {$plugin_name} is not a valid name format"); throw new SmartyException("plugin {$plugin_name} is not a valid name format");
} }
if (!empty($match[ 2 ])) { if (!empty($match[ 2 ])) {
$file = SMARTY_SYSPLUGINS_DIR . strtolower($plugin_name) . '.php'; $file = SMARTY_SYSPLUGINS_DIR . strtr($plugin_name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') . '.php';
if (isset($this->plugin_files[ $file ])) { if (isset($this->plugin_files[ $file ])) {
if ($this->plugin_files[ $file ] !== false) { if ($this->plugin_files[ $file ] !== false) {
return $this->plugin_files[ $file ]; return $this->plugin_files[ $file ];
@@ -60,7 +60,7 @@ class Smarty_Internal_Method_LoadPlugin
} }
// plugin filename is expected to be: [type].[name].php // plugin filename is expected to be: [type].[name].php
$_plugin_filename = "{$match[1]}.{$match[4]}.php"; $_plugin_filename = "{$match[1]}.{$match[4]}.php";
$_lower_filename = strtolower($_plugin_filename); $_lower_filename = strtr($_plugin_filename, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
if (isset($this->plugin_files)) { if (isset($this->plugin_files)) {
if (isset($this->plugin_files[ 'plugins_dir' ][ $_lower_filename ])) { if (isset($this->plugin_files[ 'plugins_dir' ][ $_lower_filename ])) {
if (!$smarty->use_include_path || $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ] !== false) { if (!$smarty->use_include_path || $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ] !== false) {

View File

@@ -620,7 +620,7 @@ abstract class Smarty_Internal_TemplateCompilerBase
if (strcasecmp($name, 'isset') === 0 || strcasecmp($name, 'empty') === 0 if (strcasecmp($name, 'isset') === 0 || strcasecmp($name, 'empty') === 0
|| strcasecmp($name, 'array') === 0 || is_callable($name) || strcasecmp($name, 'array') === 0 || is_callable($name)
) { ) {
$func_name = strtolower($name); $func_name = strtr($name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
if ($func_name === 'isset') { if ($func_name === 'isset') {
if (count($parameter) === 0) { if (count($parameter) === 0) {
@@ -784,7 +784,9 @@ abstract class Smarty_Internal_TemplateCompilerBase
if (!isset(self::$_tag_objects[ $tag ])) { if (!isset(self::$_tag_objects[ $tag ])) {
// lazy load internal compiler plugin // lazy load internal compiler plugin
$_tag = explode('_', $tag); $_tag = explode('_', $tag);
$_tag = array_map('ucfirst', $_tag); foreach ($_tag as &$tagPart) {
$tagPart = strtr(substr($tagPart,0,1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') . substr($tagPart,1);
}
$class_name = 'Smarty_Internal_Compile_' . implode('_', $_tag); $class_name = 'Smarty_Internal_Compile_' . implode('_', $_tag);
if (class_exists($class_name) if (class_exists($class_name)
&& (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this)) && (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this))

View File

@@ -76,13 +76,14 @@ abstract class Smarty_Resource
$smarty->registered_resources[ $type ] instanceof Smarty_Resource ? $smarty->registered_resources[ $type ] instanceof Smarty_Resource ?
$smarty->registered_resources[ $type ] : new Smarty_Internal_Resource_Registered(); $smarty->registered_resources[ $type ] : new Smarty_Internal_Resource_Registered();
} }
$typeUcfirst = strtr(substr($type,0,1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') . substr($type,1);
// try sysplugins dir // try sysplugins dir
if (isset(self::$sysplugins[ $type ])) { if (isset(self::$sysplugins[ $type ])) {
$_resource_class = 'Smarty_Internal_Resource_' . ucfirst($type); $_resource_class = 'Smarty_Internal_Resource_' . $typeUcfirst;
return $smarty->_cache[ 'resource_handlers' ][ $type ] = new $_resource_class(); return $smarty->_cache[ 'resource_handlers' ][ $type ] = new $_resource_class();
} }
// try plugins dir // try plugins dir
$_resource_class = 'Smarty_Resource_' . ucfirst($type); $_resource_class = 'Smarty_Resource_' . $typeUcfirst;
if ($smarty->loadPlugin($_resource_class)) { if ($smarty->loadPlugin($_resource_class)) {
if (class_exists($_resource_class, false)) { if (class_exists($_resource_class, false)) {
return $smarty->_cache[ 'resource_handlers' ][ $type ] = new $_resource_class(); return $smarty->_cache[ 'resource_handlers' ][ $type ] = new $_resource_class();