mirror of
https://github.com/smarty-php/smarty.git
synced 2026-08-09 23:11:30 +02:00
Compare commits
19
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c11676e85a | ||
|
|
44a08bea7c | ||
|
|
2adb8801a5 | ||
|
|
9fc96a13db | ||
|
|
09e211cbfd | ||
|
|
76881c8d33 | ||
|
|
4549822cdd | ||
|
|
55799a9b65 | ||
|
|
6592bd4ad3 | ||
|
|
7320402766 | ||
|
|
1115eb6f65 | ||
|
|
9656f553d1 | ||
|
|
42b869e3a0 | ||
|
|
4cb00900d7 | ||
|
|
204f3bc74e | ||
|
|
409802db04 | ||
|
|
1015e5472b | ||
|
|
c7a271323b | ||
|
|
e2cb9873ff |
+17
-1
@@ -6,11 +6,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [4.5.4] - 2024-08-14
|
||||||
|
- Fixed that using `count()` would trigger a deprecation notice. [#813](https://github.com/smarty-php/smarty/issues/813)
|
||||||
|
|
||||||
|
|
||||||
|
## [4.5.3] - 2024-05-28
|
||||||
|
- Fixed a code injection vulnerability in extends-tag. This addresses CVE-2024-35226.
|
||||||
|
|
||||||
|
|
||||||
|
## [4.5.2] - 2024-04-06
|
||||||
|
- Fixed argument must be passed by reference error introduced in v4.5.1 [#964](https://github.com/smarty-php/smarty/issues/964)
|
||||||
|
|
||||||
|
## [4.5.1] - 2024-03-18
|
||||||
|
- Using unregistered static class methods in expressions now also triggers a deprecation notice because we will drop support for this in the next major release [#813](https://github.com/smarty-php/smarty/issues/813)
|
||||||
|
|
||||||
|
## [4.5.0] - 2024-03-18
|
||||||
|
- (this release accidentally didn't contain any changes, fixed in 4.5.1)
|
||||||
|
|
||||||
## [4.4.1] - 2024-02-26
|
## [4.4.1] - 2024-02-26
|
||||||
- Fixed internal release-tooling
|
- Fixed internal release-tooling
|
||||||
|
|
||||||
## [4.4.0] - 2024-02-26
|
## [4.4.0] - 2024-02-26
|
||||||
### Changed
|
|
||||||
- Using the `|implode`, `|json_encode` and `|substr` modifiers does not generate a deprecation warning anymore as they will continue to be supported in v5 [#939](https://github.com/smarty-php/smarty/issues/939)
|
- Using the `|implode`, `|json_encode` and `|substr` modifiers does not generate a deprecation warning anymore as they will continue to be supported in v5 [#939](https://github.com/smarty-php/smarty/issues/939)
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -178,14 +178,14 @@ The above example will output:
|
|||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
name: Jack Jones<br />
|
name: Jack Jones<br />
|
||||||
home phone: 777-555-5555<br />
|
home: 777-555-5555<br />
|
||||||
cell phone: 888-555-5555<br />
|
cell: 888-555-5555<br />
|
||||||
e-mail: jack@myexample.com
|
e-mail: jack@myexample.com
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
name: Jane Munson<br />
|
name: Jane Munson<br />
|
||||||
home phone: 000-555-5555<br />
|
home: 000-555-5555<br />
|
||||||
cell phone: 123456<br />
|
cell: 123456<br />
|
||||||
e-mail: jane@myexample.com
|
e-mail: jane@myexample.com
|
||||||
</p>
|
</p>
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -785,6 +785,9 @@ value(res) ::= ns1(c)DOUBLECOLON static_class_access(s). {
|
|||||||
if (isset($this->smarty->registered_classes[c])) {
|
if (isset($this->smarty->registered_classes[c])) {
|
||||||
res = $this->smarty->registered_classes[c].'::'.s[0].s[1];
|
res = $this->smarty->registered_classes[c].'::'.s[0].s[1];
|
||||||
} else {
|
} else {
|
||||||
|
trigger_error('Using unregistered static method "' . c.'::'.s[0] . '" in a template is deprecated and will be ' .
|
||||||
|
'removed in a future release. Use Smarty::registerClass to explicitly register ' .
|
||||||
|
'a class for access.', E_USER_DEPRECATED);
|
||||||
res = c.'::'.s[0].s[1];
|
res = c.'::'.s[0].s[1];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
/**
|
/**
|
||||||
* smarty version
|
* smarty version
|
||||||
*/
|
*/
|
||||||
const SMARTY_VERSION = '4.4.1';
|
const SMARTY_VERSION = '4.5.4';
|
||||||
/**
|
/**
|
||||||
* define variable scopes
|
* define variable scopes
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_Compile_Shared_Inh
|
|||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
public $optional_attributes = array('extends_resource');
|
public $optional_attributes = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attribute definition: Overwrites base class.
|
* Attribute definition: Overwrites base class.
|
||||||
@@ -62,29 +62,7 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_Compile_Shared_Inh
|
|||||||
}
|
}
|
||||||
// add code to initialize inheritance
|
// add code to initialize inheritance
|
||||||
$this->registerInit($compiler, true);
|
$this->registerInit($compiler, true);
|
||||||
$file = trim($_attr[ 'file' ], '\'"');
|
$this->compileEndChild($compiler, $_attr[ 'file' ]);
|
||||||
if (strlen($file) > 8 && substr($file, 0, 8) === 'extends:') {
|
|
||||||
// generate code for each template
|
|
||||||
$files = array_reverse(explode('|', substr($file, 8)));
|
|
||||||
$i = 0;
|
|
||||||
foreach ($files as $file) {
|
|
||||||
if ($file[ 0 ] === '"') {
|
|
||||||
$file = trim($file, '".');
|
|
||||||
} else {
|
|
||||||
$file = "'{$file}'";
|
|
||||||
}
|
|
||||||
$i++;
|
|
||||||
if ($i === count($files) && isset($_attr[ 'extends_resource' ])) {
|
|
||||||
$this->compileEndChild($compiler);
|
|
||||||
}
|
|
||||||
$this->compileInclude($compiler, $file);
|
|
||||||
}
|
|
||||||
if (!isset($_attr[ 'extends_resource' ])) {
|
|
||||||
$this->compileEndChild($compiler);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$this->compileEndChild($compiler, $_attr[ 'file' ]);
|
|
||||||
}
|
|
||||||
$compiler->has_code = false;
|
$compiler->has_code = false;
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
@@ -115,44 +93,4 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_Compile_Shared_Inh
|
|||||||
'') . ");\n?>"
|
'') . ");\n?>"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Add code for including subtemplate to end of template
|
|
||||||
*
|
|
||||||
* @param \Smarty_Internal_TemplateCompilerBase $compiler
|
|
||||||
* @param string $template subtemplate name
|
|
||||||
*
|
|
||||||
* @throws \SmartyCompilerException
|
|
||||||
* @throws \SmartyException
|
|
||||||
*/
|
|
||||||
private function compileInclude(Smarty_Internal_TemplateCompilerBase $compiler, $template)
|
|
||||||
{
|
|
||||||
$compiler->parser->template_postfix[] = new Smarty_Internal_ParseTree_Tag(
|
|
||||||
$compiler->parser,
|
|
||||||
$compiler->compileTag(
|
|
||||||
'include',
|
|
||||||
array(
|
|
||||||
$template,
|
|
||||||
array('scope' => 'parent')
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create source code for {extends} from source components array
|
|
||||||
*
|
|
||||||
* @param \Smarty_Internal_Template $template
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function extendsSourceArrayCode(Smarty_Internal_Template $template)
|
|
||||||
{
|
|
||||||
$resources = array();
|
|
||||||
foreach ($template->source->components as $source) {
|
|
||||||
$resources[] = $source->resource;
|
|
||||||
}
|
|
||||||
return $template->smarty->left_delimiter . 'extends file=\'extends:' . join('|', $resources) .
|
|
||||||
'\' extends_resource=true' . $template->smarty->right_delimiter;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,9 +109,11 @@ class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBa
|
|||||||
if (!is_object($compiler->smarty->security_policy)
|
if (!is_object($compiler->smarty->security_policy)
|
||||||
|| $compiler->smarty->security_policy->isTrustedPhpModifier($modifier, $compiler)
|
|| $compiler->smarty->security_policy->isTrustedPhpModifier($modifier, $compiler)
|
||||||
) {
|
) {
|
||||||
trigger_error('Using php-function "' . $modifier . '" as a modifier is deprecated and will be ' .
|
if (!in_array($modifier, ['time', 'join', 'is_array', 'in_array'])) {
|
||||||
'removed in a future release. Use Smarty::registerPlugin to explicitly register ' .
|
trigger_error('Using unregistered function "' . $modifier . '" in a template is deprecated and will be ' .
|
||||||
'a custom modifier.', E_USER_DEPRECATED);
|
'removed in a future release. Use Smarty::registerPlugin to explicitly register ' .
|
||||||
|
'a custom modifier.', E_USER_DEPRECATED);
|
||||||
|
}
|
||||||
$output = "{$modifier}({$params})";
|
$output = "{$modifier}({$params})";
|
||||||
}
|
}
|
||||||
$compiler->known_modifier_type[ $modifier ] = $type;
|
$compiler->known_modifier_type[ $modifier ] = $type;
|
||||||
|
|||||||
@@ -455,15 +455,29 @@ abstract class Smarty_Internal_TemplateCompilerBase
|
|||||||
$this->smarty->_current_file = $this->template->source->filepath;
|
$this->smarty->_current_file = $this->template->source->filepath;
|
||||||
// get template source
|
// get template source
|
||||||
if (!empty($this->template->source->components)) {
|
if (!empty($this->template->source->components)) {
|
||||||
// we have array of inheritance templates by extends: resource
|
$_compiled_code = '<?php $_smarty_tpl->_loadInheritance(); $_smarty_tpl->inheritance->init($_smarty_tpl, true); ?>';
|
||||||
// generate corresponding source code sequence
|
|
||||||
$_content =
|
$i = 0;
|
||||||
Smarty_Internal_Compile_Extends::extendsSourceArrayCode($this->template);
|
$reversed_components = array_reverse($this->template->getSource()->components);
|
||||||
|
foreach ($reversed_components as $source) {
|
||||||
|
$i++;
|
||||||
|
if ($i === count($reversed_components)) {
|
||||||
|
$_compiled_code .= '<?php $_smarty_tpl->inheritance->endChild($_smarty_tpl); ?>';
|
||||||
|
}
|
||||||
|
$_compiled_code .= $this->compileTag(
|
||||||
|
'include',
|
||||||
|
[
|
||||||
|
var_export($source->resource, true),
|
||||||
|
['scope' => 'parent'],
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$_compiled_code = $this->postFilter($_compiled_code, $this->template);
|
||||||
} else {
|
} else {
|
||||||
// get template source
|
// get template source
|
||||||
$_content = $this->template->source->getContent();
|
$_content = $this->template->source->getContent();
|
||||||
|
$_compiled_code = $this->postFilter($this->doCompile($this->preFilter($_content), true));
|
||||||
}
|
}
|
||||||
$_compiled_code = $this->postFilter($this->doCompile($this->preFilter($_content), true));
|
|
||||||
if (!empty($this->required_plugins[ 'compiled' ]) || !empty($this->required_plugins[ 'nocache' ])) {
|
if (!empty($this->required_plugins[ 'compiled' ]) || !empty($this->required_plugins[ 'nocache' ])) {
|
||||||
$_compiled_code = '<?php ' . $this->compileRequiredPlugins() . "?>\n" . $_compiled_code;
|
$_compiled_code = '<?php ' . $this->compileRequiredPlugins() . "?>\n" . $_compiled_code;
|
||||||
}
|
}
|
||||||
@@ -640,7 +654,18 @@ abstract class Smarty_Internal_TemplateCompilerBase
|
|||||||
return $func_name . '(' . $parameter[ 0 ] . ')';
|
return $func_name . '(' . $parameter[ 0 ] . ')';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return $name . '(' . implode(',', $parameter) . ')';
|
|
||||||
|
if (
|
||||||
|
!$this->smarty->loadPlugin('smarty_modifiercompiler_' . $name)
|
||||||
|
&& !isset($this->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$name])
|
||||||
|
&& !in_array($name, ['time', 'join', 'is_array', 'in_array', 'count'])
|
||||||
|
) {
|
||||||
|
trigger_error('Using unregistered function "' . $name . '" in a template is deprecated and will be ' .
|
||||||
|
'removed in a future release. Use Smarty::registerPlugin to explicitly register ' .
|
||||||
|
'a custom modifier.', E_USER_DEPRECATED);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $name . '(' . implode(',', $parameter) . ')';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$this->trigger_template_error("unknown function '{$name}'");
|
$this->trigger_template_error("unknown function '{$name}'");
|
||||||
|
|||||||
@@ -2425,6 +2425,9 @@ public static $yy_action = array(
|
|||||||
if (isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor])) {
|
if (isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor])) {
|
||||||
$this->_retvalue = $this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor].'::'.$this->yystack[$this->yyidx + 0]->minor[0].$this->yystack[$this->yyidx + 0]->minor[1];
|
$this->_retvalue = $this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor].'::'.$this->yystack[$this->yyidx + 0]->minor[0].$this->yystack[$this->yyidx + 0]->minor[1];
|
||||||
} else {
|
} else {
|
||||||
|
trigger_error('Using unregistered static method "' . $this->yystack[$this->yyidx + -2]->minor.'::'.$this->yystack[$this->yyidx + 0]->minor[0] . '" in a template is deprecated and will be ' .
|
||||||
|
'removed in a future release. Use Smarty::registerClass to explicitly register ' .
|
||||||
|
'a class for access.', E_USER_DEPRECATED);
|
||||||
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'::'.$this->yystack[$this->yyidx + 0]->minor[0].$this->yystack[$this->yyidx + 0]->minor[1];
|
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'::'.$this->yystack[$this->yyidx + 0]->minor[0].$this->yystack[$this->yyidx + 0]->minor[1];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ class Smarty_Security
|
|||||||
*
|
*
|
||||||
* @param string $function_name
|
* @param string $function_name
|
||||||
* @param object $compiler compiler object
|
* @param object $compiler compiler object
|
||||||
*
|
* @deprecated
|
||||||
* @return boolean true if function is trusted
|
* @return boolean true if function is trusted
|
||||||
*/
|
*/
|
||||||
public function isTrustedPhpFunction($function_name, $compiler)
|
public function isTrustedPhpFunction($function_name, $compiler)
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@ php utilities/update-smarty-version-number.php $1
|
|||||||
git add changelog CHANGELOG.md libs/Smarty.class.php
|
git add changelog CHANGELOG.md libs/Smarty.class.php
|
||||||
git commit -m "version bump"
|
git commit -m "version bump"
|
||||||
|
|
||||||
git checkout support/4.3
|
git checkout support/4
|
||||||
git pull
|
git pull
|
||||||
git merge --no-ff "release/$1"
|
git merge --no-ff "release/$1"
|
||||||
git branch -d "release/$1"
|
git branch -d "release/$1"
|
||||||
|
|||||||
+5
-1
@@ -15,7 +15,11 @@
|
|||||||
timeoutForSmallTests="1"
|
timeoutForSmallTests="1"
|
||||||
timeoutForMediumTests="10"
|
timeoutForMediumTests="10"
|
||||||
timeoutForLargeTests="60"
|
timeoutForLargeTests="60"
|
||||||
verbose="false">
|
verbose="false"
|
||||||
|
convertErrorsToExceptions="true"
|
||||||
|
convertNoticesToExceptions="true"
|
||||||
|
convertWarningsToExceptions="true"
|
||||||
|
convertDeprecationsToExceptions="true">
|
||||||
<testsuites>
|
<testsuites>
|
||||||
<testsuite name="foo">
|
<testsuite name="foo">
|
||||||
<directory>./tests/UnitTests/</directory>
|
<directory>./tests/UnitTests/</directory>
|
||||||
|
|||||||
@@ -5,11 +5,13 @@
|
|||||||
# - ./run-tests-for-all-php-versions.sh --group 20221124
|
# - ./run-tests-for-all-php-versions.sh --group 20221124
|
||||||
# - ./run-tests-for-all-php-versions.sh --exclude-group slow
|
# - ./run-tests-for-all-php-versions.sh --exclude-group slow
|
||||||
|
|
||||||
docker-compose run php71 ./run-tests.sh $@ && \
|
COMPOSE_CMD="mutagen-compose"
|
||||||
docker-compose run php72 ./run-tests.sh $@ && \
|
|
||||||
docker-compose run php73 ./run-tests.sh $@ && \
|
$COMPOSE_CMD run --rm php71 ./run-tests.sh $@ && \
|
||||||
docker-compose run php74 ./run-tests.sh $@ && \
|
$COMPOSE_CMD run --rm php72 ./run-tests.sh $@ && \
|
||||||
docker-compose run php80 ./run-tests.sh $@ && \
|
$COMPOSE_CMD run --rm php73 ./run-tests.sh $@ && \
|
||||||
docker-compose run php81 ./run-tests.sh $@ && \
|
$COMPOSE_CMD run --rm php74 ./run-tests.sh $@ && \
|
||||||
docker-compose run php82 ./run-tests.sh $@ && \
|
$COMPOSE_CMD run --rm php80 ./run-tests.sh $@ && \
|
||||||
docker-compose run php83 ./run-tests.sh $@
|
$COMPOSE_CMD run --rm php81 ./run-tests.sh $@ && \
|
||||||
|
$COMPOSE_CMD run --rm php82 ./run-tests.sh $@ && \
|
||||||
|
$COMPOSE_CMD run --rm php83 ./run-tests.sh $@
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ class PHPUnit_Smarty extends PHPUnit\Framework\TestCase
|
|||||||
$this->smarty->setCacheDir(__DIR__ . '/cache');
|
$this->smarty->setCacheDir(__DIR__ . '/cache');
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->getSmartyObj();
|
$this->smarty->setErrorReporting(E_ALL &~ E_USER_DEPRECATED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -49,6 +49,6 @@ class LoadPluginTest extends PHPUnit_Smarty
|
|||||||
*/
|
*/
|
||||||
public function testLoadPluginSmartyPluginCounter()
|
public function testLoadPluginSmartyPluginCounter()
|
||||||
{
|
{
|
||||||
$this->assertTrue($this->smarty->loadPlugin('Smarty_Function_Counter') == true);
|
$this->assertTrue($this->smarty->loadPlugin('Smarty_function_counter') == true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ class SecurityTest extends PHPUnit_Smarty
|
|||||||
*/
|
*/
|
||||||
public function testTrustedPHPFunction()
|
public function testTrustedPHPFunction()
|
||||||
{
|
{
|
||||||
$this->assertEquals("5", $this->smarty->fetch('string:{assign var=foo value=[1,2,3,4,5]}{sizeof($foo)}'));
|
$this->assertEquals("5", $this->smarty->fetch('string:{assign var=foo value=[1,2,3,4,5]}{count($foo)}'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -75,7 +75,7 @@ class SecurityTest extends PHPUnit_Smarty
|
|||||||
{
|
{
|
||||||
$this->smarty->security_policy->php_functions = array('null');
|
$this->smarty->security_policy->php_functions = array('null');
|
||||||
$this->smarty->disableSecurity();
|
$this->smarty->disableSecurity();
|
||||||
$this->assertEquals("5", $this->smarty->fetch('string:{assign var=foo value=[1,2,3,4,5]}{sizeof($foo)}'));
|
$this->assertEquals("5", $this->smarty->fetch('string:{assign var=foo value=[1,2,3,4,5]}{count($foo)}'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ class ClearAllAssignTest extends PHPUnit_Smarty
|
|||||||
*/
|
*/
|
||||||
public function testClearAllAssignInTemplate()
|
public function testClearAllAssignInTemplate()
|
||||||
{
|
{
|
||||||
error_reporting((error_reporting() & ~(E_NOTICE | E_USER_NOTICE | E_WARNING)));
|
$this->smarty->setErrorReporting($this->smarty->error_reporting & ~(E_NOTICE | E_USER_NOTICE | E_WARNING));
|
||||||
$this->_tpl->clearAllAssign();
|
$this->_tpl->clearAllAssign();
|
||||||
$this->assertEquals('foobar', $this->smarty->fetch($this->_tpl));
|
$this->assertEquals('foobar', $this->smarty->fetch($this->_tpl));
|
||||||
}
|
}
|
||||||
@@ -56,7 +56,7 @@ class ClearAllAssignTest extends PHPUnit_Smarty
|
|||||||
*/
|
*/
|
||||||
public function testClearAllAssignInData()
|
public function testClearAllAssignInData()
|
||||||
{
|
{
|
||||||
error_reporting((error_reporting() & ~(E_NOTICE | E_USER_NOTICE | E_WARNING)));
|
$this->smarty->setErrorReporting($this->smarty->error_reporting & ~(E_NOTICE | E_USER_NOTICE | E_WARNING));
|
||||||
$this->_data->clearAllAssign();
|
$this->_data->clearAllAssign();
|
||||||
$this->assertEquals('fooblar', $this->smarty->fetch($this->_tpl));
|
$this->assertEquals('fooblar', $this->smarty->fetch($this->_tpl));
|
||||||
}
|
}
|
||||||
@@ -66,7 +66,7 @@ class ClearAllAssignTest extends PHPUnit_Smarty
|
|||||||
*/
|
*/
|
||||||
public function testClearAllAssignInSmarty()
|
public function testClearAllAssignInSmarty()
|
||||||
{
|
{
|
||||||
error_reporting((error_reporting() & ~(E_NOTICE | E_USER_NOTICE | E_WARNING)));
|
$this->smarty->setErrorReporting($this->smarty->error_reporting & ~(E_NOTICE | E_USER_NOTICE | E_WARNING));
|
||||||
$this->smarty->clearAllAssign();
|
$this->smarty->clearAllAssign();
|
||||||
$this->assertEquals('barblar', $this->smarty->fetch($this->_tpl));
|
$this->assertEquals('barblar', $this->smarty->fetch($this->_tpl));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,4 +109,17 @@ class GetTemplateVarsTest extends PHPUnit_Smarty
|
|||||||
$this->assertEquals("bar2", $this->smarty->getTemplateVars('foo2', $data2, false));
|
$this->assertEquals("bar2", $this->smarty->getTemplateVars('foo2', $data2, false));
|
||||||
$this->assertEquals("", $this->smarty->getTemplateVars('blar', $data2, false));
|
$this->assertEquals("", $this->smarty->getTemplateVars('blar', $data2, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testSimpleCallReturnsArrayWithAllValues()
|
||||||
|
{
|
||||||
|
$this->smarty->assign('foo', 'bar');
|
||||||
|
$this->smarty->assign('i', 3);
|
||||||
|
|
||||||
|
$vars = $this->smarty->getTemplateVars();
|
||||||
|
|
||||||
|
$this->assertArrayHasKey('foo', $vars);
|
||||||
|
$this->assertArrayHasKey('i', $vars);
|
||||||
|
$this->assertEquals('bar', $vars['foo']);
|
||||||
|
$this->assertEquals(3,$vars['i']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1371,8 +1371,38 @@ class CompileBlockExtendsTest extends PHPUnit_Smarty
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testBlockWithAssign() {
|
public function testBlockWithAssign() {
|
||||||
$this->assertEquals('Captured content is: Content with lots of html here', $this->smarty->fetch('038_child.tpl'));
|
$this->assertEquals('Captured content is: Content with lots of html here', $this->smarty->fetch('038_child.tpl'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test escaping of file parameter
|
||||||
|
*/
|
||||||
|
public function testEscaping()
|
||||||
|
{
|
||||||
|
$this->expectException(SmartyException::class);
|
||||||
|
$this->expectExceptionMessageRegExp('/Unable to load.*/');
|
||||||
|
$this->assertEquals('hello world', $this->smarty->fetch('escaping.tpl'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test escaping of file parameter 2
|
||||||
|
*/
|
||||||
|
public function testEscaping2()
|
||||||
|
{
|
||||||
|
$this->expectException(SmartyException::class);
|
||||||
|
$this->expectExceptionMessageRegExp('/Unable to load.*/');
|
||||||
|
$this->assertEquals('hello world', $this->smarty->fetch('escaping2.tpl'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test escaping of file parameter 3
|
||||||
|
*/
|
||||||
|
public function testEscaping3()
|
||||||
|
{
|
||||||
|
$this->expectException(SmartyException::class);
|
||||||
|
$this->expectExceptionMessageRegExp('/Unable to load.*/');
|
||||||
|
$this->assertEquals('hello world', $this->smarty->fetch('escaping3.tpl'));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
{extends "extends:helloworld.tpl', var_dump(shell_exec('ls')), 1, 2, 3, 4, 5, 6);}}?>"}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{extends 'extends:"helloworld.tpl\', var_dump(shell_exec(\'ls\')), 1, 2, 3, 4, 5, 6);}}?>'}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{extends file='extends:"helloworld.tpl'|cat:"', var_dump(shell_exec('ls')), 1, 2, 3, 4, 5, 6);}}?>"}
|
||||||
@@ -82,6 +82,18 @@ class CompileIncludeTest extends PHPUnit_Smarty
|
|||||||
$this->assertEquals('I1I2I3', $content, $text);
|
$this->assertEquals('I1I2I3', $content, $text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test template name escaping
|
||||||
|
*/
|
||||||
|
public function testIncludeFilenameEscaping()
|
||||||
|
{
|
||||||
|
$this->expectException(SmartyException::class);
|
||||||
|
$this->expectExceptionMessageRegExp('/Unable to load.*/');
|
||||||
|
$tpl = $this->smarty->createTemplate('test_include_security.tpl');
|
||||||
|
$content = $this->smarty->fetch($tpl);
|
||||||
|
$this->assertEquals("hello world", $content);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* test standard output
|
* test standard output
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
{include file="helloworld.tpl', var_dump(shell_exec('ls')), 1, 2, 3, 4, 5, 6);}}?>"}
|
||||||
@@ -148,4 +148,37 @@ class CompileSectionTest extends PHPUnit_Smarty
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testNestedArrayAsLoopParameter()
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
['name' => 'John Smith', 'home' => '555-555-5555',
|
||||||
|
'cell' => '666-555-5555', 'email' => 'john@myexample.com'],
|
||||||
|
['name' => 'Jack Jones', 'home' => '777-555-5555',
|
||||||
|
'cell' => '888-555-5555', 'email' => 'jack@myexample.com'],
|
||||||
|
['name' => 'Jane Munson', 'home' => '000-555-5555',
|
||||||
|
'cell' => '123456', 'email' => 'jane@myexample.com']
|
||||||
|
];
|
||||||
|
$this->smarty->assign('contacts',$data);
|
||||||
|
$result = $this->smarty->fetch('string:{section name=customer loop=$contacts}
|
||||||
|
name: {$contacts[customer].name}
|
||||||
|
home: {$contacts[customer].home}
|
||||||
|
cell: {$contacts[customer].cell}
|
||||||
|
e-mail: {$contacts[customer].email}
|
||||||
|
{/section}');
|
||||||
|
$this->assertEquals('name: John Smith
|
||||||
|
home: 555-555-5555
|
||||||
|
cell: 666-555-5555
|
||||||
|
e-mail: john@myexample.com
|
||||||
|
name: Jack Jones
|
||||||
|
home: 777-555-5555
|
||||||
|
cell: 888-555-5555
|
||||||
|
e-mail: jack@myexample.com
|
||||||
|
name: Jane Munson
|
||||||
|
home: 000-555-5555
|
||||||
|
cell: 123456
|
||||||
|
e-mail: jane@myexample.com
|
||||||
|
', $result);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ class PhpFunctionTest extends PHPUnit_Smarty
|
|||||||
public function testEmpty2()
|
public function testEmpty2()
|
||||||
{
|
{
|
||||||
$this->smarty->disableSecurity();
|
$this->smarty->disableSecurity();
|
||||||
|
$this->smarty->registerPlugin('modifier', 'pass', 'pass');
|
||||||
$this->smarty->assign('var', array(null,
|
$this->smarty->assign('var', array(null,
|
||||||
false,
|
false,
|
||||||
(int) 0,
|
(int) 0,
|
||||||
@@ -78,6 +79,7 @@ class PhpFunctionTest extends PHPUnit_Smarty
|
|||||||
public function testEmpty3()
|
public function testEmpty3()
|
||||||
{
|
{
|
||||||
$this->smarty->disableSecurity();
|
$this->smarty->disableSecurity();
|
||||||
|
$this->smarty->registerPlugin('modifier', 'pass', 'pass');
|
||||||
$this->smarty->assign('var', array(true,
|
$this->smarty->assign('var', array(true,
|
||||||
(int) 1,
|
(int) 1,
|
||||||
(float) 0.1,
|
(float) 0.1,
|
||||||
@@ -114,6 +116,7 @@ class PhpFunctionTest extends PHPUnit_Smarty
|
|||||||
public function testIsset1()
|
public function testIsset1()
|
||||||
{
|
{
|
||||||
$this->smarty->disableSecurity();
|
$this->smarty->disableSecurity();
|
||||||
|
$this->smarty->registerPlugin('modifier', 'pass', 'pass');
|
||||||
$this->smarty->assign('isNull', null);
|
$this->smarty->assign('isNull', null);
|
||||||
$this->smarty->assign('isSet', 1);
|
$this->smarty->assign('isSet', 1);
|
||||||
$this->smarty->assign('arr', array('isNull' => null, 'isSet' => 1));
|
$this->smarty->assign('arr', array('isNull' => null, 'isSet' => 1));
|
||||||
@@ -155,7 +158,7 @@ class PhpFunctionTest extends PHPUnit_Smarty
|
|||||||
public function testIsset3($strTemplate, $result)
|
public function testIsset3($strTemplate, $result)
|
||||||
{
|
{
|
||||||
$this->smarty->disableSecurity();
|
$this->smarty->disableSecurity();
|
||||||
|
$this->smarty->registerPlugin('modifier', 'intval', 'intval');
|
||||||
$this->smarty->assign('varobject', new TestIsset());
|
$this->smarty->assign('varobject', new TestIsset());
|
||||||
$this->smarty->assign('vararray', $vararray = array(
|
$this->smarty->assign('vararray', $vararray = array(
|
||||||
'keythatexists' => false,
|
'keythatexists' => false,
|
||||||
@@ -196,6 +199,107 @@ class PhpFunctionTest extends PHPUnit_Smarty
|
|||||||
array('{if isset($_varsimple{$key})}true{else}false{/if}', 'true'),
|
array('{if isset($_varsimple{$key})}true{else}false{/if}', 'true'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests various PHP functions (deprecated)
|
||||||
|
* @dataProvider dataVariousPHPFunctions
|
||||||
|
*/
|
||||||
|
public function testVariousPHPFunctions($strTemplate, $value, $expected) {
|
||||||
|
$this->smarty->disableSecurity();
|
||||||
|
$this->cleanDirs();
|
||||||
|
$this->smarty->assign('value', $value);
|
||||||
|
$this->assertEquals($expected, $this->smarty->fetch('string:' . $strTemplate));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data provider for testIsset3
|
||||||
|
*/
|
||||||
|
public function dataVariousPHPFunctions()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
array('{$a = count($value)}{$a}', array(1,2,3), '3'),
|
||||||
|
array('{$a = in_array("b", $value)}{$a}', array(1,'b',3), true),
|
||||||
|
array('{$a = strlen(uniqid())}{$a}', '', 13),
|
||||||
|
array('{$a = date("Y", $value)}{$a}', strtotime("01-01-2030"), 2030),
|
||||||
|
array('{$a = PhpFunctionTest::sayHi($value)}{$a}', 'mario', 'hi mario'),
|
||||||
|
array('{$a = pass($value)}{$a}', 'mario', 'mario'),
|
||||||
|
array('{$a = 1}{$b = Closure::fromCallable($value)}{$a}', 'strlen', 1),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function sayHi($value) {
|
||||||
|
return 'hi ' . $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that each function that will not be supported in Smarty 5 does throw an E_USER_DEPRECATED notice.
|
||||||
|
* @dataProvider dataDeprecationNoticesForSmarty5
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
|
public function testDeprecationNoticesForSmarty5($strTemplateSource, $expected = '', $shouldTriggerDeprecationNotice = false) {
|
||||||
|
|
||||||
|
// this overrides the error reporting level set in \PHPUnit_Smarty::setUpSmarty
|
||||||
|
$previousErrorReporting = $this->smarty->error_reporting;
|
||||||
|
$this->smarty->setErrorReporting($previousErrorReporting | E_USER_DEPRECATED);
|
||||||
|
|
||||||
|
$this->smarty->assign('a', 'a');
|
||||||
|
$this->smarty->assign('ar', [1,2]);
|
||||||
|
$this->smarty->assign('f', 3.14);
|
||||||
|
|
||||||
|
$errorMessage = '';
|
||||||
|
$output = '';
|
||||||
|
|
||||||
|
try {
|
||||||
|
$output = $this->smarty->fetch('string:' . $strTemplateSource);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$errorMessage = $e->getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($shouldTriggerDeprecationNotice) {
|
||||||
|
$this->assertStringContainsString('Using unregistered function', $errorMessage);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals($expected, $output);
|
||||||
|
$this->assertEquals('', $errorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->smarty->setErrorReporting($previousErrorReporting);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function dataDeprecationNoticesForSmarty5()
|
||||||
|
{
|
||||||
|
|
||||||
|
return [
|
||||||
|
|
||||||
|
['{if empty($a)}{else}b{/if}', 'b', false],
|
||||||
|
['{json_encode($a)}', '"a"', false],
|
||||||
|
['{nl2br($a)}', 'a', false],
|
||||||
|
['{$a|nl2br}', 'a', false],
|
||||||
|
['{round($f, 1)}', '3.1', false],
|
||||||
|
['{$f|round}', '3', false],
|
||||||
|
['{str_repeat($a, 2)}', 'aa', false],
|
||||||
|
['{$a|str_repeat:3}', 'aaa', false],
|
||||||
|
['{$a|strip_tags}', 'a', false],
|
||||||
|
['{$a|strlen}', '1', false],
|
||||||
|
['{$a|substr:-1}', 'a', false],
|
||||||
|
['{$f|substr:-1}', '4', false],
|
||||||
|
['{$ar|count}', '2', false],
|
||||||
|
['{count($ar)}', '2', false],
|
||||||
|
['{foreach "."|explode:$f as $n}{$n}{/foreach}', '314', false],
|
||||||
|
['{"-"|implode:$ar}', '1-2', false],
|
||||||
|
['{"-"|join:$ar}', '1-2', false],
|
||||||
|
['{$f|wordwrap:2:"k":true}', "3.k14", false],
|
||||||
|
['{$f|number_format:1:","}', "3,1", false],
|
||||||
|
['{if in_array(1, $ar)}yes{/if}', "yes", false],
|
||||||
|
['{if is_array($ar)}yes{/if}', "yes", false],
|
||||||
|
['{if time() gt 0}yes{/if}', "yes", false],
|
||||||
|
|
||||||
|
['{if array_chunk($ar, 2)}x{else}y{/if}', '', true],
|
||||||
|
['{$a|addslashes}', '', true],
|
||||||
|
['{$a|sha1}', '', true],
|
||||||
|
['{$a|get_parent_class}', '', true],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -299,4 +299,12 @@ class ScopeTest extends PHPUnit_Smarty
|
|||||||
$this->smarty->assign('scope', 'none');
|
$this->smarty->assign('scope', 'none');
|
||||||
$r = $this->smarty->fetch('test_function_scope.tpl');
|
$r = $this->smarty->fetch('test_function_scope.tpl');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testFunctionScopeIsLocalByDefault()
|
||||||
|
{
|
||||||
|
$r = $this->smarty->fetch('string:{function name=test}{$var="b"}{/function}{$var="a"}{test}{$var}');
|
||||||
|
$this->assertEquals('a', $r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,4 +32,11 @@ class ExtendsIssue419Test extends PHPUnit_Smarty
|
|||||||
$this->assertEquals('child', $this->smarty->fetch('extends:001_parent.tpl|001_child.tpl'));
|
$this->assertEquals('child', $this->smarty->fetch('extends:001_parent.tpl|001_child.tpl'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testextendsSecurity()
|
||||||
|
{
|
||||||
|
$this->expectException(SmartyException::class);
|
||||||
|
$this->expectExceptionMessageRegExp('/Unable to load.*/');
|
||||||
|
$this->assertEquals('child', $this->smarty->fetch('string:{include "001_parent.tpl\', var_dump(shell_exec(\'ls\')), 1, 2, 3, 4, 5, 6);}}?>"}'));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class ArgumentMustBePassedByReference961Test extends PHPUnit_Smarty
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group issue961
|
||||||
|
*/
|
||||||
|
public function testReset()
|
||||||
|
{
|
||||||
|
$smarty = new Smarty();
|
||||||
|
$smarty->registerPlugin('modifier', 'reset', 'reset');
|
||||||
|
$templateStr = "string:{reset(\$ar)}";
|
||||||
|
$smarty->assign('ar', [1,2,3]);
|
||||||
|
$this->assertEquals(
|
||||||
|
'1',
|
||||||
|
$smarty->fetch($templateStr)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group issue961
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
|
public function testResetAsModifier()
|
||||||
|
{
|
||||||
|
$smarty = new Smarty();
|
||||||
|
try {
|
||||||
|
$templateStr = "string:{\$ar|reset}";
|
||||||
|
$smarty->assign('ar', [1,2,3]);
|
||||||
|
$this->assertEquals(
|
||||||
|
'1',
|
||||||
|
$smarty->fetch($templateStr)
|
||||||
|
);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group issue961
|
||||||
|
*/
|
||||||
|
public function testResetInExpression()
|
||||||
|
{
|
||||||
|
$smarty = new Smarty();
|
||||||
|
$smarty->registerPlugin('modifier', 'reset', 'reset');
|
||||||
|
$templateStr = "string:{if reset(\$ar)}ok{/if}";
|
||||||
|
$smarty->assign('ar', [1,2,3]);
|
||||||
|
$this->assertEquals(
|
||||||
|
'ok',
|
||||||
|
$smarty->fetch($templateStr)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group issue961
|
||||||
|
*/
|
||||||
|
public function testMatch()
|
||||||
|
{
|
||||||
|
$smarty = new Smarty();
|
||||||
|
$smarty->registerPlugin('modifier', 'preg_match', 'preg_match');
|
||||||
|
$templateStr = 'string:{assign var="match" value=null}{if preg_match(\'/([a-z]{4})/\', "a test", $match)}{$match.1}{/if}';
|
||||||
|
$this->assertEquals(
|
||||||
|
'test',
|
||||||
|
$smarty->fetch($templateStr)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user