File manager - Edit - /home/aussies6/public_html/seafoodwarehouse.com.au/new.aussieseafoodhouse.com.au.tar
Back
.ftpquota 0000600 00000000011 15213253420 0006365 0 ustar 00 4 109897 .htaccess 0000644 00000000425 15213253420 0006340 0 ustar 00 # php -- BEGIN cPanel-generated handler, do not edit # Set the “ea-php56” package as the default “PHP” programming language. <IfModule mime_module> AddType application/x-httpd-ea-php56 .php .php5 .phtml </IfModule> # php -- END cPanel-generated handler, do not edit TAR.php 0000777 00000210612 15213253420 0005711 0 ustar 00 <?php /* vim: set ts=4 sw=4: */ // +----------------------------------------------------------------------+ // | PHP Version 4 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997-2003 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 3.0 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available through the world-wide-web at the following url: | // | http://www.php.net/license/3_0.txt. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | license@php.net so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Author: Vincent Blavet <vincent@phpconcept.net> | // +----------------------------------------------------------------------+ // // $Id: Tar.php,v 1.39 2006/12/22 19:20:08 cellog Exp $ #require_once 'PEAR.php'; define ('ARCHIVE_TAR_ATT_SEPARATOR', 90001); define ('ARCHIVE_TAR_END_BLOCK', pack("a512", '')); /** * Creates a (compressed) Tar archive * * @author Vincent Blavet <vincent@phpconcept.net> * @version $Revision: 1.39 $ * @package Archive */ class Archive_Tar { /** * @var string Name of the Tar */ var $_tarname=''; /** * @var boolean if true, the Tar file will be gzipped */ var $_compress=false; /** * @var string Type of compression : 'none', 'gz' or 'bz2' */ var $_compress_type='none'; /** * @var string Explode separator */ var $_separator=' '; /** * @var file descriptor */ var $_file=0; /** * @var string Local Tar name of a remote Tar (http:// or ftp://) */ var $_temp_tarname=''; function raiseError($message){ print "<b>TAR error: </b><font color='red'>".$message."</font><br />";return; } // {{{ constructor /** * Archive_Tar Class constructor. This flavour of the constructor only * declare a new Archive_Tar object, identifying it by the name of the * tar file. * If the compress argument is set the tar will be read or created as a * gzip or bz2 compressed TAR file. * * @param string $p_tarname The name of the tar archive to create * @param string $p_compress can be null, 'gz' or 'bz2'. This * parameter indicates if gzip or bz2 compression * is required. For compatibility reason the * boolean value 'true' means 'gz'. * @access public */ function __construct($p_tarname, $p_compress = null) { #$this->PEAR(); $this->_compress = false; $this->_compress_type = 'none'; if (($p_compress === null) || ($p_compress == '')) { if (@file_exists($p_tarname)) { if ($fp = @fopen($p_tarname, "rb")) { // look for gzip magic cookie $data = fread($fp, 2); fclose($fp); if ($data == "\37\213") { $this->_compress = true; $this->_compress_type = 'gz'; // No sure it's enought for a magic code .... } elseif ($data == "BZ") { $this->_compress = true; $this->_compress_type = 'bz2'; } } } else { // probably a remote file or some file accessible // through a stream interface if (substr($p_tarname, -2) == 'gz') { $this->_compress = true; $this->_compress_type = 'gz'; } elseif ((substr($p_tarname, -3) == 'bz2') || (substr($p_tarname, -2) == 'bz')) { $this->_compress = true; $this->_compress_type = 'bz2'; } } } else { if (($p_compress === true) || ($p_compress == 'gz')) { $this->_compress = true; $this->_compress_type = 'gz'; } else if ($p_compress == 'bz2') { $this->_compress = true; $this->_compress_type = 'bz2'; } else { die("Unsupported compression type '$p_compress'\n". "Supported types are 'gz' and 'bz2'.\n"); return false; } } $this->_tarname = $p_tarname; if ($this->_compress) { // assert zlib or bz2 extension support if ($this->_compress_type == 'gz') $extname = 'zlib'; else if ($this->_compress_type == 'bz2') $extname = 'bz2'; #if (!extension_loaded($extname)) { #PEAR::loadExtension($extname); #} if (!extension_loaded($extname)) { die("The extension '$extname' couldn't be found.\n". "Please make sure your version of PHP was built ". "with '$extname' support.\n"); return false; } } } // }}} // {{{ destructor function _Archive_Tar() { $this->_close(); // ----- Look for a local copy to delete if ($this->_temp_tarname != '') @unlink($this->_temp_tarname); #$this->_PEAR(); } // }}} // {{{ create() /** * This method creates the archive file and add the files / directories * that are listed in $p_filelist. * If a file with the same name exist and is writable, it is replaced * by the new tar. * The method return false and a PEAR error text. * The $p_filelist parameter can be an array of string, each string * representing a filename or a directory name with their path if * needed. It can also be a single string with names separated by a * single blank. * For each directory added in the archive, the files and * sub-directories are also added. * See also createModify() method for more details. * * @param array $p_filelist An array of filenames and directory names, or a * single string with names separated by a single * blank space. * @return true on success, false on error. * @see createModify() * @access public */ function create($p_filelist) { return $this->createModify($p_filelist, '', ''); } // }}} // {{{ add() /** * This method add the files / directories that are listed in $p_filelist in * the archive. If the archive does not exist it is created. * The method return false and a PEAR error text. * The files and directories listed are only added at the end of the archive, * even if a file with the same name is already archived. * See also createModify() method for more details. * * @param array $p_filelist An array of filenames and directory names, or a * single string with names separated by a single * blank space. * @return true on success, false on error. * @see createModify() * @access public */ function add($p_filelist) { return $this->addModify($p_filelist, '', ''); } // }}} // {{{ extract() function extract($p_path='') { return $this->extractModify($p_path, ''); } // }}} // {{{ listContent() function listContent() { $v_list_detail = array(); if ($this->_openRead()) { if (!$this->_extractList('', $v_list_detail, "list", '', '')) { unset($v_list_detail); $v_list_detail = 0; } $this->_close(); } return $v_list_detail; } // }}} // {{{ createModify() /** * This method creates the archive file and add the files / directories * that are listed in $p_filelist. * If the file already exists and is writable, it is replaced by the * new tar. It is a create and not an add. If the file exists and is * read-only or is a directory it is not replaced. The method return * false and a PEAR error text. * The $p_filelist parameter can be an array of string, each string * representing a filename or a directory name with their path if * needed. It can also be a single string with names separated by a * single blank. * The path indicated in $p_remove_dir will be removed from the * memorized path of each file / directory listed when this path * exists. By default nothing is removed (empty path '') * The path indicated in $p_add_dir will be added at the beginning of * the memorized path of each file / directory listed. However it can * be set to empty ''. The adding of a path is done after the removing * of path. * The path add/remove ability enables the user to prepare an archive * for extraction in a different path than the origin files are. * See also addModify() method for file adding properties. * * @param array $p_filelist An array of filenames and directory names, * or a single string with names separated by * a single blank space. * @param string $p_add_dir A string which contains a path to be added * to the memorized path of each element in * the list. * @param string $p_remove_dir A string which contains a path to be * removed from the memorized path of each * element in the list, when relevant. * @return boolean true on success, false on error. * @access public * @see addModify() */ function createModify($p_filelist, $p_add_dir, $p_remove_dir='') { $v_result = true; if (!$this->_openWrite()) return false; if ($p_filelist != '') { if (is_array($p_filelist)) $v_list = $p_filelist; elseif (is_string($p_filelist)) $v_list = explode($this->_separator, $p_filelist); else { $this->_cleanFile(); $this->_error('Invalid file list'); return false; } $v_result = $this->_addList($v_list, $p_add_dir, $p_remove_dir); } if ($v_result) { $this->_writeFooter(); $this->_close(); } else $this->_cleanFile(); return $v_result; } // }}} // {{{ addModify() /** * This method add the files / directories listed in $p_filelist at the * end of the existing archive. If the archive does not yet exists it * is created. * The $p_filelist parameter can be an array of string, each string * representing a filename or a directory name with their path if * needed. It can also be a single string with names separated by a * single blank. * The path indicated in $p_remove_dir will be removed from the * memorized path of each file / directory listed when this path * exists. By default nothing is removed (empty path '') * The path indicated in $p_add_dir will be added at the beginning of * the memorized path of each file / directory listed. However it can * be set to empty ''. The adding of a path is done after the removing * of path. * The path add/remove ability enables the user to prepare an archive * for extraction in a different path than the origin files are. * If a file/dir is already in the archive it will only be added at the * end of the archive. There is no update of the existing archived * file/dir. However while extracting the archive, the last file will * replace the first one. This results in a none optimization of the * archive size. * If a file/dir does not exist the file/dir is ignored. However an * error text is send to PEAR error. * If a file/dir is not readable the file/dir is ignored. However an * error text is send to PEAR error. * * @param array $p_filelist An array of filenames and directory * names, or a single string with names * separated by a single blank space. * @param string $p_add_dir A string which contains a path to be * added to the memorized path of each * element in the list. * @param string $p_remove_dir A string which contains a path to be * removed from the memorized path of * each element in the list, when * relevant. * @return true on success, false on error. * @access public */ function addModify($p_filelist, $p_add_dir, $p_remove_dir='') { $v_result = true; if (!$this->_isArchive()) $v_result = $this->createModify($p_filelist, $p_add_dir, $p_remove_dir); else { if (is_array($p_filelist)) $v_list = $p_filelist; elseif (is_string($p_filelist)) $v_list = explode($this->_separator, $p_filelist); else { $this->_error('Invalid file list'); return false; } $v_result = $this->_append($v_list, $p_add_dir, $p_remove_dir); } return $v_result; } // }}} // {{{ addString() /** * This method add a single string as a file at the * end of the existing archive. If the archive does not yet exists it * is created. * * @param string $p_filename A string which contains the full * filename path that will be associated * with the string. * @param string $p_string The content of the file added in * the archive. * @return true on success, false on error. * @access public */ function addString($p_filename, $p_string) { $v_result = true; if (!$this->_isArchive()) { if (!$this->_openWrite()) { return false; } $this->_close(); } if (!$this->_openAppend()) return false; // Need to check the get back to the temporary file ? .... $v_result = $this->_addString($p_filename, $p_string); $this->_writeFooter(); $this->_close(); return $v_result; } // }}} // {{{ extractModify() /** * This method extract all the content of the archive in the directory * indicated by $p_path. When relevant the memorized path of the * files/dir can be modified by removing the $p_remove_path path at the * beginning of the file/dir path. * While extracting a file, if the directory path does not exists it is * created. * While extracting a file, if the file already exists it is replaced * without looking for last modification date. * While extracting a file, if the file already exists and is write * protected, the extraction is aborted. * While extracting a file, if a directory with the same name already * exists, the extraction is aborted. * While extracting a directory, if a file with the same name already * exists, the extraction is aborted. * While extracting a file/directory if the destination directory exist * and is write protected, or does not exist but can not be created, * the extraction is aborted. * If after extraction an extracted file does not show the correct * stored file size, the extraction is aborted. * When the extraction is aborted, a PEAR error text is set and false * is returned. However the result can be a partial extraction that may * need to be manually cleaned. * * @param string $p_path The path of the directory where the * files/dir need to by extracted. * @param string $p_remove_path Part of the memorized path that can be * removed if present at the beginning of * the file/dir path. * @return boolean true on success, false on error. * @access public * @see extractList() */ function extractModify($p_path, $p_remove_path) { $v_result = true; $v_list_detail = array(); if ($v_result = $this->_openRead()) { $v_result = $this->_extractList($p_path, $v_list_detail, "complete", 0, $p_remove_path); $this->_close(); } return $v_result; } // }}} // {{{ extractInString() /** * This method extract from the archive one file identified by $p_filename. * The return value is a string with the file content, or NULL on error. * @param string $p_filename The path of the file to extract in a string. * @return a string with the file content or NULL. * @access public */ function extractInString($p_filename) { if ($this->_openRead()) { $v_result = $this->_extractInString($p_filename); $this->_close(); } else { $v_result = NULL; } return $v_result; } // }}} // {{{ extractList() /** * This method extract from the archive only the files indicated in the * $p_filelist. These files are extracted in the current directory or * in the directory indicated by the optional $p_path parameter. * If indicated the $p_remove_path can be used in the same way as it is * used in extractModify() method. * @param array $p_filelist An array of filenames and directory names, * or a single string with names separated * by a single blank space. * @param string $p_path The path of the directory where the * files/dir need to by extracted. * @param string $p_remove_path Part of the memorized path that can be * removed if present at the beginning of * the file/dir path. * @return true on success, false on error. * @access public * @see extractModify() */ function extractList($p_filelist, $p_path='', $p_remove_path='') { $v_result = true; $v_list_detail = array(); if (is_array($p_filelist)) $v_list = $p_filelist; elseif (is_string($p_filelist)) $v_list = explode($this->_separator, $p_filelist); else { $this->_error('Invalid string list'); return false; } if ($v_result = $this->_openRead()) { $v_result = $this->_extractList($p_path, $v_list_detail, "partial", $v_list, $p_remove_path); $this->_close(); } return $v_result; } // }}} // {{{ setAttribute() /** * This method set specific attributes of the archive. It uses a variable * list of parameters, in the format attribute code + attribute values : * $arch->setAttribute(ARCHIVE_TAR_ATT_SEPARATOR, ','); * @param mixed $argv variable list of attributes and values * @return true on success, false on error. * @access public */ function setAttribute() { $v_result = true; // ----- Get the number of variable list of arguments if (($v_size = func_num_args()) == 0) { return true; } // ----- Get the arguments $v_att_list = &func_get_args(); // ----- Read the attributes $i=0; while ($i<$v_size) { // ----- Look for next option switch ($v_att_list[$i]) { // ----- Look for options that request a string value case ARCHIVE_TAR_ATT_SEPARATOR : // ----- Check the number of parameters if (($i+1) >= $v_size) { $this->_error('Invalid number of parameters for ' .'attribute ARCHIVE_TAR_ATT_SEPARATOR'); return false; } // ----- Get the value $this->_separator = $v_att_list[$i+1]; $i++; break; default : $this->_error('Unknow attribute code '.$v_att_list[$i].''); return false; } // ----- Next attribute $i++; } return $v_result; } // }}} // {{{ _error() function _error($p_message) { // ----- To be completed $this->raiseError($p_message); } // }}} // {{{ _warning() function _warning($p_message) { // ----- To be completed $this->raiseError($p_message); } // }}} // {{{ _isArchive() function _isArchive($p_filename=NULL) { if ($p_filename == NULL) { $p_filename = $this->_tarname; } clearstatcache(); return @is_file($p_filename); } // }}} // {{{ _openWrite() function _openWrite() { if ($this->_compress_type == 'gz') $this->_file = @gzopen($this->_tarname, "wb9"); else if ($this->_compress_type == 'bz2') $this->_file = @bzopen($this->_tarname, "wb"); else if ($this->_compress_type == 'none') $this->_file = @fopen($this->_tarname, "wb"); else $this->_error('Unknown or missing compression type (' .$this->_compress_type.')'); if ($this->_file == 0) { $this->_error('Unable to open in write mode \'' .$this->_tarname.'\''); return false; } return true; } // }}} // {{{ _openRead() function _openRead() { if (strtolower(substr($this->_tarname, 0, 7)) == 'http://') { // ----- Look if a local copy need to be done if ($this->_temp_tarname == '') { $this->_temp_tarname = uniqid('tar').'.tmp'; if (!$v_file_from = @fopen($this->_tarname, 'rb')) { $this->_error('Unable to open in read mode \'' .$this->_tarname.'\''); $this->_temp_tarname = ''; return false; } if (!$v_file_to = @fopen($this->_temp_tarname, 'wb')) { $this->_error('Unable to open in write mode \'' .$this->_temp_tarname.'\''); $this->_temp_tarname = ''; return false; } while ($v_data = @fread($v_file_from, 1024)) @fwrite($v_file_to, $v_data); @fclose($v_file_from); @fclose($v_file_to); } // ----- File to open if the local copy $v_filename = $this->_temp_tarname; } else // ----- File to open if the normal Tar file $v_filename = $this->_tarname; if ($this->_compress_type == 'gz') $this->_file = @gzopen($v_filename, "rb"); else if ($this->_compress_type == 'bz2') $this->_file = @bzopen($v_filename, "rb"); else if ($this->_compress_type == 'none') $this->_file = @fopen($v_filename, "rb"); else $this->_error('Unknown or missing compression type (' .$this->_compress_type.')'); if ($this->_file == 0) { $this->_error('Unable to open in read mode \''.$v_filename.'\''); return false; } return true; } // }}} // {{{ _openReadWrite() function _openReadWrite() { if ($this->_compress_type == 'gz') $this->_file = @gzopen($this->_tarname, "r+b"); else if ($this->_compress_type == 'bz2') $this->_file = @bzopen($this->_tarname, "r+b"); else if ($this->_compress_type == 'none') $this->_file = @fopen($this->_tarname, "r+b"); else $this->_error('Unknown or missing compression type (' .$this->_compress_type.')'); if ($this->_file == 0) { $this->_error('Unable to open in read/write mode \'' .$this->_tarname.'\''); return false; } return true; } // }}} // {{{ _close() function _close() { //if (isset($this->_file)) { if (is_resource($this->_file)) { if ($this->_compress_type == 'gz') @gzclose($this->_file); else if ($this->_compress_type == 'bz2') @bzclose($this->_file); else if ($this->_compress_type == 'none') @fclose($this->_file); else $this->_error('Unknown or missing compression type (' .$this->_compress_type.')'); $this->_file = 0; } // ----- Look if a local copy need to be erase // Note that it might be interesting to keep the url for a time : ToDo if ($this->_temp_tarname != '') { @unlink($this->_temp_tarname); $this->_temp_tarname = ''; } return true; } // }}} // {{{ _cleanFile() function _cleanFile() { $this->_close(); // ----- Look for a local copy if ($this->_temp_tarname != '') { // ----- Remove the local copy but not the remote tarname @unlink($this->_temp_tarname); $this->_temp_tarname = ''; } else { // ----- Remove the local tarname file @unlink($this->_tarname); } $this->_tarname = ''; return true; } // }}} // {{{ _writeBlock() function _writeBlock($p_binary_data, $p_len=null) { if (is_resource($this->_file)) { if ($p_len === null) { if ($this->_compress_type == 'gz') @gzputs($this->_file, $p_binary_data); else if ($this->_compress_type == 'bz2') @bzwrite($this->_file, $p_binary_data); else if ($this->_compress_type == 'none') @fputs($this->_file, $p_binary_data); else $this->_error('Unknown or missing compression type (' .$this->_compress_type.')'); } else { if ($this->_compress_type == 'gz') @gzputs($this->_file, $p_binary_data, $p_len); else if ($this->_compress_type == 'bz2') @bzwrite($this->_file, $p_binary_data, $p_len); else if ($this->_compress_type == 'none') @fputs($this->_file, $p_binary_data, $p_len); else $this->_error('Unknown or missing compression type (' .$this->_compress_type.')'); } } return true; } // }}} // {{{ _readBlock() function _readBlock() { $v_block = null; if (is_resource($this->_file)) { if ($this->_compress_type == 'gz') $v_block = @gzread($this->_file, 512); else if ($this->_compress_type == 'bz2') $v_block = @bzread($this->_file, 512); else if ($this->_compress_type == 'none') $v_block = @fread($this->_file, 512); else $this->_error('Unknown or missing compression type (' .$this->_compress_type.')'); } return $v_block; } // }}} // {{{ _jumpBlock() function _jumpBlock($p_len=null) { if (is_resource($this->_file)) { if ($p_len === null) $p_len = 1; if ($this->_compress_type == 'gz') { @gzseek($this->_file, gztell($this->_file)+($p_len*512)); } else if ($this->_compress_type == 'bz2') { // ----- Replace missing bztell() and bzseek() for ($i=0; $i<$p_len; $i++) $this->_readBlock(); } else if ($this->_compress_type == 'none') @fseek($this->_file, ftell($this->_file)+($p_len*512)); else $this->_error('Unknown or missing compression type (' .$this->_compress_type.')'); } return true; } // }}} // {{{ _writeFooter() function _writeFooter() { if (is_resource($this->_file)) { // ----- Write the last 0 filled block for end of archive $v_binary_data = pack('a1024', ''); $this->_writeBlock($v_binary_data); } return true; } // }}} // {{{ _addList() function _addList($p_list, $p_add_dir, $p_remove_dir) { $v_result=true; $v_header = array(); // ----- Remove potential windows directory separator $p_add_dir = $this->_translateWinPath($p_add_dir); $p_remove_dir = $this->_translateWinPath($p_remove_dir, false); if (!$this->_file) { $this->_error('Invalid file descriptor'); return false; } if (sizeof($p_list) == 0) return true; foreach ($p_list as $v_filename) { if (!$v_result) { break; } // ----- Skip the current tar name if ($v_filename == $this->_tarname) continue; if ($v_filename == '') continue; if (!file_exists($v_filename)) { $this->_warning("File '$v_filename' does not exist"); continue; } // ----- Add the file or directory header if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir)) return false; if (@is_dir($v_filename)) { if (!($p_hdir = opendir($v_filename))) { $this->_warning("Directory '$v_filename' can not be read"); continue; } while (false !== ($p_hitem = readdir($p_hdir))) { if (($p_hitem != '.') && ($p_hitem != '..')) { if ($v_filename != ".") $p_temp_list[0] = $v_filename.'/'.$p_hitem; else $p_temp_list[0] = $p_hitem; $v_result = $this->_addList($p_temp_list, $p_add_dir, $p_remove_dir); } } unset($p_temp_list); unset($p_hdir); unset($p_hitem); } } return $v_result; } // }}} // {{{ _addFile() function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir) { if (!$this->_file) { $this->_error('Invalid file descriptor'); return false; } if ($p_filename == '') { $this->_error('Invalid file name'); return false; } // ----- Calculate the stored filename $p_filename = $this->_translateWinPath($p_filename, false);; $v_stored_filename = $p_filename; if (strcmp($p_filename, $p_remove_dir) == 0) { return true; } if ($p_remove_dir != '') { if (substr($p_remove_dir, -1) != '/') $p_remove_dir .= '/'; if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) $v_stored_filename = substr($p_filename, strlen($p_remove_dir)); } $v_stored_filename = $this->_translateWinPath($v_stored_filename); if ($p_add_dir != '') { if (substr($p_add_dir, -1) == '/') $v_stored_filename = $p_add_dir.$v_stored_filename; else $v_stored_filename = $p_add_dir.'/'.$v_stored_filename; } $v_stored_filename = $this->_pathReduction($v_stored_filename); if ($this->_isArchive($p_filename)) { if (($v_file = @fopen($p_filename, "rb")) == 0) { $this->_warning("Unable to open file '".$p_filename ."' in binary read mode"); return true; } if (!$this->_writeHeader($p_filename, $v_stored_filename)) return false; while (($v_buffer = fread($v_file, 512)) != '') { $v_binary_data = pack("a512", "$v_buffer"); $this->_writeBlock($v_binary_data); } fclose($v_file); } else { // ----- Only header for dir if (!$this->_writeHeader($p_filename, $v_stored_filename)) return false; } return true; } // }}} // {{{ _addString() function _addString($p_filename, $p_string) { if (!$this->_file) { $this->_error('Invalid file descriptor'); return false; } if ($p_filename == '') { $this->_error('Invalid file name'); return false; } // ----- Calculate the stored filename $p_filename = $this->_translateWinPath($p_filename, false);; if (!$this->_writeHeaderBlock($p_filename, strlen($p_string), time(), 384, "", 0, 0)) return false; $i=0; while (($v_buffer = substr($p_string, (($i++)*512), 512)) != '') { $v_binary_data = pack("a512", $v_buffer); $this->_writeBlock($v_binary_data); } return true; } // }}} // {{{ _writeHeader() function _writeHeader($p_filename, $p_stored_filename) { if ($p_stored_filename == '') $p_stored_filename = $p_filename; $v_reduce_filename = $this->_pathReduction($p_stored_filename); if (strlen($v_reduce_filename) > 99) { if (!$this->_writeLongHeader($v_reduce_filename)) return false; } $v_info = stat($p_filename); $v_uid = sprintf("%6s ", DecOct($v_info[4])); $v_gid = sprintf("%6s ", DecOct($v_info[5])); $v_perms = sprintf("%6s ", DecOct(fileperms($p_filename))); $v_mtime = sprintf("%11s", DecOct(filemtime($p_filename))); if (@is_dir($p_filename)) { $v_typeflag = "5"; $v_size = sprintf("%11s ", DecOct(0)); } else { $v_typeflag = ''; clearstatcache(); $v_size = sprintf("%11s ", DecOct(filesize($p_filename))); } $v_linkname = ''; $v_magic = ''; $v_version = ''; $v_uname = ''; $v_gname = ''; $v_devmajor = ''; $v_devminor = ''; $v_prefix = ''; $v_binary_data_first = pack("a100a8a8a8a12A12", $v_reduce_filename, $v_perms, $v_uid, $v_gid, $v_size, $v_mtime); $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", $v_typeflag, $v_linkname, $v_magic, $v_version, $v_uname, $v_gname, $v_devmajor, $v_devminor, $v_prefix, ''); // ----- Calculate the checksum $v_checksum = 0; // ..... First part of the header for ($i=0; $i<148; $i++) $v_checksum += ord(substr($v_binary_data_first,$i,1)); // ..... Ignore the checksum value and replace it by ' ' (space) for ($i=148; $i<156; $i++) $v_checksum += ord(' '); // ..... Last part of the header for ($i=156, $j=0; $i<512; $i++, $j++) $v_checksum += ord(substr($v_binary_data_last,$j,1)); // ----- Write the first 148 bytes of the header in the archive $this->_writeBlock($v_binary_data_first, 148); // ----- Write the calculated checksum $v_checksum = sprintf("%6s ", DecOct($v_checksum)); $v_binary_data = pack("a8", $v_checksum); $this->_writeBlock($v_binary_data, 8); // ----- Write the last 356 bytes of the header in the archive $this->_writeBlock($v_binary_data_last, 356); return true; } // }}} // {{{ _writeHeaderBlock() function _writeHeaderBlock($p_filename, $p_size, $p_mtime=0, $p_perms=0, $p_type='', $p_uid=0, $p_gid=0) { $p_filename = $this->_pathReduction($p_filename); if (strlen($p_filename) > 99) { if (!$this->_writeLongHeader($p_filename)) return false; } if ($p_type == "5") { $v_size = sprintf("%11s ", DecOct(0)); } else { $v_size = sprintf("%11s ", DecOct($p_size)); } $v_uid = sprintf("%6s ", DecOct($p_uid)); $v_gid = sprintf("%6s ", DecOct($p_gid)); $v_perms = sprintf("%6s ", DecOct($p_perms)); $v_mtime = sprintf("%11s", DecOct($p_mtime)); $v_linkname = ''; $v_magic = ''; $v_version = ''; $v_uname = ''; $v_gname = ''; $v_devmajor = ''; $v_devminor = ''; $v_prefix = ''; $v_binary_data_first = pack("a100a8a8a8a12A12", $p_filename, $v_perms, $v_uid, $v_gid, $v_size, $v_mtime); $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", $p_type, $v_linkname, $v_magic, $v_version, $v_uname, $v_gname, $v_devmajor, $v_devminor, $v_prefix, ''); // ----- Calculate the checksum $v_checksum = 0; // ..... First part of the header for ($i=0; $i<148; $i++) $v_checksum += ord(substr($v_binary_data_first,$i,1)); // ..... Ignore the checksum value and replace it by ' ' (space) for ($i=148; $i<156; $i++) $v_checksum += ord(' '); // ..... Last part of the header for ($i=156, $j=0; $i<512; $i++, $j++) $v_checksum += ord(substr($v_binary_data_last,$j,1)); // ----- Write the first 148 bytes of the header in the archive $this->_writeBlock($v_binary_data_first, 148); // ----- Write the calculated checksum $v_checksum = sprintf("%6s ", DecOct($v_checksum)); $v_binary_data = pack("a8", $v_checksum); $this->_writeBlock($v_binary_data, 8); // ----- Write the last 356 bytes of the header in the archive $this->_writeBlock($v_binary_data_last, 356); return true; } // }}} // {{{ _writeLongHeader() function _writeLongHeader($p_filename) { $v_size = sprintf("%11s ", DecOct(strlen($p_filename))); $v_typeflag = 'L'; $v_linkname = ''; $v_magic = ''; $v_version = ''; $v_uname = ''; $v_gname = ''; $v_devmajor = ''; $v_devminor = ''; $v_prefix = ''; $v_binary_data_first = pack("a100a8a8a8a12A12", '././@LongLink', 0, 0, 0, $v_size, 0); $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", $v_typeflag, $v_linkname, $v_magic, $v_version, $v_uname, $v_gname, $v_devmajor, $v_devminor, $v_prefix, ''); // ----- Calculate the checksum $v_checksum = 0; // ..... First part of the header for ($i=0; $i<148; $i++) $v_checksum += ord(substr($v_binary_data_first,$i,1)); // ..... Ignore the checksum value and replace it by ' ' (space) for ($i=148; $i<156; $i++) $v_checksum += ord(' '); // ..... Last part of the header for ($i=156, $j=0; $i<512; $i++, $j++) $v_checksum += ord(substr($v_binary_data_last,$j,1)); // ----- Write the first 148 bytes of the header in the archive $this->_writeBlock($v_binary_data_first, 148); // ----- Write the calculated checksum $v_checksum = sprintf("%6s ", DecOct($v_checksum)); $v_binary_data = pack("a8", $v_checksum); $this->_writeBlock($v_binary_data, 8); // ----- Write the last 356 bytes of the header in the archive $this->_writeBlock($v_binary_data_last, 356); // ----- Write the filename as content of the block $i=0; while (($v_buffer = substr($p_filename, (($i++)*512), 512)) != '') { $v_binary_data = pack("a512", "$v_buffer"); $this->_writeBlock($v_binary_data); } return true; } // }}} // {{{ _readHeader() function _readHeader($v_binary_data, &$v_header) { if (strlen($v_binary_data)==0) { $v_header['filename'] = ''; return true; } if (strlen($v_binary_data) != 512) { $v_header['filename'] = ''; $this->_error('Invalid block size : '.strlen($v_binary_data)); return false; } if (!is_array($v_header)) { $v_header = array(); } // ----- Calculate the checksum $v_checksum = 0; // ..... First part of the header for ($i=0; $i<148; $i++) $v_checksum+=ord(substr($v_binary_data,$i,1)); // ..... Ignore the checksum value and replace it by ' ' (space) for ($i=148; $i<156; $i++) $v_checksum += ord(' '); // ..... Last part of the header for ($i=156; $i<512; $i++) $v_checksum+=ord(substr($v_binary_data,$i,1)); $v_data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/" ."a8checksum/a1typeflag/a100link/a6magic/a2version/" ."a32uname/a32gname/a8devmajor/a8devminor", $v_binary_data); // ----- Extract the checksum $v_header['checksum'] = OctDec(trim($v_data['checksum'])); if ($v_header['checksum'] != $v_checksum) { $v_header['filename'] = ''; // ----- Look for last block (empty block) if (($v_checksum == 256) && ($v_header['checksum'] == 0)) return true; $this->_error('Invalid checksum for file "'.$v_data['filename'] .'" : '.$v_checksum.' calculated, ' .$v_header['checksum'].' expected'); return false; } // ----- Extract the properties $v_header['filename'] = trim($v_data['filename']); if ($this->_maliciousFilename($v_header['filename'])) { $this->_error('Malicious .tar detected, file "' . $v_header['filename'] . '" will not install in desired directory tree'); return false; } $v_header['mode'] = OctDec(trim($v_data['mode'])); $v_header['uid'] = OctDec(trim($v_data['uid'])); $v_header['gid'] = OctDec(trim($v_data['gid'])); $v_header['size'] = OctDec(trim($v_data['size'])); $v_header['mtime'] = OctDec(trim($v_data['mtime'])); if (($v_header['typeflag'] = $v_data['typeflag']) == "5") { $v_header['size'] = 0; } $v_header['link'] = trim($v_data['link']); /* ----- All these fields are removed form the header because they do not carry interesting info $v_header[magic] = trim($v_data[magic]); $v_header[version] = trim($v_data[version]); $v_header[uname] = trim($v_data[uname]); $v_header[gname] = trim($v_data[gname]); $v_header[devmajor] = trim($v_data[devmajor]); $v_header[devminor] = trim($v_data[devminor]); */ return true; } // }}} // {{{ _maliciousFilename() /** * Detect and report a malicious file name * * @param string $file * @return bool * @access private */ function _maliciousFilename($file) { if (strpos($file, '/../') !== false) { return true; } if (strpos($file, '../') === 0) { return true; } return false; } // }}} // {{{ _readLongHeader() function _readLongHeader(&$v_header) { $v_filename = ''; $n = floor($v_header['size']/512); for ($i=0; $i<$n; $i++) { $v_content = $this->_readBlock(); $v_filename .= $v_content; } if (($v_header['size'] % 512) != 0) { $v_content = $this->_readBlock(); $v_filename .= $v_content; } // ----- Read the next header $v_binary_data = $this->_readBlock(); if (!$this->_readHeader($v_binary_data, $v_header)) return false; //$v_header['filename'] = $v_filename; $v_header['filename'] = str_replace("\x00","",$v_filename); if ($this->_maliciousFilename($v_filename)) { $this->_error('Malicious .tar detected, file "' . $v_filename . '" will not install in desired directory tree'); return false; } return true; } // }}} // {{{ _extractInString() /** * This method extract from the archive one file identified by $p_filename. * The return value is a string with the file content, or NULL on error. * @param string $p_filename The path of the file to extract in a string. * @return a string with the file content or NULL. * @access private */ function _extractInString($p_filename) { $v_result_str = ""; While (strlen($v_binary_data = $this->_readBlock()) != 0) { if (!$this->_readHeader($v_binary_data, $v_header)) return NULL; if ($v_header['filename'] == '') continue; // ----- Look for long filename if ($v_header['typeflag'] == 'L') { if (!$this->_readLongHeader($v_header)) return NULL; } if ($v_header['filename'] == $p_filename) { if ($v_header['typeflag'] == "5") { $this->_error('Unable to extract in string a directory ' .'entry {'.$v_header['filename'].'}'); return NULL; } else { $n = floor($v_header['size']/512); for ($i=0; $i<$n; $i++) { $v_result_str .= $this->_readBlock(); } if (($v_header['size'] % 512) != 0) { $v_content = $this->_readBlock(); $v_result_str .= substr($v_content, 0, ($v_header['size'] % 512)); } return $v_result_str; } } else { $this->_jumpBlock(ceil(($v_header['size']/512))); } } return NULL; } // }}} // {{{ _extractList() function _extractList_vbdata($p_path, &$p_list_detail, $p_mode, $p_file_list, $p_remove_path, $v_binary_data) { $v_result=true; $v_nb = 0; $v_extract_all = true; $v_listing = false; $p_path = $this->_translateWinPath($p_path, false); if ($p_path == '' || (substr($p_path, 0, 1) != '/' && substr($p_path, 0, 3) != "../" && !strpos($p_path, ':'))) { $p_path = "./".$p_path; } $p_remove_path = $this->_translateWinPath($p_remove_path); // ----- Look for path to remove format (should end by /) if (($p_remove_path != '') && (substr($p_remove_path, -1) != '/')) $p_remove_path .= '/'; $p_remove_path_size = strlen($p_remove_path); switch ($p_mode) { case "complete" : $v_extract_all = TRUE; $v_listing = FALSE; break; case "partial" : $v_extract_all = FALSE; $v_listing = FALSE; break; case "list" : $v_extract_all = FALSE; $v_listing = TRUE; break; default : $this->_error('Invalid extract mode ('.$p_mode.')'); return false; } clearstatcache(); //while (strlen($v_binary_data = $this->_readBlock()) != 0) { $v_extract_file = FALSE; $v_extraction_stopped = 0; if (!$this->_readHeader($v_binary_data, $v_header)) return false; if ($v_header['filename'] == '') { return false; } // ----- Look for long filename if ($v_header['typeflag'] == 'L') { if (!$this->_readLongHeader($v_header)) return false; } #if ((!$v_extract_all) && (is_array($p_file_list))) #{ // ----- By default no unzip if the file is not found $v_extract_file = true; /*for ($i=0; $i<sizeof($p_file_list); $i++) { // ----- Look if it is a directory if (substr($p_file_list[$i], -1) == '/') { // ----- Look if the directory is in the filename path if ((strlen($v_header['filename']) > strlen($p_file_list[$i])) && (substr($v_header['filename'], 0, strlen($p_file_list[$i])) == $p_file_list[$i])) { $v_extract_file = TRUE; break; } } // ----- It is a file, so compare the file names elseif ($p_file_list[$i] == $v_header['filename']) { $v_extract_file = TRUE; break; } } } else { $v_extract_file = TRUE; }*/ // ----- Look if this file need to be extracted if (($v_extract_file) && (!$v_listing)) { if (($p_remove_path != '') && (substr($v_header['filename'], 0, $p_remove_path_size) == $p_remove_path)) $v_header['filename'] = substr($v_header['filename'], $p_remove_path_size); if (($p_path != './') && ($p_path != '/')) { while (substr($p_path, -1) == '/') $p_path = substr($p_path, 0, strlen($p_path)-1); if (substr($v_header['filename'], 0, 1) == '/') $v_header['filename'] = $p_path.$v_header['filename']; else $v_header['filename'] = $p_path.'/'.$v_header['filename']; } if (file_exists($v_header['filename'])) { if ( (@is_dir($v_header['filename'])) && ($v_header['typeflag'] == '')) { $this->_error('File '.$v_header['filename'] .' already exists as a directory'); return false; } if ( ($this->_isArchive($v_header['filename'])) && ($v_header['typeflag'] == "5")) { $this->_error('Directory '.$v_header['filename'] .' already exists as a file'); return false; } if (!is_writeable($v_header['filename'])) { $this->_error('File '.$v_header['filename'] .' already exists and is write protected'); return false; } if (filemtime($v_header['filename']) > $v_header['mtime']) { // To be completed : An error or silent no replace ? } } // ----- Check the directory availability and create it if necessary elseif (($v_result = $this->_dirCheck(($v_header['typeflag'] == "5" ?$v_header['filename'] :dirname($v_header['filename'])))) != 1) { $this->_error('Unable to create path for '.$v_header['filename']); return false; } if ($v_extract_file) { if ($v_header['typeflag'] == "5") { if (!@file_exists($v_header['filename'])) { if (!@mkdir($v_header['filename'], 0777)) { $this->_error('Unable to create directory {' .$v_header['filename'].'}'); return false; } } } elseif ($v_header['typeflag'] == "2") { if (!@symlink($v_header['link'], $v_header['filename'])) { $this->_error('Unable to extract symbolic link {' .$v_header['filename'].'}'); return false; } } else { if (($v_dest_file = @fopen($v_header['filename'], "wb")) == 0) { $this->_error('Error while opening {'.$v_header['filename'] .'} in write binary mode'); return false; } else { $n = floor($v_header['size']/512); for ($i=0; $i<$n; $i++) { $v_content = $this->_readBlock(); fwrite($v_dest_file, $v_content, 512); } if (($v_header['size'] % 512) != 0) { $v_content = $this->_readBlock(); fwrite($v_dest_file, $v_content, ($v_header['size'] % 512)); } @fclose($v_dest_file); // ----- Change the file mode, mtime @touch($v_header['filename'], $v_header['mtime']); if ($v_header['mode'] & 0111) { // make file executable, obey umask $mode = fileperms($v_header['filename']) | (~umask() & 0111); @chmod($v_header['filename'], $mode); } } // ----- Check the file size clearstatcache(); if (filesize($v_header['filename']) != $v_header['size']) { $this->_error('Extracted file '.$v_header['filename'] .' does not have the correct file size \'' .filesize($v_header['filename']) .'\' ('.$v_header['size'] .' expected). Archive may be corrupted.'); return false; } } } else { $this->_jumpBlock(ceil(($v_header['size']/512))); } } else { $this->_jumpBlock(ceil(($v_header['size']/512))); } /* TBC : Seems to be unused ... if ($this->_compress) $v_end_of_file = @gzeof($this->_file); else $v_end_of_file = @feof($this->_file); */ if ($v_listing || $v_extract_file || $v_extraction_stopped) { // ----- Log extracted files if (($v_file_dir = dirname($v_header['filename'])) == $v_header['filename']) $v_file_dir = ''; if ((substr($v_header['filename'], 0, 1) == '/') && ($v_file_dir == '')) $v_file_dir = '/'; $p_list_detail[$v_nb++] = $v_header; if (is_array($p_file_list) && (count($p_list_detail) == count($p_file_list))) { return true; } } } return true; } // }}} // {{{ _extractList() function _extractList($p_path, &$p_list_detail, $p_mode, $p_file_list, $p_remove_path, $limit=0) { $v_result=true; $v_nb = 0; $v_extract_all = true; $v_listing = false; $inc = 0; $p_path = $this->_translateWinPath($p_path, false); if ($p_path == '' || (substr($p_path, 0, 1) != '/' && substr($p_path, 0, 3) != "../" && !strpos($p_path, ':'))) { $p_path = "./".$p_path; } $p_remove_path = $this->_translateWinPath($p_remove_path); // ----- Look for path to remove format (should end by /) if (($p_remove_path != '') && (substr($p_remove_path, -1) != '/')) $p_remove_path .= '/'; $p_remove_path_size = strlen($p_remove_path); switch ($p_mode) { case "complete" : $v_extract_all = TRUE; $v_listing = FALSE; break; case "partial" : $v_extract_all = FALSE; $v_listing = FALSE; break; case "list" : $v_extract_all = FALSE; $v_listing = TRUE; break; default : $this->_error('Invalid extract mode ('.$p_mode.')'); return false; } clearstatcache(); while (strlen($v_binary_data = $this->_readBlock()) != 0) { $v_extract_file = FALSE; $v_extraction_stopped = 0; if (!$this->_readHeader($v_binary_data, $v_header)) return false; if ($v_header['filename'] == '') { continue; } //Ovi's code if(($inc >= $limit) and ($limit !=0)) return ftell($this->_file); $inc++; // ----- Look for long filename if ($v_header['typeflag'] == 'L') { if (!$this->_readLongHeader($v_header)) return false; } if ((!$v_extract_all) && (is_array($p_file_list))) { // ----- By default no unzip if the file is not found $v_extract_file = false; for ($i=0; $i<sizeof($p_file_list); $i++) { // ----- Look if it is a directory if (substr($p_file_list[$i], -1) == '/') { // ----- Look if the directory is in the filename path if ((strlen($v_header['filename']) > strlen($p_file_list[$i])) && (substr($v_header['filename'], 0, strlen($p_file_list[$i])) == $p_file_list[$i])) { $v_extract_file = TRUE; break; } } // ----- It is a file, so compare the file names elseif ($p_file_list[$i] == $v_header['filename']) { $v_extract_file = TRUE; break; } } } else { $v_extract_file = TRUE; } // ----- Look if this file need to be extracted if (($v_extract_file) && (!$v_listing)) { if (($p_remove_path != '') && (substr($v_header['filename'], 0, $p_remove_path_size) == $p_remove_path)) $v_header['filename'] = substr($v_header['filename'], $p_remove_path_size); if (($p_path != './') && ($p_path != '/')) { while (substr($p_path, -1) == '/') $p_path = substr($p_path, 0, strlen($p_path)-1); if (substr($v_header['filename'], 0, 1) == '/') $v_header['filename'] = $p_path.$v_header['filename']; else $v_header['filename'] = $p_path.'/'.$v_header['filename']; } if (file_exists($v_header['filename'])) { if ( (@is_dir($v_header['filename'])) && ($v_header['typeflag'] == '')) { $this->_error('File '.$v_header['filename'] .' already exists as a directory'); return false; } if ( ($this->_isArchive($v_header['filename'])) && ($v_header['typeflag'] == "5")) { $this->_error('Directory '.$v_header['filename'] .' already exists as a file'); return false; } if (!is_writeable($v_header['filename'])) { $this->_error('File '.$v_header['filename'] .' already exists and is write protected'); return false; } if (filemtime($v_header['filename']) > $v_header['mtime']) { // To be completed : An error or silent no replace ? } } // ----- Check the directory availability and create it if necessary elseif (($v_result = $this->_dirCheck(($v_header['typeflag'] == "5" ?$v_header['filename'] :dirname($v_header['filename'])))) != 1) { $this->_error('Unable to create path for '.$v_header['filename']); return false; } if ($v_extract_file) { if ($v_header['typeflag'] == "5") { if (!@file_exists($v_header['filename'])) { if (!@mkdir($v_header['filename'], 0777)) { $this->_error('Unable to create directory {' .$v_header['filename'].'}'); return false; } } } elseif ($v_header['typeflag'] == "2") { if (!@symlink($v_header['link'], $v_header['filename'])) { $this->_error('Unable to extract symbolic link {' .$v_header['filename'].'}'); return false; } } else { if (($v_dest_file = @fopen($v_header['filename'], "wb")) == 0) { $this->_error('Error while opening {'.$v_header['filename'] .'} in write binary mode'); return false; } else { $n = floor($v_header['size']/512); for ($i=0; $i<$n; $i++) { $v_content = $this->_readBlock(); fwrite($v_dest_file, $v_content, 512); } if (($v_header['size'] % 512) != 0) { $v_content = $this->_readBlock(); fwrite($v_dest_file, $v_content, ($v_header['size'] % 512)); } @fclose($v_dest_file); // ----- Change the file mode, mtime @touch($v_header['filename'], $v_header['mtime']); if ($v_header['mode'] & 0111) { // make file executable, obey umask $mode = fileperms($v_header['filename']) | (~umask() & 0111); @chmod($v_header['filename'], $mode); } } // ----- Check the file size clearstatcache(); if (filesize($v_header['filename']) != $v_header['size']) { $this->_error('Extracted file '.$v_header['filename'] .' does not have the correct file size \'' .filesize($v_header['filename']) .'\' ('.$v_header['size'] .' expected). Archive may be corrupted.'); return false; } } } else { $this->_jumpBlock(ceil(($v_header['size']/512))); } } else { $this->_jumpBlock(ceil(($v_header['size']/512))); } /* TBC : Seems to be unused ... if ($this->_compress) $v_end_of_file = @gzeof($this->_file); else $v_end_of_file = @feof($this->_file); */ if ($v_listing || $v_extract_file || $v_extraction_stopped) { // ----- Log extracted files if (($v_file_dir = dirname($v_header['filename'])) == $v_header['filename']) $v_file_dir = ''; if ((substr($v_header['filename'], 0, 1) == '/') && ($v_file_dir == '')) $v_file_dir = '/'; $p_list_detail[$v_nb++] = $v_header; if (is_array($p_file_list) && (count($p_list_detail) == count($p_file_list))) { return true; } } } return true; } // }}} //extract file by sending v_header and setting seek position function extractFile($tar, &$v_header) { $v_result_str = ""; $p_filename = $v_header['filename']; // ----- Look for long filename if ($v_header['typeflag'] == 'L') { if (!$tar->_readLongHeader($v_header)) return NULL; } if ($v_header['typeflag'] == "5") { $tar->_error('Unable to extract in string a directory ' .'entry {'.$v_header['filename'].'}'); return NULL; } else { $n = floor($v_header['size']/512); for ($i=0; $i<$n; $i++) { $v_result_str .= $tar->_readBlock(); } if (($v_header['size'] % 512) != 0) { $v_content = $tar->_readBlock(); $v_result_str .= substr($v_content, 0, ($v_header['size'] % 512)); } return $v_result_str; } return NULL; } // {{{ _openAppend() function _openAppend() { if (filesize($this->_tarname) == 0) return $this->_openWrite(); if ($this->_compress) { $this->_close(); if (!@rename($this->_tarname, $this->_tarname.".tmp")) { $this->_error('Error while renaming \''.$this->_tarname .'\' to temporary file \''.$this->_tarname .'.tmp\''); return false; } if ($this->_compress_type == 'gz') $v_temp_tar = @gzopen($this->_tarname.".tmp", "rb"); elseif ($this->_compress_type == 'bz2') $v_temp_tar = @bzopen($this->_tarname.".tmp", "rb"); if ($v_temp_tar == 0) { $this->_error('Unable to open file \''.$this->_tarname .'.tmp\' in binary read mode'); @rename($this->_tarname.".tmp", $this->_tarname); return false; } if (!$this->_openWrite()) { @rename($this->_tarname.".tmp", $this->_tarname); return false; } if ($this->_compress_type == 'gz') { while (!@gzeof($v_temp_tar)) { $v_buffer = @gzread($v_temp_tar, 512); if ($v_buffer == ARCHIVE_TAR_END_BLOCK) { // do not copy end blocks, we will re-make them // after appending continue; } $v_binary_data = pack("a512", $v_buffer); $this->_writeBlock($v_binary_data); } @gzclose($v_temp_tar); } elseif ($this->_compress_type == 'bz2') { while (strlen($v_buffer = @bzread($v_temp_tar, 512)) > 0) { if ($v_buffer == ARCHIVE_TAR_END_BLOCK) { continue; } $v_binary_data = pack("a512", $v_buffer); $this->_writeBlock($v_binary_data); } @bzclose($v_temp_tar); } if (!@unlink($this->_tarname.".tmp")) { $this->_error('Error while deleting temporary file \'' .$this->_tarname.'.tmp\''); } } else { // ----- For not compressed tar, just add files before the last // one or two 512 bytes block if (!$this->_openReadWrite()) return false; clearstatcache(); $v_size = filesize($this->_tarname); // We might have zero, one or two end blocks. // The standard is two, but we should try to handle // other cases. fseek($this->_file, $v_size - 1024); if (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) { fseek($this->_file, $v_size - 1024); } elseif (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) { fseek($this->_file, $v_size - 512); } } return true; } // }}} // {{{ _append() function _append($p_filelist, $p_add_dir='', $p_remove_dir='') { if (!$this->_openAppend()) return false; if ($this->_addList($p_filelist, $p_add_dir, $p_remove_dir)) $this->_writeFooter(); $this->_close(); return true; } // }}} // {{{ _dirCheck() /** * Check if a directory exists and create it (including parent * dirs) if not. * * @param string $p_dir directory to check * * @return bool TRUE if the directory exists or was created */ function _dirCheck($p_dir) { clearstatcache(); if ((@is_dir($p_dir)) || ($p_dir == '')) return true; $p_parent_dir = dirname($p_dir); if (($p_parent_dir != $p_dir) && ($p_parent_dir != '') && (!$this->_dirCheck($p_parent_dir))) return false; if (!@mkdir($p_dir, 0777)) { $this->_error("Unable to create directory '$p_dir'"); return false; } return true; } // }}} // {{{ _pathReduction() /** * Compress path by changing for example "/dir/foo/../bar" to "/dir/bar", * rand emove double slashes. * * @param string $p_dir path to reduce * * @return string reduced path * * @access private * */ function _pathReduction($p_dir) { $v_result = ''; // ----- Look for not empty path if ($p_dir != '') { // ----- Explode path by directory names $v_list = explode('/', $p_dir); // ----- Study directories from last to first for ($i=sizeof($v_list)-1; $i>=0; $i--) { // ----- Look for current path if ($v_list[$i] == ".") { // ----- Ignore this directory // Should be the first $i=0, but no check is done } else if ($v_list[$i] == "..") { // ----- Ignore it and ignore the $i-1 $i--; } else if ( ($v_list[$i] == '') && ($i!=(sizeof($v_list)-1)) && ($i!=0)) { // ----- Ignore only the double '//' in path, // but not the first and last / } else { $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?'/' .$v_result:''); } } } $v_result = strtr($v_result, '\\', '/'); return $v_result; } // }}} // {{{ _translateWinPath() function _translateWinPath($p_path, $p_remove_disk_letter=true) { if (defined('OS_WINDOWS') && OS_WINDOWS) { // ----- Look for potential disk letter if ( ($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { $p_path = substr($p_path, $v_position+1); } // ----- Change potential windows directory separator if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { $p_path = strtr($p_path, '\\', '/'); } } return $p_path; } // }}} } ?> XCloner.php 0000777 00000115252 15213253420 0006641 0 ustar 00 <?php /* * XCloner.php * * Copyright 2011 Ovidiu Liuta <info@thinkovi.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ if(@is_file("../cloner.config.php")){ echo "<h3>Access denied, if you are trying to restore a backup, please move the restore script in another directory!</h3>"; exit; } @set_time_limit(3600); @ini_set("error_reporting", E_ALL^E_NOTICE); ###################### Do not edit Below ############################# $g_pcltar_lib_dir = "./"; require "TAR.php"; $_CONFIG['my_version'] = "3.1.0"; $_CONFIG['script_name'] = "XCloner.php"; $_CONFIG['sql_usefile'] = ""; $_CONFIG['filesLimit'] = 100; $_CONFIG['seek'] = 0; if(isset($_REQUEST['sql_setfile'])) $_CONFIG['sql_usefile'] = $_REQUEST['sql_setfile']; if(trim($_CONFIG['sql_usefile']) == "") $_CONFIG['sql_usefile'] = "database-sql.sql"; if(isset($_REQUEST['strrep'])){ setcookie ("strrep_c", "", time() - 3600); setcookie("strrep_c", str_replace("\r\n","*-*",stripslashes($_REQUEST['strrep'])), time()+3600); /* expire in 1 hour */ }else{ $_REQUEST['strrep'] = str_replace("*-*", "\r\n", $_COOKIE['strrep_c']); } if ($handle = opendir('./')) { /* This is the correct way to loop over the directory. */ while (false !== ($file = readdir($handle))){ $ext = substr($file,strlen($file)-4,strlen($file)); if(($file!='XCloner.php')&&($file!='..')&&($file!='.')&&(($ext=='.tgz')||($ext=='.tar'))){ $_CONFIG[versions][] = $file; } } closedir($handle); }else{ echo "Unable to open my directory for reading and listing!";exit; } ###################################################################### array_map("urldecode", $_REQUEST); $_CONFIG['output_path'] = $_REQUEST['output_path']; $_CONFIG['output_url'] = $_REQUEST['output_url_pref']."://".$_REQUEST['output_url']; $_REQUEST['output_url'] = str_replace("/###","",$_REQUEST['output_url']."###"); $_REQUEST['output_url'] = str_replace("###","",$_REQUEST['output_url']); if(function_exists('filter_var')){ $_CONFIG['output_url'] = filter_var($_CONFIG['output_url'], FILTER_SANITIZE_URL); } $_CONFIG['tmp'] = $_REQUEST['output_path']; if($_REQUEST['files_skip'] == 1) $_REQUEST['do_database'] = 1; if($_REQUEST['fpos']) $_CONFIG['seek'] = $_REQUEST['fpos']; $filepath =$_SERVER["SCRIPT_FILENAME"]; $pathinfo = pathinfo($filepath); $startscript = $pathinfo['dirname']; $_CONFIG[group] = $groupinfo[name]; $_CONFIG[owner] =$ownerinfo[name]; ###################### FRONT AREA ################################### //setCache(); ?> <!DOCTYPE html> <html> <head> <title>XCloner Restore - <?php echo $_SERVER['HTTP_HOST']?> - Backup and Restore Made Easy</title> <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW"> <link REL="SHORTCUT ICON" HREF="http://www.xcloner.com/images/favicon.ico"> <style type="text/css" media="screen"> @import url( http://www.xcloner.com/downloads/style.css ); @import url( http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/themes/start/jquery-ui.css ); .error { color: red; font-size: 15px; } </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.min.js" type="text/javascript"></script> </head> <body> <script> $(function() { $( "#tabs-main" ).tabs(); }); </script> <!-- section 1--> <table align='center' width='700' bgcolor='#eeeeee' style='padding: 0 5px 0 5px;'> <tr><td align='center'><h2><font color=red>XCloner</font> Automatic Restore! - <?php echo $_SERVER['HTTP_HOST']?></h2></td></tr> <tr><td align='left'> <form action='' method='GET' name='form'> <?php switch ($_REQUEST[task]) { case 'step2': step2(); break; case 'step1': step1(); break; case 'getinfo': getPHPINFO(); break; case 'info': echo phpinfo(); break; default : start(); break; } ?> </form> </td></tr> <tr><td> <hr /> <small>XCloner Automatic Restore(<b><?php echo $_CONFIG['my_version']?></b>) - <a href='http://www.xcloner.com' title='XCloner.com - Website Backup Application'>Website Backup and Restore</a> </small> </td></tr> </table> </body> </html> <?php ##################################################################### ##################### FUNCTIONS ##################################### function step2($file=""){ global $_CONFIG,$filepath ; $DBcreated = $_REQUEST[DBcreated]; if ($DBcreated=='on'){ $DBhostname = $_REQUEST['mysql_server']; $DBuserName = $_REQUEST['mysql_username']; $DBpassword = $_REQUEST['mysql_pass']; $DBname = $_REQUEST['mysql_db']; $_CONFIG['mysqli'] = new mysqli($DBhostname, $DBuserName, $DBpassword, $DBname); /* check connection */ if ($_CONFIG['mysqli']->connect_errno) { printf("Connect failed: %s\n", $_CONFIG['mysqli']->connect_error); exit(); } $_CONFIG['mysqli']->query("SET sql_mode='';"); $_CONFIG['mysqli']->query("SET foreign_key_checks = 0;"); if($_REQUEST['charset_of_file']!="") $_CONFIG['mysqli']->query("SET NAMES ".$_REQUEST['charset_of_file'].""); else $_CONFIG['mysqli']->query("SET NAMES utf8;"); } if($_REQUEST['do_database'] != 1){ ############ DATABASE ONLY RESTRICTION################################################## ########################### START FTP MODE ################################# if($_REQUEST[transfer_mode]==2){ $_CONFIG[output_path] = $_CONFIG[output_path]."/archive_tmp/"; @mkdir($_CONFIG[output_path]); // set up basic connection $conn_id = @ftp_connect($_REQUEST[ftp_server], $_REQUEST[ftp_port]) or die("<span class='error'>Could not connect to $_REQUEST[ftp_server] on port $_REQUEST[ftp_port]! Ftp connection has failed!</span>"); // login with username and password $login_result = @ftp_login($conn_id, $_REQUEST[ftp_user], $_REQUEST[ftp_pass]) or die("<span class='error'>Could not login to ftp server for user $_REQUEST[ftp_user] and provided pass! Ftp connection has failed!</span>"); // check connection if ((!$conn_id) || (!$login_result)) { echo "<b style='color:red'>FTP connection has failed!</b>"; echo "<b style='color:red'>Attempted to connect to ".$_REQUEST[ftp_server].":".$_REQUEST[ftp_port]." for user ".$_REQUEST[ftp_user]."</b>"; return; } else { echo "<br />Connected to $_REQUEST[ftp_server], for user $_REQUEST[ftp_user], starting transfer...<br />"; } $ftp_dir_original = ftp_pwd($conn_id); @ftp_mkdir($conn_id,$_REQUEST[ftp_path]); // try to change the directory to somedir if (@ftp_chdir($conn_id, $_REQUEST[ftp_path])) { echo "Current directory is now: <b>" . ftp_pwd($conn_id) . "</b>\n"; } else { echo "<b style='color:red'>Couldn't change directory to <b>$_REQUEST[ftp_path]</b>, please verify that the ftp location exists or use the \"Install files directly\" option!</b><br />\n"; return; } @ftp_chdir($conn_id, $ftp_dir_original); } ########################## END FTP MODE ###################################### ##### START extract ###### if($_REQUEST['refresh'] < 1){ $ext = substr($file, strlen($file)-4, strlen($file)); if($_REQUEST['file_utilities'] != '1'){ $tar_object = new Archive_Tar($file); if($_REQUEST['manual_ftp']){ $tar_object->_openRead(); fseek($tar_object->_file, $_CONFIG['seek']); $seek = $tar_object->_extractList($_CONFIG['output_path'], $return, "partial", "", "", $_CONFIG['filesLimit']); $seek = $seek - 512;//reverse 512 bytes if($seek > 0){ $backupSize = filesize($file); $rurl = rurl($seek, $backupSize); $percent = sprintf("%.2f",($seek*100)/$backupSize); echo "<h3>Processing files - ".$percent."%</h3>"; echo "<script> document.location='".$rurl."'</script>"; return; } $_REQUEST['fpos'] = 0; $_REQUEST['chunk'] = 0; } else{ $tar_object->extract($_CONFIG['output_path']); #$tar_object->extractList("backups/perm.txt", $_CONFIG['output_path']); } }else{ if($ext == '.tgz') $compress = 'z'; else $compress = ''; shell_exec("tar -x".$compress."pf $file -C $_CONFIG[output_path]"); } } ##### END extract ###### $new_arr = array(); #@chmod($_CONFIG[output_path], 0777); $tran_file = $_CONFIG[output_path]."/transfer.txt"; if($_REQUEST[transfer_mode]==2){ # initialise list arrays, directories and files separately and array counters for them $excludedFolders = array(); $d_arr = array(); $d = 0; $ds_arr = array(); $f_arr = array(); $f = 0; $s_arr = array(); $s = 0; $d_arr[$d] = $_CONFIG[output_path]; if($_REQUEST['refresh'] < 1){ # obtain the list of files by recursing the mambo file store recurseFiles($d_arr, $ds_arr, $f_arr, $s_arr, $d, $f, $s, $excludedFolders , '', $_CONFIG[output_path]); recurseFiles($d_arr, $ds_arr, $f_arr, $s_arr, $d, $f, $s, $d_arr , '', $_CONFIG[output_path]); sort($d_arr); sort($f_arr); $new_arr = array_merge($d_arr, $f_arr); if($_REQUEST[transfer_mode]==2) if($fp = fopen($tran_file, "w")){ foreach($new_arr as $file){ fwrite($fp, $file."\n"); } fclose($fp); }else{ echo "Unable to write to directory ".$_CONFIG[output_path]."! Please check that this directory is writeable!"; return; } else{}; }else{ $content = ""; $new_arr = file($tran_file); } if(sizeof($new_arr) != 0 ) $percn = sprintf("%.2f",($_REQUEST[next] * 100)/sizeof($new_arr)); if($percn > sizeof($new_arr)) $percn = sizeof($new_arr); } if($_REQUEST['refresh'] == 1){ echo "<h3>Transfering $percn% of ".sizeof($new_arr)." files through ftp</h3>"; echo "<textarea cols=70 rows=30 name='ftp_list'></textarea>"; } elseif($_REQUEST['refresh'] == 2) echo "Files transfer finished!"; $i = (int)$_REQUEST[next]; $j = 0; ### MOVING THE FILES THROUGH FTP #foreach($new_arr as $key=>$file) for($key=$i;$key<=sizeof($new_arr);$key++){ $file = str_replace(array("\r","\n"), array("",""), $new_arr[$key]); if($_REQUEST['manual_ftp'] == 1) if($j == 100){ #echo "Transfering files from line: ". (int)$_REQUEST[next]; $qstr = explode("&refresh=1&next=",$_SERVER['QUERY_STRING']); $rurl = "XCloner.php?".$qstr[0]."&refresh=1&next=".($_REQUEST[next]+100); ftp_close($conn_id); echo "<script> document.location='".$rurl."'</script>"; exit; } $j++; $sfile = str_replace($_CONFIG[output_path],"",$file); $fsource = $_CONFIG[output_path]."/".$sfile; if(($sfile != "")&&($sfile!="/")) if($_REQUEST[transfer_mode]==2){ $upload = 1; $ftarget = $_REQUEST[ftp_path]."/".$sfile; if(is_dir($fsource)){ $upload1 = @ftp_mkdir($conn_id,$ftarget); }else{ $upload = ftp_put($conn_id, $ftarget, $fsource, FTP_BINARY); } #echo "$i <br >"; if(!$upload){ echo "<br /><font color=red>Transfer fail for $fsource to $ftarget</font> <br />File already exists and/or doesn't have writing permissions!<br/>"; }else{ if($_REQUEST['manual_ftp'] == 1){ $ftarget .= '\n'; echo "<script>document.form.ftp_list.value = document.form.ftp_list.value + '".$ftarget."'; </script>"; #echo "$ftarget <br />\n"; } } } } if($_REQUEST['refresh'] == 1){ $qstr = explode("&refresh=1&next=",$_SERVER['QUERY_STRING']); $rurl = "XCloner.php?".$qstr[0]."&refresh=2&next=".($_REQUEST[next]+102); echo "<script> document.location='".$rurl."'</script>"; exit; } ############### RESTORING HTACCESS AND CONFIGURATION PERM##################################### if($_REQUEST[transfer_mode]==2){ $cmd = "CHMOD 0777 ".$_REQUEST[ftp_path]."/"."wp-config.php"; @ftp_site($conn_id, $cmd); }else{ @chmod($_REQUEST[output_path]."/"."wp-config.php", 0777); } #### CUSTOM PERMISSIONS ##### if($_REQUEST['preserve_perm']){ $perm_data = ""; $perm_file = $_CONFIG[output_path]."/administrator/backups/perm.txt"; $per = 1; @chmod($perm_file,0777); $fp = @fopen($perm_file,'r'); if($fp){ while(!feof($fp)) $perm_data .= fread($fp, 1024); fclose($fp); }else{ echo "Could not set permissions! Permissions file $perm_file not found!<br />"; $per = 0; } $data = explode("\n",$perm_data); foreach($data as $value){ $dir = explode("|", $value); if($dir[1]=="") $dir[1] = '0755'; if(strstr($dir[0],"wp-config.php")) $dir[1] = '0777'; if($_REQUEST[transfer_mode]==2){ $cmd = "CHMOD ".$dir[1]." ".$_REQUEST[ftp_path]."/".$dir[0]; @ftp_site($conn_id, $cmd); }else{ @chmod($_CONFIG[output_path]."/".$dir[0], octdec($dir[1])); } } if($per){ echo "<h2>Permissions restored to their initial value...</h2>"; } } #### END CUSTOM PERMISSIONS ##### $_CONFIG[output_path] = str_replace("/archive_tmp/","",$_CONFIG[output_path]); if($_REQUEST[transfer_mode]==2){ // close the FTP stream @ftp_close($conn_id); recursive_remove_directory($_CONFIG[output_path]."/archive_tmp/"); @unlink($_CONFIG[output_path]."/archive_tmp/"); echo "<h2>Files succesfully copied to ".$_REQUEST[ftp_path]." on $_REQUEST[ftp_server] using FTP</h2>"; }else{ echo "<h2>Files succesfully copied to ".$_CONFIG[output_path]."</h2>"; } ######### END DATABASE ONLY RESTRICT ######################################### } ##### RESTORE CONFIGURATION ##### $update_config = 1; if(($_REQUEST['files_skip']) and (isset($_REQUEST['fpos']))){ $update_config = 0; } if(($_REQUEST['do_database'] != 1) || ($_REQUEST['files_skip'] == 1)){ $config_file = $_CONFIG[output_path]."/wp-config.php"; @chmod($config_file,0777); @unlink($_CONFIG[output_path]."/administrator/backups/perm.txt"); if(($_CONFIG['sql_usefile'] == "database-sql.sql") and ($update_config)) if(write_config($config_file)){ echo "<H2>Configuration updated!</H2>"; }else{ echo "<span class='error'>Unable to write to configuration file $config_file... Aborting...</span>";return; } } ############ ATTEMPT DATABASE INSERT ##################################### if($DBcreated!='on'){ echo "<h2>Database import skipped!</h2>"; echo "<a href='".$_CONFIG[output_url]."'><b>All should be done! Click here to continue...</b></a><br />"; return ; } if (($DBcreated=='on')&&($_REQUEST['do_database'] == 1)){ $sqlfile = $_CONFIG[output_path]."/administrator/backups/".$_CONFIG['sql_usefile']; if(!file_exists($sqlfile)){ echo "<span class='error'>Unable to read the database backup file $sqlfile , database was not imported!</span>"; }else{ if($_REQUEST['manual_sql']) $errors = populate_db_manual( $db, $sqlfile); else $errors = populate_db( $db, $sqlfile); if(sizeof($errors)>0){ echo "There were some errors while importing the database:<br />"; echo "<textarea cols=60 rows=30>".implode("\n",$errors)."</textarea>"; exit; }else{ @unlink($_CONFIG[output_path]."/administrator/backups/".$_CONFIG['sql_usefile']); } echo "<h2>Database populated...</h2>"; } } ################################################################################### if($_REQUEST['do_database'] != 1) { $vars = ""; foreach($_REQUEST as $key=>$value) $vars .= $key.'='.@urlencode($value).'&'; #$href = "XCloner.php?".$vars."do_database=1"; $href = rurl()."&do_database=1"; echo "<br /><a href='$href'>Please click here to continue with database import...</a>"; return; }else{ echo "<br /><a href='".$_CONFIG[output_url]."'><b>All should be done! Click here to continue...<br /></a><br />"; return ; } } function write_config($file){ global $_CONFIG; if(@$fp = fopen($file, "r")){ $config_data = ""; while(!feof($fp)) $config_data .= fread($fp, 1024); fclose($fp); } if ($_REQUEST[DBcreated] == 'on'){ $config_data = str_replace("define('DB_HOST', '", "define('DB_HOST', '".$_REQUEST[mysql_server]."');#", $config_data); $config_data = str_replace("define('DB_USER', '", "define('DB_USER', '".$_REQUEST[mysql_username]."');#", $config_data); $config_data = str_replace("define('DB_PASSWORD', '", "define('DB_PASSWORD', '".$_REQUEST[mysql_pass]."');#", $config_data); $config_data = str_replace("define('DB_NAME', '", "define('DB_NAME', '".$_REQUEST[mysql_db]."');#", $config_data); $liveurl = $_CONFIG['output_url']; $config_data = str_replace("define('DB_HOST", "define('WP_SITEURL','".$liveurl."');\ndefine('WP_HOME','".$liveurl."');\ndefine('RELOCATE',true);\ndefine('DB_HOST", $config_data); $config_data = str_replace("define('WP_SITEURL', '", "define('WP_SITEURL', '".$liveurl."');#", $config_data); $config_data = str_replace("define('WP_HOME', '", "define('WP_HOME', '".$liveurl."');#", $config_data); } if($_REQUEST['transfer_mode'] == 2){ $config_data = str_replace('$'.'ftp_host =',"$"."ftp_host ='".$_REQUEST[ftp_server]."';#", $config_data); $config_data = str_replace('$'.'ftp_port =',"$"."ftp_port ='".$_REQUEST[ftp_port]."';#", $config_data); $config_data = str_replace('$'.'ftp_user =',"$"."ftp_user ='".$_REQUEST[ftp_user]."';#", $config_data); $config_data = str_replace('$'.'ftp_pass =',"$"."ftp_pass ='".$_REQUEST[ftp_pass]."';#", $config_data); $config_data = str_replace('$'.'ftp_root =',"$"."ftp_root ='".$_REQUEST[ftp_path]."';#", $config_data); }else{ $config_data = str_replace('$'.'ftp_enable =',"$"."ftp_enable ='0';#", $config_data); } $config_data = str_replace('$'.'live_site =',"$"."live_site ='".$_CONFIG['output_url']."';#", $config_data); $config_data = str_replace('$'.'absolute_path =',"$"."absolute_path ='".$_CONFIG['output_path']."';#", $config_data); if ($fp = fopen($file, "w")) { fwrite( $fp, $config_data); fclose( $fp ); } else { return false; } // if return true; } function step1(){ global $_CONFIG; $ftarget = $_CONFIG[output_path]."/".$_REQUEST[ver]; if($_REQUEST['refresh'] < 1) if(!is_writable($_CONFIG[output_path])){ echo "<span class='error'>Directory ".$_CONFIG[output_path]." is not writeable or does not exists! Could not continue...</span>"; return ; } $ftarget = $_REQUEST[ver]; if((!file_exists($ftarget)) and (!$_REQUEST['files_skip'])){ echo "<span class='error'>Could not continue, unable to read the clone backup file! Please make sure you copied the backup in the same directory as XCloner.php </span>"; return; } step2($ftarget); return; } function start() { global $_CONFIG,$pathinfo; $pdir = str_replace($_CONFIG['script_name'], "", $_SERVER["SCRIPT_FILENAME"]); $purl = $_SERVER['HTTP_HOST'].str_replace("/".$_CONFIG['script_name'],"", $_SERVER['SCRIPT_NAME']); ?> <script> $(function() { $( "#DBcreated" ).button(); $( "#phpinfo").button(); $( "#manual_sql" ).button(); $( "#transfer_mode-ftp" ).button(); $( "#transfer_mode-direct" ).button(); $( "input:submit", ".form" ).button(); }); $(function() { $( "#tabs" ).tabs(); $( "#tabs2" ).tabs(); }); </script> <!-- section 1--> <div id="tabs2"> <ul> <li><a href="#tabs2-1">New Path & Url Configuration</a></li> </ul> <div id="tabs2-1"> <table class="adminForm"> <tr><td nowrap> 1. Install directory: (server path where you want to restore your backup)<br /> <input type=text size=80 name='output_path' value='<?php echo str_replace("\\", "/", $pdir);?>'><br > </td></tr> <tr><td> <br />2.Install Url: (the url correspondent of your Install directory:)<br /> <div style="display:inline"> <div style="float:left"> <select name='output_url_pref'> <option selected value='http'>http://</option> <option value='https'>https://</option> </select> </div> <div style="float:left"> <input type=text size=65 name='output_url' value='<?php echo $purl?>'> </div> </div> </td></tr> <tr><td> <br />3. Choose backup archive to restore: <?php echo version_list('ver');?> </td></tr> </table> </div> </div> <!-- end section 1--> <div id="tabs"> <ul> <li><a href="#tabs-1">New Mysql Configuration</a></li> <li><a href="#tabs-2">File Restore Options</a></li> </ul> <div id="tabs-1"> <!--start tabs 1 --> <table width="100%"> <tr><td> <!--<h3><a href="#">Mysql configuration: </a></h3>--> <input type=checkbox checked name='DBcreated' id="DBcreated"> <label for="DBcreated">Import mysql database</label> <input type='checkbox' value='1' name='manual_sql' checked id="manual_sql"> <label for="manual_sql">Incremental sql import</label> </td></tr> <tr><td> <!-- mysql details --> <table width='100%'> <tr> <td nowrap>Mysql server:</td> <td><input type=text size=40 name='mysql_server' value='localhost'></td> <tr> <td>Mysql username:</td> <td><input type=text size=40 name='mysql_username' value=''></td> </tr> <tr> <td>Mysql password:</td> <td><input type=text size=40 name='mysql_pass' value=''></td> </tr> <tr> <td>Mysql database:</td> <td><input type=text size=40 name='mysql_db' value=''></td> </tr> <tr> <td>Data encoding:</td> <td> <select name="charset_of_file"> <option value="" selected="selected">Default</option> <option value="big5" title="Big5 Traditional Chinese">big5</option> <option value="binary" title="Binary pseudo charset">binary</option> <option value="cp1250" title="Windows Central European">cp1250</option> <option value="cp932" title="SJIS for Windows Japanese">cp932</option> <option value="euckr" title="EUC-KR Korean">euckr</option> <option value="gb2312" title="GB2312 Simplified Chinese">gb2312</option> <option value="gbk" title="GBK Simplified Chinese">gbk</option> <option value="latin1" title="cp1252 West European">latin1</option> <option value="latin2" title="ISO 8859-2 Central European">latin2</option> <option value="sjis" title="Shift-JIS Japanese">sjis</option> <option value="tis620" title="TIS620 Thai">tis620</option> <option value="ucs2" title="UCS-2 Unicode">ucs2</option> <option value="ujis" title="EUC-JP Japanese">ujis</option> <option value="utf8" title="UTF-8 Unicode" >utf8</option> </select> </td> </tr> <?php $dir = "administrator/backups/"; $sql_files =array(); if(@is_dir($dir)){ if ($handle = @opendir($dir)) { /* This is the correct way to loop over the directory. */ while (false !== ($file = @readdir($handle))) { if(strstr($file, ".sql")) $sql_files[] = $file; } @closedir($handle); } if(sizeof($sql_files) > 0) { $list = ""; for($i=0;$i<sizeof($sql_files);$i++){ $list .= "<option value='$sql_files[$i]'>$sql_files[$i]</option>"; } echo "<tr><td>Import Mysql file:</td> <td><select name='sql_setfile'><option value='database-sql.sql'>Default</option>$list</select></td> </tr>"; } } ?> </table> </tr></td> <!-- end mysql details --> </table> <!--end tabs 1 --> </div> <div id="tabs-2"> <!-- start tabs 2 --> <table width="100%"> <tr bgcolor='#dddddd'><td> <!--<h3><a href="#">Files transfer and configuration:</a></h3>--> <input type=checkbox name='files_skip' value='1' > <font color='red'>Skip files restore</font><br /> <input type=checkbox name='preserve_perm' value='1'> Restore files permissions<br /> <input type=checkbox name='file_utilities' value='1' > Restore by using the server utilities(tar) <br /> <input type='checkbox' value='1' name='manual_ftp' checked> Incremental transfer </td></tr> <tr><td colspan=2> <table width='100%'> <tr><td colspan='2'> <label for="transfer_mode-ftp">Install files throught ftp:</label> <input type=radio name=transfer_mode value=2 id="transfer_mode-ftp"> <!--<small>this will attempt to transfer all files through ftp, so the owner keep it's permissions, can be used to send files to other hosts also, <font color=red>*recommended</font></small>--> <label for="transfer_mode-direct">Install files directly</label> <input type=radio name=transfer_mode value=1 checked id="transfer_mode-direct"><br /> <!--<small>transfering the files directly will cause some permissions problems in some cases, but it's faster than the other option </small>--> </td></tr> <tr> <td valign="top" nowrap>Ftp server:</td> <td><input type=text size=30 name='ftp_server' value='localhost'> : <input type=text size=3 name='ftp_port' value='21'></td> </tr> <tr> <td valign="top">Ftp username:</td> <td><input type=text size=30 name='ftp_user'></td> </tr> <tr> <td valign="top">Ftp password:</td> <td><input type=text size=30 name='ftp_pass'></td> </tr> <tr> <td valign="top">Ftp upload path:</td> <td><input type=text size=30 name='ftp_path'> <br><small>ftp root path of where the backup will be restored</small> </td> </tr> </table> </td></tr> </table> <!--end tabs 2--> </div> </div> <br /> <div class="form"> <input type=hidden name='task' value='step1'> <input type=submit name=submit value='Start install' > <button onclick="window.open('XCloner.php?task=getinfo', 'getInfo', 'toolbar,width=750,height=400'); return false;" id="phpinfo">phpinfo()</button> </div> <small>*after hitting submit please wait for the package to get unarchived and transfered through ftp if it is the case!</small> <br /> <span class="ui-state-highlight"> <span style='color:red'>Security Note:</span> After restore <b>delete the XCloner.php</b> script from your server</span> </span> <?php } function getPHPINFO(){ ?> <table width='100%'> <tr bgcolor='#dddddd'><td> <b>PHP Configuration: <a target='_blank' href='XCloner.php?task=info'> phpinfo()</a></b> </td></tr> <tr><td> <table bgcolor='#dddddd' width='65%' style='text-align:center;' border='1'> <tr> <td><b style='color:red'>PHP Setting</b></td> <td><b style='color:orange'>Current Value</b></td> <td><b style='color:green'>Recomemnded</b></td> </tr> <tr> <td><b>Open_Basedir:</b> </td> <td> <?php echo (@ini_get('open_basedir') ? @ini_get('open_basedir') : 'No value')?> </td> <td><b>No Value</b></td> </tr> <tr> <td><b>Max Execution Time:</b> </td> <td> <?php echo (@ini_get('max_execution_time') ? @ini_get('max_execution_time') : 'No value')?> </td> <td><b>>30</b></td> </tr> <tr> <td><b>Safe mode:</b> </td> <td> <?php echo (@ini_get('safe_mode') ? @ini_get('safe_mode') : 'Off')?> </td> <td><b>Off</b></td> </tr> </table> </td></tr> </table> <?php } ###END ###Starting the manual sql backup function populate_db_manual( $db, $sqlfile='administrator/backups/database-sql.sql'){ global $qstr, $_CONFIG; $extra_que = $qstr[0]; $file = $sqlfile; define ('DATA_CHUNK_LENGTH',16384); // How many chars are read per time define ('MAX_QUERY_LINES',300); // How many lines may be considered to be one query (except text lines) $lines = ""; $error = ""; $error_status = 0; if((isset($_REQUEST['chunk']))&&((int)$_REQUEST['chunk'] != 0)) $chunk = $_REQUEST['chunk']; else $chunk = DATA_CHUNK_LENGTH; if($_REQUEST['correct_query'] != 1){ $start_pos = (int)$_REQUEST['fpos']; $fpos = read_file($file, MAX_QUERY_LINES, $start_pos, $chunk, $lines); }else{ $lines[0] = stripslashes($_REQUEST['error_msg']); $fpos = $_REQUEST['start_posf'] ; } foreach($lines as $line) if(trim($line) != ''){ $query = $line; $line = $line .";\n"; #$tmp = explode("DEFAULT CHARSET",$line); $line_tmp = $line; $start_pos = $start_pos + strlen($line); if(isset($_REQUEST['strrep'])) { $strrep = explode("\r\n", stripslashes($_REQUEST['strrep'])); foreach($strrep as $value) if(trim($value)!= ""){ $tmp = explode("|", $value); $line_tmp = str_replace(trim($tmp[0]),trim($tmp[1]),$line_tmp); $query = str_replace(trim($tmp[0]),trim($tmp[1]),$query); } } if(!$_CONFIG['mysqli']->query($line_tmp)){ if($_REQUEST['correct_query'] != 1) $fpos = $start_pos ; $form_url = rurl($fpos, $chunk); echo "</form><form name='' action='".$form_url."' method='POST'> <input type='hidden' name='correct_query' value = '1'> <input type='hidden' name='start_pos' value='".($start_pos-strlen($line))."'> <input type='hidden' name='start_posf' value='".$fpos."'> <input type='hidden' name='glen' value='".$qlen."'> <center>"; echo sprintf("<b>###MYSQL error</b>\n<br /><font color='red'>".$_CONFIG['mysqli']->error."</font><br />\n<b>###On Query:</b><br />\n<br /><textarea cols=70 rows=15 name='error_msg'>%s</textarea><br />", $query); echo "<b>Search and replace in query:</b><br /><textarea cols=70 rows=5 name='strrep'>".stripslashes($_REQUEST[strrep])."</textarea><br /> <small> enter a string, one per line, which you would like to replace in the query above, example <i>string_to_search|text_to_replace_with</i> </small>"; echo "<br /> <input type=submit name=submit value='Correct Query >>'>"; echo "</center></form>"; $error_status = 1; break; } } $percent = sprintf("%.2f", (100*$fpos)/ filesize($file)); if($fpos!='-1'){ echo "<h3>Processed $percent% from sql backup!</h3>"; $red_url = rurl($fpos, $chunk); if($error_status == 1 ){ echo "<h3><a href='".$red_url."'>To skip this query, click here to Continue</a></h3>"; exit; }else{ echo "<h3><a href='".$red_url."'>Continue here</a></h3>"; echo "<script>window.location='".$red_url."'</script>"; exit; } } else { echo "<h3>The sql import is finished!</h3>"; } return; } ########END ### STARTING THE AUTOMATIC BACKUP function populate_db( $db, $sqlfile='administrator/backups/database-sql.sql') { global $errors, $_CONFIG; if($_REQUEST['use_mysqldump'] == 1){ echo shell_exec($_REQUEST['mysqldump_path']." -u ".$_REQUEST[mysql_username]." -p".$_REQUEST[mysql_pass]." -h ".$_REQUEST[mysql_server]." ".$_REQUEST[mysql_db]." < ".$sqlfile); return; } $mqr = @get_magic_quotes_runtime(); @set_magic_quotes_runtime(0); @chmod($sqlfile,0777); $query = fread( fopen( $sqlfile, 'r' ), filesize( $sqlfile ) ); @set_magic_quotes_runtime($mqr); $pieces = split_sql($query); for ($i=0; $i<count($pieces); $i++) { $pieces[$i] = trim($pieces[$i]); $tmp = explode("DEFAULT CHARSET",$pieces[$i]); $pieces[$i] = $tmp[0].";"; if(!empty($pieces[$i]) && $pieces[$i] != "#") { if (!$_CONFIG['mysqli']->query($pieces[$i], $db)) { $errors[] = "\n\n##Mysql Query: \n########\n". $pieces[$i]. "\n########\n##Error message: ". $_CONFIG['mysqli']->error; } } } return $errors; } function rurl($fpos = 0, $chunk = 0){ $get_query = "&"; foreach($_REQUEST as $key=>$value){ if(($key != 'fpos')&&($key != 'chunk')&&($key != 'strrep_c')&&($key != 'strrep') && ($key != "error_msg") && ($key != "correct_query") ) $get_query .= $key."=".urlencode($value)."&"; } $url = $_SERVER['PHP_SELF']."?fpos=".$fpos."&chunk=".$chunk.$get_query; return $url; } function read_file($file, $lines, $start_pos, &$chunk, &$text){ $cline = 0; $fp = fopen($file, "r"); fseek($fp, $start_pos); while((!feof($fp)) &&($cline <= $lines)){ $btemp = fgets($fp, $chunk); $buffer .= $btemp; if(strstr($btemp, ";\n")) $cline++; $fpos = ftell($fp); } $buffer = str_replace(";\r", ";\n", $buffer); $text = explode(";\n", $buffer); $fpos = $fpos - strlen($text[sizeof($text)-1]); if(sizeof($text) == 1) $chunk = DATA_CHUNK_LENGTH+$chunk; else $chunk = DATA_CHUNK_LENGTH; if(feof($fp)) $fpos = '-1'; fclose ($fp); return $fpos; // array_reverse is optional: you can also just return the $text array which consists of the file's lines. } /** * @param string */ function split_sql($sql) { $ret = array(); $sql = str_replace("\n) ", "\n) ;\n#\n#", $sql); $sql = str_replace("\n--\n","\n#\n",$sql); $sql = str_replace("\n-- ","\n# ",$sql); $sql = str_replace("\n/*","\n#/*",$sql); $sql = str_replace("#\n", "#;\n", $sql); // Processing the SQL file content $file_content = explode("\n",$sql); $query = ""; // Parsing the SQL file content foreach($file_content as $key=>$sql_line) { if(substr($sql_line, 0, 2) == "--") $sql_line = "#".substr($sql_line, 2, strlen($sql_line)); if(trim($sql_line) != "" ){ $query .= $sql_line; // Checking whether the line is a valid statement if(preg_match("/(.*);/", $sql_line)){ $query = substr($query, 0, strlen($query)-1); //Executing the parsed string, returns the error code in failure $ret[] = $query; $query = ""; } } } //End of foreach return($ret); } function recurseFiles(&$d_arr, &$ds_arr, &$f_arr, &$s_arr, &$d, &$f, &$s, &$includedFolders, $path, $mosConfig_absolute_path) { $currentfullpath = $mosConfig_absolute_path.$path; # Open possibly available directory if( is_dir( $currentfullpath ) ) { if( $handle = opendir( $currentfullpath ) ) { while( false !== ( $file = readdir( $handle ) ) ) { # Make sure we don't push parental directories or dotfiles (unix) into the arrays if( $file != "." && $file != ".." ) { if( is_dir( $currentfullpath . "/" . $file ) ) { # Create array for directories $d_arr[++$d] = $currentfullpath . "/" . $file; recurseFiles($d_arr, $ds_arr, $f_arr, $s_arr, $d, $f, $s, $includedFolders, $path . "/" . $file, $mosConfig_absolute_path); } else { if ( in_array($currentfullpath, $includedFolders) ) { # Create array for files $s_arr[$f] = filesize($currentfullpath.'/'.$file); $f_arr[$f++] = str_replace($mosConfig_absolute_path.'/', '', $currentfullpath.'/').$file; $s += filesize($currentfullpath.'/'.$file); } } } } } # Wrap things up if we're in a directory if( is_dir( $handle ) ) closedir( $handle ); } } function version_list($fname) { global $_CONFIG; $return = "<select name='$fname'><option value=''>Choose local clone archive</option>"; if(is_array($_CONFIG[versions])){ foreach($_CONFIG[versions] as $key=>$value){ $size = sprintf("%.2fM", filesize($value)/(1024*1024)); $return .= "<option selected value='$value'>$value($size)</option>"; } } $return .= "</select>"; return $return; } function recursive_remove_directory($directory, $empty=FALSE){ // if the path has a slash at the end we remove it here if(substr($directory,-1) == '/'){ $directory = substr($directory,0,-1); } // if the path is not valid or is not a directory ... if(!file_exists($directory) || !is_dir($directory)){ // ... we return false and exit the function return FALSE; // ... if the path is not readable }elseif(!is_readable($directory)){ // ... we return false and exit the function return FALSE; // ... else if the path is readable }else{ // we open the directory $handle = opendir($directory); // and scan through the items inside while (FALSE !== ($item = readdir($handle))){ // if the filepointer is not the current directory // or the parent directory if($item != '.' && $item != '..'){ // we build the new path to delete $path = $directory.'/'.$item; // if the new path is a directory if(is_dir($path)){ // we call this function with the new path recursive_remove_directory($path); // if the new path is a file }else{ // we remove the file unlink($path); } } } // close the directory closedir($handle); // if the option to empty is not set to true if($empty == FALSE){ // try to delete the now empty directory if(!@rmdir($directory)){ // return false if not possible return FALSE; } } // return success return TRUE; } } function setCache($time = 3600){ $seconds_to_cache = $time; $ts = gmdate("D, d M Y H:i:s", time() + $seconds_to_cache) . " GMT"; @header("Expires: $ts"); @header("Pragma: cache"); @header("Cache-Control: maxage=$seconds_to_cache"); } ?>
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0 |
proxy
|
phpinfo
|
Settings