diff options
author | emkael <emkael@tlen.pl> | 2018-10-18 02:39:34 +0200 |
---|---|---|
committer | emkael <emkael@tlen.pl> | 2018-10-18 02:39:42 +0200 |
commit | ab5d8d4e07bb3c8230d0285ef8902ef1979fce51 (patch) | |
tree | 0b955e585cb2fdbc7207392a5f2c97d610b6a5bc /lib/smarty/sysplugins/smarty_internal_resource_file.php | |
parent | c055ce2ab60c6582bad3e5babcb1d00384fde78a (diff) |
Updating Smarty
Diffstat (limited to 'lib/smarty/sysplugins/smarty_internal_resource_file.php')
-rw-r--r-- | lib/smarty/sysplugins/smarty_internal_resource_file.php | 158 |
1 files changed, 124 insertions, 34 deletions
diff --git a/lib/smarty/sysplugins/smarty_internal_resource_file.php b/lib/smarty/sysplugins/smarty_internal_resource_file.php index 48b391d..ae20606 100644 --- a/lib/smarty/sysplugins/smarty_internal_resource_file.php +++ b/lib/smarty/sysplugins/smarty_internal_resource_file.php @@ -2,42 +2,44 @@ /** * Smarty Internal Plugin Resource File * - * @package Smarty + * @package Smarty * @subpackage TemplateResources - * @author Uwe Tews - * @author Rodney Rehm + * @author Uwe Tews + * @author Rodney Rehm */ /** * Smarty Internal Plugin Resource File - * * Implements the file system as resource for Smarty templates * - * @package Smarty + * @package Smarty * @subpackage TemplateResources */ -class Smarty_Internal_Resource_File extends Smarty_Resource { - +class Smarty_Internal_Resource_File extends Smarty_Resource +{ /** * populate Source Object with meta data from Resource * * @param Smarty_Template_Source $source source object * @param Smarty_Internal_Template $_template template object + * + * @throws \SmartyException */ - public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null) + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) { $source->filepath = $this->buildFilepath($source, $_template); - if ($source->filepath !== false) { - if (is_object($source->smarty->security_policy)) { - $source->smarty->security_policy->isTrustedResourceDir($source->filepath); - } - - $source->uid = sha1($source->filepath); - if ($source->smarty->compile_check && !isset($source->timestamp)) { - $source->timestamp = @filemtime($source->filepath); - $source->exists = !!$source->timestamp; + if (isset($source->smarty->security_policy) && is_object($source->smarty->security_policy)) { + $source->smarty->security_policy->isTrustedResourceDir($source->filepath, $source->isConfig); } + $source->exists = true; + $source->uid = sha1( + $source->filepath . ($source->isConfig ? $source->smarty->_joined_config_dir : + $source->smarty->_joined_template_dir) + ); + $source->timestamp = filemtime($source->filepath); + } else { + $source->timestamp = $source->exists = false; } } @@ -48,43 +50,131 @@ class Smarty_Internal_Resource_File extends Smarty_Resource { */ public function populateTimestamp(Smarty_Template_Source $source) { - $source->timestamp = @filemtime($source->filepath); - $source->exists = !!$source->timestamp; + if (!$source->exists) { + $source->timestamp = $source->exists = is_file($source->filepath); + } + if ($source->exists) { + $source->timestamp = filemtime($source->filepath); + } } /** * Load template's source from file into current template object * * @param Smarty_Template_Source $source source object - * @return string template source - * @throws SmartyException if source cannot be loaded + * + * @return string template source + * @throws SmartyException if source cannot be loaded */ public function getContent(Smarty_Template_Source $source) { - if ($source->timestamp) { + if ($source->exists) { return file_get_contents($source->filepath); } - if ($source instanceof Smarty_Config_Source) { - throw new SmartyException("Unable to read config {$source->type} '{$source->name}'"); - } - throw new SmartyException("Unable to read template {$source->type} '{$source->name}'"); + throw new SmartyException( + 'Unable to read ' . ($source->isConfig ? 'config' : 'template') . + " {$source->type} '{$source->name}'" + ); } /** * Determine basename for compiled filename * * @param Smarty_Template_Source $source source object - * @return string resource's basename + * + * @return string resource's basename */ public function getBasename(Smarty_Template_Source $source) { - $_file = $source->name; - if (($_pos = strpos($_file, ']')) !== false) { - $_file = substr($_file, $_pos + 1); - } - return basename($_file); + return basename($source->filepath); } + /** + * build template filepath by traversing the template_dir array + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + * + * @return string fully qualified filepath + * @throws SmartyException + */ + protected function buildFilepath(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) + { + $file = $source->name; + // absolute file ? + if ($file[ 0 ] === '/' || $file[ 1 ] === ':') { + $file = $source->smarty->_realpath($file, true); + return is_file($file) ? $file : false; + } + // go relative to a given template? + if ($file[ 0 ] === '.' && $_template && $_template->_isSubTpl() + && preg_match('#^[.]{1,2}[\\\/]#', $file) + ) { + if ($_template->parent->source->type !== 'file' && $_template->parent->source->type !== 'extends' + && !isset($_template->parent->_cache[ 'allow_relative_path' ]) + ) { + throw new SmartyException("Template '{$file}' cannot be relative to template of resource type '{$_template->parent->source->type}'"); + } + // normalize path + $path = + $source->smarty->_realpath(dirname($_template->parent->source->filepath) . DIRECTORY_SEPARATOR . $file); + // files relative to a template only get one shot + return is_file($path) ? $path : false; + } + // normalize DIRECTORY_SEPARATOR + if (strpos($file, DIRECTORY_SEPARATOR === '/' ? '\\' : '/') !== false) { + $file = str_replace(DIRECTORY_SEPARATOR === '/' ? '\\' : '/', DIRECTORY_SEPARATOR, $file); + } + $_directories = $source->smarty->getTemplateDir(null, $source->isConfig); + // template_dir index? + if ($file[ 0 ] === '[' && preg_match('#^\[([^\]]+)\](.+)$#', $file, $fileMatch)) { + $file = $fileMatch[ 2 ]; + $_indices = explode(',', $fileMatch[ 1 ]); + $_index_dirs = array(); + foreach ($_indices as $index) { + $index = trim($index); + // try string indexes + if (isset($_directories[ $index ])) { + $_index_dirs[] = $_directories[ $index ]; + } elseif (is_numeric($index)) { + // try numeric index + $index = (int)$index; + if (isset($_directories[ $index ])) { + $_index_dirs[] = $_directories[ $index ]; + } else { + // try at location index + $keys = array_keys($_directories); + if (isset($_directories[ $keys[ $index ] ])) { + $_index_dirs[] = $_directories[ $keys[ $index ] ]; + } + } + } + } + if (empty($_index_dirs)) { + // index not found + return false; + } else { + $_directories = $_index_dirs; + } + } + // relative file name? + foreach ($_directories as $_directory) { + $path = $_directory . $file; + if (is_file($path)) { + return (strpos($path, '.' . DIRECTORY_SEPARATOR) !== false) ? $source->smarty->_realpath($path) : $path; + } + } + if (!isset($_index_dirs)) { + // Could be relative to cwd + $path = $source->smarty->_realpath($file, true); + if (is_file($path)) { + return $path; + } + } + // Use include path ? + if ($source->smarty->use_include_path) { + return $source->smarty->ext->_getIncludePath->getIncludePath($_directories, $file, $source->smarty); + } + return false; + } } - -?>
\ No newline at end of file |