
Comparing changes: https://github.com/smarty-php/smarty/compare/v4.3.1...v4.4.1 It is noticeable that Smarty 4.3.1 does not officially support PHP 8.3. Is only supported with 4.4.0. Remark: During tests with Smarty 4.5.1, it was noticed that the following warning occurs: Deprecated: Using the unregistered function "function_exists" in a template is deprecated and will be removed in a future version. Use Smarty::registerPlugin to explicitly register a custom modifier. As of Smarty 5.X.X, templates must be revised again. The Smarty release 5.0.2 is already officially available. However, integration into FlatPress is not entirely trivial.
92 lines
3.0 KiB
PHP
92 lines
3.0 KiB
PHP
<?php
|
|
/**
|
|
* Smarty write file plugin
|
|
*
|
|
* @package Smarty
|
|
* @subpackage PluginsInternal
|
|
* @author Monte Ohrt
|
|
*/
|
|
|
|
/**
|
|
* Smarty Internal Write File Class
|
|
*
|
|
* @package Smarty
|
|
* @subpackage PluginsInternal
|
|
*/
|
|
class Smarty_Internal_Runtime_WriteFile
|
|
{
|
|
/**
|
|
* Writes file in a safe way to disk
|
|
*
|
|
* @param string $_filepath complete filepath
|
|
* @param string $_contents file content
|
|
* @param Smarty $smarty smarty instance
|
|
*
|
|
* @throws SmartyException
|
|
* @return boolean true
|
|
*/
|
|
public function writeFile($_filepath, $_contents, Smarty $smarty)
|
|
{
|
|
$_error_reporting = error_reporting();
|
|
error_reporting($_error_reporting & ~E_NOTICE & ~E_WARNING);
|
|
$_dirpath = dirname($_filepath);
|
|
// if subdirs, create dir structure
|
|
if ($_dirpath !== '.') {
|
|
$i = 0;
|
|
// loop if concurrency problem occurs
|
|
// see https://bugs.php.net/bug.php?id=35326
|
|
while (!is_dir($_dirpath)) {
|
|
if (@mkdir($_dirpath, 0777, true)) {
|
|
break;
|
|
}
|
|
clearstatcache();
|
|
if (++$i === 3) {
|
|
error_reporting($_error_reporting);
|
|
throw new SmartyException("unable to create directory {$_dirpath}");
|
|
}
|
|
sleep(1);
|
|
}
|
|
}
|
|
// write to tmp file, then move to overt file lock race condition
|
|
$_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}");
|
|
}
|
|
/*
|
|
* Windows' rename() fails if the destination exists,
|
|
* Linux' rename() properly handles the overwrite.
|
|
* Simply unlink()ing a file might cause other processes
|
|
* currently reading that file to fail, but linux' rename()
|
|
* seems to be smart enough to handle that for us.
|
|
*/
|
|
if (Smarty::$_IS_WINDOWS) {
|
|
// remove original file
|
|
if (is_file($_filepath)) {
|
|
@unlink($_filepath);
|
|
}
|
|
// rename tmp file
|
|
$success = @rename($_tmp_file, $_filepath);
|
|
} else {
|
|
// rename tmp file
|
|
$success = @rename($_tmp_file, $_filepath);
|
|
if (!$success) {
|
|
// remove original file
|
|
if (is_file($_filepath)) {
|
|
@unlink($_filepath);
|
|
}
|
|
// rename tmp file
|
|
$success = @rename($_tmp_file, $_filepath);
|
|
}
|
|
}
|
|
if (!$success) {
|
|
error_reporting($_error_reporting);
|
|
throw new SmartyException("unable to write file {$_filepath}");
|
|
}
|
|
// set file permissions
|
|
@chmod($_filepath, 0666 & ~umask());
|
|
error_reporting($_error_reporting);
|
|
return true;
|
|
}
|
|
}
|