diff --git a/NEW_FEATURES.txt b/NEW_FEATURES.txt index 43b7ee85..83945638 100644 --- a/NEW_FEATURES.txt +++ b/NEW_FEATURES.txt @@ -4,6 +4,12 @@ This file contains a brief description of new features which have been added to Smarty 3.1.32 + Deprecate functions Smarty::muteExpectedErrors() and Smarty::unmuteExpectedErrors() + =================================================================================== + These functions to start a special error handler are no longer needed as Smarty does + no longer use error suppression like @filemtime(). + For backward compatibility the functions still can be called. + Using literals containing Smarty's left and right delimiter =========================================================== New Methods diff --git a/change_log.txt b/change_log.txt index ca71190f..812953e8 100644 --- a/change_log.txt +++ b/change_log.txt @@ -2,6 +2,10 @@ 26.10.2017 3.1.32-dev-28 - bugfix Smarty version was not filled in header comment of compiled and cached files - optimization replace internal Smarty::$ds property by DIRECTORY_SEPARATOR + - deprecate functions Smarty::muteExpectedErrors() and Smarty::unmuteExpectedErrors() + as Smarty does no longer use error suppression like @filemtime(). + for backward compatibility code is moved from Smarty class to an external class and still can be + called. 21.10.2017 - bugfix custom delimiters could fail since modification of version 3.1.32-dev-23 diff --git a/libs/Smarty.class.php b/libs/Smarty.class.php index 1f6585b9..9a01e160 100644 --- a/libs/Smarty.class.php +++ b/libs/Smarty.class.php @@ -100,7 +100,7 @@ class Smarty extends Smarty_Internal_TemplateBase /** * smarty version */ - const SMARTY_VERSION = '3.1.32-dev-28'; + const SMARTY_VERSION = '3.1.32-dev-29'; /** * define variable scopes */ @@ -166,14 +166,6 @@ class Smarty extends Smarty_Internal_TemplateBase * assigned global tpl vars */ public static $global_tpl_vars = array(); - /** - * error handler returned by set_error_handler() in Smarty::muteExpectedErrors() - */ - public static $_previous_error_handler = null; - /** - * contains directories outside of SMARTY_DIR that are to be muted by muteExpectedErrors() - */ - public static $_muted_directories = array(); /** * Flag denoting if Multibyte String functions are available */ @@ -625,99 +617,21 @@ class Smarty extends Smarty_Internal_TemplateBase } } - /** - * Error Handler to mute expected messages - * - * @link http://php.net/set_error_handler - * - * @param integer $errno Error level - * @param $errstr - * @param $errfile - * @param $errline - * @param $errcontext - * - * @return bool|void - */ - public static function mutingErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) - { - $_is_muted_directory = false; - // add the SMARTY_DIR to the list of muted directories - if (!isset(Smarty::$_muted_directories[ SMARTY_DIR ])) { - $smarty_dir = realpath(SMARTY_DIR); - if ($smarty_dir !== false) { - Smarty::$_muted_directories[ SMARTY_DIR ] = - array('file' => $smarty_dir, 'length' => strlen($smarty_dir),); - } - } - // walk the muted directories and test against $errfile - foreach (Smarty::$_muted_directories as $key => &$dir) { - if (!$dir) { - // resolve directory and length for speedy comparisons - $file = realpath($key); - if ($file === false) { - // this directory does not exist, remove and skip it - unset(Smarty::$_muted_directories[ $key ]); - continue; - } - $dir = array('file' => $file, 'length' => strlen($file),); - } - if (!strncmp($errfile, $dir[ 'file' ], $dir[ 'length' ])) { - $_is_muted_directory = true; - break; - } - } - // pass to next error handler if this error did not occur inside SMARTY_DIR - // or the error was within smarty but masked to be ignored - if (!$_is_muted_directory || ($errno && $errno & error_reporting())) { - if (Smarty::$_previous_error_handler) { - return call_user_func(Smarty::$_previous_error_handler, - $errno, - $errstr, - $errfile, - $errline, - $errcontext); - } else { - return false; - } - } - return; - } - /** * Enable error handler to mute expected messages * * @return void + * @deprecated */ public static function muteExpectedErrors() { - /* - error muting is done because some people implemented custom error_handlers using - http://php.net/set_error_handler and for some reason did not understand the following paragraph: - - It is important to remember that the standard PHP error handler is completely bypassed for the - error types specified by error_types unless the callback function returns FALSE. - error_reporting() settings will have no effect and your error handler will be called regardless - - however you are still able to read the current value of error_reporting and act appropriately. - Of particular note is that this value will be 0 if the statement that caused the error was - prepended by the @ error-control operator. - - Smarty deliberately uses @filemtime() over file_exists() and filemtime() in some places. Reasons include - - @filemtime() is almost twice as fast as using an additional file_exists() - - between file_exists() and filemtime() a possible race condition is opened, - which does not exist using the simple @filemtime() approach. - */ - $error_handler = array('Smarty', 'mutingErrorHandler'); - $previous = set_error_handler($error_handler); - // avoid dead loops - if ($previous !== $error_handler) { - Smarty::$_previous_error_handler = $previous; - } + return Smarty_Internal_ErrorHandler::muteExpectedErrors(); } /** * Disable error handler muting expected messages * - * @return void + * @deprecated */ public static function unmuteExpectedErrors() { diff --git a/libs/sysplugins/smarty_internal_errorhandler.php b/libs/sysplugins/smarty_internal_errorhandler.php new file mode 100644 index 00000000..96087720 --- /dev/null +++ b/libs/sysplugins/smarty_internal_errorhandler.php @@ -0,0 +1,112 @@ + $smarty_dir, 'length' => strlen($smarty_dir),); + } + } + // walk the muted directories and test against $errfile + foreach (self::$mutedDirectories as $key => &$dir) { + if (!$dir) { + // resolve directory and length for speedy comparisons + $file = realpath($key); + if ($file === false) { + // this directory does not exist, remove and skip it + unset(self::$mutedDirectories[ $key ]); + continue; + } + $dir = array('file' => $file, 'length' => strlen($file),); + } + if (!strncmp($errfile, $dir[ 'file' ], $dir[ 'length' ])) { + $_is_muted_directory = true; + break; + } + } + // pass to next error handler if this error did not occur inside SMARTY_DIR + // or the error was within smarty but masked to be ignored + if (!$_is_muted_directory || ($errno && $errno & error_reporting())) { + if (self::$previousErrorHandler) { + return call_user_func(self::$previousErrorHandler, + $errno, + $errstr, + $errfile, + $errline, + $errcontext); + } else { + return false; + } + } + } +} \ No newline at end of file diff --git a/libs/sysplugins/smarty_internal_testinstall.php b/libs/sysplugins/smarty_internal_testinstall.php index 45963b79..7213b5d5 100644 --- a/libs/sysplugins/smarty_internal_testinstall.php +++ b/libs/sysplugins/smarty_internal_testinstall.php @@ -28,15 +28,12 @@ class Smarty_Internal_TestInstall public static function testInstall(Smarty $smarty, &$errors = null) { $status = true; - if ($errors === null) { echo "
\n"; echo "Smarty Installation test...\n"; echo "Testing template directory...\n"; } - $_stream_resolve_include_path = function_exists('stream_resolve_include_path'); - // test if all registered template_dir are accessible foreach ($smarty->getTemplateDir() as $template_dir) { $_template_dir = $template_dir; @@ -50,12 +47,10 @@ class Smarty_Internal_TestInstall } else { $template_dir = $smarty->ext->_getIncludePath->getIncludePath($_template_dir, null, $smarty); } - if ($template_dir !== false) { if ($errors === null) { echo "$template_dir is OK.\n"; } - continue; } else { $status = false; @@ -64,9 +59,8 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['template_dir'] = $message; + $errors[ 'template_dir' ] = $message; } - continue; } } else { @@ -75,20 +69,18 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['template_dir'] = $message; + $errors[ 'template_dir' ] = $message; } - continue; } } - if (!is_dir($template_dir)) { $status = false; $message = "FAILED: $template_dir is not a directory"; if ($errors === null) { echo $message . ".\n"; } else { - $errors['template_dir'] = $message; + $errors[ 'template_dir' ] = $message; } } else if (!is_readable($template_dir)) { $status = false; @@ -96,7 +88,7 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['template_dir'] = $message; + $errors[ 'template_dir' ] = $message; } } else { if ($errors === null) { @@ -104,11 +96,9 @@ class Smarty_Internal_TestInstall } } } - if ($errors === null) { echo "Testing compile directory...\n"; } - // test if registered compile_dir is accessible $__compile_dir = $smarty->getCompileDir(); $_compile_dir = realpath($__compile_dir); @@ -118,7 +108,7 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['compile_dir'] = $message; + $errors[ 'compile_dir' ] = $message; } } else if (!is_dir($_compile_dir)) { $status = false; @@ -126,7 +116,7 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['compile_dir'] = $message; + $errors[ 'compile_dir' ] = $message; } } else if (!is_readable($_compile_dir)) { $status = false; @@ -134,7 +124,7 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['compile_dir'] = $message; + $errors[ 'compile_dir' ] = $message; } } else if (!is_writable($_compile_dir)) { $status = false; @@ -142,18 +132,16 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['compile_dir'] = $message; + $errors[ 'compile_dir' ] = $message; } } else { if ($errors === null) { echo "{$_compile_dir} is OK.\n"; } } - if ($errors === null) { echo "Testing plugins directory...\n"; } - // test if all registered plugins_dir are accessible // and if core plugins directory is still registered $_core_plugins_dir = realpath(dirname(__FILE__) . '/../plugins'); @@ -170,12 +158,10 @@ class Smarty_Internal_TestInstall } else { $plugin_dir = $smarty->ext->_getIncludePath->getIncludePath($_plugin_dir, null, $smarty); } - if ($plugin_dir !== false) { if ($errors === null) { echo "$plugin_dir is OK.\n"; } - continue; } else { $status = false; @@ -183,9 +169,8 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['plugins_dir'] = $message; + $errors[ 'plugins_dir' ] = $message; } - continue; } } else { @@ -194,20 +179,18 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['plugins_dir'] = $message; + $errors[ 'plugins_dir' ] = $message; } - continue; } } - if (!is_dir($plugin_dir)) { $status = false; $message = "FAILED: $plugin_dir is not a directory"; if ($errors === null) { echo $message . ".\n"; } else { - $errors['plugins_dir'] = $message; + $errors[ 'plugins_dir' ] = $message; } } else if (!is_readable($plugin_dir)) { $status = false; @@ -215,7 +198,7 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['plugins_dir'] = $message; + $errors[ 'plugins_dir' ] = $message; } } else if ($_core_plugins_dir && $_core_plugins_dir == realpath($plugin_dir)) { $_core_plugins_available = true; @@ -233,15 +216,13 @@ class Smarty_Internal_TestInstall $message = "WARNING: Smarty's own libs/plugins is not available"; if ($errors === null) { echo $message . ".\n"; - } else if (!isset($errors['plugins_dir'])) { - $errors['plugins_dir'] = $message; + } else if (!isset($errors[ 'plugins_dir' ])) { + $errors[ 'plugins_dir' ] = $message; } } - if ($errors === null) { echo "Testing cache directory...\n"; } - // test if all registered cache_dir is accessible $__cache_dir = $smarty->getCacheDir(); $_cache_dir = realpath($__cache_dir); @@ -251,7 +232,7 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['cache_dir'] = $message; + $errors[ 'cache_dir' ] = $message; } } else if (!is_dir($_cache_dir)) { $status = false; @@ -259,7 +240,7 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['cache_dir'] = $message; + $errors[ 'cache_dir' ] = $message; } } else if (!is_readable($_cache_dir)) { $status = false; @@ -267,7 +248,7 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['cache_dir'] = $message; + $errors[ 'cache_dir' ] = $message; } } else if (!is_writable($_cache_dir)) { $status = false; @@ -275,18 +256,16 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['cache_dir'] = $message; + $errors[ 'cache_dir' ] = $message; } } else { if ($errors === null) { echo "{$_cache_dir} is OK.\n"; } } - if ($errors === null) { echo "Testing configs directory...\n"; } - // test if all registered config_dir are accessible foreach ($smarty->getConfigDir() as $config_dir) { $_config_dir = $config_dir; @@ -299,12 +278,10 @@ class Smarty_Internal_TestInstall } else { $config_dir = $smarty->ext->_getIncludePath->getIncludePath($_config_dir, null, $smarty); } - if ($config_dir !== false) { if ($errors === null) { echo "$config_dir is OK.\n"; } - continue; } else { $status = false; @@ -312,9 +289,8 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['config_dir'] = $message; + $errors[ 'config_dir' ] = $message; } - continue; } } else { @@ -323,20 +299,18 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['config_dir'] = $message; + $errors[ 'config_dir' ] = $message; } - continue; } } - if (!is_dir($config_dir)) { $status = false; $message = "FAILED: $config_dir is not a directory"; if ($errors === null) { echo $message . ".\n"; } else { - $errors['config_dir'] = $message; + $errors[ 'config_dir' ] = $message; } } else if (!is_readable($config_dir)) { $status = false; @@ -344,7 +318,7 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['config_dir'] = $message; + $errors[ 'config_dir' ] = $message; } } else { if ($errors === null) { @@ -352,7 +326,6 @@ class Smarty_Internal_TestInstall } } } - if ($errors === null) { echo "Testing sysplugin files...\n"; } @@ -411,6 +384,7 @@ class Smarty_Internal_TestInstall 'smarty_internal_config_file_compiler.php' => true, 'smarty_internal_data.php' => true, 'smarty_internal_debug.php' => true, + 'smarty_internal_errorhandler.php' => true, 'smarty_internal_extension_handler.php' => true, 'smarty_internal_method_addautoloadfilters.php' => true, 'smarty_internal_method_adddefaultmodifiers.php' => true, @@ -524,7 +498,7 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['sysplugins'] = $message; + $errors[ 'sysplugins' ] = $message; } } else if ($errors === null) { echo "... OK\n"; @@ -535,10 +509,9 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['sysplugins_dir_constant'] = $message; + $errors[ 'sysplugins_dir_constant' ] = $message; } } - if ($errors === null) { echo "Testing plugin files...\n"; } @@ -609,7 +582,7 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['plugins'] = $message; + $errors[ 'plugins' ] = $message; } } else if ($errors === null) { echo "... OK\n"; @@ -620,15 +593,13 @@ class Smarty_Internal_TestInstall if ($errors === null) { echo $message . ".\n"; } else { - $errors['plugins_dir_constant'] = $message; + $errors[ 'plugins_dir_constant' ] = $message; } } - if ($errors === null) { echo "Tests complete.\n"; echo "\n"; } - return $status; } }