mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-07 09:17:35 +00:00
450 lines
11 KiB
PHP
450 lines
11 KiB
PHP
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
namespace Magento\Backup\Model;
|
|
|
|
use Magento\Framework\App\Filesystem\DirectoryList;
|
|
use Magento\Framework\Filesystem\DriverPool;
|
|
|
|
/**
|
|
* Backup file item model
|
|
*
|
|
* @method string getPath()
|
|
* @method string getName()
|
|
* @method string getTime()
|
|
* @SuppressWarnings(PHPMD.CookieAndSessionMisuse)
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
* @api
|
|
* @since 100.0.2
|
|
*/
|
|
class Backup extends \Magento\Framework\DataObject implements \Magento\Framework\Backup\Db\BackupInterface
|
|
{
|
|
/**
|
|
* Compress rate
|
|
*/
|
|
const COMPRESS_RATE = 9;
|
|
|
|
/**
|
|
* Type of backup file
|
|
*
|
|
* @var string
|
|
*/
|
|
private $_type = 'db';
|
|
|
|
/**
|
|
* Gz file pointer
|
|
*
|
|
* @var \Magento\Framework\Filesystem\File\WriteInterface
|
|
*/
|
|
protected $_stream = null;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Filesystem
|
|
*/
|
|
protected $_filesystem;
|
|
|
|
/**
|
|
* @var \Magento\Backup\Helper\Data
|
|
*/
|
|
protected $_helper;
|
|
|
|
/**
|
|
* Locale model
|
|
*
|
|
* @var \Magento\Framework\Locale\ResolverInterface
|
|
*/
|
|
protected $_localeResolver;
|
|
|
|
/**
|
|
* Backend auth session
|
|
*
|
|
* @var \Magento\Backend\Model\Auth\Session
|
|
*/
|
|
protected $_backendAuthSession;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Encryption\EncryptorInterface
|
|
*/
|
|
protected $_encryptor;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Filesystem\Directory\WriteInterface
|
|
*/
|
|
protected $varDirectory;
|
|
|
|
/**
|
|
* @param \Magento\Backup\Helper\Data $helper
|
|
* @param \Magento\Framework\Locale\ResolverInterface $localeResolver
|
|
* @param \Magento\Backend\Model\Auth\Session $authSession
|
|
* @param \Magento\Framework\Encryption\EncryptorInterface $encryptor
|
|
* @param \Magento\Framework\Filesystem $filesystem
|
|
* @param array $data
|
|
* @throws \Magento\Framework\Exception\FileSystemException
|
|
*/
|
|
public function __construct(
|
|
\Magento\Backup\Helper\Data $helper,
|
|
\Magento\Framework\Locale\ResolverInterface $localeResolver,
|
|
\Magento\Backend\Model\Auth\Session $authSession,
|
|
\Magento\Framework\Encryption\EncryptorInterface $encryptor,
|
|
\Magento\Framework\Filesystem $filesystem,
|
|
$data = []
|
|
) {
|
|
$this->_encryptor = $encryptor;
|
|
parent::__construct($data);
|
|
|
|
$this->_filesystem = $filesystem;
|
|
$this->varDirectory = $this->_filesystem->getDirectoryWrite(DirectoryList::VAR_DIR);
|
|
$this->_helper = $helper;
|
|
$this->_localeResolver = $localeResolver;
|
|
$this->_backendAuthSession = $authSession;
|
|
}
|
|
|
|
/**
|
|
* Set backup time
|
|
*
|
|
* @param int $time
|
|
* @return $this
|
|
*/
|
|
public function setTime($time)
|
|
{
|
|
$this->setData('time', $time);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set backup path
|
|
*
|
|
* @param string $path
|
|
* @return $this
|
|
*/
|
|
public function setPath($path)
|
|
{
|
|
$this->setData('path', $path);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set backup name
|
|
*
|
|
* @param string $name
|
|
* @return $this
|
|
*/
|
|
public function setName($name)
|
|
{
|
|
$this->setData('name', $name);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Load backup file info
|
|
*
|
|
* @param string $fileName
|
|
* @param string $filePath
|
|
* @return $this
|
|
*/
|
|
public function load($fileName, $filePath)
|
|
{
|
|
$backupData = $this->_helper->extractDataFromFilename($fileName);
|
|
|
|
$this->addData(
|
|
[
|
|
'id' => $filePath . '/' . $fileName,
|
|
'time' => (int)$backupData->getTime(),
|
|
'path' => $filePath,
|
|
'extension' => $this->_helper->getExtensionByType($backupData->getType()),
|
|
'display_name' => $this->_helper->nameToDisplayName($backupData->getName()),
|
|
'name' => $backupData->getName(),
|
|
'date_object' => (new \DateTime())->setTimestamp($backupData->getTime()),
|
|
]
|
|
);
|
|
|
|
$this->setType($backupData->getType());
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Checks backup file exists.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function exists()
|
|
{
|
|
return $this->varDirectory->isFile($this->_getFilePath());
|
|
}
|
|
|
|
/**
|
|
* Return file name of backup file
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getFileName()
|
|
{
|
|
$filename = $this->getTime() . "_" . $this->getType();
|
|
$backupName = $this->getName();
|
|
|
|
if (!empty($backupName)) {
|
|
$filename .= '_' . $backupName;
|
|
}
|
|
|
|
$filename .= '.' . $this->_helper->getExtensionByType($this->getType());
|
|
|
|
return $filename;
|
|
}
|
|
|
|
/**
|
|
* Sets type of file
|
|
*
|
|
* @param string $value
|
|
* @return $this
|
|
*/
|
|
public function setType($value = 'db')
|
|
{
|
|
$possibleTypes = $this->_helper->getBackupTypesList();
|
|
if (!in_array($value, $possibleTypes)) {
|
|
$value = $this->_helper->getDefaultBackupType();
|
|
}
|
|
|
|
$this->_type = $value;
|
|
$this->setData('type', $this->_type);
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Returns type of backup file
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getType()
|
|
{
|
|
return $this->_type;
|
|
}
|
|
|
|
/**
|
|
* Set the backup file content
|
|
*
|
|
* @param string &$content
|
|
* @return $this
|
|
* @throws \Magento\Framework\Exception\LocalizedException
|
|
*/
|
|
public function setFile(&$content)
|
|
{
|
|
if (!$this->hasData('time') || !$this->hasData('type') || !$this->hasData('path')) {
|
|
throw new \Magento\Framework\Exception\LocalizedException(
|
|
__('Please correct the order of creation for a new backup.')
|
|
);
|
|
}
|
|
|
|
$this->varDirectory->writeFile($this->_getFilePath(), $content);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Return content of backup file
|
|
*
|
|
* @return array
|
|
* @throws \Magento\Framework\Exception\LocalizedException
|
|
*/
|
|
public function &getFile()
|
|
{
|
|
if (!$this->exists()) {
|
|
throw new \Magento\Framework\Exception\LocalizedException(__('The backup file does not exist.'));
|
|
}
|
|
|
|
return $this->varDirectory->read($this->_getFilePath());
|
|
}
|
|
|
|
/**
|
|
* Delete backup file
|
|
*
|
|
* @return $this
|
|
* @throws \Magento\Framework\Exception\LocalizedException
|
|
*/
|
|
public function deleteFile()
|
|
{
|
|
if (!$this->exists()) {
|
|
throw new \Magento\Framework\Exception\LocalizedException(__('The backup file does not exist.'));
|
|
}
|
|
|
|
$this->varDirectory->delete($this->_getFilePath());
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Open backup file (write or read mode)
|
|
*
|
|
* @param bool $write
|
|
* @return $this
|
|
* @throws \Magento\Framework\Backup\Exception\NotEnoughPermissions
|
|
* @throws \Magento\Framework\Exception\FileSystemException
|
|
* @throws \Magento\Framework\Exception\InputException
|
|
*/
|
|
public function open($write = false)
|
|
{
|
|
if ($this->getPath() === null) {
|
|
throw new \Magento\Framework\Exception\InputException(__('The backup file path was not specified.'));
|
|
}
|
|
|
|
if ($write && $this->varDirectory->isFile($this->_getFilePath())) {
|
|
$this->varDirectory->delete($this->_getFilePath());
|
|
}
|
|
if (!$write && !$this->varDirectory->isFile($this->_getFilePath())) {
|
|
throw new \Magento\Framework\Exception\InputException(
|
|
__('The backup file "%1" does not exist.', $this->getFileName())
|
|
);
|
|
}
|
|
|
|
$mode = $write ? 'wb' . self::COMPRESS_RATE : 'rb';
|
|
|
|
try {
|
|
/** @var \Magento\Framework\Filesystem\Directory\WriteInterface $varDirectory */
|
|
$varDirectory = $this->_filesystem->getDirectoryWrite(DirectoryList::VAR_DIR, DriverPool::ZLIB);
|
|
$this->_stream = $varDirectory->openFile(
|
|
$this->_getFilePath(),
|
|
$mode
|
|
);
|
|
} catch (\Magento\Framework\Exception\FileSystemException $e) {
|
|
throw new \Magento\Framework\Backup\Exception\NotEnoughPermissions(
|
|
__('Sorry, but we cannot read from or write to backup file "%1".', $this->getFileName())
|
|
);
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get zlib handler
|
|
*
|
|
* @return \Magento\Framework\Filesystem\File\WriteInterface
|
|
* @throws \Magento\Framework\Exception\InputException
|
|
*/
|
|
protected function _getStream()
|
|
{
|
|
if ($this->_stream === null) {
|
|
throw new \Magento\Framework\Exception\InputException(__('The backup file handler was unspecified.'));
|
|
}
|
|
return $this->_stream;
|
|
}
|
|
|
|
/**
|
|
* Read backup uncompressed data
|
|
*
|
|
* @param int $length
|
|
* @return string
|
|
* @throws \Magento\Framework\Exception\InputException
|
|
*/
|
|
public function read($length)
|
|
{
|
|
return $this->_getStream()->read($length);
|
|
}
|
|
|
|
/**
|
|
* Check end of file.
|
|
*
|
|
* @return bool
|
|
* @throws \Magento\Framework\Exception\InputException
|
|
*/
|
|
public function eof()
|
|
{
|
|
return $this->_getStream()->eof();
|
|
}
|
|
|
|
/**
|
|
* Write to backup file
|
|
*
|
|
* @param string $string
|
|
* @return $this
|
|
* @throws \Magento\Framework\Exception\InputException
|
|
*/
|
|
public function write($string)
|
|
{
|
|
try {
|
|
$this->_getStream()->write($string);
|
|
} catch (\Magento\Framework\Exception\FileSystemException $e) {
|
|
throw new \Magento\Framework\Exception\InputException(
|
|
__('Something went wrong while writing to the backup file "%1".', $this->getFileName())
|
|
);
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Close open backup file
|
|
*
|
|
* @return $this
|
|
* @throws \Magento\Framework\Exception\InputException
|
|
*/
|
|
public function close()
|
|
{
|
|
$this->_getStream()->close();
|
|
$this->_stream = null;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Print output
|
|
*
|
|
* @return string
|
|
* @return \Magento\Framework\Filesystem\Directory\ReadInterface|string|void
|
|
* @throws \Magento\Framework\Exception\FileSystemException
|
|
*/
|
|
public function output()
|
|
{
|
|
if (!$this->exists()) {
|
|
return;
|
|
}
|
|
|
|
/** @var \Magento\Framework\Filesystem\Directory\ReadInterface $directory */
|
|
$directory = $this->_filesystem->getDirectoryWrite(DirectoryList::VAR_DIR);
|
|
$directory = $directory->readFile($this->_getFilePath());
|
|
|
|
return $directory;
|
|
}
|
|
|
|
/**
|
|
* Get Size
|
|
*
|
|
* @return int|mixed
|
|
*/
|
|
public function getSize()
|
|
{
|
|
if ($this->getData('size') !== null) {
|
|
return $this->getData('size');
|
|
}
|
|
|
|
if ($this->exists()) {
|
|
$this->setData('size', $this->varDirectory->stat($this->_getFilePath())['size']);
|
|
return $this->getData('size');
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Validate user password
|
|
*
|
|
* @param string $password
|
|
* @return bool
|
|
* @throws \Exception
|
|
*/
|
|
public function validateUserPassword($password)
|
|
{
|
|
$userPasswordHash = $this->_backendAuthSession->getUser()->getPassword();
|
|
return $this->_encryptor->validateHash($password, $userPasswordHash);
|
|
}
|
|
|
|
/**
|
|
* Get file path.
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function _getFilePath()
|
|
{
|
|
return $this->varDirectory->getRelativePath($this->getPath() . '/' . $this->getFileName());
|
|
}
|
|
}
|