mirror of
https://github.com/smarty-php/smarty.git
synced 2025-08-02 17:34:26 +02:00
src/sysplugins/* to PSR-4
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* MySQL CacheResource
|
||||
* CacheResource Implementation based on the Custom API to use
|
||||
@@ -47,14 +49,14 @@ class Smarty_CacheResource_Mysql extends \Smarty\Cacheresource\Custom
|
||||
/**
|
||||
* Smarty_CacheResource_Mysql constructor.
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
try {
|
||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty");
|
||||
} catch (PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
throw new Exception('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, content FROM output_cache WHERE id = :id');
|
||||
$this->fetchTimestamp = $this->db->prepare('SELECT modified FROM output_cache WHERE id = :id');
|
||||
|
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* PDO Cache Handler
|
||||
* Allows you to store Smarty Cache files into your db.
|
||||
@@ -119,12 +121,12 @@ class Smarty_CacheResource_Pdo extends \Smarty\Cacheresource\Custom
|
||||
* @param string $table : table (or view) name
|
||||
* @param string $database : optional - if table is located in another db
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function __construct(PDO $pdo, $table, $database = null)
|
||||
{
|
||||
if (is_null($table)) {
|
||||
throw new SmartyException("Table name for caching can't be null");
|
||||
throw new Exception("Table name for caching can't be null");
|
||||
}
|
||||
$this->pdo = $pdo;
|
||||
$this->table = $table;
|
||||
|
@@ -1,5 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Smarty\Exception;
|
||||
use Smarty\Template;
|
||||
use Smarty\Template\Source;
|
||||
|
||||
@@ -35,7 +36,7 @@ class Smarty_Resource_Extendsall extends \Smarty\Resource\ExtendsPlugin
|
||||
$sources[ $s->uid ] = $s;
|
||||
$uid .= $s->filepath;
|
||||
$timestamp = $s->timestamp > $timestamp ? $s->timestamp : $timestamp;
|
||||
} catch (SmartyException $e) {
|
||||
} catch (Exception $e) {
|
||||
}
|
||||
}
|
||||
if (!$sources) {
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Smarty\Resource\CustomPlugin;
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* MySQL Resource
|
||||
@@ -47,14 +48,14 @@ class _MysqlPlugin extends CustomPlugin
|
||||
/**
|
||||
* Smarty_Resource_Mysql constructor.
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
try {
|
||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty");
|
||||
} catch (PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
throw new Exception('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
||||
$this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name');
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Smarty\Resource\CustomPlugin;
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* MySQL Resource
|
||||
@@ -42,14 +43,14 @@ class _MysqlsPlugin extends CustomPlugin
|
||||
/**
|
||||
* Smarty_Resource_Mysqls constructor.
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
try {
|
||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty");
|
||||
} catch (PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
throw new Exception('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
||||
}
|
||||
|
@@ -8,7 +8,7 @@ resource.
|
||||
>
|
||||
> The default handler is currently only invoked for file resources. It
|
||||
> is not triggered when the resource itself cannot be found, in which
|
||||
> case a SmartyException is thrown.
|
||||
> case a \Smarty\Exception is thrown.
|
||||
|
||||
|
||||
<?php
|
||||
|
@@ -8,7 +8,7 @@ resource.
|
||||
>
|
||||
> The default handler is currently only invoked for file resources. It
|
||||
> is not triggered when the resource itself cannot be found, in which
|
||||
> case a SmartyException is thrown.
|
||||
> case a \Smarty\Exception is thrown.
|
||||
|
||||
|
||||
<?php
|
||||
|
@@ -77,7 +77,7 @@ to invoke your custom CacheResource implementation.
|
||||
try {
|
||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "smarty");
|
||||
} catch (PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
throw new \Smarty\Exception('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, content FROM output_cache WHERE id = :id');
|
||||
$this->fetchTimestamp = $this->db->prepare('SELECT modified FROM output_cache WHERE id = :id');
|
||||
|
@@ -63,7 +63,7 @@ example.
|
||||
try {
|
||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "smarty");
|
||||
} catch (PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
throw new \Smarty\Exception('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
||||
$this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name');
|
||||
|
@@ -49,7 +49,7 @@ on the functions you are supposed to provide.
|
||||
try {
|
||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "smarty");
|
||||
} catch (PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
throw new \Smarty\Exception('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
||||
$this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name');
|
||||
|
@@ -59,7 +59,7 @@ on the functions you are supposed to provide.
|
||||
try {
|
||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "smarty");
|
||||
} catch (PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
throw new \Smarty\Exception('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
||||
$this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name');
|
||||
|
@@ -33,7 +33,7 @@ use Smarty\Template;
|
||||
*
|
||||
* @return string content re-formatted
|
||||
* @author Monte Ohrt <monte at ohrt dot com>
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
function smarty_block_textformat($params, $content, Template $template, &$repeat)
|
||||
{
|
||||
|
@@ -6,6 +6,7 @@
|
||||
* @subpackage PluginsFunction
|
||||
*/
|
||||
|
||||
use Smarty\Exception;
|
||||
use Smarty\Template;
|
||||
|
||||
/**
|
||||
@@ -21,7 +22,7 @@ use Smarty\Template;
|
||||
* @param array $params parameters
|
||||
* @param Template $template template object
|
||||
*
|
||||
* @throws SmartyException
|
||||
* @throws Exception
|
||||
* @return string|null if the assign parameter is passed, Smarty assigns the result to a template variable
|
||||
*/
|
||||
function smarty_function_fetch($params, $template)
|
||||
@@ -196,7 +197,7 @@ function smarty_function_fetch($params, $template)
|
||||
} else {
|
||||
$content = @file_get_contents($params[ 'file' ]);
|
||||
if ($content === false) {
|
||||
throw new SmartyException("{fetch} cannot read resource '" . $params[ 'file' ] . "'");
|
||||
throw new Exception("{fetch} cannot read resource '" . $params[ 'file' ] . "'");
|
||||
}
|
||||
}
|
||||
if (!empty($params[ 'assign' ])) {
|
||||
|
@@ -43,7 +43,7 @@ use Smarty\Template;
|
||||
*
|
||||
* @return string
|
||||
* @uses smarty_function_escape_special_chars()
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
function smarty_function_html_checkboxes($params, Template $template)
|
||||
{
|
||||
|
@@ -6,6 +6,7 @@
|
||||
* @subpackage PluginsFunction
|
||||
*/
|
||||
|
||||
use Smarty\Exception;
|
||||
use Smarty\Template;
|
||||
|
||||
/**
|
||||
@@ -33,7 +34,7 @@ use Smarty\Template;
|
||||
* @param array $params parameters
|
||||
* @param Template $template template object
|
||||
*
|
||||
* @throws SmartyException
|
||||
* @throws Exception
|
||||
* @return string
|
||||
* @uses smarty_function_escape_special_chars()
|
||||
*/
|
||||
@@ -62,7 +63,7 @@ function smarty_function_html_image($params, Template $template)
|
||||
if (!is_array($_val)) {
|
||||
$$_key = smarty_function_escape_special_chars($_val);
|
||||
} else {
|
||||
throw new SmartyException(
|
||||
throw new Exception(
|
||||
"html_image: extra attribute '{$_key}' cannot be an array",
|
||||
E_USER_NOTICE
|
||||
);
|
||||
@@ -77,7 +78,7 @@ function smarty_function_html_image($params, Template $template)
|
||||
if (!is_array($_val)) {
|
||||
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
|
||||
} else {
|
||||
throw new SmartyException(
|
||||
throw new Exception(
|
||||
"html_image: extra attribute '{$_key}' cannot be an array",
|
||||
E_USER_NOTICE
|
||||
);
|
||||
|
@@ -35,7 +35,7 @@ use Smarty\Template;
|
||||
*
|
||||
* @return string
|
||||
* @uses smarty_function_escape_special_chars()
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
function smarty_function_html_options($params, Template $template)
|
||||
{
|
||||
|
@@ -43,7 +43,7 @@ use Smarty\Template;
|
||||
*
|
||||
* @return string
|
||||
* @uses smarty_function_escape_special_chars()
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
function smarty_function_html_radios($params, Template $template)
|
||||
{
|
||||
|
@@ -43,7 +43,7 @@ use Smarty\Template;
|
||||
* @param \Smarty\Template $template
|
||||
*
|
||||
* @return string
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
function smarty_function_html_select_date($params, Template $template)
|
||||
{
|
||||
|
@@ -25,7 +25,7 @@ use Smarty\Template;
|
||||
*
|
||||
* @return string
|
||||
* @uses smarty_make_timestamp()
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
function smarty_function_html_select_time($params, Template $template)
|
||||
{
|
||||
|
@@ -5,6 +5,9 @@
|
||||
* @package Smarty
|
||||
* @subpackage PluginsModifierCompiler
|
||||
*/
|
||||
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* Smarty escape modifier plugin
|
||||
* Type: modifier
|
||||
@@ -18,7 +21,7 @@
|
||||
* @param \Smarty\Compiler\Template $compiler
|
||||
*
|
||||
* @return string with compiled code
|
||||
* @throws SmartyException
|
||||
* @throws Exception
|
||||
*/
|
||||
function smarty_modifiercompiler_escape($params, \Smarty\Compiler\Template $compiler)
|
||||
{
|
||||
@@ -53,7 +56,7 @@ function smarty_modifiercompiler_escape($params, \Smarty\Compiler\Template $comp
|
||||
$params[ 0 ] .
|
||||
', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/", "<!--" => "<\!--", "<s" => "<\s", "<S" => "<\S" ))';
|
||||
}
|
||||
} catch (SmartyException $e) {
|
||||
} catch (Exception $e) {
|
||||
// pass through to regular plugin fallback
|
||||
}
|
||||
return 'smarty_modifier_escape(' . join(', ', $params) . ')';
|
||||
|
@@ -18,7 +18,7 @@
|
||||
* @param \Smarty\Compiler\Template $compiler
|
||||
*
|
||||
* @return string with compiled code
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
function smarty_modifiercompiler_wordwrap($params, \Smarty\Compiler\Template $compiler)
|
||||
{
|
||||
|
@@ -5,6 +5,9 @@
|
||||
* @package Smarty
|
||||
* @subpackage PluginsShared
|
||||
*/
|
||||
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* evaluate compiler parameter
|
||||
*
|
||||
@@ -13,7 +16,7 @@
|
||||
* @param mixed $default value to be returned if the parameter is not present
|
||||
*
|
||||
* @return mixed evaluated value of parameter or $default
|
||||
* @throws SmartyException if parameter is not a literal (but an expression, variable, …)
|
||||
* @throws Exception if parameter is not a literal (but an expression, variable, …)
|
||||
* @author Rodney Rehm
|
||||
*/
|
||||
function smarty_literal_compiler_param($params, $index, $default = null)
|
||||
@@ -24,7 +27,7 @@ function smarty_literal_compiler_param($params, $index, $default = null)
|
||||
}
|
||||
// test if param is a literal
|
||||
if (!preg_match('/^([\'"]?)[a-zA-Z0-9-]+(\\1)$/', $params[ $index ])) {
|
||||
throw new SmartyException(
|
||||
throw new Exception(
|
||||
'$param[' . $index .
|
||||
'] is not a literal and is thus not evaluatable at compile time'
|
||||
);
|
||||
|
@@ -6,6 +6,8 @@
|
||||
* @subpackage PluginsShared
|
||||
*/
|
||||
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* Multibyte string replace
|
||||
*
|
||||
@@ -72,7 +74,7 @@ function smarty_mb_str_replace($search, $replace, $subject, &$count = 0)
|
||||
// This exception is thrown if call to mb_split failed.
|
||||
// Usually it happens, when $search or $replace are not valid for given mb_regex_encoding().
|
||||
// There may be other cases for it to fail, please file an issue if you find a reproducible one.
|
||||
throw new SmartyException("Source string is not a valid $current_charset sequence (probably)");
|
||||
throw new Exception("Source string is not a valid $current_charset sequence (probably)");
|
||||
}
|
||||
|
||||
$count = count($parts) - 1;
|
||||
|
@@ -193,7 +193,6 @@ abstract class Base
|
||||
* @param Smarty $smarty Smarty object
|
||||
* @param string $type name of the cache resource
|
||||
*
|
||||
* @throws SmartyException
|
||||
* @return Base Cache Resource Handler
|
||||
*/
|
||||
public static function load(Smarty $smarty, $type = null)
|
||||
|
@@ -233,7 +233,7 @@ abstract class Custom extends Base
|
||||
* @param integer $exp_time expiration time (number of seconds, not timestamp)
|
||||
*
|
||||
* @return int number of cache files deleted
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function clear(\Smarty\Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
|
||||
{
|
||||
|
@@ -122,7 +122,7 @@ class File extends Base
|
||||
* @param string $content content to cache
|
||||
*
|
||||
* @return bool success
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function storeCachedContent(Template $_template, $content)
|
||||
{
|
||||
|
@@ -207,7 +207,7 @@ abstract class KeyValueStore extends Base
|
||||
* @param integer $exp_time expiration time [being ignored]
|
||||
*
|
||||
* @return int number of cache files deleted [always -1]
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
* @uses buildCachedFilepath() to generate the CacheID
|
||||
* @uses invalidate() to mark CacheIDs parent chain as outdated
|
||||
* @uses delete() to remove CacheID from cache
|
||||
@@ -229,7 +229,7 @@ abstract class KeyValueStore extends Base
|
||||
* @param string $resource_name template name
|
||||
*
|
||||
* @return string filepath of cache file
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
protected function getTemplateUid(Smarty $smarty, $resource_name)
|
||||
{
|
||||
|
@@ -27,7 +27,7 @@ class Append extends Assign
|
||||
* @param array $parameter array with compilation parameter
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = array(), $tag = null, $function = null)
|
||||
{
|
||||
|
@@ -49,7 +49,7 @@ class Assign extends CompileBase
|
||||
* @param array $parameter array with compilation parameter
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = array(), $tag = null, $function = null)
|
||||
{
|
||||
|
@@ -206,7 +206,7 @@ abstract class Base {
|
||||
* @param array $parameter array with compilation parameter
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
abstract public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = array(), $tag = null, $function = null);
|
||||
}
|
||||
|
@@ -48,7 +48,7 @@ class BreakTag extends Base {
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = array(), $tag = null, $function = null)
|
||||
{
|
||||
@@ -73,7 +73,7 @@ class BreakTag extends Base {
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return array
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function checkLevels($args, \Smarty\Compiler\Template $compiler) {
|
||||
static $_is_loopy = ['for' => true, 'foreach' => true, 'while' => true, 'section' => true];
|
||||
|
@@ -49,7 +49,7 @@ class Child extends Base {
|
||||
* @param array $parameter array with compilation parameter
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
// check and get attributes
|
||||
|
@@ -71,7 +71,7 @@ class ConfigLoad extends Base {
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
// check and get attributes
|
||||
|
@@ -20,7 +20,7 @@ class ElseIfTag extends Base {
|
||||
* @param array $parameter array with compilation parameter
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
// check and get attributes
|
||||
|
@@ -51,8 +51,8 @@ class ExtendsTag extends Inheritance {
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
// check and get attributes
|
||||
@@ -98,8 +98,8 @@ class ExtendsTag extends Inheritance {
|
||||
* @param \Smarty\Compiler\Template $compiler
|
||||
* @param null|string $template optional inheritance parent template
|
||||
*
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
private function compileEndChild(\Smarty\Compiler\Template $compiler, $template = null) {
|
||||
$inlineUids = '';
|
||||
@@ -124,8 +124,8 @@ class ExtendsTag extends Inheritance {
|
||||
* @param \Smarty\Compiler\Template $compiler
|
||||
* @param string $template subtemplate name
|
||||
*
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
private function compileInclude(\Smarty\Compiler\Template $compiler, $template) {
|
||||
$compiler->parser->template_postfix[] = new \Smarty\ParseTree\Tag(
|
||||
|
@@ -25,7 +25,7 @@ class ForeachClose extends Base {
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
$compiler->loopNesting--;
|
||||
|
@@ -80,7 +80,7 @@ abstract class ForeachSection extends Base {
|
||||
* @param array $attributes
|
||||
* @param \Smarty\Compiler\Template $compiler
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
protected function scanForProperties($attributes, \Smarty\Compiler\Template $compiler) {
|
||||
$this->propertyPreg = '~(';
|
||||
@@ -162,7 +162,7 @@ abstract class ForeachSection extends Base {
|
||||
*
|
||||
* @param \Smarty\Compiler\Template $compiler
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
private function matchParentTemplateSource(\Smarty\Compiler\Template $compiler) {
|
||||
// search parent compiler template source
|
||||
@@ -194,7 +194,7 @@ abstract class ForeachSection extends Base {
|
||||
* @param array $parameter array with compilation parameter
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compileSpecialVariable(\Smarty\Compiler\Template $compiler, $parameter) {
|
||||
$tag = smarty_strtolower_ascii(trim($parameter[0], '"\''));
|
||||
|
@@ -78,8 +78,8 @@ class ForeachTag extends ForeachSection {
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
$compiler->loopNesting++;
|
||||
|
@@ -43,7 +43,7 @@ class FunctionTag extends Base {
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return bool true
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
// check and get attributes
|
||||
|
@@ -20,7 +20,7 @@ class IfTag extends Base {
|
||||
* @param array $parameter array with compilation parameter
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
// check and get attributes
|
||||
|
@@ -79,8 +79,8 @@ class IncludeTag extends Base {
|
||||
*
|
||||
* @return string
|
||||
* @throws \Exception
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
$uid = $t_hash = null;
|
||||
@@ -292,7 +292,7 @@ class IncludeTag extends Base {
|
||||
*
|
||||
* @return bool
|
||||
* @throws \Exception
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
private function compileInlineTemplate(
|
||||
Template $compiler,
|
||||
|
@@ -52,8 +52,8 @@ class Insert extends Base {
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
// check and get attributes
|
||||
|
@@ -28,7 +28,7 @@ class Ldelim extends Base {
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
|
@@ -45,8 +45,8 @@ class PrivateBlockPlugin extends Base {
|
||||
* @param string $function PHP function name
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
if (!isset($tag[5]) || substr($tag, -5) !== 'close') {
|
||||
@@ -64,7 +64,7 @@ class PrivateBlockPlugin extends Base {
|
||||
$callback = "\$_block_plugin{$this->nesting}{$callback[1]}";
|
||||
}
|
||||
if (isset($callable)) {
|
||||
$output .= "if (!is_callable({$callable})) {\nthrow new SmartyException('block tag \'{$tag}\' not callable or registered');\n}\n";
|
||||
$output .= "if (!is_callable({$callable})) {\nthrow new \\Smarty\\Exception('block tag \'{$tag}\' not callable or registered');\n}\n";
|
||||
}
|
||||
$output .= "\$_block_repeat=true;\necho {$callback}({$_params}, null, \$_smarty_tpl, \$_block_repeat);\nwhile (\$_block_repeat) {\nob_start();?>";
|
||||
$this->openTag($compiler, $tag, [$_params, $compiler->nocache, $callback]);
|
||||
|
@@ -47,8 +47,8 @@ class PrivateFunctionPlugin extends Base {
|
||||
* @param string $function PHP function name
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
// check and get attributes
|
||||
|
@@ -28,8 +28,8 @@ class PrivateModifier extends Base {
|
||||
* @param array $parameter array with compilation parameter
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
// check and get attributes
|
||||
|
@@ -38,8 +38,8 @@ class PrivateObjectFunction extends Base {
|
||||
* @param string $function name of method to call
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
// check and get attributes
|
||||
|
@@ -45,7 +45,7 @@ class PrivatePrintExpression extends Base {
|
||||
* @param array $parameter array with compilation parameter
|
||||
*
|
||||
* @return string
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
// check and get attributes
|
||||
@@ -138,7 +138,7 @@ class PrivatePrintExpression extends Base {
|
||||
* @param string $output embedded output
|
||||
*
|
||||
* @return string
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
private function compile_variable_filter(\Smarty\Compiler\Template $compiler, $name, $output) {
|
||||
$function = $compiler->getPlugin($name, 'variablefilter');
|
||||
|
@@ -38,8 +38,8 @@ class PrivateRegisteredFunction extends Base {
|
||||
* @param string $tag name of function
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
// check and get attributes
|
||||
|
@@ -32,7 +32,7 @@ class PrivateSpecialVariable extends Base {
|
||||
* @param $parameter
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
$_index = preg_split("/\]\[/", substr($parameter, 1, strlen($parameter) - 2));
|
||||
|
@@ -28,7 +28,7 @@ class Rdelim extends Ldelim {
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
parent::compile($args, $compiler);
|
||||
|
@@ -81,8 +81,8 @@ class Section extends ForeachSection {
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
$compiler->loopNesting++;
|
||||
|
@@ -20,7 +20,7 @@ class WhileTag extends Base {
|
||||
* @param array $parameter array with compilation parameter
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
$compiler->loopNesting++;
|
||||
|
@@ -14,7 +14,7 @@ use Smarty;
|
||||
use Smarty_Internal_ConfigFileLexer;
|
||||
use Smarty_Internal_ConfigFileParser;
|
||||
use Smarty\Template;
|
||||
use SmartyCompilerException;
|
||||
use Smarty\CompilerException;
|
||||
|
||||
/**
|
||||
* Main config file compiler class
|
||||
@@ -96,7 +96,7 @@ class ConfigFile {
|
||||
* @param Template $template
|
||||
*
|
||||
* @return bool true if compiling succeeded, false if it failed
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compileTemplate(Template $template) {
|
||||
$this->template = $template;
|
||||
@@ -174,7 +174,7 @@ class ConfigFile {
|
||||
*
|
||||
* @param string $args individual error message or null
|
||||
*
|
||||
* @throws SmartyCompilerException
|
||||
* @throws CompilerException
|
||||
*/
|
||||
public function trigger_config_file_error($args = null) {
|
||||
// get config source line which has error
|
||||
@@ -203,6 +203,6 @@ class ConfigFile {
|
||||
// output parser error message
|
||||
$error_text .= ' - Unexpected "' . $this->lex->value . '", expected one of: ' . implode(' , ', $expect);
|
||||
}
|
||||
throw new SmartyCompilerException($error_text);
|
||||
throw new CompilerException($error_text);
|
||||
}
|
||||
}
|
||||
|
@@ -14,8 +14,8 @@ use Smarty;
|
||||
use Smarty\Compile\Base;
|
||||
use Smarty\Compile\ExtendsTag;
|
||||
use Smarty_Internal_Templateparser;
|
||||
use SmartyCompilerException;
|
||||
use SmartyException;
|
||||
use Smarty\CompilerException;
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* Class SmartyTemplateCompiler
|
||||
@@ -468,7 +468,7 @@ class Template {
|
||||
* @param string $code compiled code
|
||||
*
|
||||
* @return string
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function postFilter($code) {
|
||||
// run post filter if on code
|
||||
@@ -485,7 +485,7 @@ class Template {
|
||||
* @param string $_content template source
|
||||
*
|
||||
* @return string
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function preFilter($_content) {
|
||||
// run pre filter if required
|
||||
@@ -510,8 +510,8 @@ class Template {
|
||||
* @param array $parameter array with compilation parameter
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws SmartyException
|
||||
* @throws SmartyCompilerException
|
||||
* @throws Exception
|
||||
* @throws CompilerException
|
||||
*/
|
||||
public function compileTag($tag, $args, $parameter = []) {
|
||||
$this->prefixCodeStack[] = $this->prefix_code;
|
||||
@@ -562,7 +562,7 @@ class Template {
|
||||
* @param array $parameter
|
||||
*
|
||||
* @return string
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compilePHPFunctionCall($name, $parameter) {
|
||||
if (!$this->smarty->security_policy || $this->smarty->security_policy->isTrustedPhpFunction($name, $this)) {
|
||||
@@ -704,7 +704,7 @@ class Template {
|
||||
* @param mixed $param3 optional parameter
|
||||
*
|
||||
* @return bool|string compiled code or false
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
private function callTagCompiler($tag, $args, $param1 = null, $param2 = null, $param3 = null) {
|
||||
/* @var Base $tagCompiler */
|
||||
@@ -860,7 +860,7 @@ class Template {
|
||||
* @param string $plugin_type type of plugin
|
||||
*
|
||||
* @return bool true if found
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function getPluginFromDefaultHandler($tag, $plugin_type) {
|
||||
$callback = null;
|
||||
@@ -1003,7 +1003,7 @@ class Template {
|
||||
* @param array $validScopes
|
||||
*
|
||||
* @return int|string
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function convertScope($_attr, $validScopes) {
|
||||
$_scope = 0;
|
||||
@@ -1048,7 +1048,7 @@ class Template {
|
||||
* @param string $line line-number
|
||||
* @param null|bool $tagline if true the line number of last tag
|
||||
*
|
||||
* @throws \SmartyCompilerException when an unexpected token is found
|
||||
* @throws \Smarty\CompilerException when an unexpected token is found
|
||||
*/
|
||||
public function trigger_template_error($args = null, $line = null, $tagline = null) {
|
||||
$lex = $this->parser->lex;
|
||||
@@ -1113,7 +1113,7 @@ class Template {
|
||||
echo ob_get_clean();
|
||||
flush();
|
||||
}
|
||||
$e = new SmartyCompilerException(
|
||||
$e = new CompilerException(
|
||||
$error_text,
|
||||
0,
|
||||
$this->template->source->filepath,
|
||||
@@ -1205,7 +1205,7 @@ class Template {
|
||||
* leave double quoted string
|
||||
* - throw exception if block in string was not closed
|
||||
*
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function leaveDoubleQuote() {
|
||||
if (array_pop($this->_tag_stack_count) !== $this->getTagStackCount()) {
|
||||
@@ -1349,8 +1349,8 @@ class Template {
|
||||
* @param array $parameter array with compilation parameter
|
||||
*
|
||||
* @return string compiled code
|
||||
* @throws SmartyException
|
||||
* @throws SmartyCompilerException
|
||||
* @throws Exception
|
||||
* @throws CompilerException
|
||||
*/
|
||||
private function compileTag2($tag, $args, $parameter) {
|
||||
$plugin_type = '';
|
||||
@@ -1494,7 +1494,7 @@ class Template {
|
||||
return $plugin_object->compile($args, $this);
|
||||
}
|
||||
}
|
||||
throw new SmartyException("Plugin '{$tag}' not callable");
|
||||
throw new Exception("Plugin '{$tag}' not callable");
|
||||
} else {
|
||||
if ($function = $this->getPlugin($tag, $plugin_type)) {
|
||||
if (!isset($this->smarty->security_policy)
|
||||
@@ -1628,7 +1628,7 @@ class Template {
|
||||
return $plugin_object->compile($args, $this);
|
||||
}
|
||||
}
|
||||
throw new SmartyException("Plugin '{$tag}' not callable");
|
||||
throw new Exception("Plugin '{$tag}' not callable");
|
||||
}
|
||||
$this->trigger_template_error("unknown tag '{$tag}'", null, true);
|
||||
}
|
||||
@@ -1641,7 +1641,7 @@ class Template {
|
||||
* @param bool $isTemplateSource
|
||||
*
|
||||
* @return bool true if compiling succeeded, false if it failed
|
||||
* @throws \SmartyCompilerException
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
protected function doCompile($_content, $isTemplateSource = false) {
|
||||
/* here is where the compiling takes place. Smarty
|
||||
|
73
src/CompilerException.php
Normal file
73
src/CompilerException.php
Normal file
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
namespace Smarty;
|
||||
|
||||
/**
|
||||
* Smarty compiler exception class
|
||||
*
|
||||
* @package Smarty
|
||||
*/
|
||||
class CompilerException extends Exception {
|
||||
|
||||
/**
|
||||
* The constructor of the exception
|
||||
*
|
||||
* @param string $message The Exception message to throw.
|
||||
* @param int $code The Exception code.
|
||||
* @param string|null $filename The filename where the exception is thrown.
|
||||
* @param int|null $line The line number where the exception is thrown.
|
||||
* @param Throwable|null $previous The previous exception used for the exception chaining.
|
||||
*/
|
||||
public function __construct(
|
||||
string $message = "",
|
||||
int $code = 0,
|
||||
?string $filename = null,
|
||||
?int $line = null,
|
||||
Throwable $previous = null
|
||||
) {
|
||||
parent::__construct($message, $code, $previous);
|
||||
|
||||
// These are optional parameters, should be be overridden only when present!
|
||||
if ($filename) {
|
||||
$this->file = $filename;
|
||||
}
|
||||
if ($line) {
|
||||
$this->line = $line;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString() {
|
||||
return ' --> Smarty Compiler: ' . $this->message . ' <-- ';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $line
|
||||
*/
|
||||
public function setLine($line) {
|
||||
$this->line = $line;
|
||||
}
|
||||
|
||||
/**
|
||||
* The template source snippet relating to the error
|
||||
*
|
||||
* @type string|null
|
||||
*/
|
||||
public $source = null;
|
||||
|
||||
/**
|
||||
* The raw text of the error message
|
||||
*
|
||||
* @type string|null
|
||||
*/
|
||||
public $desc = null;
|
||||
|
||||
/**
|
||||
* The resource identifier or template name
|
||||
*
|
||||
* @type string|null
|
||||
*/
|
||||
public $template = null;
|
||||
}
|
14
src/Data.php
14
src/Data.php
@@ -48,7 +48,7 @@ abstract class Data
|
||||
/**
|
||||
* parent template (if any)
|
||||
*
|
||||
* @var Smarty|Template|Smarty_Data
|
||||
* @var Smarty|Template|DataObject
|
||||
*/
|
||||
public $parent = null;
|
||||
|
||||
@@ -126,7 +126,7 @@ abstract class Data
|
||||
if ($tpl_var !== '' && isset($value)) {
|
||||
if (!isset($this->tpl_vars[ $tpl_var ])) {
|
||||
$tpl_var_inst = $this->_getVariable($tpl_var, null, true, false);
|
||||
if ($tpl_var_inst instanceof Smarty_Undefined_Variable) {
|
||||
if ($tpl_var_inst instanceof UndefinedVariable) {
|
||||
$this->tpl_vars[ $tpl_var ] = new \Smarty\Variable(null, $nocache);
|
||||
} else {
|
||||
$this->tpl_vars[ $tpl_var ] = clone $tpl_var_inst;
|
||||
@@ -313,7 +313,7 @@ abstract class Data
|
||||
// force a notice
|
||||
$x = $$varName;
|
||||
}
|
||||
return new Smarty_Undefined_Variable;
|
||||
return new UndefinedVariable;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -566,12 +566,12 @@ abstract class Data
|
||||
/**
|
||||
* gets a stream variable
|
||||
*
|
||||
* @api Smarty::getStreamVariable()
|
||||
*
|
||||
* @param string $variable the stream of the variable
|
||||
*
|
||||
* @return mixed
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*@api Smarty::getStreamVariable()
|
||||
*
|
||||
*/
|
||||
public function getStreamVariable($variable)
|
||||
{
|
||||
@@ -586,7 +586,7 @@ abstract class Data
|
||||
}
|
||||
$smarty = $this->smarty ?? $this;
|
||||
if ($smarty->error_unassigned) {
|
||||
throw new SmartyException('Undefined stream variable "' . $variable . '"');
|
||||
throw new Exception('Undefined stream variable "' . $variable . '"');
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
71
src/DataObject.php
Normal file
71
src/DataObject.php
Normal file
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Plugin Data
|
||||
* This file contains the data object
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Template
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
namespace Smarty;
|
||||
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* class for the Smarty data object
|
||||
* The Smarty data object will hold Smarty variables in the current scope
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Template
|
||||
*/
|
||||
class DataObject extends Data {
|
||||
|
||||
/**
|
||||
* Counter
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public static $count = 0;
|
||||
|
||||
/**
|
||||
* Data block name
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $dataObjectName = '';
|
||||
|
||||
/**
|
||||
* Smarty object
|
||||
*
|
||||
* @var Smarty
|
||||
*/
|
||||
public $smarty = null;
|
||||
|
||||
/**
|
||||
* create Smarty data object
|
||||
*
|
||||
* @param Smarty|array $_parent parent template
|
||||
* @param Smarty|Template $smarty global smarty instance
|
||||
* @param string $name optional data block name
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
public function __construct($_parent = null, $smarty = null, $name = null) {
|
||||
parent::__construct();
|
||||
self::$count++;
|
||||
$this->dataObjectName = 'Data_object ' . (isset($name) ? "'{$name}'" : self::$count);
|
||||
$this->smarty = $smarty;
|
||||
if (is_object($_parent)) {
|
||||
// when object set up back pointer
|
||||
$this->parent = $_parent;
|
||||
} elseif (is_array($_parent)) {
|
||||
// set up variable values
|
||||
foreach ($_parent as $_key => $_val) {
|
||||
$this->tpl_vars[$_key] = new Variable($_val);
|
||||
}
|
||||
} elseif ($_parent !== null) {
|
||||
throw new Exception('Wrong type for template variables');
|
||||
}
|
||||
}
|
||||
}
|
@@ -188,7 +188,7 @@ class Debug extends Data
|
||||
* @param bool $full
|
||||
*
|
||||
* @throws \Exception
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function display_debug($obj, $full = false)
|
||||
{
|
||||
@@ -254,7 +254,7 @@ class Debug extends Data
|
||||
/**
|
||||
* Recursively gets variables from all template/data scopes
|
||||
*
|
||||
* @param \Smarty\Template|\Smarty_Data $obj object to debug
|
||||
* @param \Smarty\Template|\Smarty\DataObject $obj object to debug
|
||||
*
|
||||
* @return \StdClass
|
||||
*/
|
||||
|
16
src/Exception.php
Normal file
16
src/Exception.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace Smarty;
|
||||
|
||||
/**
|
||||
* Smarty exception class
|
||||
*/
|
||||
class Exception extends \Exception {
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString() {
|
||||
return ' --> Smarty: ' . $this->message . ' <-- ';
|
||||
}
|
||||
}
|
@@ -64,8 +64,8 @@ abstract class BasePlugin
|
||||
* @param \Smarty $smarty smarty object
|
||||
* @param string $type name of the resource
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @return BasePlugin Resource Handler
|
||||
*@throws \Smarty\Exception
|
||||
*/
|
||||
public static function load(\Smarty $smarty, $type)
|
||||
{
|
||||
@@ -108,7 +108,7 @@ abstract class BasePlugin
|
||||
}
|
||||
// TODO: try default_(template|config)_handler
|
||||
// give up
|
||||
throw new \SmartyException("Unknown resource type '{$type}'");
|
||||
throw new \Smarty\Exception("Unknown resource type '{$type}'");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -143,7 +143,7 @@ abstract class BasePlugin
|
||||
* name of
|
||||
*
|
||||
* @return string unique resource name
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public static function getUniqueTemplateName($obj, $template_resource)
|
||||
{
|
||||
@@ -171,7 +171,7 @@ abstract class BasePlugin
|
||||
* @param string $template_resource resource identifier
|
||||
*
|
||||
* @return \Smarty\Template\Source Source Object
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public static function source(
|
||||
\Smarty\Template $_template = null,
|
||||
@@ -187,7 +187,7 @@ abstract class BasePlugin
|
||||
* @param \Smarty\Template\Source $source source object
|
||||
*
|
||||
* @return string template source
|
||||
* @throws \SmartyException if source cannot be loaded
|
||||
* @throws \Smarty\Exception if source cannot be loaded
|
||||
*/
|
||||
abstract public function getContent(\Smarty\Template\Source $source);
|
||||
|
||||
|
@@ -11,7 +11,7 @@ namespace Smarty\Resource;
|
||||
use Smarty;
|
||||
use Smarty\Template;
|
||||
use Smarty\Template\Source;
|
||||
use SmartyException;
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* Smarty Resource Plugin
|
||||
@@ -72,14 +72,14 @@ abstract class CustomPlugin extends BasePlugin {
|
||||
* @param Source $source source object
|
||||
*
|
||||
* @return string template source
|
||||
* @throws SmartyException if source cannot be loaded
|
||||
* @throws Exception if source cannot be loaded
|
||||
*/
|
||||
public function getContent(Source $source) {
|
||||
$this->fetch($source->name, $content, $timestamp);
|
||||
if (isset($content)) {
|
||||
return $content;
|
||||
}
|
||||
throw new SmartyException("Unable to read template {$source->type} '{$source->name}'");
|
||||
throw new Exception("Unable to read template {$source->type} '{$source->name}'");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -27,7 +27,7 @@ class ExtendsPlugin extends BasePlugin
|
||||
* @param \Smarty\Template\Source $source source object
|
||||
* @param \Smarty\Template $_template template object
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function populate(\Smarty\Template\Source $source, \Smarty\Template $_template = null)
|
||||
{
|
||||
@@ -40,7 +40,7 @@ class ExtendsPlugin extends BasePlugin
|
||||
/* @var \Smarty\Template\Source $_s */
|
||||
$_s = \Smarty\Template\Source::load(null, $smarty, $component);
|
||||
if ($_s->type === 'php') {
|
||||
throw new \SmartyException("Resource type {$_s->type} cannot be used with the extends resource type");
|
||||
throw new \Smarty\Exception("Resource type {$_s->type} cannot be used with the extends resource type");
|
||||
}
|
||||
$sources[ $_s->uid ] = $_s;
|
||||
$uid .= $_s->filepath;
|
||||
@@ -78,12 +78,12 @@ class ExtendsPlugin extends BasePlugin
|
||||
* @param \Smarty\Template\Source $source source object
|
||||
*
|
||||
* @return string template source
|
||||
* @throws \SmartyException if source cannot be loaded
|
||||
* @throws \Smarty\Exception if source cannot be loaded
|
||||
*/
|
||||
public function getContent(\Smarty\Template\Source $source)
|
||||
{
|
||||
if (!$source->exists) {
|
||||
throw new \SmartyException("Unable to load template '{$source->type}:{$source->name}'");
|
||||
throw new \Smarty\Exception("Unable to load template '{$source->type}:{$source->name}'");
|
||||
}
|
||||
$_components = array_reverse($source->components);
|
||||
$_content = '';
|
||||
|
@@ -12,7 +12,7 @@ namespace Smarty\Resource;
|
||||
use Smarty;
|
||||
use Smarty\Template;
|
||||
use Smarty\Template\Source;
|
||||
use SmartyException;
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Resource File
|
||||
@@ -29,7 +29,7 @@ class FilePlugin extends BasePlugin {
|
||||
* @param Source $source source object
|
||||
* @param Template $_template template object
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function populate(Source $source, Template $_template = null) {
|
||||
$source->filepath = $this->buildFilepath($source, $_template);
|
||||
@@ -68,13 +68,13 @@ class FilePlugin extends BasePlugin {
|
||||
* @param Source $source source object
|
||||
*
|
||||
* @return string template source
|
||||
* @throws SmartyException if source cannot be loaded
|
||||
* @throws Exception if source cannot be loaded
|
||||
*/
|
||||
public function getContent(Source $source) {
|
||||
if ($source->exists) {
|
||||
return file_get_contents($source->filepath);
|
||||
}
|
||||
throw new SmartyException(
|
||||
throw new Exception(
|
||||
'Unable to read ' . ($source->isConfig ? 'config' : 'template') .
|
||||
" {$source->type} '{$source->name}'"
|
||||
);
|
||||
@@ -98,7 +98,7 @@ class FilePlugin extends BasePlugin {
|
||||
* @param Template $_template template object
|
||||
*
|
||||
* @return string fully qualified filepath
|
||||
* @throws SmartyException
|
||||
* @throws Exception
|
||||
*/
|
||||
protected function buildFilepath(Source $source, Template $_template = null) {
|
||||
$file = $source->name;
|
||||
@@ -112,7 +112,7 @@ class FilePlugin extends BasePlugin {
|
||||
&& preg_match('#^[.]{1,2}[\\\/]#', $file)
|
||||
) {
|
||||
if ($_template->parent->source->type !== 'file' && $_template->parent->source->type !== 'extends') {
|
||||
throw new SmartyException("Template '{$file}' cannot be relative to template of resource type '{$_template->parent->source->type}'");
|
||||
throw new Exception("Template '{$file}' cannot be relative to template of resource type '{$_template->parent->source->type}'");
|
||||
}
|
||||
// normalize path
|
||||
$path =
|
||||
|
@@ -5,7 +5,7 @@ namespace Smarty\Resource;
|
||||
use Smarty\Template;
|
||||
use Smarty\Template\Source;
|
||||
use Smarty\Template\Compiled;
|
||||
use SmartyException;
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Resource PHP
|
||||
@@ -52,13 +52,13 @@ class PhpPlugin extends FilePlugin {
|
||||
* @param Source $source source object
|
||||
*
|
||||
* @return string template source
|
||||
* @throws SmartyException if source cannot be loaded
|
||||
* @throws Exception if source cannot be loaded
|
||||
*/
|
||||
public function getContent(Source $source) {
|
||||
if ($source->exists) {
|
||||
return '';
|
||||
}
|
||||
throw new SmartyException("Unable to read template {$source->type} '{$source->name}'");
|
||||
throw new Exception("Unable to read template {$source->type} '{$source->name}'");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -86,14 +86,14 @@ class PhpPlugin extends FilePlugin {
|
||||
* @param Template $_template template object
|
||||
*
|
||||
* @return void
|
||||
* @throws SmartyException if template cannot be loaded or allow_php_templates is disabled
|
||||
* @throws Exception if template cannot be loaded or allow_php_templates is disabled
|
||||
*/
|
||||
public function renderUncompiled(Source $source, Template $_template) {
|
||||
if (!$source->smarty->allow_php_templates) {
|
||||
throw new SmartyException('PHP templates are disabled');
|
||||
throw new Exception('PHP templates are disabled');
|
||||
}
|
||||
if (!$source->exists) {
|
||||
throw new SmartyException(
|
||||
throw new Exception(
|
||||
"Unable to load template '{$source->type}:{$source->name}'" .
|
||||
($_template->_isSubTpl() ? " in '{$_template->parent->template_resource}'" : '')
|
||||
);
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace Smarty;
|
||||
namespace Smarty\Runtime;
|
||||
|
||||
/**
|
||||
* Smarty {block} tag class
|
@@ -101,7 +101,7 @@ class CaptureRuntime {
|
||||
*
|
||||
* @param \Smarty\Template $_template
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function close(Template $_template) {
|
||||
if ($this->captureCount) {
|
||||
@@ -124,10 +124,10 @@ class CaptureRuntime {
|
||||
*
|
||||
* @param \Smarty\Template $_template
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function error(Template $_template) {
|
||||
throw new SmartyException("Not matching {capture}{/capture} in '{$_template->template_resource}'");
|
||||
throw new \Smarty\Exception("Not matching {capture}{/capture} in '{$_template->template_resource}'");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -151,7 +151,7 @@ class CaptureRuntime {
|
||||
*
|
||||
* @param \Smarty\Template $_template
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function endRender(Template $_template) {
|
||||
if ($this->captureCount) {
|
||||
|
@@ -3,7 +3,7 @@
|
||||
namespace Smarty\Runtime;
|
||||
use Smarty\Template;
|
||||
use Smarty\Template\Source;
|
||||
use SmartyException;
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* Inheritance Runtime Methods processBlock, endChild, init
|
||||
@@ -29,7 +29,7 @@ class InheritanceRuntime {
|
||||
/**
|
||||
* Array of root child {block} objects
|
||||
*
|
||||
* @var \Smarty\Block[]
|
||||
* @var \Smarty\Runtime\Block[]
|
||||
*/
|
||||
public $childRoot = [];
|
||||
|
||||
@@ -104,7 +104,7 @@ class InheritanceRuntime {
|
||||
* @param null|string $func function call name of inline template
|
||||
*
|
||||
* @throws \Exception
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function endChild(Template $tpl, $template = null, $uid = null, $func = null) {
|
||||
--$this->inheritanceLevel;
|
||||
@@ -140,7 +140,7 @@ class InheritanceRuntime {
|
||||
* @param string $name
|
||||
* @param int|null $tplIndex index of outer level {block} if nested
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function instanceBlock(Template $tpl, $className, $name, $tplIndex = null) {
|
||||
$block = new $className($name, isset($tplIndex) ? $tplIndex : $this->tplIndex);
|
||||
@@ -162,15 +162,15 @@ class InheritanceRuntime {
|
||||
* Goto child block or render this
|
||||
*
|
||||
* @param Template $tpl
|
||||
* @param \Smarty\Block $block
|
||||
* @param \Smarty\Block|null $parent
|
||||
* @param \Smarty\Runtime\Block $block
|
||||
* @param \Smarty\Runtime\Block|null $parent
|
||||
*
|
||||
* @throws SmartyException
|
||||
* @throws Exception
|
||||
*/
|
||||
public function process(
|
||||
Template $tpl,
|
||||
\Smarty\Block $block,
|
||||
\Smarty\Block $parent = null
|
||||
Template $tpl,
|
||||
\Smarty\Runtime\Block $block,
|
||||
\Smarty\Runtime\Block $parent = null
|
||||
) {
|
||||
if ($block->hide && !isset($block->child)) {
|
||||
return;
|
||||
@@ -206,12 +206,12 @@ class InheritanceRuntime {
|
||||
* Render child on \$smarty.block.child
|
||||
*
|
||||
* @param Template $tpl
|
||||
* @param \Smarty\Block $block
|
||||
* @param \Smarty\Runtime\Block $block
|
||||
*
|
||||
* @return null|string block content
|
||||
* @throws SmartyException
|
||||
* @throws Exception
|
||||
*/
|
||||
public function callChild(Template $tpl, \Smarty\Block $block) {
|
||||
public function callChild(Template $tpl, \Smarty\Runtime\Block $block) {
|
||||
if (isset($block->child)) {
|
||||
$this->process($tpl, $block->child, $block);
|
||||
}
|
||||
@@ -221,27 +221,27 @@ class InheritanceRuntime {
|
||||
* Render parent block on \$smarty.block.parent or {block append/prepend}
|
||||
*
|
||||
* @param Template $tpl
|
||||
* @param \Smarty\Block $block
|
||||
* @param \Smarty\Runtime\Block $block
|
||||
* @param string $tag
|
||||
*
|
||||
* @return null|string block content
|
||||
* @throws SmartyException
|
||||
* @throws Exception
|
||||
*/
|
||||
public function callParent(Template $tpl, \Smarty\Block $block, $tag) {
|
||||
public function callParent(Template $tpl, \Smarty\Runtime\Block $block, $tag) {
|
||||
if (isset($block->parent)) {
|
||||
$this->callBlock($block->parent, $tpl);
|
||||
} else {
|
||||
throw new SmartyException("inheritance: illegal '{$tag}' used in child template '{$tpl->inheritance->sources[$block->tplIndex]->filepath}' block '{$block->name}'");
|
||||
throw new Exception("inheritance: illegal '{$tag}' used in child template '{$tpl->inheritance->sources[$block->tplIndex]->filepath}' block '{$block->name}'");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* render block
|
||||
*
|
||||
* @param \Smarty\Block $block
|
||||
* @param \Smarty\Runtime\Block $block
|
||||
* @param Template $tpl
|
||||
*/
|
||||
public function callBlock(\Smarty\Block $block, Template $tpl) {
|
||||
public function callBlock(\Smarty\Runtime\Block $block, Template $tpl) {
|
||||
$this->sourceStack[] = $tpl->source;
|
||||
$tpl->source = $this->sources[$block->tplIndex];
|
||||
$block->callBlock($tpl);
|
||||
|
@@ -19,14 +19,14 @@ class MakeNocacheRuntime {
|
||||
* @param \Smarty\Template $tpl
|
||||
* @param string $var variable name
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function save(Template $tpl, $var) {
|
||||
if (isset($tpl->tpl_vars[$var])) {
|
||||
$export =
|
||||
preg_replace('/^\\\\Smarty\\\\Variable::__set_state[(]|[)]$/', '', var_export($tpl->tpl_vars[$var], true));
|
||||
if (preg_match('/(\w+)::__set_state/', $export, $match)) {
|
||||
throw new SmartyException("{make_nocache \${$var}} in template '{$tpl->source->name}': variable does contain object '{$match[1]}' not implementing method '__set_state'");
|
||||
throw new \Smarty\Exception("{make_nocache \${$var}} in template '{$tpl->source->name}': variable does contain object '{$match[1]}' not implementing method '__set_state'");
|
||||
}
|
||||
echo "/*%%SmartyNocache:{$tpl->compiled->nocache_hash}%%*/<?php " .
|
||||
addcslashes("\$_smarty_tpl->smarty->getRuntime('MakeNocache')->store(\$_smarty_tpl, '{$var}', ", '\\') .
|
||||
|
@@ -21,7 +21,7 @@ class TplFunctionRuntime {
|
||||
* @param array $params parameter array
|
||||
* @param bool $nocache true if called nocache
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function callTemplateFunction(Template $tpl, $name, $params, $nocache) {
|
||||
$funcParam = $tpl->tplFunctions[$name] ?? ($tpl->smarty->tplFunctions[$name] ?? null);
|
||||
@@ -49,7 +49,7 @@ class TplFunctionRuntime {
|
||||
return;
|
||||
}
|
||||
}
|
||||
throw new SmartyException("Unable to find template function '{$name}'");
|
||||
throw new \Smarty\Exception("Unable to find template function '{$name}'");
|
||||
}
|
||||
|
||||
/**
|
||||
|
667
src/Security.php
Normal file
667
src/Security.php
Normal file
@@ -0,0 +1,667 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty plugin
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Security
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* FIXME: Smarty_Security API
|
||||
* - getter and setter instead of public properties would allow cultivating an internal cache properly
|
||||
* - current implementation of isTrustedResourceDir() assumes that Smarty::$template_dir and Smarty::$config_dir
|
||||
* are immutable the cache is killed every time either of the variables change. That means that two distinct
|
||||
* Smarty objects with differing
|
||||
* $template_dir or $config_dir should NOT share the same Smarty_Security instance,
|
||||
* as this would lead to (severe) performance penalty! how should this be handled?
|
||||
*/
|
||||
|
||||
namespace Smarty;
|
||||
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* This class does contain the security settings
|
||||
*/
|
||||
#[\AllowDynamicProperties]
|
||||
class Security {
|
||||
|
||||
/**
|
||||
* This is the list of template directories that are considered secure.
|
||||
* $template_dir is in this list implicitly.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $secure_dir = [];
|
||||
|
||||
/**
|
||||
* This is an array of directories where trusted php scripts reside.
|
||||
* {@link $security} is disabled during their inclusion/execution.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $trusted_dir = [];
|
||||
|
||||
/**
|
||||
* List of regular expressions (PCRE) that include trusted URIs
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $trusted_uri = [];
|
||||
|
||||
/**
|
||||
* List of trusted constants names
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $trusted_constants = [];
|
||||
|
||||
/**
|
||||
* This is an array of trusted static classes.
|
||||
* If empty access to all static classes is allowed.
|
||||
* If set to 'none' none is allowed.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $static_classes = [];
|
||||
|
||||
/**
|
||||
* This is an nested array of trusted classes and static methods.
|
||||
* If empty access to all static classes and methods is allowed.
|
||||
* Format:
|
||||
* array (
|
||||
* 'class_1' => array('method_1', 'method_2'), // allowed methods listed
|
||||
* 'class_2' => array(), // all methods of class allowed
|
||||
* )
|
||||
* If set to null none is allowed.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $trusted_static_methods = [];
|
||||
|
||||
/**
|
||||
* This is an array of trusted static properties.
|
||||
* If empty access to all static classes and properties is allowed.
|
||||
* Format:
|
||||
* array (
|
||||
* 'class_1' => array('prop_1', 'prop_2'), // allowed properties listed
|
||||
* 'class_2' => array(), // all properties of class allowed
|
||||
* )
|
||||
* If set to null none is allowed.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $trusted_static_properties = [];
|
||||
|
||||
/**
|
||||
* This is an array of trusted PHP functions.
|
||||
* If empty all functions are allowed.
|
||||
* To disable all PHP functions set $php_functions = null.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $php_functions = ['isset', 'empty', 'count', 'sizeof', 'in_array', 'is_array', 'time',];
|
||||
|
||||
/**
|
||||
* This is an array of trusted PHP modifiers.
|
||||
* If empty all modifiers are allowed.
|
||||
* To disable all modifier set $php_modifiers = null.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $php_modifiers = ['escape', 'count', 'sizeof', 'nl2br',];
|
||||
|
||||
/**
|
||||
* This is an array of allowed tags.
|
||||
* If empty no restriction by allowed_tags.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $allowed_tags = [];
|
||||
|
||||
/**
|
||||
* This is an array of disabled tags.
|
||||
* If empty no restriction by disabled_tags.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $disabled_tags = [];
|
||||
|
||||
/**
|
||||
* This is an array of allowed modifier plugins.
|
||||
* If empty no restriction by allowed_modifiers.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $allowed_modifiers = [];
|
||||
|
||||
/**
|
||||
* This is an array of disabled modifier plugins.
|
||||
* If empty no restriction by disabled_modifiers.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $disabled_modifiers = [];
|
||||
|
||||
/**
|
||||
* This is an array of disabled special $smarty variables.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $disabled_special_smarty_vars = [];
|
||||
|
||||
/**
|
||||
* This is an array of trusted streams.
|
||||
* If empty all streams are allowed.
|
||||
* To disable all streams set $streams = null.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $streams = ['file'];
|
||||
|
||||
/**
|
||||
* + flag if constants can be accessed from template
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
public $allow_constants = true;
|
||||
|
||||
/**
|
||||
* + flag if super globals can be accessed from template
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
public $allow_super_globals = true;
|
||||
|
||||
/**
|
||||
* max template nesting level
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $max_template_nesting = 0;
|
||||
|
||||
/**
|
||||
* current template nesting level
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $_current_template_nesting = 0;
|
||||
|
||||
/**
|
||||
* Cache for $resource_dir lookup
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_resource_dir = [];
|
||||
|
||||
/**
|
||||
* Cache for $template_dir lookup
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_template_dir = [];
|
||||
|
||||
/**
|
||||
* Cache for $config_dir lookup
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_config_dir = [];
|
||||
|
||||
/**
|
||||
* Cache for $secure_dir lookup
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_secure_dir = [];
|
||||
|
||||
/**
|
||||
* Cache for $php_resource_dir lookup
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_php_resource_dir = null;
|
||||
|
||||
/**
|
||||
* Cache for $trusted_dir lookup
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_trusted_dir = null;
|
||||
|
||||
/**
|
||||
* Cache for include path status
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $_include_path_status = false;
|
||||
|
||||
/**
|
||||
* Cache for $_include_array lookup
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_include_dir = [];
|
||||
|
||||
/**
|
||||
* @param Smarty $smarty
|
||||
*/
|
||||
public function __construct(Smarty $smarty) {
|
||||
$this->smarty = $smarty;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if PHP function is trusted.
|
||||
*
|
||||
* @param string $function_name
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return boolean true if function is trusted
|
||||
*/
|
||||
public function isTrustedPhpFunction($function_name, $compiler) {
|
||||
if (isset($this->php_functions)
|
||||
&& (empty($this->php_functions) || in_array($function_name, $this->php_functions))
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
$compiler->trigger_template_error("PHP function '{$function_name}' not allowed by security setting");
|
||||
return false; // should not, but who knows what happens to the compiler in the future?
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if static class is trusted.
|
||||
*
|
||||
* @param string $class_name
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return boolean true if class is trusted
|
||||
*/
|
||||
public function isTrustedStaticClass($class_name, $compiler) {
|
||||
if (isset($this->static_classes)
|
||||
&& (empty($this->static_classes) || in_array($class_name, $this->static_classes))
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
$compiler->trigger_template_error("access to static class '{$class_name}' not allowed by security setting");
|
||||
return false; // should not, but who knows what happens to the compiler in the future?
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if static class method/property is trusted.
|
||||
*
|
||||
* @param string $class_name
|
||||
* @param string $params
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return boolean true if class method is trusted
|
||||
*/
|
||||
public function isTrustedStaticClassAccess($class_name, $params, $compiler) {
|
||||
if (!isset($params[2])) {
|
||||
// fall back
|
||||
return $this->isTrustedStaticClass($class_name, $compiler);
|
||||
}
|
||||
if ($params[2] === 'method') {
|
||||
$allowed = $this->trusted_static_methods;
|
||||
$name = substr($params[0], 0, strpos($params[0], '('));
|
||||
} else {
|
||||
$allowed = $this->trusted_static_properties;
|
||||
// strip '$'
|
||||
$name = substr($params[0], 1);
|
||||
}
|
||||
if (isset($allowed)) {
|
||||
if (empty($allowed)) {
|
||||
// fall back
|
||||
return $this->isTrustedStaticClass($class_name, $compiler);
|
||||
}
|
||||
if (isset($allowed[$class_name])
|
||||
&& (empty($allowed[$class_name]) || in_array($name, $allowed[$class_name]))
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
$compiler->trigger_template_error("access to static class '{$class_name}' {$params[2]} '{$name}' not allowed by security setting");
|
||||
return false; // should not, but who knows what happens to the compiler in the future?
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if PHP modifier is trusted.
|
||||
*
|
||||
* @param string $modifier_name
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return boolean true if modifier is trusted
|
||||
* @deprecated
|
||||
*/
|
||||
public function isTrustedPhpModifier($modifier_name, $compiler) {
|
||||
if (isset($this->php_modifiers)
|
||||
&& (empty($this->php_modifiers) || in_array($modifier_name, $this->php_modifiers))
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
$compiler->trigger_template_error("modifier '{$modifier_name}' not allowed by security setting");
|
||||
return false; // should not, but who knows what happens to the compiler in the future?
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if tag is trusted.
|
||||
*
|
||||
* @param string $tag_name
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return boolean true if tag is trusted
|
||||
*/
|
||||
public function isTrustedTag($tag_name, $compiler) {
|
||||
// check for internal always required tags
|
||||
if (in_array(
|
||||
$tag_name,
|
||||
[
|
||||
'assign', 'call', 'private_filter', 'private_block_plugin', 'private_function_plugin',
|
||||
'private_object_block_function', 'private_object_function', 'private_registered_function',
|
||||
'private_registered_block', 'private_special_variable', 'private_print_expression',
|
||||
'private_modifier',
|
||||
]
|
||||
)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
// check security settings
|
||||
if (empty($this->allowed_tags)) {
|
||||
if (empty($this->disabled_tags) || !in_array($tag_name, $this->disabled_tags)) {
|
||||
return true;
|
||||
} else {
|
||||
$compiler->trigger_template_error("tag '{$tag_name}' disabled by security setting", null, true);
|
||||
}
|
||||
} elseif (in_array($tag_name, $this->allowed_tags) && !in_array($tag_name, $this->disabled_tags)) {
|
||||
return true;
|
||||
} else {
|
||||
$compiler->trigger_template_error("tag '{$tag_name}' not allowed by security setting", null, true);
|
||||
}
|
||||
return false; // should not, but who knows what happens to the compiler in the future?
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if special $smarty variable is trusted.
|
||||
*
|
||||
* @param string $var_name
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return boolean true if tag is trusted
|
||||
*/
|
||||
public function isTrustedSpecialSmartyVar($var_name, $compiler) {
|
||||
if (!in_array($var_name, $this->disabled_special_smarty_vars)) {
|
||||
return true;
|
||||
} else {
|
||||
$compiler->trigger_template_error(
|
||||
"special variable '\$smarty.{$var_name}' not allowed by security setting",
|
||||
null,
|
||||
true
|
||||
);
|
||||
}
|
||||
return false; // should not, but who knows what happens to the compiler in the future?
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if modifier plugin is trusted.
|
||||
*
|
||||
* @param string $modifier_name
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return boolean true if tag is trusted
|
||||
*/
|
||||
public function isTrustedModifier($modifier_name, $compiler) {
|
||||
// check for internal always allowed modifier
|
||||
if (in_array($modifier_name, ['default'])) {
|
||||
return true;
|
||||
}
|
||||
// check security settings
|
||||
if (empty($this->allowed_modifiers)) {
|
||||
if (empty($this->disabled_modifiers) || !in_array($modifier_name, $this->disabled_modifiers)) {
|
||||
return true;
|
||||
} else {
|
||||
$compiler->trigger_template_error(
|
||||
"modifier '{$modifier_name}' disabled by security setting",
|
||||
null,
|
||||
true
|
||||
);
|
||||
}
|
||||
} elseif (in_array($modifier_name, $this->allowed_modifiers)
|
||||
&& !in_array($modifier_name, $this->disabled_modifiers)
|
||||
) {
|
||||
return true;
|
||||
} else {
|
||||
$compiler->trigger_template_error(
|
||||
"modifier '{$modifier_name}' not allowed by security setting",
|
||||
null,
|
||||
true
|
||||
);
|
||||
}
|
||||
return false; // should not, but who knows what happens to the compiler in the future?
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if constants are enabled or trusted
|
||||
*
|
||||
* @param string $const constant name
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isTrustedConstant($const, $compiler) {
|
||||
if (in_array($const, ['true', 'false', 'null'])) {
|
||||
return true;
|
||||
}
|
||||
if (!empty($this->trusted_constants)) {
|
||||
if (!in_array(strtolower($const), $this->trusted_constants)) {
|
||||
$compiler->trigger_template_error("Security: access to constant '{$const}' not permitted");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if ($this->allow_constants) {
|
||||
return true;
|
||||
}
|
||||
$compiler->trigger_template_error("Security: access to constants not permitted");
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if stream is trusted.
|
||||
*
|
||||
* @param string $stream_name
|
||||
*
|
||||
* @return boolean true if stream is trusted
|
||||
* @throws Exception if stream is not trusted
|
||||
*/
|
||||
public function isTrustedStream($stream_name) {
|
||||
if (isset($this->streams) && (empty($this->streams) || in_array($stream_name, $this->streams))) {
|
||||
return true;
|
||||
}
|
||||
throw new Exception("stream '{$stream_name}' not allowed by security setting");
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if directory of file resource is trusted.
|
||||
*
|
||||
* @param string $filepath
|
||||
* @param null|bool $isConfig
|
||||
*
|
||||
* @return bool true if directory is trusted
|
||||
* @throws \Smarty\Exception if directory is not trusted
|
||||
*/
|
||||
public function isTrustedResourceDir($filepath, $isConfig = null) {
|
||||
if ($this->_include_path_status !== $this->smarty->use_include_path) {
|
||||
$_dir =
|
||||
$this->smarty->use_include_path ? $this->smarty->getIncludePathDirs() : [];
|
||||
if ($this->_include_dir !== $_dir) {
|
||||
$this->_updateResourceDir($this->_include_dir, $_dir);
|
||||
$this->_include_dir = $_dir;
|
||||
}
|
||||
$this->_include_path_status = $this->smarty->use_include_path;
|
||||
}
|
||||
$_dir = $this->smarty->getTemplateDir();
|
||||
if ($this->_template_dir !== $_dir) {
|
||||
$this->_updateResourceDir($this->_template_dir, $_dir);
|
||||
$this->_template_dir = $_dir;
|
||||
}
|
||||
$_dir = $this->smarty->getConfigDir();
|
||||
if ($this->_config_dir !== $_dir) {
|
||||
$this->_updateResourceDir($this->_config_dir, $_dir);
|
||||
$this->_config_dir = $_dir;
|
||||
}
|
||||
if ($this->_secure_dir !== $this->secure_dir) {
|
||||
$this->secure_dir = (array)$this->secure_dir;
|
||||
foreach ($this->secure_dir as $k => $d) {
|
||||
$this->secure_dir[$k] = $this->smarty->_realpath($d . DIRECTORY_SEPARATOR, true);
|
||||
}
|
||||
$this->_updateResourceDir($this->_secure_dir, $this->secure_dir);
|
||||
$this->_secure_dir = $this->secure_dir;
|
||||
}
|
||||
$addPath = $this->_checkDir($filepath, $this->_resource_dir);
|
||||
if ($addPath !== false) {
|
||||
$this->_resource_dir = array_merge($this->_resource_dir, $addPath);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if URI (e.g. {fetch} or {html_image}) is trusted
|
||||
* To simplify things, isTrustedUri() resolves all input to "{$PROTOCOL}://{$HOSTNAME}".
|
||||
* So "http://username:password@hello.world.example.org:8080/some-path?some=query-string"
|
||||
* is reduced to "http://hello.world.example.org" prior to applying the patters from {@link $trusted_uri}.
|
||||
*
|
||||
* @param string $uri
|
||||
*
|
||||
* @return boolean true if URI is trusted
|
||||
* @throws Exception if URI is not trusted
|
||||
* @uses $trusted_uri for list of patterns to match against $uri
|
||||
*/
|
||||
public function isTrustedUri($uri) {
|
||||
$_uri = parse_url($uri);
|
||||
if (!empty($_uri['scheme']) && !empty($_uri['host'])) {
|
||||
$_uri = $_uri['scheme'] . '://' . $_uri['host'];
|
||||
foreach ($this->trusted_uri as $pattern) {
|
||||
if (preg_match($pattern, $_uri)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new Exception("URI '{$uri}' not allowed by security setting");
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove old directories and its sub folders, add new directories
|
||||
*
|
||||
* @param array $oldDir
|
||||
* @param array $newDir
|
||||
*/
|
||||
private function _updateResourceDir($oldDir, $newDir) {
|
||||
foreach ($oldDir as $directory) {
|
||||
// $directory = $this->smarty->_realpath($directory, true);
|
||||
$length = strlen($directory);
|
||||
foreach ($this->_resource_dir as $dir) {
|
||||
if (substr($dir, 0, $length) === $directory) {
|
||||
unset($this->_resource_dir[$dir]);
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($newDir as $directory) {
|
||||
// $directory = $this->smarty->_realpath($directory, true);
|
||||
$this->_resource_dir[$directory] = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if file is inside a valid directory
|
||||
*
|
||||
* @param string $filepath
|
||||
* @param array $dirs valid directories
|
||||
*
|
||||
* @return array|bool
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
private function _checkDir($filepath, $dirs) {
|
||||
$directory = dirname($this->smarty->_realpath($filepath, true)) . DIRECTORY_SEPARATOR;
|
||||
$_directory = [];
|
||||
if (!preg_match('#[\\\\/][.][.][\\\\/]#', $directory)) {
|
||||
while (true) {
|
||||
// test if the directory is trusted
|
||||
if (isset($dirs[$directory])) {
|
||||
return $_directory;
|
||||
}
|
||||
// abort if we've reached root
|
||||
if (!preg_match('#[\\\\/][^\\\\/]+[\\\\/]$#', $directory)) {
|
||||
// give up
|
||||
break;
|
||||
}
|
||||
// remember the directory to add it to _resource_dir in case we're successful
|
||||
$_directory[$directory] = true;
|
||||
// bubble up one level
|
||||
$directory = preg_replace('#[\\\\/][^\\\\/]+[\\\\/]$#', DIRECTORY_SEPARATOR, $directory);
|
||||
}
|
||||
}
|
||||
// give up
|
||||
throw new Exception(sprintf('Smarty Security: not trusted file path \'%s\' ', $filepath));
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads security class and enables security
|
||||
*
|
||||
* @param \Smarty $smarty
|
||||
* @param string|Security $security_class if a string is used, it must be class-name
|
||||
*
|
||||
* @return \Smarty current Smarty instance for chaining
|
||||
* @throws \Smarty\Exception when an invalid class name is provided
|
||||
*/
|
||||
public static function enableSecurity(Smarty $smarty, $security_class) {
|
||||
if ($security_class instanceof Security) {
|
||||
$smarty->security_policy = $security_class;
|
||||
return $smarty;
|
||||
} elseif (is_object($security_class)) {
|
||||
throw new Exception("Class '" . get_class($security_class) . "' must extend Smarty_Security.");
|
||||
}
|
||||
if ($security_class === null) {
|
||||
$security_class = $smarty->security_class;
|
||||
}
|
||||
if (!class_exists($security_class)) {
|
||||
throw new Exception("Security class '$security_class' is not defined");
|
||||
} elseif ($security_class !== Security::class && !is_subclass_of($security_class, Security::class)) {
|
||||
throw new Exception("Class '$security_class' must extend " . Security::class . ".");
|
||||
} else {
|
||||
$smarty->security_policy = new $security_class($smarty);
|
||||
}
|
||||
return $smarty;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start template processing
|
||||
*
|
||||
* @param $template
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
public function startTemplate($template) {
|
||||
if ($this->max_template_nesting > 0 && $this->_current_template_nesting++ >= $this->max_template_nesting) {
|
||||
throw new Exception("maximum template nesting level of '{$this->max_template_nesting}' exceeded when calling '{$template->template_resource}'");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Exit template processing
|
||||
*/
|
||||
public function endTemplate() {
|
||||
if ($this->max_template_nesting > 0) {
|
||||
$this->_current_template_nesting--;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Register callback functions call at start/end of template rendering
|
||||
*
|
||||
* @param \Smarty\Template $template
|
||||
*/
|
||||
public function registerCallBacks(Template $template) {
|
||||
$template->startRenderCallbacks[] = [$this, 'startTemplate'];
|
||||
$template->endRenderCallbacks[] = [$this, 'endTemplate'];
|
||||
}
|
||||
}
|
@@ -274,14 +274,14 @@ class Smarty extends \Smarty\TemplateBase
|
||||
* This should be instance of \Smarty_Security.
|
||||
*
|
||||
* @var string
|
||||
* @see \Smarty_Security
|
||||
* @see \Smarty\Security
|
||||
*/
|
||||
public $security_class = \Smarty_Security::class;
|
||||
public $security_class = \Smarty\Security::class;
|
||||
|
||||
/**
|
||||
* implementation of security class
|
||||
*
|
||||
* @var \Smarty_Security
|
||||
* @var \Smarty\Security
|
||||
*/
|
||||
public $security_policy = null;
|
||||
|
||||
@@ -592,7 +592,7 @@ class Smarty extends \Smarty\TemplateBase
|
||||
* @param string $resource_name template name
|
||||
*
|
||||
* @return bool status
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function templateExists($resource_name)
|
||||
{
|
||||
@@ -604,14 +604,14 @@ class Smarty extends \Smarty\TemplateBase
|
||||
/**
|
||||
* Loads security class and enables security
|
||||
*
|
||||
* @param string|\Smarty_Security $security_class if a string is used, it must be class-name
|
||||
* @param string|\Smarty\Security $security_class if a string is used, it must be class-name
|
||||
*
|
||||
* @return Smarty current Smarty instance for chaining
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function enableSecurity($security_class = null)
|
||||
{
|
||||
\Smarty_Security::enableSecurity($this, $security_class);
|
||||
\Smarty\Security::enableSecurity($this, $security_class);
|
||||
return $this;
|
||||
}
|
||||
|
||||
@@ -845,7 +845,7 @@ class Smarty extends \Smarty\TemplateBase
|
||||
* @param boolean $do_clone flag is Smarty object shall be cloned
|
||||
*
|
||||
* @return \Smarty\Template template object
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true)
|
||||
{
|
||||
@@ -909,7 +909,7 @@ class Smarty extends \Smarty\TemplateBase
|
||||
* @param \Smarty\Template $template
|
||||
*
|
||||
* @return string
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function _getTemplateId(
|
||||
$template_name,
|
||||
@@ -1224,9 +1224,6 @@ class Smarty extends \Smarty\TemplateBase
|
||||
/**
|
||||
* Empty cache for a specific template
|
||||
*
|
||||
* @api Smarty::clearCache()
|
||||
* @link https://www.smarty.net/docs/en/api.clear.cache.tpl
|
||||
*
|
||||
* @param string $template_name template name
|
||||
* @param string $cache_id cache id
|
||||
* @param string $compile_id compile id
|
||||
@@ -1234,7 +1231,10 @@ class Smarty extends \Smarty\TemplateBase
|
||||
* @param string $type resource type
|
||||
*
|
||||
* @return int number of cache files deleted
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*@link https://www.smarty.net/docs/en/api.clear.cache.tpl
|
||||
*
|
||||
* @api Smarty::clearCache()
|
||||
*/
|
||||
public function clearCache(
|
||||
$template_name,
|
||||
@@ -1271,15 +1271,15 @@ class Smarty extends \Smarty\TemplateBase
|
||||
/**
|
||||
* Delete compiled template file
|
||||
*
|
||||
* @api Smarty::clearCompiledTemplate()
|
||||
* @link https://www.smarty.net/docs/en/api.clear.compiled.template.tpl
|
||||
*
|
||||
* @param string $resource_name template name
|
||||
* @param string $compile_id compile id
|
||||
* @param integer $exp_time expiration time
|
||||
*
|
||||
* @return int number of template files deleted
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*@link https://www.smarty.net/docs/en/api.clear.compiled.template.tpl
|
||||
*
|
||||
* @api Smarty::clearCompiledTemplate()
|
||||
*/
|
||||
public function clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null)
|
||||
{
|
||||
@@ -1511,7 +1511,7 @@ class Smarty extends \Smarty\TemplateBase
|
||||
* @param string $content
|
||||
*
|
||||
* @throws \Exception
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function cacheModifiedCheck(Template\Cached $cached, \Smarty\Template $_template, $content)
|
||||
{
|
||||
@@ -1572,7 +1572,7 @@ class Smarty extends \Smarty\TemplateBase
|
||||
* @param Template $template template object
|
||||
*
|
||||
* @return string the filtered content
|
||||
*@throws SmartyException
|
||||
*@throws Exception
|
||||
*/
|
||||
public function runFilter($type, $content, Template $template)
|
||||
{
|
||||
@@ -1748,8 +1748,8 @@ class Smarty extends \Smarty\TemplateBase
|
||||
* @param string $_filepath complete filepath
|
||||
* @param string $_contents file content
|
||||
*
|
||||
* @throws SmartyException
|
||||
* @return boolean true
|
||||
*@throws Exception
|
||||
*/
|
||||
public function writeFile($_filepath, $_contents)
|
||||
{
|
||||
@@ -1768,7 +1768,7 @@ class Smarty extends \Smarty\TemplateBase
|
||||
clearstatcache();
|
||||
if (++$i === 3) {
|
||||
error_reporting($_error_reporting);
|
||||
throw new SmartyException("unable to create directory {$_dirpath}");
|
||||
throw new Exception("unable to create directory {$_dirpath}");
|
||||
}
|
||||
sleep(1);
|
||||
}
|
||||
@@ -1777,7 +1777,7 @@ class Smarty extends \Smarty\TemplateBase
|
||||
$_tmp_file = $_dirpath . DIRECTORY_SEPARATOR . str_replace(array('.', ','), '_', uniqid('wrt', true));
|
||||
if (!file_put_contents($_tmp_file, $_contents)) {
|
||||
error_reporting($_error_reporting);
|
||||
throw new SmartyException("unable to write file {$_tmp_file}");
|
||||
throw new Exception("unable to write file {$_tmp_file}");
|
||||
}
|
||||
/*
|
||||
* Windows' rename() fails if the destination exists,
|
||||
@@ -1807,7 +1807,7 @@ class Smarty extends \Smarty\TemplateBase
|
||||
}
|
||||
if (!$success) {
|
||||
error_reporting($_error_reporting);
|
||||
throw new SmartyException("unable to write file {$_filepath}");
|
||||
throw new Exception("unable to write file {$_filepath}");
|
||||
}
|
||||
// set file permissions
|
||||
@chmod($_filepath, 0666 & ~umask());
|
||||
@@ -1844,7 +1844,7 @@ class Smarty extends \Smarty\TemplateBase
|
||||
return $this->runtimes[$type] = new Smarty\Runtime\TplFunctionRuntime();
|
||||
}
|
||||
|
||||
throw new \SmartyException('Trying to load invalid runtime ' . $type);
|
||||
throw new \Smarty\Exception('Trying to load invalid runtime ' . $type);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1858,7 +1858,7 @@ class Smarty extends \Smarty\TemplateBase
|
||||
try {
|
||||
$this->getRuntime($type);
|
||||
return true;
|
||||
} catch (\SmartyException $e) {
|
||||
} catch (\Smarty\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@@ -16,7 +16,7 @@ use Smarty\Template\Source;
|
||||
use Smarty\Template\Cached;
|
||||
use Smarty\Template\Compiled;
|
||||
use Smarty\Template\Config;
|
||||
use SmartyException;
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* Main class with template data structures and methods
|
||||
@@ -143,7 +143,7 @@ class Template extends TemplateBase {
|
||||
* seconds
|
||||
* @param bool $_isConfig
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function __construct(
|
||||
$template_resource,
|
||||
@@ -182,7 +182,7 @@ class Template extends TemplateBase {
|
||||
*
|
||||
* @return string
|
||||
* @throws \Exception
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function render($no_output_filter = true, $display = null) {
|
||||
if ($this->smarty->debugging) {
|
||||
@@ -193,7 +193,7 @@ class Template extends TemplateBase {
|
||||
}
|
||||
// checks if template exists
|
||||
if (!$this->source->exists) {
|
||||
throw new SmartyException(
|
||||
throw new Exception(
|
||||
"Unable to load template '{$this->source->type}:{$this->source->name}'" .
|
||||
($this->_isSubTpl() ? " in '{$this->parent->template_resource}'" : '')
|
||||
);
|
||||
@@ -273,7 +273,7 @@ class Template extends TemplateBase {
|
||||
* @param string $content_func function name
|
||||
*
|
||||
* @throws \Exception
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function _subTemplateRender(
|
||||
$template,
|
||||
@@ -444,7 +444,7 @@ class Template extends TemplateBase {
|
||||
* @param bool $cache flag if called from cache file
|
||||
*
|
||||
* @return bool flag if compiled or cache file is valid
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function _decodeProperties(Template $tpl, $properties, $cache = false) {
|
||||
// on cache resources other than file check version stored in cache code
|
||||
@@ -543,7 +543,7 @@ class Template extends TemplateBase {
|
||||
* Get unique template id
|
||||
*
|
||||
* @return string
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function _getTemplateId() {
|
||||
return $this->templateId ?? $this->templateId =
|
||||
@@ -553,10 +553,10 @@ class Template extends TemplateBase {
|
||||
/**
|
||||
* runtime error not matching capture tags
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function capture_error() {
|
||||
throw new SmartyException("Not matching {capture} open/close in '{$this->template_resource}'");
|
||||
throw new Exception("Not matching {capture} open/close in '{$this->template_resource}'");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -602,7 +602,7 @@ class Template extends TemplateBase {
|
||||
/**
|
||||
* Load compiler object
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function loadCompiler() {
|
||||
$this->compiler =
|
||||
@@ -650,7 +650,7 @@ class Template extends TemplateBase {
|
||||
* @param string $property_name property name
|
||||
*
|
||||
* @return mixed|Cached
|
||||
* @throws SmartyException
|
||||
* @throws Exception
|
||||
*/
|
||||
public function __get($property_name) {
|
||||
switch ($property_name) {
|
||||
@@ -669,7 +669,7 @@ class Template extends TemplateBase {
|
||||
return $this->smarty->$property_name;
|
||||
}
|
||||
}
|
||||
throw new SmartyException("template property '$property_name' does not exist.");
|
||||
throw new Exception("template property '$property_name' does not exist.");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -678,7 +678,7 @@ class Template extends TemplateBase {
|
||||
* @param string $property_name property name
|
||||
* @param mixed $value value
|
||||
*
|
||||
* @throws SmartyException
|
||||
* @throws Exception
|
||||
*/
|
||||
public function __set($property_name, $value) {
|
||||
switch ($property_name) {
|
||||
@@ -694,7 +694,7 @@ class Template extends TemplateBase {
|
||||
return;
|
||||
}
|
||||
}
|
||||
throw new SmartyException("invalid template property '$property_name'.");
|
||||
throw new Exception("invalid template property '$property_name'.");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -790,7 +790,7 @@ class Template extends TemplateBase {
|
||||
* configuration
|
||||
*
|
||||
* @return bool
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function mustCompile() {
|
||||
if (!$this->source->exists) {
|
||||
@@ -799,7 +799,7 @@ class Template extends TemplateBase {
|
||||
} else {
|
||||
$parent_resource = '';
|
||||
}
|
||||
throw new SmartyException("Unable to load template {$this->source->type} '{$this->source->name}'{$parent_resource}");
|
||||
throw new Exception("Unable to load template {$this->source->type} '{$this->source->name}'{$parent_resource}");
|
||||
}
|
||||
if ($this->mustCompile === null) {
|
||||
$this->mustCompile = (!$this->source->handler->uncompiled &&
|
||||
|
@@ -84,7 +84,7 @@ class Cached extends ResourceBase {
|
||||
*
|
||||
* @param Template $_template template object
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function __construct(Template $_template) {
|
||||
$this->compile_id = $_template->compile_id;
|
||||
@@ -282,7 +282,7 @@ class Cached extends ResourceBase {
|
||||
* @param Template $_template
|
||||
* @param bool $no_output_filter
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function updateCache(Template $_template, $no_output_filter) {
|
||||
ob_start();
|
||||
@@ -315,7 +315,7 @@ class Cached extends ResourceBase {
|
||||
* @param Template $_template
|
||||
* @param bool $no_output_filter
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
private function removeNoCacheHash(Template $_template, $no_output_filter) {
|
||||
$php_pattern = '/(<%|%>|<\?php|<\?|\?>|<script\s+language\s*=\s*[\"\']?\s*php\s*[\"\']?\s*>)/';
|
||||
|
@@ -88,13 +88,13 @@ class Compiled extends ResourceBase {
|
||||
* @param Template $_template
|
||||
*
|
||||
* @return string
|
||||
* @throws Exception
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function render(Template $_template) {
|
||||
// checks if template exists
|
||||
if (!$_template->source->exists) {
|
||||
$type = $_template->source->isConfig ? 'config' : 'template';
|
||||
throw new SmartyException("Unable to load {$type} '{$_template->source->type}:{$_template->source->name}'");
|
||||
throw new \Smarty\Exception("Unable to load {$type} '{$_template->source->type}:{$_template->source->name}'");
|
||||
}
|
||||
if ($_template->smarty->debugging) {
|
||||
if (!isset($_template->smarty->_debug)) {
|
||||
@@ -200,7 +200,7 @@ class Compiled extends ResourceBase {
|
||||
* @param string $code compiled code
|
||||
*
|
||||
* @return bool success
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function write(Template $_template, $code) {
|
||||
if (!$_template->source->handler->recompiled) {
|
||||
|
@@ -4,7 +4,7 @@ namespace Smarty\Template;
|
||||
|
||||
use Smarty;
|
||||
use Smarty\Template;
|
||||
use SmartyException;
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* Smarty Config Resource Data Object
|
||||
@@ -65,7 +65,7 @@ class Config extends Source {
|
||||
* @param string $template_resource resource identifier
|
||||
*
|
||||
* @return Config Source Object
|
||||
* @throws SmartyException
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function load(
|
||||
Template $_template = null,
|
||||
@@ -78,13 +78,13 @@ class Config extends Source {
|
||||
$template_resource = $_template->template_resource;
|
||||
}
|
||||
if (empty($template_resource)) {
|
||||
throw new SmartyException('Source: Missing name');
|
||||
throw new Exception('Source: Missing name');
|
||||
}
|
||||
// parse resource_name, load resource handler
|
||||
[$name, $type] = Smarty\Resource\BasePlugin::parseResourceName($template_resource, $smarty->default_config_type);
|
||||
// make sure configs are not loaded via anything smarty can't handle
|
||||
if (isset($_incompatible_resources[$type])) {
|
||||
throw new SmartyException("Unable to use resource '{$type}' for config");
|
||||
throw new Exception("Unable to use resource '{$type}' for config");
|
||||
}
|
||||
$source = new Config($smarty, $template_resource, $type, $name);
|
||||
$source->handler->populate($source, $_template);
|
||||
|
@@ -116,7 +116,7 @@ abstract class ResourceBase {
|
||||
$unifunc = $this->unifunc;
|
||||
}
|
||||
if (empty($unifunc) || !function_exists($unifunc)) {
|
||||
throw new \SmartyException("Invalid compiled template for '{$_template->template_resource}'");
|
||||
throw new \Smarty\Exception("Invalid compiled template for '{$_template->template_resource}'");
|
||||
}
|
||||
if ($_template->startRenderCallbacks) {
|
||||
foreach ($_template->startRenderCallbacks as $callback) {
|
||||
|
@@ -4,7 +4,7 @@ namespace Smarty\Template;
|
||||
|
||||
use Smarty;
|
||||
use Smarty\Template;
|
||||
use SmartyException;
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* Smarty Resource Data Object
|
||||
@@ -136,7 +136,7 @@ class Source {
|
||||
* @param string $type type of resource
|
||||
* @param string $name resource name
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
* @internal param \Smarty\Resource\Base $handler Resource Handler this source object communicates with
|
||||
*/
|
||||
public function __construct(Smarty $smarty, $resource, $type, $name) {
|
||||
@@ -157,7 +157,7 @@ class Source {
|
||||
* @param string $template_resource resource identifier
|
||||
*
|
||||
* @return Source Source Object
|
||||
* @throws SmartyException
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function load(
|
||||
Template $_template = null,
|
||||
@@ -169,7 +169,7 @@ class Source {
|
||||
$template_resource = $_template->template_resource;
|
||||
}
|
||||
if (empty($template_resource)) {
|
||||
throw new SmartyException('Source: Missing name');
|
||||
throw new Exception('Source: Missing name');
|
||||
}
|
||||
// parse resource_name, load resource handler, identify unique resource name
|
||||
if (preg_match('/^([A-Za-z0-9_\-]{2,})[:]([\s\S]*)$/', $template_resource, $match)) {
|
||||
@@ -207,7 +207,7 @@ class Source {
|
||||
* Get source content
|
||||
*
|
||||
* @return string
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function getContent() {
|
||||
return isset($this->content) ? $this->content : $this->handler->getContent($this);
|
||||
@@ -216,7 +216,7 @@ class Source {
|
||||
/**
|
||||
* get default content from template or config resource handler
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function _getDefaultTemplate($default_handler) {
|
||||
$_content = $_timestamp = null;
|
||||
@@ -229,7 +229,7 @@ class Source {
|
||||
if ($this->exists) {
|
||||
$this->timestamp = filemtime($_return);
|
||||
} else {
|
||||
throw new SmartyException(
|
||||
throw new Exception(
|
||||
'Default handler: Unable to load ' .
|
||||
($this->isConfig ? 'config' : 'template') .
|
||||
" default file '{$_return}' for '{$this->type}:{$this->name}'"
|
||||
@@ -244,7 +244,7 @@ class Source {
|
||||
$this->handler = Smarty\Resource\BasePlugin::load($this->smarty, 'eval');
|
||||
} else {
|
||||
$this->exists = false;
|
||||
throw new SmartyException(
|
||||
throw new Exception(
|
||||
'Default handler: No ' . ($this->isConfig ? 'config' : 'template') .
|
||||
" default content for '{$this->type}:{$this->name}'"
|
||||
);
|
||||
|
@@ -14,8 +14,8 @@ use Smarty\Cacheresource\Base;
|
||||
use Smarty\Data;
|
||||
use Smarty\Smarty;
|
||||
use Smarty\Template;
|
||||
use Smarty_Data;
|
||||
use SmartyException;
|
||||
use Smarty\DataObject;
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* Class with shared smarty/template methods
|
||||
@@ -92,7 +92,7 @@ abstract class TemplateBase extends Data {
|
||||
* @param object $parent next higher level of Smarty variables
|
||||
*
|
||||
* @return string rendered template output
|
||||
* @throws SmartyException
|
||||
* @throws Exception
|
||||
* @throws Exception
|
||||
*/
|
||||
public function fetch($template = null, $cache_id = null, $compile_id = null, $parent = null) {
|
||||
@@ -109,7 +109,7 @@ abstract class TemplateBase extends Data {
|
||||
* @param object $parent next higher level of Smarty variables
|
||||
*
|
||||
* @throws \Exception
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function display($template = null, $cache_id = null, $compile_id = null, $parent = null) {
|
||||
// display template
|
||||
@@ -127,7 +127,7 @@ abstract class TemplateBase extends Data {
|
||||
*
|
||||
* @return bool cache status
|
||||
* @throws \Exception
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
* @link https://www.smarty.net/docs/en/api.is.cached.tpl
|
||||
*
|
||||
* @api Smarty::isCached()
|
||||
@@ -147,21 +147,21 @@ abstract class TemplateBase extends Data {
|
||||
*
|
||||
* @return mixed
|
||||
* @throws \Exception
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
private function _execute($template, $cache_id, $compile_id, $parent, $function) {
|
||||
$smarty = $this->_getSmartyObj();
|
||||
$saveVars = true;
|
||||
if ($template === null) {
|
||||
if (!$this->_isTplObj()) {
|
||||
throw new SmartyException($function . '():Missing \'$template\' parameter');
|
||||
throw new Exception($function . '():Missing \'$template\' parameter');
|
||||
} else {
|
||||
$template = $this;
|
||||
}
|
||||
} elseif (is_object($template)) {
|
||||
/* @var Template $template */
|
||||
if (!isset($template->_objType) || !$template->_isTplObj()) {
|
||||
throw new SmartyException($function . '():Template object expected');
|
||||
throw new Exception($function . '():Template object expected');
|
||||
}
|
||||
} else {
|
||||
// get template object
|
||||
@@ -262,7 +262,7 @@ abstract class TemplateBase extends Data {
|
||||
* @param mixed $cache_attr caching attributes if any
|
||||
*
|
||||
* @return \Smarty|\Smarty\Template
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
* @link https://www.smarty.net/docs/en/api.register.plugin.tpl
|
||||
*
|
||||
* @api Smarty::registerPlugin()
|
||||
@@ -270,11 +270,11 @@ abstract class TemplateBase extends Data {
|
||||
public function registerPlugin($type, $name, $callback, $cacheable = true, $cache_attr = null) {
|
||||
$smarty = $this->_getSmartyObj();
|
||||
if (isset($smarty->registered_plugins[$type][$name])) {
|
||||
throw new SmartyException("Plugin tag '{$name}' already registered");
|
||||
throw new Exception("Plugin tag '{$name}' already registered");
|
||||
} elseif (!is_callable($callback)) {
|
||||
throw new SmartyException("Plugin '{$name}' not callable");
|
||||
throw new Exception("Plugin '{$name}' not callable");
|
||||
} elseif ($cacheable && $cache_attr) {
|
||||
throw new SmartyException("Cannot set caching attributes for plugin '{$name}' when it is cacheable.");
|
||||
throw new Exception("Cannot set caching attributes for plugin '{$name}' when it is cacheable.");
|
||||
} else {
|
||||
$smarty->registered_plugins[$type][$name] = [$callback, (bool)$cacheable, (array)$cache_attr];
|
||||
}
|
||||
@@ -307,7 +307,7 @@ abstract class TemplateBase extends Data {
|
||||
* @param string $name filter name
|
||||
*
|
||||
* @return bool
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
* @api Smarty::loadFilter()
|
||||
* @link https://www.smarty.net/docs/en/api.load.filter.tpl
|
||||
*
|
||||
@@ -328,7 +328,7 @@ abstract class TemplateBase extends Data {
|
||||
$smarty->registered_filters[$type][$_filter_name] = $_plugin;
|
||||
return true;
|
||||
}
|
||||
throw new SmartyException("{$type}filter '{$name}' not found or callable");
|
||||
throw new Exception("{$type}filter '{$name}' not found or callable");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -338,7 +338,7 @@ abstract class TemplateBase extends Data {
|
||||
* @param string $name filter name
|
||||
*
|
||||
* @return TemplateBase
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
* @api Smarty::unloadFilter()
|
||||
*
|
||||
* @link https://www.smarty.net/docs/en/api.unload.filter.tpl
|
||||
@@ -367,7 +367,7 @@ abstract class TemplateBase extends Data {
|
||||
* @param string|null $name optional filter name
|
||||
*
|
||||
* @return TemplateBase
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
* @link https://www.smarty.net/docs/en/api.register.filter.tpl
|
||||
*
|
||||
* @api Smarty::registerFilter()
|
||||
@@ -377,7 +377,7 @@ abstract class TemplateBase extends Data {
|
||||
$this->_checkFilterType($type);
|
||||
$name = isset($name) ? $name : $this->_getFilterName($callback);
|
||||
if (!is_callable($callback)) {
|
||||
throw new SmartyException("{$type}filter '{$name}' not callable");
|
||||
throw new Exception("{$type}filter '{$name}' not callable");
|
||||
}
|
||||
$smarty->registered_filters[$type][$name] = $callback;
|
||||
return $this;
|
||||
@@ -390,7 +390,7 @@ abstract class TemplateBase extends Data {
|
||||
* @param callback|string $callback
|
||||
*
|
||||
* @return TemplateBase
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
* @api Smarty::unregisterFilter()
|
||||
*
|
||||
* @link https://www.smarty.net/docs/en/api.unregister.filter.tpl
|
||||
@@ -421,7 +421,7 @@ abstract class TemplateBase extends Data {
|
||||
* @param array $block_methods list of block-methods
|
||||
*
|
||||
* @return \Smarty|\Smarty\Template
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
* @link https://www.smarty.net/docs/en/api.register.object.tpl
|
||||
*
|
||||
* @api Smarty::registerObject()
|
||||
@@ -438,7 +438,7 @@ abstract class TemplateBase extends Data {
|
||||
if (!empty($allowed_methods_properties)) {
|
||||
foreach ((array)$allowed_methods_properties as $method) {
|
||||
if (!is_callable([$object, $method]) && !property_exists($object, $method)) {
|
||||
throw new SmartyException("Undefined method or property '$method' in registered object");
|
||||
throw new Exception("Undefined method or property '$method' in registered object");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -446,7 +446,7 @@ abstract class TemplateBase extends Data {
|
||||
if (!empty($block_methods)) {
|
||||
foreach ((array)$block_methods as $method) {
|
||||
if (!is_callable([$object, $method])) {
|
||||
throw new SmartyException("Undefined method '$method' in registered object");
|
||||
throw new Exception("Undefined method '$method' in registered object");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -536,8 +536,8 @@ abstract class TemplateBase extends Data {
|
||||
* variables
|
||||
* @param null $name optional data block name
|
||||
*
|
||||
* @return Smarty_Data data object
|
||||
* @throws SmartyException
|
||||
* @return DataObject data object
|
||||
* @throws Exception
|
||||
* @api Smarty::createData()
|
||||
* @link https://www.smarty.net/docs/en/api.create.data.tpl
|
||||
*
|
||||
@@ -545,7 +545,7 @@ abstract class TemplateBase extends Data {
|
||||
public function createData(Data $parent = null, $name = null) {
|
||||
/* @var Smarty $smarty */
|
||||
$smarty = $this->_getSmartyObj();
|
||||
$dataObj = new Smarty_Data($parent, $smarty, $name);
|
||||
$dataObj = new DataObject($parent, $smarty, $name);
|
||||
if ($smarty->debugging) {
|
||||
\Smarty\Debug::register_data($dataObj);
|
||||
}
|
||||
@@ -582,7 +582,7 @@ abstract class TemplateBase extends Data {
|
||||
* @param string $object_name object name
|
||||
*
|
||||
* @return object
|
||||
* @throws \SmartyException if no such object is found
|
||||
* @throws \Smarty\Exception if no such object is found
|
||||
* @link https://www.smarty.net/docs/en/api.get.registered.object.tpl
|
||||
*
|
||||
* @api Smarty::getRegisteredObject()
|
||||
@@ -590,10 +590,10 @@ abstract class TemplateBase extends Data {
|
||||
public function getRegisteredObject($object_name) {
|
||||
$smarty = $this->_getSmartyObj();
|
||||
if (!isset($smarty->registered_objects[$object_name])) {
|
||||
throw new SmartyException("'$object_name' is not a registered object");
|
||||
throw new Exception("'$object_name' is not a registered object");
|
||||
}
|
||||
if (!is_object($smarty->registered_objects[$object_name][0])) {
|
||||
throw new SmartyException("registered '$object_name' is not an object");
|
||||
throw new Exception("registered '$object_name' is not an object");
|
||||
}
|
||||
return $smarty->registered_objects[$object_name][0];
|
||||
}
|
||||
@@ -617,7 +617,7 @@ abstract class TemplateBase extends Data {
|
||||
* to addto add
|
||||
*
|
||||
* @return TemplateBase
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
* @api Smarty::addLiterals()
|
||||
*
|
||||
*/
|
||||
@@ -635,7 +635,7 @@ abstract class TemplateBase extends Data {
|
||||
* to setto set
|
||||
*
|
||||
* @return TemplateBase
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
* @api Smarty::setLiterals()
|
||||
*
|
||||
*/
|
||||
@@ -655,14 +655,14 @@ abstract class TemplateBase extends Data {
|
||||
* @param Smarty $smarty
|
||||
* @param array $literals
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
private function _setLiterals(Smarty $smarty, $literals) {
|
||||
$literals = array_combine($literals, $literals);
|
||||
$error = isset($literals[$smarty->left_delimiter]) ? [$smarty->left_delimiter] : [];
|
||||
$error = isset($literals[$smarty->right_delimiter]) ? $error[] = $smarty->right_delimiter : $error;
|
||||
if (!empty($error)) {
|
||||
throw new SmartyException(
|
||||
throw new Exception(
|
||||
'User defined literal(s) "' . $error .
|
||||
'" may not be identical with left or right delimiter'
|
||||
);
|
||||
@@ -675,11 +675,11 @@ abstract class TemplateBase extends Data {
|
||||
*
|
||||
* @param string $type
|
||||
*
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
private function _checkFilterType($type) {
|
||||
if (!isset($this->filterTypes[$type])) {
|
||||
throw new SmartyException("Illegal filter type '{$type}'");
|
||||
throw new Exception("Illegal filter type '{$type}'");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -709,7 +709,7 @@ abstract class TemplateBase extends Data {
|
||||
* register
|
||||
*
|
||||
* @return TemplateBase
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
* @api Smarty::registerClass()
|
||||
* @link https://www.smarty.net/docs/en/api.register.class.tpl
|
||||
*
|
||||
@@ -718,7 +718,7 @@ abstract class TemplateBase extends Data {
|
||||
$smarty = $this->_getSmartyObj();
|
||||
// test if exists
|
||||
if (!class_exists($class_impl)) {
|
||||
throw new SmartyException("Undefined class '$class_impl' in register template class");
|
||||
throw new Exception("Undefined class '$class_impl' in register template class");
|
||||
}
|
||||
// register the class
|
||||
$smarty->registered_classes[$class_name] = $class_impl;
|
||||
@@ -766,7 +766,7 @@ abstract class TemplateBase extends Data {
|
||||
* @param callable $callback class/method name
|
||||
*
|
||||
* @return TemplateBase
|
||||
* @throws SmartyException if $callback is not callable
|
||||
* @throws Exception if $callback is not callable
|
||||
* @api Smarty::registerDefaultConfigHandler()
|
||||
*
|
||||
*/
|
||||
@@ -775,7 +775,7 @@ abstract class TemplateBase extends Data {
|
||||
if (is_callable($callback)) {
|
||||
$smarty->default_config_handler_func = $callback;
|
||||
} else {
|
||||
throw new SmartyException('Default config handler not callable');
|
||||
throw new Exception('Default config handler not callable');
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
@@ -786,7 +786,7 @@ abstract class TemplateBase extends Data {
|
||||
* @param callable $callback class/method name
|
||||
*
|
||||
* @return TemplateBase
|
||||
* @throws SmartyException if $callback is not callable
|
||||
* @throws Exception if $callback is not callable
|
||||
* @link https://www.smarty.net/docs/en/api.register.default.plugin.handler.tpl
|
||||
*
|
||||
* @api Smarty::registerDefaultPluginHandler()
|
||||
@@ -796,7 +796,7 @@ abstract class TemplateBase extends Data {
|
||||
if (is_callable($callback)) {
|
||||
$smarty->default_plugin_handler_func = $callback;
|
||||
} else {
|
||||
throw new SmartyException("Default plugin handler '$callback' not callable");
|
||||
throw new Exception("Default plugin handler '$callback' not callable");
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
@@ -807,7 +807,7 @@ abstract class TemplateBase extends Data {
|
||||
* @param callable $callback class/method name
|
||||
*
|
||||
* @return TemplateBase
|
||||
* @throws SmartyException if $callback is not callable
|
||||
* @throws Exception if $callback is not callable
|
||||
* @api Smarty::registerDefaultTemplateHandler()
|
||||
*
|
||||
*/
|
||||
@@ -816,7 +816,7 @@ abstract class TemplateBase extends Data {
|
||||
if (is_callable($callback)) {
|
||||
$smarty->default_template_handler_func = $callback;
|
||||
} else {
|
||||
throw new SmartyException('Default template handler not callable');
|
||||
throw new Exception('Default template handler not callable');
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
@@ -862,14 +862,14 @@ abstract class TemplateBase extends Data {
|
||||
* @param string $tpl_name
|
||||
*
|
||||
* @return TemplateBase
|
||||
* @throws SmartyException if file is not readable
|
||||
* @throws Exception if file is not readable
|
||||
* @api Smarty::setDebugTemplate()
|
||||
*
|
||||
*/
|
||||
public function setDebugTemplate($tpl_name) {
|
||||
$smarty = $this->_getSmartyObj();
|
||||
if (!is_readable($tpl_name)) {
|
||||
throw new SmartyException("Unknown file '{$tpl_name}'");
|
||||
throw new Exception("Unknown file '{$tpl_name}'");
|
||||
}
|
||||
$smarty->debug_tpl = $tpl_name;
|
||||
return $this;
|
||||
|
33
src/UndefinedVariable.php
Normal file
33
src/UndefinedVariable.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace Smarty;
|
||||
|
||||
/**
|
||||
* class for undefined variable object
|
||||
* This class defines an object for undefined variable handling
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Template
|
||||
*/
|
||||
class UndefinedVariable extends Variable {
|
||||
|
||||
/**
|
||||
* Returns null for not existing properties
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function __get($name) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Always returns an empty string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString() {
|
||||
return '';
|
||||
}
|
||||
}
|
@@ -1,70 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty Plugin Data
|
||||
* This file contains the data object
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Template
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
use Smarty\Template;
|
||||
|
||||
/**
|
||||
* class for the Smarty data object
|
||||
* The Smarty data object will hold Smarty variables in the current scope
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Template
|
||||
*/
|
||||
class Smarty_Data extends \Smarty\Data
|
||||
{
|
||||
/**
|
||||
* Counter
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public static $count = 0;
|
||||
|
||||
/**
|
||||
* Data block name
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $dataObjectName = '';
|
||||
|
||||
/**
|
||||
* Smarty object
|
||||
*
|
||||
* @var Smarty
|
||||
*/
|
||||
public $smarty = null;
|
||||
|
||||
/**
|
||||
* create Smarty data object
|
||||
*
|
||||
* @param Smarty|array $_parent parent template
|
||||
* @param Smarty|Template $smarty global smarty instance
|
||||
* @param string $name optional data block name
|
||||
*
|
||||
* @throws SmartyException
|
||||
*/
|
||||
public function __construct($_parent = null, $smarty = null, $name = null)
|
||||
{
|
||||
parent::__construct();
|
||||
self::$count++;
|
||||
$this->dataObjectName = 'Data_object ' . (isset($name) ? "'{$name}'" : self::$count);
|
||||
$this->smarty = $smarty;
|
||||
if (is_object($_parent)) {
|
||||
// when object set up back pointer
|
||||
$this->parent = $_parent;
|
||||
} elseif (is_array($_parent)) {
|
||||
// set up variable values
|
||||
foreach ($_parent as $_key => $_val) {
|
||||
$this->tpl_vars[ $_key ] = new \Smarty\Variable($_val);
|
||||
}
|
||||
} elseif ($_parent !== null) {
|
||||
throw new SmartyException('Wrong type for template variables');
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,682 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Smarty plugin
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Security
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
/**
|
||||
* FIXME: Smarty_Security API
|
||||
* - getter and setter instead of public properties would allow cultivating an internal cache properly
|
||||
* - current implementation of isTrustedResourceDir() assumes that Smarty::$template_dir and Smarty::$config_dir
|
||||
* are immutable the cache is killed every time either of the variables change. That means that two distinct
|
||||
* Smarty objects with differing
|
||||
* $template_dir or $config_dir should NOT share the same Smarty_Security instance,
|
||||
* as this would lead to (severe) performance penalty! how should this be handled?
|
||||
*/
|
||||
|
||||
use Smarty\Template;
|
||||
|
||||
/**
|
||||
* This class does contain the security settings
|
||||
*/
|
||||
#[\AllowDynamicProperties]
|
||||
class Smarty_Security
|
||||
{
|
||||
|
||||
/**
|
||||
* This is the list of template directories that are considered secure.
|
||||
* $template_dir is in this list implicitly.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $secure_dir = array();
|
||||
|
||||
/**
|
||||
* This is an array of directories where trusted php scripts reside.
|
||||
* {@link $security} is disabled during their inclusion/execution.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $trusted_dir = array();
|
||||
|
||||
/**
|
||||
* List of regular expressions (PCRE) that include trusted URIs
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $trusted_uri = array();
|
||||
|
||||
/**
|
||||
* List of trusted constants names
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $trusted_constants = array();
|
||||
|
||||
/**
|
||||
* This is an array of trusted static classes.
|
||||
* If empty access to all static classes is allowed.
|
||||
* If set to 'none' none is allowed.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $static_classes = array();
|
||||
|
||||
/**
|
||||
* This is an nested array of trusted classes and static methods.
|
||||
* If empty access to all static classes and methods is allowed.
|
||||
* Format:
|
||||
* array (
|
||||
* 'class_1' => array('method_1', 'method_2'), // allowed methods listed
|
||||
* 'class_2' => array(), // all methods of class allowed
|
||||
* )
|
||||
* If set to null none is allowed.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $trusted_static_methods = array();
|
||||
|
||||
/**
|
||||
* This is an array of trusted static properties.
|
||||
* If empty access to all static classes and properties is allowed.
|
||||
* Format:
|
||||
* array (
|
||||
* 'class_1' => array('prop_1', 'prop_2'), // allowed properties listed
|
||||
* 'class_2' => array(), // all properties of class allowed
|
||||
* )
|
||||
* If set to null none is allowed.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $trusted_static_properties = array();
|
||||
|
||||
/**
|
||||
* This is an array of trusted PHP functions.
|
||||
* If empty all functions are allowed.
|
||||
* To disable all PHP functions set $php_functions = null.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $php_functions = array('isset', 'empty', 'count', 'sizeof', 'in_array', 'is_array', 'time',);
|
||||
|
||||
/**
|
||||
* This is an array of trusted PHP modifiers.
|
||||
* If empty all modifiers are allowed.
|
||||
* To disable all modifier set $php_modifiers = null.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $php_modifiers = array('escape', 'count', 'sizeof', 'nl2br',);
|
||||
|
||||
/**
|
||||
* This is an array of allowed tags.
|
||||
* If empty no restriction by allowed_tags.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $allowed_tags = array();
|
||||
|
||||
/**
|
||||
* This is an array of disabled tags.
|
||||
* If empty no restriction by disabled_tags.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $disabled_tags = array();
|
||||
|
||||
/**
|
||||
* This is an array of allowed modifier plugins.
|
||||
* If empty no restriction by allowed_modifiers.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $allowed_modifiers = array();
|
||||
|
||||
/**
|
||||
* This is an array of disabled modifier plugins.
|
||||
* If empty no restriction by disabled_modifiers.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $disabled_modifiers = array();
|
||||
|
||||
/**
|
||||
* This is an array of disabled special $smarty variables.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $disabled_special_smarty_vars = array();
|
||||
|
||||
/**
|
||||
* This is an array of trusted streams.
|
||||
* If empty all streams are allowed.
|
||||
* To disable all streams set $streams = null.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $streams = array('file');
|
||||
|
||||
/**
|
||||
* + flag if constants can be accessed from template
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
public $allow_constants = true;
|
||||
|
||||
/**
|
||||
* + flag if super globals can be accessed from template
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
public $allow_super_globals = true;
|
||||
|
||||
/**
|
||||
* max template nesting level
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $max_template_nesting = 0;
|
||||
|
||||
/**
|
||||
* current template nesting level
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $_current_template_nesting = 0;
|
||||
|
||||
/**
|
||||
* Cache for $resource_dir lookup
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_resource_dir = array();
|
||||
|
||||
/**
|
||||
* Cache for $template_dir lookup
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_template_dir = array();
|
||||
|
||||
/**
|
||||
* Cache for $config_dir lookup
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_config_dir = array();
|
||||
|
||||
/**
|
||||
* Cache for $secure_dir lookup
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_secure_dir = array();
|
||||
|
||||
/**
|
||||
* Cache for $php_resource_dir lookup
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_php_resource_dir = null;
|
||||
|
||||
/**
|
||||
* Cache for $trusted_dir lookup
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_trusted_dir = null;
|
||||
|
||||
/**
|
||||
* Cache for include path status
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $_include_path_status = false;
|
||||
|
||||
/**
|
||||
* Cache for $_include_array lookup
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_include_dir = array();
|
||||
|
||||
/**
|
||||
* @param Smarty $smarty
|
||||
*/
|
||||
public function __construct($smarty)
|
||||
{
|
||||
$this->smarty = $smarty;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if PHP function is trusted.
|
||||
*
|
||||
* @param string $function_name
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return boolean true if function is trusted
|
||||
*/
|
||||
public function isTrustedPhpFunction($function_name, $compiler)
|
||||
{
|
||||
if (isset($this->php_functions)
|
||||
&& (empty($this->php_functions) || in_array($function_name, $this->php_functions))
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
$compiler->trigger_template_error("PHP function '{$function_name}' not allowed by security setting");
|
||||
return false; // should not, but who knows what happens to the compiler in the future?
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if static class is trusted.
|
||||
*
|
||||
* @param string $class_name
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return boolean true if class is trusted
|
||||
*/
|
||||
public function isTrustedStaticClass($class_name, $compiler)
|
||||
{
|
||||
if (isset($this->static_classes)
|
||||
&& (empty($this->static_classes) || in_array($class_name, $this->static_classes))
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
$compiler->trigger_template_error("access to static class '{$class_name}' not allowed by security setting");
|
||||
return false; // should not, but who knows what happens to the compiler in the future?
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if static class method/property is trusted.
|
||||
*
|
||||
* @param string $class_name
|
||||
* @param string $params
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return boolean true if class method is trusted
|
||||
*/
|
||||
public function isTrustedStaticClassAccess($class_name, $params, $compiler)
|
||||
{
|
||||
if (!isset($params[ 2 ])) {
|
||||
// fall back
|
||||
return $this->isTrustedStaticClass($class_name, $compiler);
|
||||
}
|
||||
if ($params[ 2 ] === 'method') {
|
||||
$allowed = $this->trusted_static_methods;
|
||||
$name = substr($params[ 0 ], 0, strpos($params[ 0 ], '('));
|
||||
} else {
|
||||
$allowed = $this->trusted_static_properties;
|
||||
// strip '$'
|
||||
$name = substr($params[ 0 ], 1);
|
||||
}
|
||||
if (isset($allowed)) {
|
||||
if (empty($allowed)) {
|
||||
// fall back
|
||||
return $this->isTrustedStaticClass($class_name, $compiler);
|
||||
}
|
||||
if (isset($allowed[ $class_name ])
|
||||
&& (empty($allowed[ $class_name ]) || in_array($name, $allowed[ $class_name ]))
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
$compiler->trigger_template_error("access to static class '{$class_name}' {$params[2]} '{$name}' not allowed by security setting");
|
||||
return false; // should not, but who knows what happens to the compiler in the future?
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if PHP modifier is trusted.
|
||||
*
|
||||
* @param string $modifier_name
|
||||
* @param object $compiler compiler object
|
||||
* @deprecated
|
||||
* @return boolean true if modifier is trusted
|
||||
*/
|
||||
public function isTrustedPhpModifier($modifier_name, $compiler)
|
||||
{
|
||||
if (isset($this->php_modifiers)
|
||||
&& (empty($this->php_modifiers) || in_array($modifier_name, $this->php_modifiers))
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
$compiler->trigger_template_error("modifier '{$modifier_name}' not allowed by security setting");
|
||||
return false; // should not, but who knows what happens to the compiler in the future?
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if tag is trusted.
|
||||
*
|
||||
* @param string $tag_name
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return boolean true if tag is trusted
|
||||
*/
|
||||
public function isTrustedTag($tag_name, $compiler)
|
||||
{
|
||||
// check for internal always required tags
|
||||
if (in_array(
|
||||
$tag_name,
|
||||
array(
|
||||
'assign', 'call', 'private_filter', 'private_block_plugin', 'private_function_plugin',
|
||||
'private_object_block_function', 'private_object_function', 'private_registered_function',
|
||||
'private_registered_block', 'private_special_variable', 'private_print_expression',
|
||||
'private_modifier'
|
||||
)
|
||||
)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
// check security settings
|
||||
if (empty($this->allowed_tags)) {
|
||||
if (empty($this->disabled_tags) || !in_array($tag_name, $this->disabled_tags)) {
|
||||
return true;
|
||||
} else {
|
||||
$compiler->trigger_template_error("tag '{$tag_name}' disabled by security setting", null, true);
|
||||
}
|
||||
} elseif (in_array($tag_name, $this->allowed_tags) && !in_array($tag_name, $this->disabled_tags)) {
|
||||
return true;
|
||||
} else {
|
||||
$compiler->trigger_template_error("tag '{$tag_name}' not allowed by security setting", null, true);
|
||||
}
|
||||
return false; // should not, but who knows what happens to the compiler in the future?
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if special $smarty variable is trusted.
|
||||
*
|
||||
* @param string $var_name
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return boolean true if tag is trusted
|
||||
*/
|
||||
public function isTrustedSpecialSmartyVar($var_name, $compiler)
|
||||
{
|
||||
if (!in_array($var_name, $this->disabled_special_smarty_vars)) {
|
||||
return true;
|
||||
} else {
|
||||
$compiler->trigger_template_error(
|
||||
"special variable '\$smarty.{$var_name}' not allowed by security setting",
|
||||
null,
|
||||
true
|
||||
);
|
||||
}
|
||||
return false; // should not, but who knows what happens to the compiler in the future?
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if modifier plugin is trusted.
|
||||
*
|
||||
* @param string $modifier_name
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return boolean true if tag is trusted
|
||||
*/
|
||||
public function isTrustedModifier($modifier_name, $compiler)
|
||||
{
|
||||
// check for internal always allowed modifier
|
||||
if (in_array($modifier_name, array('default'))) {
|
||||
return true;
|
||||
}
|
||||
// check security settings
|
||||
if (empty($this->allowed_modifiers)) {
|
||||
if (empty($this->disabled_modifiers) || !in_array($modifier_name, $this->disabled_modifiers)) {
|
||||
return true;
|
||||
} else {
|
||||
$compiler->trigger_template_error(
|
||||
"modifier '{$modifier_name}' disabled by security setting",
|
||||
null,
|
||||
true
|
||||
);
|
||||
}
|
||||
} elseif (in_array($modifier_name, $this->allowed_modifiers)
|
||||
&& !in_array($modifier_name, $this->disabled_modifiers)
|
||||
) {
|
||||
return true;
|
||||
} else {
|
||||
$compiler->trigger_template_error(
|
||||
"modifier '{$modifier_name}' not allowed by security setting",
|
||||
null,
|
||||
true
|
||||
);
|
||||
}
|
||||
return false; // should not, but who knows what happens to the compiler in the future?
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if constants are enabled or trusted
|
||||
*
|
||||
* @param string $const constant name
|
||||
* @param object $compiler compiler object
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isTrustedConstant($const, $compiler)
|
||||
{
|
||||
if (in_array($const, array('true', 'false', 'null'))) {
|
||||
return true;
|
||||
}
|
||||
if (!empty($this->trusted_constants)) {
|
||||
if (!in_array(strtolower($const), $this->trusted_constants)) {
|
||||
$compiler->trigger_template_error("Security: access to constant '{$const}' not permitted");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if ($this->allow_constants) {
|
||||
return true;
|
||||
}
|
||||
$compiler->trigger_template_error("Security: access to constants not permitted");
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if stream is trusted.
|
||||
*
|
||||
* @param string $stream_name
|
||||
*
|
||||
* @return boolean true if stream is trusted
|
||||
* @throws SmartyException if stream is not trusted
|
||||
*/
|
||||
public function isTrustedStream($stream_name)
|
||||
{
|
||||
if (isset($this->streams) && (empty($this->streams) || in_array($stream_name, $this->streams))) {
|
||||
return true;
|
||||
}
|
||||
throw new SmartyException("stream '{$stream_name}' not allowed by security setting");
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if directory of file resource is trusted.
|
||||
*
|
||||
* @param string $filepath
|
||||
* @param null|bool $isConfig
|
||||
*
|
||||
* @return bool true if directory is trusted
|
||||
* @throws \SmartyException if directory is not trusted
|
||||
*/
|
||||
public function isTrustedResourceDir($filepath, $isConfig = null)
|
||||
{
|
||||
if ($this->_include_path_status !== $this->smarty->use_include_path) {
|
||||
$_dir =
|
||||
$this->smarty->use_include_path ? $this->smarty->getIncludePathDirs() : array();
|
||||
if ($this->_include_dir !== $_dir) {
|
||||
$this->_updateResourceDir($this->_include_dir, $_dir);
|
||||
$this->_include_dir = $_dir;
|
||||
}
|
||||
$this->_include_path_status = $this->smarty->use_include_path;
|
||||
}
|
||||
$_dir = $this->smarty->getTemplateDir();
|
||||
if ($this->_template_dir !== $_dir) {
|
||||
$this->_updateResourceDir($this->_template_dir, $_dir);
|
||||
$this->_template_dir = $_dir;
|
||||
}
|
||||
$_dir = $this->smarty->getConfigDir();
|
||||
if ($this->_config_dir !== $_dir) {
|
||||
$this->_updateResourceDir($this->_config_dir, $_dir);
|
||||
$this->_config_dir = $_dir;
|
||||
}
|
||||
if ($this->_secure_dir !== $this->secure_dir) {
|
||||
$this->secure_dir = (array)$this->secure_dir;
|
||||
foreach ($this->secure_dir as $k => $d) {
|
||||
$this->secure_dir[ $k ] = $this->smarty->_realpath($d . DIRECTORY_SEPARATOR, true);
|
||||
}
|
||||
$this->_updateResourceDir($this->_secure_dir, $this->secure_dir);
|
||||
$this->_secure_dir = $this->secure_dir;
|
||||
}
|
||||
$addPath = $this->_checkDir($filepath, $this->_resource_dir);
|
||||
if ($addPath !== false) {
|
||||
$this->_resource_dir = array_merge($this->_resource_dir, $addPath);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if URI (e.g. {fetch} or {html_image}) is trusted
|
||||
* To simplify things, isTrustedUri() resolves all input to "{$PROTOCOL}://{$HOSTNAME}".
|
||||
* So "http://username:password@hello.world.example.org:8080/some-path?some=query-string"
|
||||
* is reduced to "http://hello.world.example.org" prior to applying the patters from {@link $trusted_uri}.
|
||||
*
|
||||
* @param string $uri
|
||||
*
|
||||
* @return boolean true if URI is trusted
|
||||
* @throws SmartyException if URI is not trusted
|
||||
* @uses $trusted_uri for list of patterns to match against $uri
|
||||
*/
|
||||
public function isTrustedUri($uri)
|
||||
{
|
||||
$_uri = parse_url($uri);
|
||||
if (!empty($_uri[ 'scheme' ]) && !empty($_uri[ 'host' ])) {
|
||||
$_uri = $_uri[ 'scheme' ] . '://' . $_uri[ 'host' ];
|
||||
foreach ($this->trusted_uri as $pattern) {
|
||||
if (preg_match($pattern, $_uri)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new SmartyException("URI '{$uri}' not allowed by security setting");
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove old directories and its sub folders, add new directories
|
||||
*
|
||||
* @param array $oldDir
|
||||
* @param array $newDir
|
||||
*/
|
||||
private function _updateResourceDir($oldDir, $newDir)
|
||||
{
|
||||
foreach ($oldDir as $directory) {
|
||||
// $directory = $this->smarty->_realpath($directory, true);
|
||||
$length = strlen($directory);
|
||||
foreach ($this->_resource_dir as $dir) {
|
||||
if (substr($dir, 0, $length) === $directory) {
|
||||
unset($this->_resource_dir[ $dir ]);
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($newDir as $directory) {
|
||||
// $directory = $this->smarty->_realpath($directory, true);
|
||||
$this->_resource_dir[ $directory ] = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if file is inside a valid directory
|
||||
*
|
||||
* @param string $filepath
|
||||
* @param array $dirs valid directories
|
||||
*
|
||||
* @return array|bool
|
||||
* @throws \SmartyException
|
||||
*/
|
||||
private function _checkDir($filepath, $dirs)
|
||||
{
|
||||
$directory = dirname($this->smarty->_realpath($filepath, true)) . DIRECTORY_SEPARATOR;
|
||||
$_directory = array();
|
||||
if (!preg_match('#[\\\\/][.][.][\\\\/]#', $directory)) {
|
||||
while (true) {
|
||||
// test if the directory is trusted
|
||||
if (isset($dirs[ $directory ])) {
|
||||
return $_directory;
|
||||
}
|
||||
// abort if we've reached root
|
||||
if (!preg_match('#[\\\\/][^\\\\/]+[\\\\/]$#', $directory)) {
|
||||
// give up
|
||||
break;
|
||||
}
|
||||
// remember the directory to add it to _resource_dir in case we're successful
|
||||
$_directory[ $directory ] = true;
|
||||
// bubble up one level
|
||||
$directory = preg_replace('#[\\\\/][^\\\\/]+[\\\\/]$#', DIRECTORY_SEPARATOR, $directory);
|
||||
}
|
||||
}
|
||||
// give up
|
||||
throw new SmartyException(sprintf('Smarty Security: not trusted file path \'%s\' ', $filepath));
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads security class and enables security
|
||||
*
|
||||
* @param \Smarty $smarty
|
||||
* @param string|Smarty_Security $security_class if a string is used, it must be class-name
|
||||
*
|
||||
* @return \Smarty current Smarty instance for chaining
|
||||
* @throws \SmartyException when an invalid class name is provided
|
||||
*/
|
||||
public static function enableSecurity(Smarty $smarty, $security_class)
|
||||
{
|
||||
if ($security_class instanceof Smarty_Security) {
|
||||
$smarty->security_policy = $security_class;
|
||||
return $smarty;
|
||||
} elseif (is_object($security_class)) {
|
||||
throw new SmartyException("Class '" . get_class($security_class) . "' must extend Smarty_Security.");
|
||||
}
|
||||
if ($security_class === null) {
|
||||
$security_class = $smarty->security_class;
|
||||
}
|
||||
if (!class_exists($security_class)) {
|
||||
throw new SmartyException("Security class '$security_class' is not defined");
|
||||
} elseif ($security_class !== 'Smarty_Security' && !is_subclass_of($security_class, 'Smarty_Security')) {
|
||||
throw new SmartyException("Class '$security_class' must extend Smarty_Security.");
|
||||
} else {
|
||||
$smarty->security_policy = new $security_class($smarty);
|
||||
}
|
||||
return $smarty;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start template processing
|
||||
*
|
||||
* @param $template
|
||||
*
|
||||
* @throws SmartyException
|
||||
*/
|
||||
public function startTemplate($template)
|
||||
{
|
||||
if ($this->max_template_nesting > 0 && $this->_current_template_nesting++ >= $this->max_template_nesting) {
|
||||
throw new SmartyException("maximum template nesting level of '{$this->max_template_nesting}' exceeded when calling '{$template->template_resource}'");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Exit template processing
|
||||
*/
|
||||
public function endTemplate()
|
||||
{
|
||||
if ($this->max_template_nesting > 0) {
|
||||
$this->_current_template_nesting--;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Register callback functions call at start/end of template rendering
|
||||
*
|
||||
* @param \Smarty\Template $template
|
||||
*/
|
||||
public function registerCallBacks(Template $template)
|
||||
{
|
||||
$template->startRenderCallbacks[] = array($this, 'startTemplate');
|
||||
$template->endRenderCallbacks[] = array($this, 'endTemplate');
|
||||
}
|
||||
}
|
@@ -1,33 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* class for undefined variable object
|
||||
* This class defines an object for undefined variable handling
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Template
|
||||
*/
|
||||
class Smarty_Undefined_Variable extends \Smarty\Variable
|
||||
{
|
||||
/**
|
||||
* Returns null for not existing properties
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function __get($name)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Always returns an empty string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return '';
|
||||
}
|
||||
}
|
@@ -1,73 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Smarty compiler exception class
|
||||
*
|
||||
* @package Smarty
|
||||
*/
|
||||
class SmartyCompilerException extends SmartyException
|
||||
{
|
||||
/**
|
||||
* The constructor of the exception
|
||||
*
|
||||
* @param string $message The Exception message to throw.
|
||||
* @param int $code The Exception code.
|
||||
* @param string|null $filename The filename where the exception is thrown.
|
||||
* @param int|null $line The line number where the exception is thrown.
|
||||
* @param Throwable|null $previous The previous exception used for the exception chaining.
|
||||
*/
|
||||
public function __construct(
|
||||
string $message = "",
|
||||
int $code = 0,
|
||||
?string $filename = null,
|
||||
?int $line = null,
|
||||
Throwable $previous = null
|
||||
) {
|
||||
parent::__construct($message, $code, $previous);
|
||||
|
||||
// These are optional parameters, should be be overridden only when present!
|
||||
if ($filename) {
|
||||
$this->file = $filename;
|
||||
}
|
||||
if ($line) {
|
||||
$this->line = $line;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return ' --> Smarty Compiler: ' . $this->message . ' <-- ';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $line
|
||||
*/
|
||||
public function setLine($line)
|
||||
{
|
||||
$this->line = $line;
|
||||
}
|
||||
|
||||
/**
|
||||
* The template source snippet relating to the error
|
||||
*
|
||||
* @type string|null
|
||||
*/
|
||||
public $source = null;
|
||||
|
||||
/**
|
||||
* The raw text of the error message
|
||||
*
|
||||
* @type string|null
|
||||
*/
|
||||
public $desc = null;
|
||||
|
||||
/**
|
||||
* The resource identifier or template name
|
||||
*
|
||||
* @type string|null
|
||||
*/
|
||||
public $template = null;
|
||||
}
|
@@ -1,19 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Smarty exception class
|
||||
*
|
||||
* @package Smarty
|
||||
*/
|
||||
class SmartyException extends Exception
|
||||
{
|
||||
public static $escape = false;
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return ' --> Smarty: ' . (self::$escape ? htmlentities($this->message) : $this->message) . ' <-- ';
|
||||
}
|
||||
}
|
@@ -4,6 +4,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
use Smarty\Exception;
|
||||
use Smarty\TemplateBase;
|
||||
use Smarty\Template;
|
||||
|
||||
@@ -166,7 +167,7 @@ class PHPUnit_Smarty extends PHPUnit\Framework\TestCase
|
||||
PHPUnit_Smarty::$pdo = new PDO(DB_DSN, DB_USER, DB_PASSWD);
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
throw new Exception('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$timezone = date_default_timezone_get();
|
||||
$j = PHPUnit_Smarty::$pdo->exec("SET time_zone = '{$timezone}';");
|
||||
|
@@ -1,5 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Smarty\Exception;
|
||||
use Smarty\Template\Cached;
|
||||
|
||||
require_once SMARTY_DIR . '../demo/plugins/cacheresource.mysql.php';
|
||||
@@ -12,7 +13,7 @@ class Smarty_CacheResource_Mysqltest extends Smarty_CacheResource_Mysql
|
||||
try {
|
||||
$this->db = PHPUnit_Smarty::$pdo;
|
||||
} catch (PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
throw new Exception('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, content FROM output_cache WHERE id = :id');
|
||||
$this->fetchTimestamp = $this->db->prepare('SELECT modified FROM output_cache WHERE id = :id');
|
||||
|
@@ -32,7 +32,7 @@ class DefaultConfigHandlerTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testUnknownConfigFile()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('Unable to load config \'file:foo.conf\'');
|
||||
$this->smarty->configLoad('foo.conf');
|
||||
}
|
||||
@@ -42,7 +42,7 @@ class DefaultConfigHandlerTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testRegisterUnknownDefaultConfigHandler()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('Default config handler');
|
||||
$this->expectExceptionMessage('not callable');
|
||||
$this->smarty->registerDefaultConfigHandler('foo');
|
||||
@@ -52,7 +52,7 @@ class DefaultConfigHandlerTest extends PHPUnit_Smarty
|
||||
* test default config handler replacement (config data)
|
||||
*
|
||||
* @throws \Exception
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function testDefaultConfigHandlerReplacement()
|
||||
{
|
||||
@@ -65,7 +65,7 @@ class DefaultConfigHandlerTest extends PHPUnit_Smarty
|
||||
* test default config handler replacement (other config file)
|
||||
*
|
||||
* @throws \Exception
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function testDefaultConfigHandlerReplacementByConfigFile()
|
||||
{
|
||||
@@ -76,7 +76,7 @@ class DefaultConfigHandlerTest extends PHPUnit_Smarty
|
||||
|
||||
public function testDefaultConfigHandlerReplacementByConfigFileFail()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage("Unable to load config default file 'no.conf' for 'file:fo.conf'");
|
||||
$this->smarty->registerDefaultConfigHandler('configHandlerFile');
|
||||
$this->smarty->configLoad('fo.conf');
|
||||
@@ -88,7 +88,7 @@ class DefaultConfigHandlerTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testDefaultConfigHandlerReplacementReturningFalse()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('Unable to load config \'file:foo.conf\'');
|
||||
$this->smarty->configLoad('foo.conf');
|
||||
}
|
||||
@@ -98,7 +98,7 @@ class DefaultConfigHandlerTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testDefaultConfigHandlerReplacementReturningFalse1()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('No config default content for \'file:bla.conf\'');
|
||||
$this->smarty->registerDefaultConfigHandler('configHandlerData');
|
||||
$this->smarty->configLoad('bla.conf');
|
||||
|
@@ -1,4 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Smarty\Exception;
|
||||
|
||||
require_once SMARTY_DIR . '../demo/plugins/resource.mysqls.php';
|
||||
|
||||
class Smarty_Resource_Mysqlstest extends _MysqlsPlugin
|
||||
@@ -10,7 +13,7 @@ class Smarty_Resource_Mysqlstest extends _MysqlsPlugin
|
||||
}
|
||||
catch
|
||||
(PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
throw new Exception('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
||||
}
|
||||
|
@@ -1,4 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Smarty\Exception;
|
||||
|
||||
require_once SMARTY_DIR . '../demo/plugins/resource.mysql.php';
|
||||
|
||||
class Smarty_Resource_Mysqltest extends _MysqlPlugin
|
||||
@@ -10,7 +13,7 @@ class Smarty_Resource_Mysqltest extends _MysqlPlugin
|
||||
}
|
||||
catch
|
||||
(PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
throw new Exception('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
||||
$this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name');
|
||||
|
@@ -143,7 +143,7 @@ if (MysqlResourceEnable == true) {
|
||||
*
|
||||
*/
|
||||
public function testUnknownTemplate() {
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('Unable to load template \'mysqlstest:foo.tpl\'');
|
||||
$this->assertEquals('foo', $this->smarty->fetch('mysqlstest:foo.tpl'));
|
||||
}
|
||||
|
@@ -6,6 +6,8 @@
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
use Smarty\Exception;
|
||||
|
||||
/**
|
||||
* class for file resource tests
|
||||
*
|
||||
@@ -69,7 +71,7 @@ class FileResourceTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testTemplateFileNotExists3()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('Unable to');
|
||||
$this->expectExceptionMessage('notthere.tpl');
|
||||
$this->smarty->fetch('notthere.tpl');
|
||||
@@ -222,7 +224,7 @@ class FileResourceTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testRelativeIncludeFail()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('Unable to');
|
||||
$this->smarty->fetch('relative_sub.tpl');
|
||||
}
|
||||
@@ -234,7 +236,7 @@ class FileResourceTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testRelativeIncludeFailOtherDir()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('./hello.tpl');
|
||||
$this->smarty->addTemplateDir('./templates_2');
|
||||
$this->smarty->fetch('relative_notexist.tpl');
|
||||
@@ -331,7 +333,7 @@ class FileResourceTest extends PHPUnit_Smarty
|
||||
|
||||
return;
|
||||
}
|
||||
catch (SmartyException $e) {
|
||||
catch (Exception $e) {
|
||||
// this was expected to fail
|
||||
}
|
||||
} else {
|
||||
|
@@ -146,7 +146,7 @@ class StreamResourceTest extends PHPUnit_Smarty
|
||||
|
||||
public function testTemplateStramNotExists3()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('\'global:notthere\'');
|
||||
$this->smarty->fetch('global:notthere');
|
||||
}
|
||||
|
@@ -6,6 +6,8 @@
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
use Smarty\CompilerException;
|
||||
|
||||
/**
|
||||
* class for security test
|
||||
*
|
||||
@@ -27,18 +29,6 @@ class SecurityTest extends PHPUnit_Smarty
|
||||
$this->cleanDirs();
|
||||
}
|
||||
|
||||
/**
|
||||
* test that security is loaded
|
||||
' *'/
|
||||
public function testSecurityReenable()
|
||||
{
|
||||
$this->smarty->disableSecurity();
|
||||
$this->smarty->enableSecurity('Security');
|
||||
$this->smarty->fetch('helloworld.tpl');
|
||||
$this->smarty->disableSecurity();
|
||||
$this->smarty->enableSecurity('Security');
|
||||
$this->smarty->fetch('helloworld.tpl');
|
||||
}
|
||||
/**
|
||||
* test that security is loaded
|
||||
*/
|
||||
@@ -62,7 +52,7 @@ class SecurityTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testNotTrustedPHPFunction()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('PHP function \'sizeof\' not allowed by security setting');
|
||||
$this->smarty->security_policy->php_functions = array('null');
|
||||
$this->smarty->fetch('string:{assign var=foo value=[1,2,3,4,5]}{sizeof($foo)}');
|
||||
@@ -95,7 +85,7 @@ class SecurityTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testNotTrustedModifier()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('modifier \'sizeof\' not allowed by security setting');
|
||||
$this->smarty->security_policy->php_modifiers = array('null');
|
||||
@$this->smarty->fetch('string:{assign var=foo value=[1,2,3,4,5]}{$foo|@sizeof}');
|
||||
@@ -128,7 +118,7 @@ class SecurityTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testNotAllowedTags2()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('tag \'cycle\' not allowed by security setting');
|
||||
$this->smarty->security_policy->allowed_tags = array('counter');
|
||||
$this->smarty->fetch('string:{counter}{cycle values="1,2"}');
|
||||
@@ -141,7 +131,7 @@ class SecurityTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testDisabledTags()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('tag \'cycle\' disabled by security setting');
|
||||
$this->smarty->security_policy->disabled_tags = array('cycle');
|
||||
$this->smarty->fetch('string:{counter}{cycle values="1,2"}');
|
||||
@@ -171,7 +161,7 @@ class SecurityTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testNotAllowedModifier()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('modifier \'lower\' not allowed by security setting');
|
||||
$this->smarty->security_policy->allowed_modifiers = array('upper');
|
||||
$this->smarty->fetch('string:{"hello"|upper}{"world"|lower}');
|
||||
@@ -184,7 +174,7 @@ class SecurityTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testDisabledModifier()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('modifier \'lower\' disabled by security setting');
|
||||
$this->smarty->security_policy->disabled_modifiers = array('lower');
|
||||
$this->smarty->fetch('string:{"hello"|upper}{"world"|lower}');
|
||||
@@ -235,7 +225,7 @@ class SecurityTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testNotTrustedDirectory()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('not trusted file path');
|
||||
$this->smarty->security_policy->secure_dir = array(str_replace('\\', '/', __DIR__ . '/templates_3/'));
|
||||
$this->smarty->fetch('string:{include file="templates_2/hello.tpl"}');
|
||||
@@ -267,7 +257,7 @@ class SecurityTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testNotTrustedStaticClass()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('access to static class \'mysecuritystaticclass\' not allowed by security setting');
|
||||
$this->smarty->security_policy->static_classes = array('null');
|
||||
$this->smarty->fetch('string:{mysecuritystaticclass::square(5)}');
|
||||
@@ -278,7 +268,7 @@ class SecurityTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testNotTrustedStaticClassEval()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('dynamic static class not allowed by security setting');
|
||||
$this->smarty->security_policy->static_classes = array('null');
|
||||
$this->smarty->fetch('string:{$test = "mysecuritystaticclass"}{$test::square(5)}');
|
||||
@@ -289,7 +279,7 @@ class SecurityTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testNotTrustedStaticClassSmartyVar()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('dynamic static class not allowed by security setting');
|
||||
$this->smarty->security_policy->static_classes = array('null');
|
||||
$this->smarty->fetch('string:{$smarty.template_object::square(5)}');
|
||||
@@ -332,7 +322,7 @@ class SecurityTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testTemplateNotTrustedStream()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('stream \'global\' not allowed by security setting');
|
||||
stream_wrapper_register("global", "ResourceStreamSecurity")
|
||||
or die("Failed to register protocol");
|
||||
@@ -361,7 +351,7 @@ class SecurityTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testNotTrustedUri()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('URI \'https://www.smarty.net/docs/en/preface.tpl\' not allowed by security setting');
|
||||
$this->smarty->security_policy->trusted_uri = array();
|
||||
$this->assertStringContainsString('<title>Preface | Smarty</title>', $this->smarty->fetch('string:{fetch file="https://www.smarty.net/docs/en/preface.tpl"}'));
|
||||
@@ -371,7 +361,7 @@ class SecurityTest extends PHPUnit_Smarty
|
||||
* In security mode, accessing $smarty.template_object should be illegal.
|
||||
*/
|
||||
public function testSmartyTemplateObject() {
|
||||
$this->expectException(SmartyCompilerException::class);
|
||||
$this->expectException(CompilerException::class);
|
||||
$this->smarty->display('string:{$smarty.template_object}');
|
||||
}
|
||||
|
||||
@@ -387,10 +377,7 @@ class mysecuritystaticclass
|
||||
return $i * $i;
|
||||
}
|
||||
}
|
||||
class Security extends Smarty_Security
|
||||
{
|
||||
|
||||
}
|
||||
#[AllowDynamicProperties]
|
||||
class ResourceStreamSecurity
|
||||
{
|
||||
|
@@ -50,7 +50,7 @@ class CompileBlockPluginTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testBlockPluginUnknown()
|
||||
{
|
||||
$this->expectException('SmartyCompilerException');
|
||||
$this->expectException(\Smarty\CompilerException::class);
|
||||
$this->expectExceptionMessage('unknown tag \'bar\'');
|
||||
$this->assertEquals("hello world", $this->smarty->fetch('unknown.tpl'));
|
||||
}
|
||||
@@ -76,7 +76,7 @@ class CompileBlockPluginTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testBlockPluginRegisteredFunction2()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('block tag \'blockplugintest\' not callable');
|
||||
$this->assertEquals('block test', $this->smarty->fetch('registered.tpl'));
|
||||
}
|
||||
@@ -103,7 +103,7 @@ class CompileBlockPluginTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testBlockPluginRegisteredStatic2()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('block tag \'blockpluginstatic\' not callable');
|
||||
$this->assertEquals('static block test', $this->smarty->fetch('registered_static.tpl'));
|
||||
}
|
||||
@@ -130,7 +130,7 @@ class CompileBlockPluginTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testBlockPluginRegisteredMethod2()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('block tag \'blockpluginmethod\' not callable');
|
||||
$this->assertEquals('method block test', $this->smarty->fetch('registered_method.tpl'));
|
||||
}
|
||||
@@ -157,7 +157,7 @@ class CompileBlockPluginTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testBlockPluginRegisteredObject2()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('block tag \'myobject\' not callable');
|
||||
$this->assertEquals('object block test', $this->smarty->fetch('registered_object.tpl'));
|
||||
}
|
||||
|
@@ -759,7 +759,7 @@ class CompileBlockExtendsTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testSmartyBlockChildOutsideBlock_025()
|
||||
{
|
||||
$this->expectException('SmartyCompilerException');
|
||||
$this->expectException(\Smarty\CompilerException::class);
|
||||
$this->expectExceptionMessage('\'{$smarty.block.child}\' used outside {block} tags');
|
||||
$this->smarty->fetch('025_parent.tpl');
|
||||
}
|
||||
@@ -769,7 +769,7 @@ class CompileBlockExtendsTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testSmartyBlockParentOutsideBlock_026()
|
||||
{
|
||||
$this->expectException('SmartyCompilerException');
|
||||
$this->expectException(\Smarty\CompilerException::class);
|
||||
$this->expectExceptionMessage('\'{$smarty.block.parent}\' used outside {block} tags');
|
||||
$this->smarty->fetch('026_child.tpl');
|
||||
}
|
||||
@@ -779,7 +779,7 @@ class CompileBlockExtendsTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testSmartyBlockParentInParent_027()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('illegal \'{$smarty.block.parent}\'');
|
||||
$this->smarty->fetch('027_parent.tpl');
|
||||
}
|
||||
@@ -1149,7 +1149,7 @@ class CompileBlockExtendsTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testSmartyBlockWrongBlockName_036()
|
||||
{
|
||||
$this->expectException('SmartyCompilerException');
|
||||
$this->expectException(\Smarty\CompilerException::class);
|
||||
$this->expectExceptionMessage('$smarty.block is not defined');
|
||||
$this->smarty->fetch('036_parent.tpl');
|
||||
}
|
||||
@@ -1158,7 +1158,7 @@ class CompileBlockExtendsTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testSmartyParentBlockCalledInParent_036_1()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('inheritance: illegal \'{$smarty.block.parent}\' used in child template');
|
||||
$this->smarty->fetch('036_1_parent.tpl');
|
||||
}
|
||||
@@ -1167,7 +1167,7 @@ class CompileBlockExtendsTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testSmartyParentBlockCalledInParent_036_2()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('inheritance: illegal \'{block_parent}\' used in child template');
|
||||
$this->smarty->fetch('036_2_parent.tpl');
|
||||
}
|
||||
@@ -1176,7 +1176,7 @@ class CompileBlockExtendsTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testSmartyParentBlockCalledInParent_036_3()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('inheritance: illegal \'{parent}\' used in child template');
|
||||
$this->smarty->fetch('036_3_parent.tpl');
|
||||
}
|
||||
@@ -1186,7 +1186,7 @@ class CompileBlockExtendsTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testSmartyBlockMissigBlockName_037()
|
||||
{
|
||||
$this->expectException('SmartyCompilerException');
|
||||
$this->expectException(\Smarty\CompilerException::class);
|
||||
$this->expectExceptionMessage('$smarty.block is not defined');
|
||||
$this->smarty->fetch('037_parent.tpl');
|
||||
}
|
||||
|
@@ -165,7 +165,7 @@ class CompileConfigLoadTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testConfigSyntaxError_009()
|
||||
{
|
||||
$this->expectException('SmartyCompilerException');
|
||||
$this->expectException(\Smarty\CompilerException::class);
|
||||
$this->expectExceptionMessage('Syntax error in config file');
|
||||
$this->smarty->fetch('009_error.tpl');
|
||||
}
|
||||
|
@@ -43,7 +43,7 @@ class CompileDelimiterTest extends PHPUnit_Smarty
|
||||
|
||||
public function testLeftDelimiterError()
|
||||
{
|
||||
$this->expectException('SmartyCompilerException');
|
||||
$this->expectException(\Smarty\CompilerException::class);
|
||||
$this->expectExceptionMessage('nocache option not allowed');
|
||||
$tpl = $this->smarty->createTemplate('string:x{ldelim nocache}x');
|
||||
$this->assertEquals('x{x', $this->smarty->fetch($tpl));
|
||||
|
@@ -45,7 +45,7 @@ class PluginFunctionFetchTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testFetchInvalidUri()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('{fetch} cannot read resource \'https://foo.smarty.net/foo.dat\'');
|
||||
$this->smarty->fetch('string:{fetch file="https://foo.smarty.net/foo.dat"}');
|
||||
}
|
||||
@@ -58,7 +58,7 @@ class PluginFunctionFetchTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testFetchSecurity()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('not trusted file path');
|
||||
$this->cleanDirs();
|
||||
$dir=$this->smarty->getTemplateDir();
|
||||
@@ -73,7 +73,7 @@ class PluginFunctionFetchTest extends PHPUnit_Smarty
|
||||
*/
|
||||
public function testFetchSecurity2()
|
||||
{
|
||||
$this->expectException('SmartyException');
|
||||
$this->expectException(\Smarty\Exception::class);
|
||||
$this->expectExceptionMessage('not trusted file path');
|
||||
$this->cleanDirs();
|
||||
$this->smarty->getTemplateDir();
|
||||
|
@@ -19,7 +19,7 @@ class PluginModifierExplodeTest extends \PHPUnit_Smarty
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @throws \SmartyException
|
||||
* @throws \Smarty\Exception
|
||||
*
|
||||
* @dataProvider explodeDataProvider
|
||||
*/
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user