Files
2019-11-17 19:14:07 +01:00

505 lines
15 KiB
PHP

<?php
/*
* 2007-2018 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2018 PrestaShop SA
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
namespace PrestaShop\Module\AutoUpgrade;
use PrestaShop\Module\AutoUpgrade\Log\LegacyLogger;
use PrestaShop\Module\AutoUpgrade\Log\Logger;
use PrestaShop\Module\AutoUpgrade\UpgradeTools\CacheCleaner;
use PrestaShop\Module\AutoUpgrade\UpgradeTools\FileFilter;
use PrestaShop\Module\AutoUpgrade\UpgradeTools\FilesystemAdapter;
use PrestaShop\Module\AutoUpgrade\UpgradeTools\ModuleAdapter;
use PrestaShop\Module\AutoUpgrade\UpgradeTools\SymfonyAdapter;
use PrestaShop\Module\AutoUpgrade\UpgradeTools\Translation;
use PrestaShop\Module\AutoUpgrade\Parameters\FileConfigurationStorage;
use PrestaShop\Module\AutoUpgrade\Parameters\UpgradeConfigurationStorage;
use PrestaShop\Module\AutoUpgrade\Parameters\UpgradeConfiguration;
use PrestaShop\Module\AutoUpgrade\Parameters\UpgradeFileNames;
use PrestaShop\Module\AutoUpgrade\Twig\TransFilterExtension;
use PrestaShop\Module\AutoUpgrade\UpgradeTools\Translator;
use Twig_Loader_Filesystem;
use Twig_Environment;
/**
* Class responsible of the easy (& Lazy) loading of the different services
* available for the upgrade.
*/
class UpgradeContainer
{
const WORKSPACE_PATH = 'workspace'; // AdminSelfUpgrade::$autoupgradePath
const BACKUP_PATH = 'backup';
const DOWNLOAD_PATH = 'download';
const LATEST_PATH = 'latest'; // AdminSelfUpgrade::$latestRootDir
const LATEST_DIR = 'lastest/';
const TMP_PATH = 'tmp';
const PS_ADMIN_PATH = 'ps_admin';
const PS_ADMIN_SUBDIR = 'ps_admin_subdir';
const PS_ROOT_PATH = 'ps_root'; // AdminSelfUpgrade::$prodRootDir
const ARCHIVE_FILENAME = 'destDownloadFilename';
const ARCHIVE_FILEPATH = 'destDownloadFilepath';
const PS_VERSION = 'version';
/**
* @var CacheCleaner
*/
private $cacheCleaner;
/**
* @var Cookie
*/
private $cookie;
/**
* @var \Db
*/
public $db;
/**
* @var FileConfigurationStorage
*/
private $fileConfigurationStorage;
/**
* @var FileFilter
*/
private $fileFilter;
/**
* @var PrestashopConfiguration
*/
private $prestashopConfiguration;
/**
* @var UpgradeConfiguration
*/
private $upgradeConfiguration;
/**
* @var FilesystemAdapter
*/
private $filesystemAdapter;
/**
* @var Logger
*/
private $logger;
/**
* @var ModuleAdapter
*/
private $moduleAdapter;
/**
* @var Twig_Environment
*/
private $twig;
/**
* @var State
*/
private $state;
/**
* @var SymfonyAdapter
*/
private $symfonyAdapter;
/**
* @var Upgrader
*/
private $upgrader;
/**
* @var Workspace
*/
private $workspace;
/**
* @var ZipAction
*/
private $zipAction;
/**
* AdminSelfUpgrade::$autoupgradePath
* Ex.: /var/www/html/PrestaShop/admin-dev/autoupgrade.
*
* @var string Path to the base folder of the autoupgrade (in admin)
*/
private $autoupgradeWorkDir;
/**
* @var string Absolute path to the admin folder
*/
private $adminDir;
/**
* @var string Absolute path to ps root folder of PS
*/
private $psRootDir;
public function __construct($psRootDir, $adminDir, $moduleSubDir = 'autoupgrade')
{
$this->autoupgradeWorkDir = $adminDir . DIRECTORY_SEPARATOR . $moduleSubDir;
$this->adminDir = $adminDir;
$this->psRootDir = $psRootDir;
}
public function getProperty($property)
{
switch ($property) {
case self::PS_ADMIN_PATH:
return $this->adminDir;
case self::PS_ADMIN_SUBDIR:
return trim(str_replace($this->getProperty(self::PS_ROOT_PATH), '', $this->getProperty(self::PS_ADMIN_PATH)), DIRECTORY_SEPARATOR);
case self::PS_ROOT_PATH:
return $this->psRootDir;
case self::WORKSPACE_PATH:
return $this->autoupgradeWorkDir;
case self::BACKUP_PATH:
return $this->autoupgradeWorkDir . DIRECTORY_SEPARATOR . 'backup';
case self::DOWNLOAD_PATH:
return $this->autoupgradeWorkDir . DIRECTORY_SEPARATOR . 'download';
case self::LATEST_PATH:
return $this->autoupgradeWorkDir . DIRECTORY_SEPARATOR . 'latest';
case self::LATEST_DIR:
return $this->autoupgradeWorkDir . DIRECTORY_SEPARATOR . 'latest' . DIRECTORY_SEPARATOR;
case self::TMP_PATH:
return $this->autoupgradeWorkDir . DIRECTORY_SEPARATOR . 'tmp';
case self::ARCHIVE_FILENAME:
return $this->getUpgradeConfiguration()->getArchiveFilename();
case self::ARCHIVE_FILEPATH:
return $this->getProperty(self::DOWNLOAD_PATH) . DIRECTORY_SEPARATOR . $this->getProperty(self::ARCHIVE_FILENAME);
case self::PS_VERSION:
return $this->getPrestaShopConfiguration()->getPrestaShopVersion();
}
}
/**
* Init and return CacheCleaner
*
* @return CacheCleaner
*/
public function getCacheCleaner()
{
if (null !== $this->cacheCleaner) {
return $this->cacheCleaner;
}
return $this->cacheCleaner = new CacheCleaner($this, $this->getLogger());
}
public function getCookie()
{
if (null !== $this->cookie) {
return $this->cookie;
}
$this->cookie = new Cookie(
$this->getProperty(self::PS_ADMIN_SUBDIR),
$this->getProperty(self::TMP_PATH));
return $this->cookie;
}
public function getDb()
{
return \Db::getInstance();
}
/**
* Return the path to the zipfile containing prestashop.
*
* @return string
*/
public function getFilePath()
{
return $this->getProperty(self::ARCHIVE_FILEPATH);
}
public function getFileConfigurationStorage()
{
if (null !== $this->fileConfigurationStorage) {
return $this->fileConfigurationStorage;
}
$this->fileConfigurationStorage = new FileConfigurationStorage($this->getProperty(self::WORKSPACE_PATH) . DIRECTORY_SEPARATOR);
return $this->fileConfigurationStorage;
}
public function getFileFilter()
{
if (null !== $this->fileFilter) {
return $this->fileFilter;
}
$this->fileFilter = new FileFilter($this->getUpgradeConfiguration());
return $this->fileFilter;
}
public function getUpgrader()
{
if (null !== $this->upgrader) {
return $this->upgrader;
}
if (!defined('_PS_ROOT_DIR_')) {
define('_PS_ROOT_DIR_', $this->getProperty(self::PS_ROOT_PATH));
}
// in order to not use Tools class
$upgrader = new Upgrader($this->getProperty(self::PS_VERSION));
preg_match('#([0-9]+\.[0-9]+)(?:\.[0-9]+){1,2}#', $this->getProperty(self::PS_VERSION), $matches);
$upgrader->branch = $matches[1];
$upgradeConfiguration = $this->getUpgradeConfiguration();
$channel = $upgradeConfiguration->get('channel');
switch ($channel) {
case 'archive':
$upgrader->channel = 'archive';
$upgrader->version_num = $upgradeConfiguration->get('archive.version_num');
$upgrader->checkPSVersion(true, array('archive'));
break;
case 'directory':
$upgrader->channel = 'directory';
$upgrader->version_num = $upgradeConfiguration->get('directory.version_num');
$upgrader->checkPSVersion(true, array('directory'));
break;
default:
$upgrader->channel = $channel;
if ($upgradeConfiguration->get('channel') == 'private' && !$upgradeConfiguration->get('private_allow_major')) {
$upgrader->checkPSVersion(false, array('private', 'minor'));
} else {
$upgrader->checkPSVersion(false, array('minor'));
}
}
$this->getState()->setInstallVersion($upgrader->version_num);
$this->upgrader = $upgrader;
return $this->upgrader;
}
public function getFilesystemAdapter()
{
if (null !== $this->filesystemAdapter) {
return $this->filesystemAdapter;
}
$this->filesystemAdapter = new FilesystemAdapter(
$this->getFileFilter(),
$this->getState()->getRestoreFilesFilename(),
$this->getProperty(self::WORKSPACE_PATH),
str_replace($this->getProperty(self::PS_ROOT_PATH), '', $this->getProperty(self::PS_ADMIN_PATH)), $this->getProperty(self::PS_ROOT_PATH));
return $this->filesystemAdapter;
}
/**
* @return Logger
*/
public function getLogger()
{
if (null !== $this->logger) {
return $this->logger;
}
$logFile = null;
if (is_writable($this->getProperty(self::TMP_PATH))) {
$logFile = $this->getProperty(self::TMP_PATH) . DIRECTORY_SEPARATOR . 'log.txt';
}
$this->logger = new LegacyLogger($logFile);
return $this->logger;
}
public function setLogger(Logger $logger)
{
$this->logger = $logger;
}
public function getModuleAdapter()
{
if (null !== $this->moduleAdapter) {
return $this->moduleAdapter;
}
$this->moduleAdapter = new ModuleAdapter(
$this->getDb(),
$this->getTranslator(),
$this->getProperty(self::PS_ROOT_PATH) . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR,
$this->getProperty(self::TMP_PATH),
$this->getState()->getInstallVersion(),
$this->getZipAction(),
$this->getSymfonyAdapter()
);
return $this->moduleAdapter;
}
public function getState()
{
if (null !== $this->state) {
return $this->state;
}
$this->state = new State();
return $this->state;
}
public function getTranslationAdapter()
{
return new Translation($this->getTranslator(), $this->getLogger(), $this->getState()->getInstalledLanguagesIso());
}
public function getTranslator()
{
return new Translator('AdminSelfUpgrade');
}
public function getTwig()
{
if (null !== $this->twig) {
return $this->twig;
}
// Using independant template engine for 1.6 & 1.7 compatibility
$loader = new Twig_Loader_Filesystem();
$loader->addPath(realpath(__DIR__ . '/..') . '/views/templates', 'ModuleAutoUpgrade');
$twig = new Twig_Environment($loader);
$twig->addExtension(new TransFilterExtension($this->getTranslator()));
$this->twig = $twig;
return $this->twig;
}
public function getPrestaShopConfiguration()
{
if (null !== $this->prestashopConfiguration) {
return $this->prestashopConfiguration;
}
$this->prestashopConfiguration = new PrestashopConfiguration(
$this->getProperty(self::WORKSPACE_PATH),
$this->getProperty(self::PS_ROOT_PATH)
);
return $this->prestashopConfiguration;
}
/**
* @return SymfonyAdapter
*/
public function getSymfonyAdapter()
{
if (null !== $this->symfonyAdapter) {
return $this->symfonyAdapter;
}
$this->symfonyAdapter = new SymfonyAdapter($this->getState()->getInstallVersion());
return $this->symfonyAdapter;
}
public function getUpgradeConfiguration()
{
if (null !== $this->upgradeConfiguration) {
return $this->upgradeConfiguration;
}
$upgradeConfigurationStorage = new UpgradeConfigurationStorage($this->getProperty(self::WORKSPACE_PATH) . DIRECTORY_SEPARATOR);
$this->upgradeConfiguration = $upgradeConfigurationStorage->load(UpgradeFileNames::CONFIG_FILENAME);
return $this->upgradeConfiguration;
}
public function getUpgradeConfigurationStorage()
{
return new UpgradeConfigurationStorage($this->getProperty(self::WORKSPACE_PATH) . DIRECTORY_SEPARATOR);
}
public function getWorkspace()
{
if (null !== $this->workspace) {
return $this->workspace;
}
$paths = array();
$properties = array(
self::WORKSPACE_PATH, self::BACKUP_PATH,
self::DOWNLOAD_PATH, self::LATEST_PATH,
self::TMP_PATH, );
foreach ($properties as $property) {
$paths[] = $this->getProperty($property);
}
$this->workspace = new Workspace(
$this->getLogger(),
$this->getTranslator(),
$paths
);
return $this->workspace;
}
public function getZipAction()
{
if (null !== $this->zipAction) {
return $this->zipAction;
}
$this->zipAction = new ZipAction(
$this->getTranslator(),
$this->getLogger(),
$this->getUpgradeConfiguration(),
$this->getProperty(self::PS_ROOT_PATH));
return $this->zipAction;
}
/**
* Checks if the composer autoload exists, and loads it.
*/
public function initPrestaShopAutoloader()
{
$autoloader = $this->getProperty(self::PS_ROOT_PATH) . '/vendor/autoload.php';
if (file_exists($autoloader)) {
require_once $autoloader;
}
require_once $this->getProperty(self::PS_ROOT_PATH) . '/config/defines.inc.php';
require_once $this->getProperty(self::PS_ROOT_PATH) . '/config/autoload.php';
}
public function initPrestaShopCore()
{
require_once $this->getProperty(self::PS_ROOT_PATH) . '/config/config.inc.php';
$id_employee = !empty($_COOKIE['id_employee']) ? $_COOKIE['id_employee'] : 1;
\Context::getContext()->employee = new \Employee((int) $id_employee);
}
}