diff --git a/module/backup/control.php b/module/backup/control.php index bc127c9d5f..96dd23b546 100644 --- a/module/backup/control.php +++ b/module/backup/control.php @@ -81,14 +81,7 @@ class backup extends control echo js::alert(sprintf($this->lang->backup->error->noWritable, $this->backupPath)); die(js::reload('parent')); } - - $fp = fopen($this->backupPath . $fileName . '.sql.php', 'r'); - $tmp = fopen($this->backupPath . $fileName . '.sql.php.tmp', 'w'); - fwrite($tmp, "#;\n"); - while(($buffer = fgets($fp)) !== false) fwrite($tmp, $buffer); - fclose($fp); - fclose($tmp); - rename($this->backupPath . $fileName . '.sql.php.tmp', $this->backupPath . $fileName . '.sql.php'); + $this->backup->addFileHeader($this->backupPath . $fileName . '.sql.php'); if(extension_loaded('zlib')) { @@ -98,6 +91,7 @@ class backup extends control echo js::alert(sprintf($this->lang->backup->error->backupFile, $result->error)); die(js::reload('parent')); } + $this->backup->addFileHeader($this->backupPath . $fileName . '.file.zip.php'); } echo js::alert($this->lang->backup->success->backup); @@ -122,7 +116,9 @@ class backup extends control set_time_limit(0); /* Restore database. */ + $this->backup->removeFileHeader($this->backupPath . $fileName . '.sql.php'); $result = $this->backup->restoreSQL($this->backupPath . $fileName . '.sql.php'); + $this->backup->addFileHeader($this->backupPath . $fileName . '.sql.php'); if(!$result->result) { echo js::alert(sprintf($this->lang->backup->error->restoreSQL, $result->error)); @@ -132,7 +128,9 @@ class backup extends control /* Restore attatchments. */ if(file_exists($this->backupPath . $fileName . '.file.zip.php')) { + $this->backup->removeFileHeader($this->backupPath . $fileName . '.file.zip.php'); $result = $this->backup->restoreFile($this->backupPath . $fileName . '.file.zip.php'); + $this->backup->addFileHeader($this->backupPath . $fileName . '.file.zip.php'); if(!$result->result) { echo js::alert(sprintf($this->lang->backup->error->restoreFile, $result->error)); diff --git a/module/backup/model.php b/module/backup/model.php index 1de5e795fd..a3a15881e7 100644 --- a/module/backup/model.php +++ b/module/backup/model.php @@ -85,4 +85,89 @@ class backupModel extends model return $return; } + + /** + * Add file header. + * + * @param string $fileName + * @access public + * @return bool + */ + public function addFileHeader($fileName) + { + $firstline = false; + $die = "\n"; + $fileSize = filesize($fileName); + + $fh = fopen($fileName, 'c+'); + $delta = strlen($die); + while(true) + { + $offset = ftell($fh); + $line = fread($fh, 1024 * 1024); + if(!$firstline) + { + $line = $die . $line; + $firstline = true; + } + else + { + $line = $compensate . $line; + } + + $compensate = fread($fh, $delta); + fseek($fh, $offset); + fwrite($fh, $line); + + if(ftell($fh) >= $fileSize) + { + fwrite($fh, $compensate); + break; + } + } + fclose($fh); + return true; + } + + /** + * Remove file header. + * + * @param string $fileName + * @access public + * @return bool + */ + public function removeFileHeader($fileName) + { + $firstline = false; + $die = "\n"; + $fileSize = filesize($fileName); + + $fh = fopen($fileName, 'c+'); + while(true) + { + $offset = ftell($fh); + if($firstline and $delta) fseek($fh, $offset + $delta); + $line = fread($fh, 1024 * 1024); + if(!$firstline) + { + $firstline = true; + $beforeLength = strlen($line); + $line = str_replace($die, '', $line); + $afterLength = strlen($line); + $delta = $beforeLength - $afterLength; + if($delta == 0) + { + fclose($fh); + return true; + } + } + fseek($fh, $offset); + fwrite($fh, $line); + + if(ftell($fh) >= $fileSize - $delta) break; + } + ftruncate($fh, ($fileSize - $delta)); + fclose($fh); + return true; + } } diff --git a/module/common/lang/menuOrder.php b/module/common/lang/menuOrder.php index 8080fb4c6e..510bc45774 100644 --- a/module/common/lang/menuOrder.php +++ b/module/common/lang/menuOrder.php @@ -112,7 +112,8 @@ $lang->admin->menuOrder[20] = 'editor'; $lang->admin->menuOrder[25] = 'mail'; $lang->admin->menuOrder[30] = 'custom'; $lang->admin->menuOrder[40] = 'convert'; -$lang->admin->menuOrder[45] = 'trashes'; +$lang->admin->menuOrder[45] = 'backup'; +$lang->admin->menuOrder[50] = 'trashes'; $lang->convert->menuOrder = $lang->admin->menuOrder; $lang->upgrade->menuOrder = $lang->admin->menuOrder; $lang->action->menuOrder = $lang->admin->menuOrder; @@ -121,3 +122,4 @@ $lang->custom->menuOrder = $lang->admin->menuOrder; $lang->editor->menuOrder = $lang->admin->menuOrder; $lang->mail->menuOrder = $lang->admin->menuOrder; $lang->custom->menuOrder = $lang->admin->menuOrder; +$lang->backup->menuOrder = $lang->admin->menuOrder;