180){
$keepalive = 60;
}
}
ignore_user_abort(true); // Dont abort if user aborts
//error_reporting(E_ALL);
//Constants
define('ARCHIVE_TAR_ATT_SEPARATOR', 90001);
define('ARCHIVE_TAR_END_BLOCK', pack('a512', ''));
include_once __DIR__ .'/lib/Curl/Curl.php';
use Curl\Curl;
function backuply_died() {
$last_error = error_get_last();
if(!$last_error){
return false;
}
if(!empty($last_error['type']) && ($last_error['type'] === E_ERROR || $last_error['type'] === E_PARSE)){
backuply_log($last_error['message'], true);
}
// To show the memory limit error.
if(strpos($last_error['message'], 'Allowed memory size') !== FALSE){
backuply_status_log($last_error['message'] . 'you can solve this issue by increasing PHP memory_limit', 'error');
}
if(strpos($last_error['message'], 'Maximum execution time') !== FALSE){
//backuply_log('Didnt Come inside max execution');
backuply_status_log('Your server reached PHP maximum execution time, to solve this issue you can increase PHP max_execution_time', 'error');
backuply_kill_process();
}
}
register_shutdown_function('backuply_died');
function backuply_glob($relative_path){
global $data;
$glob = glob(dirname(__FILE__, 3) .'/backuply/'. $relative_path .'-*', GLOB_ONLYDIR);
if(!empty($glob[0])){
return $glob[0];
}
return false;
}
// Update Backuply logs as per action
function backuply_log($info, $is_fatal = false){
global $data;
if(empty($data['debug_mode']) && empty($is_fatal)){
return;
}
$write = '';
$write .= '['.date('Y-m-d H:i:s', time()).'] ';
$write .= $info."\n\n";
$log_file = backuply_glob('backups_info') .'/debug.php';
$fp = @fopen($log_file, 'ab');
if (0 == filesize($log_file)){
// file is empty
@fwrite($fp, "\n");
}
@fwrite($fp, $write);
@fclose($fp);
@chmod($log_file, 0600);
}
// Returns the Security key
function backuply_get_config() {
$config_file = dirname(__FILE__, 3) . '/backuply/backuply_config.php';
if(!file_exists($config_file) || 0 == filesize($config_file)) {
return false;
}
$fp = @fopen($config_file, 'r');
@fseek($fp, 16);
$content = @fread($fp, filesize($config_file));
@fclose($fp);
$config = json_decode($content, true);
return $config;
}
function backuply_kill_process() {
global $error, $data;
if(file_exists(dirname(__FILE__, 3).'/backuply/restoration/restoration.php')) {
@unlink(dirname(__FILE__, 3).'/backuply/restoration/restoration.php');
}
restore_clean();
$error[] = 'The Restore has been killed Successfully';
// Deleting restore index file
if(!empty($data['softpath']) && file_exists($data['softpath'] . '/backuply-restore.php')){
unlink($data['softpath'] . '/backuply-restore.php');
}
backuply_die('restore_killed');
}
function restore_got_killed() {
if(!file_exists(dirname(__FILE__, 3).'/backuply/restoration/restoration.php')) {
restore_clean();
backuply_die('got_killed');
}
}
function backuply_preg_replace($pattern, $file, &$var, $valuenum, $stripslashes = ''){
preg_match($pattern, $file, $matches);
if(empty($stripslashes)){
$var = trim($matches[$valuenum]);
}else{
$var = stripslashes(trim($matches[$valuenum]));
}
}
// Verifies the backuply key
function backuply_verify_self() {
//backuply_log($_REQUEST['restore_key']);
if(empty($_REQUEST['restore_key'])) {
return false;
}
$config = backuply_get_config();
if(!$config) {
return false;
}
if(urldecode($_REQUEST['restore_key']) == $config['RESTORE_KEY']) {
return true;
}
return false;
}
function backuply_inputsec($string){
//get_magic_quotes_gpc is depricated in php 7.4
if(version_compare(PHP_VERSION, '7.4', '<')){
if(!get_magic_quotes_gpc()){
$string = addslashes($string);
}else{
$string = stripslashes($string);
$string = addslashes($string);
}
}else{
$string = addslashes($string);
}
// This is to replace ` which can cause the command to be executed in exec()
$string = str_replace('`', '\`', $string);
return $string;
}
function backuply_htmlizer($string){
global $globals;
$string = htmlentities($string, ENT_QUOTES, 'UTF-8');
preg_match_all('/(&#(\d{1,7}|x[0-9a-fA-F]{1,6});)/', $string, $matches);//backuply_print($matches);
foreach($matches[1] as $mk => $mv){
$tmp_m = backuply_entity_check($matches[2][$mk]);
$string = str_replace($matches[1][$mk], $tmp_m, $string);
}
return $string;
}
class softtar{
var $_tarname='';
var $_compress=false;
var $_compress_type='none';
var $_separator=',';
var $_file=0;
var $_temp_tarname='';
var $_ignore_regexp='';
var $error_object=null;
var $_local_tar=''; // The local file
var $_orig_tar=''; // The remote file
var $remote_fp=''; // The remote file pointer
var $remote_fp_filter = NULL;
var $remote_hctx = NULL;
var $remote_content_size = 0;
function __construct($p_tarname, $p_compress = null, $handle_remote = false){
// $tmpdir is mainly used for REMOTE protocols so that we can write locally and append on the remote server
if(preg_match('/\:\/\//', $p_tarname) && $handle_remote){
$tmpdir = backuply_glob('backups') . '/tmp';
$this->_orig_tar = $p_tarname;
$p_tarname = $tmpdir.'/'.md5($p_tarname);
$this->_local_tar = $p_tarname;
$GLOBALS['local_tarname'] = $this->_local_tar;
}
$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 {
$this->_error("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)) {
$this->_error("The extension '$extname' couldn't be found.\n".
"Please make sure your version of PHP was built ".
"with '$extname' support.\n");
return false;
}
}
}
// }}}
function __destruct(){
$this->_softtar();
}
// {{{ destructor
function _softtar(){
$this->_close();
// ----- Look for a local copy to delete
if ($this->_temp_tarname != '')
@unlink($this->_temp_tarname);
}
// }}}
// {{{ create()
function create($p_filelist){
return $this->createModify($p_filelist, '', '');
}
// }}}
// {{{ add()
function add($p_filelist){
return $this->addModify($p_filelist, '', '');
}
// }}}
// {{{ extract()
function extract($p_path='', $p_preserve=false){
return $this->extractModify($p_path, '', $p_preserve);
}
// }}}
// {{{ 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()
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()
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()
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()
function extractModify($p_path, $p_remove_path, $p_preserve=false){
$v_result = true;
$v_list_detail = array();
// Download the archive if its remote
// if(!empty($this->_orig_tar)){
// $this->remote_archive_download_loop();
// }
if ($v_result = $this->_openRead()) {
$v_result = $this->_extractList($p_path, $v_list_detail,
'complete', 0, $p_remove_path, $p_preserve);
$this->_close();
}
return $v_result;
}
// }}}
// {{{ extractInString()
function extractInString($p_filename){
if ($this->_openRead()) {
$v_result = $this->_extractInString($p_filename);
$this->_close();
} else {
$v_result = null;
}
return $v_result;
}
// }}}
// {{{ extractList()
function extractList($p_filelist, $p_path='', $p_remove_path='', $p_preserve=false){
$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, $p_preserve);
$this->_close();
}
return $v_result;
}
// }}}
// {{{ setAttribute()
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;
}
// }}}
// {{{ setIgnoreRegexp()
function setIgnoreRegexp($regexp){
$this->_ignore_regexp = $regexp;
}
// }}}
// {{{ setIgnoreList()
function setIgnoreList($list){
$regexp = str_replace(array('#', '.', '^', '$'), array('\#', '\.', '\^', '\$'), $list);
$regexp = '#/'.join('$|/', $list).'#';
$this->setIgnoreRegexp($regexp);
}
// }}}
// {{{ _error()
function _error($p_message){
//we have changed this since PEAR is not used
//$this->error_object = &$this->raiseError($p_message);
trigger_error($p_message, E_USER_WARNING);
}
// }}}
// {{{ _warning()
function _warning($p_message){
//we have changed this since PEAR is not used
//$this->error_object = &$this->raiseError($p_message);
trigger_error($p_message, E_USER_NOTICE);
}
// }}}
// {{{ _isArchive()
function _isArchive($p_filename=null){
if ($p_filename == null) {
$p_filename = $this->_tarname;
}
clearstatcache();
return @is_file($p_filename) && !@is_link($p_filename);
}
// }}}
// {{{ _openWrite()
function _openWrite(){
if ($this->_compress_type == 'gz' && function_exists('gzopen'))
$this->_file = @gzopen($this->_tarname, "wb9");
else if ($this->_compress_type == 'bz2' && function_exists('bzopen'))
$this->_file = @bzopen($this->_tarname, "w");
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(){
global $ftp, $can_write;
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, "r");
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->_error('Unable to open bz2 in read/write mode \''
.$this->_tarname.'\' (limitation of bz2 extension)');
return false;
} 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, $finished = false){
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'){
$cur = ftell($this->_file);
$v_block = @fread($this->_file, 512);
// We always need to read 512 blocks and in some cases we do not get complete 512 blocks due to network issues
// This is a fix to retry if we did not get 512 blocks
$retry = 0;
$read = strlen($v_block); // How much did we read ?
while($read != 512 && !feof($this->_file)){
if($retry >= 3){ // We can try max for 3 times
break;
}
$toread = 512 - $read; // How many blocks did we miss ?
$tmp_block = @fread($this->_file, $toread); // Read the missing blocks
$v_block .= $tmp_block; // Add it to the existing content
$read = strlen($v_block); // Update the length of updated content
$retry++;
}
}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, $p_len*512, SEEK_CUR);
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;
// ----- ignore files and directories matching the ignore regular expression
if($this->_ignore_regexp && preg_match($this->_ignore_regexp, '/'.$v_filename)){
$this->_warning("File '$v_filename' ignored");
continue;
}
if(!file_exists($v_filename) && !is_link($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) && !@is_link($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);
$v_reduce_filename = str_replace($GLOBALS['replace']['from'], $GLOBALS['replace']['to'], $v_reduce_filename);
//echo $v_reduce_filename."
";
if(strlen($v_reduce_filename) > 99){
if(!$this->_writeLongHeader($v_reduce_filename))
return false;
}
$v_info = lstat($p_filename);
$v_uid = sprintf("%07s", DecOct($v_info[4]));
$v_gid = sprintf("%07s", DecOct($v_info[5]));
$v_perms = sprintf("%07s", DecOct($v_info['mode'] & 000777));
$v_mtime = sprintf("%011s", DecOct($v_info['mtime']));
$v_linkname = '';
if(@is_link($p_filename)){
$v_typeflag = '2';
$v_linkname = readlink($p_filename);
$v_size = sprintf("%011s", DecOct(0));
} elseif (@is_dir($p_filename)){
$v_typeflag = "5";
$v_size = sprintf("%011s", DecOct(0));
} else {
$v_typeflag = '0';
clearstatcache();
$v_size = sprintf("%011s", DecOct($v_info['size']));
}
// We have to write the entries for datadir permissions softdatadir/softperms.txt
if(isset($GLOBALS['bfh']['softperms']) && preg_match('/'.preg_quote($GLOBALS['replace']['from']['softpath'], '/').'/is', $p_filename)){
fwrite($GLOBALS['bfh']['softperms'], trim($v_reduce_filename, '/')." ". (substr(sprintf('%o', fileperms($p_filename)), -4)) ."\n");
}
$v_magic = 'ustar ';
$v_version = ' ';
if (function_exists('posix_getpwuid')){
$userinfo = posix_getpwuid($v_info[4]);
$groupinfo = posix_getgrgid($v_info[5]);
$v_uname = $userinfo['name'];
$v_gname = $groupinfo['name'];
} else {
$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("%06s ", 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("%011s", DecOct(0));
} else {
$v_size = sprintf("%011s", DecOct($p_size));
}
$v_uid = sprintf("%07s", DecOct($p_uid));
$v_gid = sprintf("%07s", DecOct($p_gid));
$v_perms = sprintf("%07s", DecOct($p_perms & 000777));
$v_mtime = sprintf("%11s", DecOct($p_mtime));
$v_linkname = '';
$v_magic = 'ustar ';
$v_version = ' ';
if(function_exists('posix_getpwuid')){
$userinfo = posix_getpwuid($p_uid);
$groupinfo = posix_getgrgid($p_gid);
$v_uname = $userinfo['name'];
$v_gname = $groupinfo['name'];
}else{
$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("%06s ", 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("%06s ", 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));
if (version_compare(PHP_VERSION, "5.5.0-dev") < 0) {
$fmt = "a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/" .
"a8checksum/a1typeflag/a100link/a6magic/a2version/" .
"a32uname/a32gname/a8devmajor/a8devminor/a131prefix";
} else {
$fmt = "Z100filename/Z8mode/Z8uid/Z8gid/Z12size/Z12mtime/" .
"Z8checksum/Z1typeflag/Z100link/Z6magic/Z2version/" .
"Z32uname/Z32gname/Z8devmajor/Z8devminor/Z131prefix";
}
$v_data = unpack($fmt, $v_binary_data);
if (strlen($v_data["prefix"]) > 0) {
$v_data["filename"] = "$v_data[prefix]/$v_data[filename]";
}
// ----- 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;
// There was a bug in the tar created by Softaculous where it did not set the correct filesize of softperms.txt causing the tar to read incomplete data and reading the remaining data as header for next file
if(preg_match('/softperms\.txt/is', $v_data["filename"])){
$v_binary_data = $this->_readBlock();
if(strlen($v_binary_data) != 0){
return $this->_readHeader($v_binary_data, $v_header);
}else{
// We have reached end of file softperms.txt was the last file
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'] = $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']);
return true;
}
// }}}
// {{{ _maliciousFilename()
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 .= trim($v_content);
}
// ----- Read the next header
$v_binary_data = $this->_readBlock();
if(!$this->_readHeader($v_binary_data, $v_header))
return false;
$v_filename = trim($v_filename);
$v_header['filename'] = $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()
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($p_path, &$p_list_detail, $p_mode, $p_file_list, $p_remove_path, $p_preserve=false){
global $globals, $ftp, $can_write, $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();
// We will just to the last byte we read in the previous loop.
if(!empty($GLOBALS['last_byte']) && empty($p_file_list)){
$did_jump = $this->_jumpBlock(ceil(($GLOBALS['last_byte']/512)));
if(!empty($did_jump)){
$GLOBALS['start'] = 1;
}
}
while(strlen($v_binary_data = $this->_readBlock()) != 0){
$v_extract_file = FALSE;
$wildcard_list = FALSE;
$v_extraction_stopped = 0;
if(!$this->_readHeader($v_binary_data, $v_header))
return false;
if($v_header['filename'] == ''){
continue;
}
// ----- Look for long filename
if($v_header['typeflag'] == 'L'){
if(!$this->_readLongHeader($v_header))
return false;
}
$last_file = $v_header['filename'];
// check last file and skip the files that have been already backed up...
if(!empty($GLOBALS['last_file']) && $GLOBALS['start'] == 0){
if(preg_match('#^'.$GLOBALS['last_file'].'$#', $v_header['filename'])){
$GLOBALS['start'] = 1; // give a jump start once the last backed up file is found..
}
$this->_jumpBlock(ceil(($v_header['size']/512)));
continue; //return true to skip files
}
// Exclude Wp-Config when we are migrating to other site location
// if($v_header['filename'] == 'wp-config.php' && !empty($data['is_migrating'])){
// $this->_jumpBlock(ceil(($v_header['size']/512)));
// continue; //return true to skip files
// }
// Skip the plugin itself
if(preg_match('/'.preg_quote('wp-content/plugins/backuply', '/').'/is', $v_header['filename'])){
$this->_jumpBlock(ceil(($v_header['size']/512)));
continue; //return true to skip files
}
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';
print_r($array);
echo '
';
}
// Create or updates the log file
function backuply_status_log($log, $status = 'working', $percentage = 0 ){
$log_file = dirname(__FILE__, 3).'/backuply/backuply_log.php';
if(!file_exists($log_file) || 0 == filesize($log_file)) {
$log = "\n" . $log; //Prepend php exit
}
$this_log = $log . '|' . $status . '|' . $percentage . "\n";
file_put_contents($log_file, $this_log, FILE_APPEND);
}
function restore_clean($force = 0){
global $data;
//Delete the temporarily downloaded archive if some error occur in the restore
if($GLOBALS['current_status'] >= 4 || !empty($force)){
@unlink($data['local_tar']);
}
// Delete these always, we will unzip these files everytime
@unlink($data['softpath'].'/softperms.txt');
@unlink($data['softpath'].'/softver.txt');
$info_file = str_replace('.tar.gz', '.php', $data['fname']);
// To delete the info file which gets extracted too.
if(file_exists($data['softpath'] .'/'. $info_file)){
@unlink($data['softpath'] .'/'. $info_file);
}
//Delete the softsql.sql file
if((file_exists($data['softpath'].'/'.$data['dbexist']) && $GLOBALS['current_status'] >= 2) || !empty($force)){
if(file_exists($data['softpath'].'/'.$data['dbexist']) && !is_dir($data['softpath'].'/'.$data['dbexist'])){
@unlink($data['softpath'].'/'.$data['dbexist']);
}
if(file_exists($data['softpath'].'/'.$data['fname']) && !is_dir($data['softpath'].'/'.$data['fname'])){
@unlink($data['softpath'].'/'.$data['fname']);
}
}
}
function handle_restore_status($output) {
if(!empty($output['restore_error'])){
// Send restore failure mail
$error = $output['restore_error'];
$error_string = 'Below are the error(s) :
';
foreach($error as $ek => $ev){
$error_string .= '* '.$ev.'
';
}
backuply_status_log($error_string, 'info');
backuply_status_log('Restore of your WordPress installation failed.', 'error', 100);
restore_clean(1);
final_restore_response($output, $error_string);
return false;
}
if($output['status'] == 0) {
backuply_log('Restore complete called !');
final_restore_response($output, '');
}
}
function final_restore_response($output, $error_str = '') {
global $data;
$config = backuply_get_config();
$url = $output['ajax_url'];
if(empty($config['RESTORE_KEY'])) {
backuply_status_log('Unable to find security key', 'error');
backuply_kill_process();
return;
}
$url .= '?action=backuply_restore_response&security='. $config['RESTORE_KEY'].'&user_id='.$output['user_id']. '&sess_key='.$output['sess_key'];
if(!empty($output['restore_db'])){
$url .= '&restore_db=true';
}
if(!empty($output['is_migrating'])){
$url .= '&is_migrating=true';
}
if(!empty($output['not_writable'])){
$url .= '¬_writable=true';
}
if(!empty($error_str)) {
$url .= '&error=1&error_string=' . htmlentities($error_str);
}
$curl = new Curl();
$curl->setConnectTimeout(5);
$curl->setTimeout(5);
$curl->setOpt(CURLOPT_SSL_VERIFYPEER, FALSE);
$curl->setOpt(CURLOPT_SSL_VERIFYHOST, FALSE);
$curl->setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36');
$curl->get($url);
die();
}
// CURL call to call self to prevent timeout
function restore_curl($data) {
$config = backuply_get_config();
if(empty($config['RESTORE_KEY'])) {
backuply_kill_process();
return;
}
$data['restore_key'] = urlencode($config['RESTORE_KEY']);
$data['site_url'] = backuply_optPOST('site_url');
$data['backup_site_url'] = backuply_optPOST('backup_site_url');
$data['backup_site_path'] = backuply_optPOST('backup_site_path');
$data['ajax_url'] = backuply_optPOST('ajax_url');
$data['backuly_backup_dir'] = backuply_optPOST('backuly_backup_dir');
$data['restore_db'] = backuply_optPOST('restore_db');
$data['debug_mode'] = backuply_optPOST('debug_mode');
$data['sess_key'] = backuply_optPOST('sess_key');
$data['user_id'] = backuply_optPOST('user_id');
$data['exclude_db'] = backuply_optPOST('exclude_db');
handle_restore_status($data);
$curl = new Curl();
$curl->setConnectTimeout(5);
$curl->setTimeout(5);
$curl->setOpt(CURLOPT_SSL_VERIFYPEER, FALSE);
$curl->setOpt(CURLOPT_SSL_VERIFYHOST, FALSE);
$curl->setReferer((!empty($_SERVER['REQUEST_SCHEME']) ? $_SERVER['REQUEST_SCHEME'] : 'http') .'://'. $_SERVER['SERVER_NAME']);
$curl->setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36');
$curl->post(backuply_optPOST('restore_curl_url'), $data);
die();
}
// Download the remote archive
function remote_archive_download_loop(){
global $data;
// Do we have a remote file ?
if(empty($data['remote_tar'])){
return false;
}
clearstatcache();
restore_got_killed(); //stops process if restore gets killed
// For untar and backward compatibiility of .tar files
// if(substr($this->_orig_tar, -2) == 'gz'){
// $this->_compress = true;
// $this->_compress_type = 'gz';
// }
$url = parse_url($data['remote_tar']);
if(!class_exists($url['scheme'])){
$did_register = backuply_stream_wrapper_register($url['scheme'], $url['scheme']);
if(empty($did_register)){
backuply_include_lib($url['scheme']);
}
}
//Create tmp directory if not present.
$localdir = pathinfo($data['local_tar'], PATHINFO_DIRNAME);
if(!is_dir($localdir)){
//create recursively
@mkdir($localdir, 0755, 1);
}
// Lets ensure file data is proper
if($data['restore_loop'] == 1){
// $data['size'] = filesize($data['remote_tar']);
// backuply_log('Size : ' . $data['size']);
@unlink($data['local_tar']);
$data['l_readbytes'] = 0;
}
if(empty($data['l_readbytes']) && $data['restore_loop'] == 1) {
backuply_status_log('Downloading the backup(' . $data['fname'] . ') from remote location.', 'info', 13);
}
if(method_exists($url['scheme'], 'download_file_loop')){
$obj = new $url['scheme'];
//Delete the local file if the process is starting afresh and the file already exists
if(file_exists($data['local_tar']) && empty($data['l_readbytes'])){
@unlink($data['local_tar']);
}
//backuply_log('invoked download function, org_tar : '.$this->_orig_tar.' , local : '.$this->_local_tar);
$obj->download_file_loop($data['remote_tar'], $data['local_tar'], $data['l_readbytes']);
}else{
// Open the file pointer if not opened
$remote_fp = @fopen($data['remote_tar'], 'rb');
$fp = @fopen($data['local_tar'], 'ab');
$GLOBALS['l_readbytes'] = $data['l_readbytes'];
//backuply_log($data['remote_tar']);
if(empty($remote_fp)){
$error[] = 'Unable to open remote file for reading';
backuply_log('Unable to open remote file for reading');
backuply_die('download_error');
}
$meta = stream_get_meta_data($remote_fp);
$chunk = 1048576;
// Seek to the location
if(!fseek($remote_fp, $GLOBALS['l_readbytes'])){
$error[] = 'Unable to seek file pointer';
backuply_die('download_error');
}
while($GLOBALS['l_readbytes'] < $data['size']){
restore_got_killed();
if(time() + 5 >= $GLOBALS['end']){
$GLOBALS['l_readbytes'] = filesize($data['local_tar']);
break;
}
if(($data['size'] - $GLOBALS['l_readbytes']) < $chunk){
$chunk = (int) $data['size'] - $GLOBALS['l_readbytes'];
backuply_log('Last Chunk '. $chunk);
}
// Read a block
$block = fread($remote_fp, $chunk);
$GLOBALS['l_readbytes'] += strlen($block);
backuply_log('Downloaded (L'.$data['restore_loop'].') : '.$GLOBALS['l_readbytes'].' / '.$data['size']);
// Write the block to the local file
fwrite($fp, $block);
$percentage = (filesize($data['local_tar']) / $data['size']) * 100;
backuply_status_log('