You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
502 lines
19 KiB
502 lines
19 KiB
<?php
|
|
|
|
/**
|
|
* Original installer files manager
|
|
*
|
|
* Standard: PSR-2
|
|
*
|
|
* @link http://www.php-fig.org/psr/psr-2 Full Documentation
|
|
*
|
|
* @package SC\DUPX\U
|
|
*/
|
|
|
|
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
|
|
|
use Duplicator\Installer\Utils\Log\Log;
|
|
use Duplicator\Installer\Core\Params\PrmMng;
|
|
|
|
require_once(DUPX_INIT . '/classes/plugins/class.plugin.item.php');
|
|
require_once(DUPX_INIT . '/classes/plugins/class.plugin.custom.actions.php');
|
|
require_once(DUPX_INIT . '/classes/utilities/class.u.remove.redundant.data.php');
|
|
|
|
/**
|
|
* Original installer files manager
|
|
* singleton class
|
|
*/
|
|
final class DUPX_Plugins_Manager
|
|
{
|
|
const SLUG_WOO_ADMIN = 'woocommerce-admin/woocommerce-admin.php';
|
|
const SLUG_SIMPLE_SSL = 'really-simple-ssl/rlrsssl-really-simple-ssl.php';
|
|
const SLUG_ONE_CLICK_SSL = 'one-click-ssl/ssl.php';
|
|
const SLUG_WP_FORCE_SSL = 'wp-force-ssl/wp-force-ssl.php';
|
|
const SLUG_RECAPTCHA = 'simple-google-recaptcha/simple-google-recaptcha.php';
|
|
const SLUG_WPBAKERY_PAGE_BUILDER = 'js_composer/js_composer.php';
|
|
const SLUG_DUPLICATOR_PRO = 'duplicator-pro/duplicator-pro.php';
|
|
const SLUG_DUPLICATOR_LITE = 'duplicator/duplicator.php';
|
|
const SLUG_DUPLICATOR_TESTER = 'duplicator-tester-plugin/duplicator-tester.php';
|
|
const SLUG_WPS_HIDE_LOGIN = 'wps-hide-login/wps-hide-login.php';
|
|
const SLUG_POPUP_MAKER = 'popup-maker/popup-maker.php';
|
|
const SLUG_JETPACK = 'jetpack/jetpack.php';
|
|
const SLUG_WP_ROCKET = 'wp-rocket/wp-rocket.php';
|
|
const SLUG_BETTER_WP_SECURITY = 'better-wp-security/better-wp-security.php';
|
|
const SLUG_HTTPS_REDIRECTION = 'https-redirection/https-redirection.php';
|
|
const SLUG_LOGIN_NOCAPTCHA = 'login-recaptcha/login-nocaptcha.php';
|
|
const SLUG_GOOGLE_CAPTCHA = 'google-captcha/google-captcha.php';
|
|
const SLUG_ADVANCED_CAPTCHA = 'advanced-google-recaptcha/advanced-google-recaptcha.php';
|
|
const OPTION_ACTIVATE_PLUGINS = 'duplicator_activate_plugins_after_installation';
|
|
|
|
/**
|
|
*
|
|
* @var self
|
|
*/
|
|
private static $instance = null;
|
|
|
|
/**
|
|
*
|
|
* @var DUPX_Plugin_item[]
|
|
*/
|
|
private $plugins = array();
|
|
|
|
/**
|
|
*
|
|
* @var DUPX_Plugin_item[]
|
|
*/
|
|
private $unistallList = array();
|
|
|
|
/**
|
|
*
|
|
* @var DUPX_Plugin_custom_actions[]
|
|
*/
|
|
private $customPluginsActions = array();
|
|
|
|
/**
|
|
*
|
|
* @return self
|
|
*/
|
|
public static function getInstance()
|
|
{
|
|
if (is_null(self::$instance)) {
|
|
self::$instance = new self();
|
|
}
|
|
|
|
return self::$instance;
|
|
}
|
|
|
|
private function __construct()
|
|
{
|
|
|
|
foreach (DUPX_ArchiveConfig::getInstance()->wpInfo->plugins as $pluginInfo) {
|
|
$this->plugins[$pluginInfo->slug] = new DUPX_Plugin_item((array) $pluginInfo);
|
|
}
|
|
|
|
$this->setCustomPluginsActions();
|
|
|
|
Log::info('CONSTRUCT PLUGINS OBJECTS: ' . Log::v2str($this->plugins), Log::LV_HARD_DEBUG);
|
|
}
|
|
|
|
private function setCustomPluginsActions()
|
|
{
|
|
$default = DUPX_Plugin_custom_actions::BY_DEFAULT_ENABLED;
|
|
$afterLogin = true;
|
|
$longMsg = '';
|
|
|
|
$this->customPluginsActions[self::SLUG_DUPLICATOR_LITE] = new DUPX_Plugin_custom_actions(
|
|
self::SLUG_DUPLICATOR_LITE,
|
|
$default,
|
|
$afterLogin,
|
|
$longMsg
|
|
);
|
|
$this->customPluginsActions[self::SLUG_DUPLICATOR_TESTER] = new DUPX_Plugin_custom_actions(
|
|
self::SLUG_DUPLICATOR_TESTER,
|
|
$default,
|
|
$afterLogin,
|
|
$longMsg
|
|
);
|
|
$this->customPluginsActions[self::SLUG_DUPLICATOR_PRO] = new DUPX_Plugin_custom_actions(
|
|
self::SLUG_DUPLICATOR_PRO,
|
|
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
|
|
false,
|
|
'Duplicator PRO has been deactivated because in the new versions it is not possible to ' .
|
|
'have Duplicator PRO active at the same time as PRO.'
|
|
);
|
|
|
|
$longMsg = "This plugin is deactivated by default automatically. "
|
|
. "<strong>You must reactivate from the WordPress admin panel after completing the installation</strong> "
|
|
. "or from the plugins tab."
|
|
. " Your site's frontend will render properly after reactivating the plugin.";
|
|
$this->customPluginsActions[self::SLUG_WPBAKERY_PAGE_BUILDER] = new DUPX_Plugin_custom_actions(
|
|
self::SLUG_WPBAKERY_PAGE_BUILDER,
|
|
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
|
|
true,
|
|
$longMsg
|
|
);
|
|
$this->customPluginsActions[self::SLUG_JETPACK] = new DUPX_Plugin_custom_actions(
|
|
self::SLUG_JETPACK,
|
|
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
|
|
true,
|
|
$longMsg
|
|
);
|
|
|
|
$longMsg = "This plugin is deactivated by default automatically due to issues that one may encounter when migrating. "
|
|
. "<strong>You must reactivate from the WordPress admin panel after completing the installation</strong> "
|
|
. "or from the plugins tab."
|
|
. " Your site's frontend will render properly after reactivating the plugin.";
|
|
|
|
$this->customPluginsActions[self::SLUG_POPUP_MAKER] = new DUPX_Plugin_custom_actions(
|
|
self::SLUG_POPUP_MAKER,
|
|
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
|
|
true,
|
|
$longMsg
|
|
);
|
|
$this->customPluginsActions[self::SLUG_WP_ROCKET] = new DUPX_Plugin_custom_actions(
|
|
self::SLUG_WP_ROCKET,
|
|
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
|
|
true,
|
|
$longMsg
|
|
);
|
|
$this->customPluginsActions[self::SLUG_WPS_HIDE_LOGIN] = new DUPX_Plugin_custom_actions(
|
|
self::SLUG_WPS_HIDE_LOGIN,
|
|
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
|
|
true,
|
|
$longMsg
|
|
);
|
|
|
|
$longMsg = "This plugin is deactivated by default automatically due to issues that one may encounter when migrating. "
|
|
. "<strong>You must reactivate from the WordPress admin panel after completing the installation</strong> "
|
|
. "or from the plugins tab.";
|
|
$this->customPluginsActions[self::SLUG_WOO_ADMIN] = new DUPX_Plugin_custom_actions(
|
|
self::SLUG_WOO_ADMIN,
|
|
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
|
|
true,
|
|
$longMsg
|
|
);
|
|
$this->customPluginsActions[self::SLUG_BETTER_WP_SECURITY] = new DUPX_Plugin_custom_actions(
|
|
self::SLUG_BETTER_WP_SECURITY,
|
|
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
|
|
true,
|
|
$longMsg
|
|
);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return DUPX_Plugin_item[]
|
|
*/
|
|
public function getPlugins()
|
|
{
|
|
return $this->plugins;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @staticvar string[] $dropInsPaths
|
|
* @return string[]
|
|
*/
|
|
public function getDropInsPaths()
|
|
{
|
|
static $dropInsPaths = null;
|
|
|
|
if (is_null($dropInsPaths)) {
|
|
$dropInsPaths = array();
|
|
foreach ($this->plugins as $plugin) {
|
|
if ($plugin->isDropIns()) {
|
|
$dropInsPaths[] = $plugin->getPluginArchivePath();
|
|
}
|
|
}
|
|
Log::info('DROP INS PATHS: ' . Log::v2str($dropInsPaths));
|
|
}
|
|
return $dropInsPaths;
|
|
}
|
|
|
|
public function pluginExistsInArchive($slug)
|
|
{
|
|
return array_key_exists($slug, $this->plugins);
|
|
}
|
|
|
|
/**
|
|
* This function performs status checks on plugins and disables those that must disable creating user messages
|
|
*/
|
|
public function preViewChecks()
|
|
{
|
|
$noticeManager = DUPX_NOTICE_MANAGER::getInstance();
|
|
$paramsManager = PrmMng::getInstance();
|
|
|
|
if (DUPX_InstallerState::isRestoreBackup()) {
|
|
return;
|
|
}
|
|
|
|
$activePlugins = $paramsManager->getValue(PrmMng::PARAM_PLUGINS);
|
|
$saveParams = false;
|
|
|
|
foreach ($this->customPluginsActions as $slug => $customPlugin) {
|
|
if (!isset($this->plugins[$slug])) {
|
|
continue;
|
|
}
|
|
|
|
switch ($customPlugin->byDefaultStatus()) {
|
|
case DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED:
|
|
if (($delKey = array_search($slug, $activePlugins)) !== false) {
|
|
$saveParams = true;
|
|
unset($activePlugins[$delKey]);
|
|
|
|
$noticeManager->addNextStepNotice(array(
|
|
'shortMsg' => 'Plugin ' . $this->plugins[$slug]->name . ' disabled by default',
|
|
'level' => DUPX_NOTICE_ITEM::NOTICE,
|
|
'longMsg' => $customPlugin->byDefaultMessage(),
|
|
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
|
|
'sections' => 'plugins'
|
|
), DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'custom_plugin_action' . $slug);
|
|
}
|
|
break;
|
|
case DUPX_Plugin_custom_actions::BY_DEFAULT_ENABLED:
|
|
if (!in_array($slug, $activePlugins)) {
|
|
$saveParams = true;
|
|
$activePlugins[] = $slug;
|
|
|
|
$noticeManager->addNextStepNotice(array(
|
|
'shortMsg' => 'Plugin ' . $this->plugins[$slug]->name . ' enabled by default',
|
|
'level' => DUPX_NOTICE_ITEM::NOTICE,
|
|
'longMsg' => $customPlugin->byDefaultMessage(),
|
|
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
|
|
'sections' => 'plugins'
|
|
), DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'custom_plugin_action' . $slug);
|
|
}
|
|
break;
|
|
case DUPX_Plugin_custom_actions::BY_DEFAULT_AUTO:
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ($saveParams) {
|
|
$paramsManager->setValue(PrmMng::PARAM_PLUGINS, $activePlugins);
|
|
$paramsManager->save();
|
|
$noticeManager->saveNotices();
|
|
}
|
|
}
|
|
|
|
public function getStatusCounts($subsiteId = -1)
|
|
{
|
|
$result = array(
|
|
DUPX_Plugin_item::STATUS_MUST_USE => 0,
|
|
DUPX_Plugin_item::STATUS_DROP_INS => 0,
|
|
DUPX_Plugin_item::STATUS_NETWORK_ACTIVE => 0,
|
|
DUPX_Plugin_item::STATUS_ACTIVE => 0,
|
|
DUPX_Plugin_item::STATUS_INACTIVE => 0
|
|
);
|
|
|
|
foreach ($this->plugins as $plugin) {
|
|
$result[$plugin->getOrgiStatus($subsiteId)]++;
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
public function getDefaultActivePluginsList($subsiteId = -1)
|
|
{
|
|
$result = array();
|
|
foreach ($this->plugins as $plugin) {
|
|
if (!$plugin->isInactive($subsiteId)) {
|
|
$result[] = $plugin->slug;
|
|
}
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* return alla plugins slugs list
|
|
*
|
|
* @return string[]
|
|
*/
|
|
public function getAllPluginsSlugs()
|
|
{
|
|
return array_keys($this->plugins);
|
|
}
|
|
|
|
public function setActions($plugins, $subsiteId = -1)
|
|
{
|
|
Log::info('FUNCTION [' . __FUNCTION__ . ']: plugins ' . Log::v2str($plugins), Log::LV_DEBUG);
|
|
|
|
foreach ($this->plugins as $slug => $plugin) {
|
|
$deactivate = false;
|
|
|
|
if ($plugin->isForceDisabled()) {
|
|
$deactivate = true;
|
|
} else {
|
|
if (!$this->plugins[$slug]->isInactive($subsiteId) && !in_array($slug, $plugins)) {
|
|
$deactivate = true;
|
|
}
|
|
}
|
|
|
|
if ($deactivate) {
|
|
$this->plugins[$slug]->setDeactivateAction($subsiteId, null, null, false);
|
|
}
|
|
}
|
|
|
|
foreach ($plugins as $slug) {
|
|
if (isset($this->plugins[$slug])) {
|
|
$this->plugins[$slug]->setActivationAction($subsiteId, false);
|
|
}
|
|
}
|
|
|
|
$this->setAutoActions($subsiteId);
|
|
DUPX_NOTICE_MANAGER::getInstance()->saveNotices();
|
|
}
|
|
|
|
public function executeActions($dbh, $subsiteId = -1)
|
|
{
|
|
$activePluginsList = array();
|
|
$activateOnLoginPluginsList = array();
|
|
$this->unistallList = array();
|
|
|
|
$escapedTablePrefix = mysqli_real_escape_string($dbh, PrmMng::getInstance()->getValue(PrmMng::PARAM_DB_TABLE_PREFIX));
|
|
|
|
$noticeManager = DUPX_NOTICE_MANAGER::getInstance();
|
|
|
|
Log::info('PLUGINS OBJECTS: ' . Log::v2str($this->plugins), Log::LV_HARD_DEBUG);
|
|
|
|
foreach ($this->plugins as $plugin) {
|
|
$deactivated = false;
|
|
if ($plugin->deactivateAction) {
|
|
$plugin->deactivate();
|
|
// can't remove deactivate after login
|
|
$deactivated = true;
|
|
} else {
|
|
if ($plugin->isActive($subsiteId)) {
|
|
$activePluginsList[] = $plugin->slug;
|
|
}
|
|
}
|
|
|
|
if ($plugin->activateAction) {
|
|
$activateOnLoginPluginsList[] = $plugin->slug;
|
|
$noticeManager->addFinalReportNotice(array(
|
|
'shortMsg' => 'Activate ' . $plugin->name . ' after you login.',
|
|
'level' => DUPX_NOTICE_ITEM::NOTICE,
|
|
'sections' => 'plugins'
|
|
));
|
|
}
|
|
}
|
|
|
|
// force duplicator lite activation
|
|
if (!array_key_exists(self::SLUG_DUPLICATOR_LITE, $activePluginsList)) {
|
|
$activePluginsList[] = self::SLUG_DUPLICATOR_LITE;
|
|
}
|
|
|
|
// force duplicator tester activation if exists
|
|
if ($this->pluginExistsInArchive(self::SLUG_DUPLICATOR_TESTER) && !array_key_exists(self::SLUG_DUPLICATOR_TESTER, $activePluginsList)) {
|
|
$activePluginsList[] = self::SLUG_DUPLICATOR_TESTER;
|
|
}
|
|
|
|
Log::info('Active plugins: ' . Log::v2str($activePluginsList), Log::LV_DEBUG);
|
|
|
|
$value = mysqli_real_escape_string($dbh, @serialize($activePluginsList));
|
|
$optionTable = mysqli_real_escape_string($dbh, DUPX_DB_Functions::getOptionsTableName());
|
|
$query = "UPDATE `" . $optionTable . "` SET option_value = '" . $value . "' WHERE option_name = 'active_plugins' ";
|
|
|
|
if (!DUPX_DB::mysqli_query($dbh, $query)) {
|
|
$noticeManager->addFinalReportNotice(array(
|
|
'shortMsg' => 'QUERY ERROR: MySQL',
|
|
'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
|
|
'longMsg' => "Error description: " . mysqli_error($dbh),
|
|
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_DEFAULT,
|
|
'sections' => 'database'
|
|
));
|
|
throw new Exception("Database error description: " . mysqli_error($dbh));
|
|
}
|
|
|
|
$value = mysqli_real_escape_string($dbh, @serialize($activateOnLoginPluginsList));
|
|
$optionTable = mysqli_real_escape_string($dbh, DUPX_DB_Functions::getOptionsTableName());
|
|
$query = "INSERT INTO `" . $optionTable . "` (option_name, option_value) VALUES('" . self::OPTION_ACTIVATE_PLUGINS . "','" . $value . "') ON DUPLICATE KEY UPDATE option_name=\"" . self::OPTION_ACTIVATE_PLUGINS . "\"";
|
|
if (!DUPX_DB::mysqli_query($dbh, $query)) {
|
|
$noticeManager->addFinalReportNotice(array(
|
|
'shortMsg' => 'QUERY ERROR: MySQL',
|
|
'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
|
|
'longMsg' => "Error description: " . mysqli_error($dbh),
|
|
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_DEFAULT,
|
|
'sections' => 'database'
|
|
));
|
|
throw new Exception("Database error description: " . mysqli_error($dbh));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* remove inactive plugins
|
|
* this method must calle after wp-config set
|
|
*/
|
|
public function unistallInactivePlugins()
|
|
{
|
|
Log::info('FUNCTION [' . __FUNCTION__ . ']: unistall inactive plugins');
|
|
|
|
foreach ($this->unistallList as $plugin) {
|
|
if ($plugin->uninstall()) {
|
|
Log::info("UNINSTALL PLUGIN " . Log::v2str($plugin->slug) . ' DONE');
|
|
} else {
|
|
Log::info("UNINSTALL PLUGIN " . Log::v2str($plugin->slug) . ' FAILED');
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set automatic actions for plugins
|
|
*
|
|
* @return void
|
|
*/
|
|
public function setAutoActions($subsiteId = -1)
|
|
{
|
|
$paramManager = PrmMng::getInstance();
|
|
$casesToHandle = array(
|
|
array(
|
|
'slugs' => array(
|
|
self::SLUG_SIMPLE_SSL,
|
|
self::SLUG_WP_FORCE_SSL,
|
|
self::SLUG_HTTPS_REDIRECTION,
|
|
self::SLUG_ONE_CLICK_SSL
|
|
),
|
|
'longMsg' => "The plugin '%name%' has been deactivated because you are migrating from SSL (HTTPS) to Non-SSL (HTTP).<br>" .
|
|
"If it was not deactivated, you would not be able to login.",
|
|
'info' => '%name% [as Non-SSL installation] will be deactivated',
|
|
'condition' => !DUPX_U::is_ssl()
|
|
),
|
|
array(
|
|
'slugs' => array(
|
|
self::SLUG_RECAPTCHA,
|
|
self::SLUG_LOGIN_NOCAPTCHA,
|
|
self::SLUG_GOOGLE_CAPTCHA,
|
|
self::SLUG_ADVANCED_CAPTCHA
|
|
),
|
|
'longMsg' => "The plugin '%name%' has been deactivated because reCaptcha requires a site key which is bound to the site's address." .
|
|
"Your package site's address and installed site's address don't match. " .
|
|
"You can reactivate it after finishing with the installation.<br>" .
|
|
"<strong>Please do not forget to change the reCaptcha site key after activating it.</strong>",
|
|
'info' => '%name% [as package creation site URL and the installation site URL are different] will be deactivated',
|
|
'condition' => $paramManager->getValue(PrmMng::PARAM_SITE_URL_OLD) != $paramManager->getValue(PrmMng::PARAM_SITE_URL),
|
|
),
|
|
);
|
|
|
|
foreach ($casesToHandle as $case) {
|
|
foreach ($case['slugs'] as $slug) {
|
|
if (isset($this->plugins[$slug]) && $this->plugins[$slug]->isActive($subsiteId) && $case['condition']) {
|
|
$info = str_replace('%name%', $this->plugins[$slug]->name, $case['info']);
|
|
$longMsg = str_replace('%name%', $this->plugins[$slug]->name, $case['longMsg']);
|
|
Log::info($info, Log::LV_DEBUG);
|
|
$this->plugins[$slug]->setDeactivateAction($subsiteId, $info, $longMsg);
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach ($this->customPluginsActions as $slug => $customPlugin) {
|
|
if (!isset($this->plugins[$slug])) {
|
|
continue;
|
|
}
|
|
if (!$this->plugins[$slug]->isInactive($subsiteId) && $customPlugin->isEnableAfterLogin()) {
|
|
$this->plugins[$slug]->setActivationAction($subsiteId);
|
|
}
|
|
}
|
|
}
|
|
|
|
private function __clone()
|
|
{
|
|
}
|
|
}
|
|
|