A super easy PHP Framework for web development!
				https://github.com/exacti/phacil-framework
			
			
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					100 lines
				
				3.4 KiB
			
		
		
			
		
	
	
					100 lines
				
				3.4 KiB
			| 
								 
											7 years ago
										 
									 | 
							
								<?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);
							 | 
						||
| 
								 | 
							
								        $_file_perms = property_exists($smarty, '_file_perms') ? $smarty->_file_perms : 0644;
							 | 
						||
| 
								 | 
							
								        $_dir_perms =
							 | 
						||
| 
								 | 
							
								            property_exists($smarty, '_dir_perms') ? (isset($smarty->_dir_perms) ? $smarty->_dir_perms : 0777) : 0771;
							 | 
						||
| 
								 | 
							
								        if ($_file_perms !== null) {
							 | 
						||
| 
								 | 
							
								            $old_umask = umask(0);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $_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, $_dir_perms, 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}");
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if ($_file_perms !== null) {
							 | 
						||
| 
								 | 
							
								            // set file permissions
							 | 
						||
| 
								 | 
							
								            chmod($_filepath, $_file_perms);
							 | 
						||
| 
								 | 
							
								            umask($old_umask);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        error_reporting($_error_reporting);
							 | 
						||
| 
								 | 
							
								        return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |