first commit

This commit is contained in:
2026-04-20 13:11:14 +02:00
commit e0b63ca5f9
7793 changed files with 1844488 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
<Files *.php>
Order Deny,Allow
Deny from all
</Files>
<Files index.php>
Order Allow,Deny
Allow from all
</Files>

View File

@@ -0,0 +1,352 @@
<?php
/**
* controller step 0
*
* Standard: PSR-2
*
* @link http://www.php-fig.org/psr/psr-2 Full Documentation
*
* @package SC\DUPX
*/
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
use Duplicator\Installer\Core\Deploy\Plugins\PluginsManager;
use Duplicator\Installer\Core\InstState;
use Duplicator\Installer\Core\Params\PrmMng;
use Duplicator\Installer\Core\Security;
use Duplicator\Installer\Utils\Log\Log;
use Duplicator\Installer\Utils\SecureCsrf;
use Duplicator\Installer\Utils\Tests\WP\TestsExecuter;
use Duplicator\Libs\Snap\SnapJson;
use Duplicator\Libs\Snap\SnapString;
use Duplicator\Libs\Snap\SnapUtil;
/**
* Ajax controller
*/
final class DUPX_Ctrl_ajax
{
const DEBUG_AJAX_CALL_SLEEP = 0;
const PREVENT_BRUTE_FORCE_ATTACK_SLEEP = 1;
const AJAX_NAME = 'ajax_request';
const ACTION_NAME = 'ajax_action';
const TOKEN_NAME = 'ajax_csrf_token';
// ACCEPTED ACTIONS
const ACTION_INITPASS_CHECK = 'initpass';
const ACTION_PROCEED_CONFIRM_DIALOG = 'proceed_confirm_dialog';
const ACTION_VALIDATE = 'validate';
const ACTION_SET_PARAMS_S1 = 'sparam_s1';
const ACTION_SET_PARAMS_S2 = 'sparam_s2';
const ACTION_SET_PARAMS_S3 = 'sparam_s3';
const ACTION_EXTRACTION = 'extract';
const ACTION_DBINSTALL = 'dbinstall';
const ACTION_WEBSITE_UPDATE = 'webupdate';
const ACTION_PWD_CHECK = 'pwdcheck';
const ACTION_FINAL_TESTS_PREPARE = 'finalpre';
const ACTION_FINAL_TESTS_AFTER = 'finalafter';
const ACTION_SET_AUTO_CLEAN_FILES = 'autoclean';
/**
* Ajax actions
*
* @return string[]
*/
public static function ajaxActions()
{
static $actions = null;
if (is_null($actions)) {
$actions = array(
self::ACTION_PROCEED_CONFIRM_DIALOG,
self::ACTION_VALIDATE,
self::ACTION_SET_PARAMS_S1,
self::ACTION_SET_PARAMS_S2,
self::ACTION_SET_PARAMS_S3,
self::ACTION_EXTRACTION,
self::ACTION_DBINSTALL,
self::ACTION_WEBSITE_UPDATE,
self::ACTION_PWD_CHECK,
self::ACTION_FINAL_TESTS_PREPARE,
self::ACTION_FINAL_TESTS_AFTER,
self::ACTION_SET_AUTO_CLEAN_FILES,
);
}
return $actions;
}
/**
* Ajax controller
*
* @return void
*/
public static function controller()
{
$action = null;
if (self::isAjax($action) === false) {
return;
}
ob_start();
Log::info("\n" . '-------------------------' . "\n" . 'AJAX ACTION [' . $action . "] START");
Log::infoObject('POST DATA: ', $_POST, Log::LV_DEBUG);
$jsonResult = array(
'success' => true,
'message' => '',
"errorContent" => array(
'pre' => '',
'html' => '',
),
'trace' => '',
'actionData' => null,
);
Log::setThrowExceptionOnError(true);
try {
DUPX_Template::getInstance()->setTemplate(PrmMng::getInstance()->getValue(PrmMng::PARAM_TEMPLATE));
$jsonResult['actionData'] = self::actions($action);
} catch (Exception $e) {
Log::logException($e);
if (SnapString::isHTML($e->getMessage())) {
$message = $e->getMessage();
} else {
$message = DUPX_U::esc_html($e->getMessage());
}
$jsonResult = array(
'success' => false,
'message' => $message,
"errorContent" => array(
'pre' => Log::getLogException($e),
'html' => '',
),
);
}
$invalidOutput = SnapUtil::obCleanAll();
ob_end_clean();
if (strlen($invalidOutput) > 0) {
Log::info('INVALID AJAX OUTPUT:' . "\n" . $invalidOutput . "\n---------------------------------");
}
if ($jsonResult['success']) {
Log::info('AJAX ACTION [' . $action . '] SUCCESS');
} else {
Log::info('AJAX ACTION [' . $action . '] FAIL, MESSAGE: ' . $jsonResult['message']);
}
Log::info('-------------------------' . "\n");
if (!headers_sent()) {
header('Content-Type: application/json');
}
echo SnapJson::jsonEncode($jsonResult);
Log::close();
// if is ajax always die;
die();
}
/**
* ajax actions
*
* @param string $action action name
*
* @return mixed
*/
protected static function actions($action)
{
$actionData = null;
self::debugAjaxCallSleep();
switch ($action) {
case self::ACTION_PWD_CHECK:
$actionData = Security::getInstance()->securityCheck();
break;
case self::ACTION_PROCEED_CONFIRM_DIALOG:
$vData = DUPX_Validation_database_service::getInstance();
if (!InstState::dbDoNothing() && !$vData->getDbConnection()) {
throw new Exception('Connection DB data isn\'t valid');
}
$actionData = dupxTplRender(
'pages-parts/step1/proceed-confirm-dialog',
array(
'tableCount' => InstState::dbDoNothing() ? 0 : $vData->getDBActionAffectedTablesCount(),
),
false
);
break;
case self::ACTION_VALIDATE:
DUP_PRO_Extraction::resetData();
$actionData = DUPX_Validation_manager::getInstance()->getValidateData();
if ($actionData['mainLevel'] <= DUPX_Validation_abstract_item::LV_FAIL) {
sleep(self::PREVENT_BRUTE_FORCE_ATTACK_SLEEP);
} else {
DUPX_Ctrl_Params::setParamsAfterValidation();
}
$actionData['nextStepMessagesHtml'] = DUPX_NOTICE_MANAGER::getInstance()->nextStepMessages(true, false);
break;
case self::ACTION_SET_PARAMS_S1:
$valid = DUPX_Ctrl_Params::setParamsStep1();
DUPX_NOTICE_MANAGER::getInstance()->nextStepLog(false);
$nexStepNotices = DUPX_NOTICE_MANAGER::getInstance()->nextStepMessages(true, false);
$actionData = array(
'isValid' => $valid,
'nextStepMessagesHtml' => $nexStepNotices,
);
break;
case self::ACTION_SET_PARAMS_S2:
$valid = DUPX_Ctrl_Params::setParamsStep2();
DUPX_NOTICE_MANAGER::getInstance()->nextStepLog(false);
$nexStepNotices = DUPX_NOTICE_MANAGER::getInstance()->nextStepMessages(true, false);
$actionData = array(
'isValid' => $valid,
'nextStepMessagesHtml' => $nexStepNotices,
);
break;
case self::ACTION_SET_PARAMS_S3:
$valid = DUPX_Ctrl_Params::setParamsStep3();
DUPX_NOTICE_MANAGER::getInstance()->nextStepLog(false);
$nexStepNotices = DUPX_NOTICE_MANAGER::getInstance()->nextStepMessages(true, false);
$actionData = array(
'isValid' => $valid,
'nextStepMessagesHtml' => $nexStepNotices,
);
break;
case self::ACTION_EXTRACTION:
$extractor = DUP_PRO_Extraction::getInstance();
$extractor->runExtraction();
$actionData = $extractor->finishExtraction();
break;
case self::ACTION_DBINSTALL:
$dbInstall = DUPX_DBInstall::getInstance();
$actionData = $dbInstall->deploy();
PluginsManager::getInstance()->preViewChecks();
break;
case self::ACTION_WEBSITE_UPDATE:
$actionData = DUPX_S3_Funcs::getInstance()->updateWebsite();
break;
case self::ACTION_FINAL_TESTS_PREPARE:
$actionData = InstState::dbDoNothing() || TestsExecuter::preTestPrepare();
break;
case self::ACTION_FINAL_TESTS_AFTER:
$actionData = InstState::dbDoNothing() || TestsExecuter::afterTestClean();
break;
case self::ACTION_SET_AUTO_CLEAN_FILES:
if (
(!InstState::dbDoNothing() || InstState::isImportFromBackendMode()) &&
DUPX_Ctrl_Params::setParamAutoClean()
) {
$valid = DUPX_S3_Funcs::getInstance()->duplicatorMigrationInfoSet();
} else {
$valid = false;
}
DUPX_NOTICE_MANAGER::getInstance()->nextStepLog(false);
$nexStepNotices = DUPX_NOTICE_MANAGER::getInstance()->nextStepMessages(true, false);
$actionData = array(
'isValid' => $valid,
'nextStepMessagesHtml' => $nexStepNotices,
);
break;
default:
throw new Exception('Invalid ajax action');
}
return $actionData;
}
/**
* Check if current call is ajax
*
* @param string $action if is ajax $action is set with action string
*
* @return bool true if is ajax
*/
public static function isAjax(&$action = null)
{
static $isAjaxAction = null;
if (is_null($isAjaxAction)) {
$isAjaxAction = array(
'isAjax' => false,
'action' => false,
);
$argsInput = SnapUtil::filterInputRequestArray(array(
PrmMng::PARAM_CTRL_ACTION => array(
'filter' => FILTER_SANITIZE_SPECIAL_CHARS,
'flags' => FILTER_REQUIRE_SCALAR | FILTER_FLAG_STRIP_HIGH,
'options' => array('default' => ''),
),
self::ACTION_NAME => array(
'filter' => FILTER_SANITIZE_SPECIAL_CHARS,
'flags' => FILTER_REQUIRE_SCALAR | FILTER_FLAG_STRIP_HIGH,
'options' => array('default' => false),
),
));
if ($argsInput[PrmMng::PARAM_CTRL_ACTION] !== 'ajax' || $argsInput[self::ACTION_NAME] === false) {
$isAjaxAction['isAjax'] = false;
} else {
if (($isAjaxAction['isAjax'] = in_array($argsInput[self::ACTION_NAME], self::ajaxActions()))) {
$isAjaxAction['action'] = $argsInput[self::ACTION_NAME];
}
}
}
if ($isAjaxAction['isAjax']) {
$action = $isAjaxAction['action'];
}
return $isAjaxAction['isAjax'];
}
/**
* Get token key by action
*
* @param string $action action name
*
* @return string
*/
public static function getTokenKeyByAction($action)
{
return self::ACTION_NAME . $action;
}
/**
* Get token from input
*
* @return string
*/
public static function getTokenFromInput()
{
return SnapUtil::sanitizeDefaultInput(INPUT_POST, self::TOKEN_NAME, false);
}
/**
* Get token by action
*
* @param string $action action name
*
* @return string
*/
public static function generateToken($action)
{
return SecureCsrf::generate(self::getTokenKeyByAction($action));
}
/**
* debugAjaxCallSleep
*
* @return void
*/
protected static function debugAjaxCallSleep()
{
if (self::DEBUG_AJAX_CALL_SLEEP > 0) { // @phpstan-ignore-line
sleep(self::DEBUG_AJAX_CALL_SLEEP);
}
}
}

View File

@@ -0,0 +1,597 @@
<?php
/**
* Controller params 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\Core\Deploy\Plugins\PluginsManager;
use Duplicator\Installer\Core\Deploy\ServerConfigs;
use Duplicator\Installer\Core\InstState;
use Duplicator\Installer\Core\Params\Descriptors\ParamDescDatabase;
use Duplicator\Installer\Core\Params\Descriptors\ParamDescEngines;
use Duplicator\Installer\Core\Params\Items\ParamForm;
use Duplicator\Installer\Core\Params\PrmMng;
use Duplicator\Installer\Utils\Log\Log;
/**
* singleton class
*/
final class DUPX_Ctrl_Params
{
/** @var bool this variable becomes false if there was something wrong with the validation but the basic is true */
private static $paramsValidated = true;
/**
* returns false if at least one param has not been validated
*
* @return bool
*/
public static function isParamsValidated()
{
return self::$paramsValidated;
}
/**
* Set base params
*
* @return bool
*/
public static function setParamsBase()
{
Log::info('CTRL PARAMS BASE', Log::LV_DETAILED);
$paramsManager = PrmMng::getInstance();
$paramsManager->setValueFromInput(PrmMng::PARAM_CTRL_ACTION, ParamForm::INPUT_REQUEST);
$paramsManager->setValueFromInput(PrmMng::PARAM_STEP_ACTION, ParamForm::INPUT_REQUEST);
return true;
}
/**
*
* @return bool
*/
public static function setParamsStep0()
{
Log::info('CTRL PARAMS S0', Log::LV_DETAILED);
Log::info('REQUEST: ' . Log::v2str($_REQUEST), Log::LV_HARD_DEBUG);
$paramsManager = PrmMng::getInstance();
DUPX_ArchiveConfig::getInstance()->setNewPathsAndUrlParamsByMainNew();
DUPX_ArchiveConfig::getInstance()->setEnginesDBExcluded();
DUPX_Custom_Host_Manager::getInstance()->setManagedHostParams();
$paramsManager->save();
return self::$paramsValidated;
}
/**
*
* @return boolean
*/
public static function setParamsStep1()
{
Log::info('CTRL PARAMS S1', Log::LV_DETAILED);
Log::info('REQUEST: ' . Log::v2str($_REQUEST), Log::LV_HARD_DEBUG);
$archive_config = DUPX_ArchiveConfig::getInstance();
$paramsManager = PrmMng::getInstance();
$paramsManager->setValueFromInput(PrmMng::PARAM_LOGGING, ParamForm::INPUT_POST);
Log::setLogLevel();
$oldSubsiteId = $paramsManager->getValue(PrmMng::PARAM_SUBSITE_ID);
$readParamsList = array(
PrmMng::PARAM_INST_TYPE,
PrmMng::PARAM_PATH_NEW,
PrmMng::PARAM_URL_NEW,
PrmMng::PARAM_PATH_WP_CORE_NEW,
PrmMng::PARAM_SITE_URL,
PrmMng::PARAM_PATH_CONTENT_NEW,
PrmMng::PARAM_URL_CONTENT_NEW,
PrmMng::PARAM_PATH_UPLOADS_NEW,
PrmMng::PARAM_URL_UPLOADS_NEW,
PrmMng::PARAM_PATH_PLUGINS_NEW,
PrmMng::PARAM_URL_PLUGINS_NEW,
PrmMng::PARAM_PATH_MUPLUGINS_NEW,
PrmMng::PARAM_URL_MUPLUGINS_NEW,
PrmMng::PARAM_SUBSITE_ID,
PrmMng::PARAM_SUBSITE_OVERWRITE_MAPPING,
PrmMng::PARAM_ARCHIVE_ACTION,
PrmMng::PARAM_ARCHIVE_ENGINE,
PrmMng::PARAM_ARCHIVE_ENGINE_SKIP_WP_FILES,
PrmMng::PARAM_DB_ENGINE,
PrmMng::PARAM_REPLACE_ENGINE,
PrmMng::PARAM_USERS_MODE,
PrmMng::PARAM_MU_REPLACE,
PrmMng::PARAM_ADD_SUBSITE_USER_MODE,
PrmMng::PARAM_SET_FILE_PERMS,
PrmMng::PARAM_SET_DIR_PERMS,
PrmMng::PARAM_FILE_PERMS_VALUE,
PrmMng::PARAM_DIR_PERMS_VALUE,
PrmMng::PARAM_SAFE_MODE,
PrmMng::PARAM_WP_CONFIG,
PrmMng::PARAM_HTACCESS_CONFIG,
PrmMng::PARAM_OTHER_CONFIG,
PrmMng::PARAM_FILE_TIME,
PrmMng::PARAM_REMOVE_RENDUNDANT,
PrmMng::PARAM_REMOVE_USERS_WITHOUT_PERMISSIONS,
PrmMng::PARAM_BLOGNAME,
PrmMng::PARAM_ACCEPT_TERM_COND,
PrmMng::PARAM_ZIP_THROTTLING,
);
foreach ($readParamsList as $cParam) {
if ($paramsManager->setValueFromInput($cParam, ParamForm::INPUT_POST, false, true) === false) {
self::$paramsValidated = false;
}
}
$paramsManager->setValue(PrmMng::PARAM_REPLACE_ENGINE, ParamDescEngines::getReplaceEngineModeFromParams());
$paramsManager->setValue(PrmMng::PARAM_DB_CHUNK, ParamDescEngines::getDbChunkFromParams());
self::setParamsDatabase();
self::updateBlogname($oldSubsiteId);
if (self::$paramsValidated) {
self::resetUrlAndPathsFromOverwriteData();
self::setParamsOnAddSiteOnMultisite();
Log::info('UPDATE PARAMS FROM SUBSITE ID', Log::LV_DEBUG);
Log::info('NETWORK INSTALL: ' . Log::v2str(InstState::isNewSiteIsMultisite()), Log::LV_DEBUG);
// UPDATE ACTIVE PARAMS BY SUBSITE ID
$subsiteId = $paramsManager->getValue(PrmMng::PARAM_SUBSITE_ID);
Log::info('SUBSITE ID: ' . Log::v2str($subsiteId), Log::LV_DEBUG);
$activePlugins = PluginsManager::getInstance()->getDefaultActivePluginsList($subsiteId);
$paramsManager->setValue(PrmMng::PARAM_PLUGINS, $activePlugins);
// IF SAFE MODE DISABLE ALL PLUGINS
if ($paramsManager->getValue(PrmMng::PARAM_SAFE_MODE) > 0) {
$forceDisable = PluginsManager::getInstance()->getAllPluginsSlugs();
// EXCLUDE DUPLICATOR PRO
if (($key = array_search(PluginsManager::SLUG_DUPLICATOR_PRO, $forceDisable)) !== false) {
unset($forceDisable[$key]);
}
$paramsManager->setValue(PrmMng::PARAM_FORCE_DIABLE_PLUGINS, $forceDisable);
}
}
// reload state after new path and new url
InstState::getInstance()->checkState(false, false);
if (InstState::dbDoNothing()) {
$paramsManager->setValue(PrmMng::PARAM_REPLACE_ENGINE, DUPX_S3_Funcs::MODE_SKIP);
$paramsManager->setValue(PrmMng::PARAM_WP_CONFIG, ServerConfigs::ACTION_WPCONF_NOTHING);
$paramsManager->setValue(PrmMng::PARAM_HTACCESS_CONFIG, 'nothing');
$paramsManager->setValue(PrmMng::PARAM_OTHER_CONFIG, 'nothing');
}
$paramsManager->save();
return self::$paramsValidated;
}
/**
*
* @return boolean
*/
public static function setParamsAfterValidation()
{
Log::info("\nCTRL PARAMS AFTER VALIDATION");
$paramsManager = PrmMng::getInstance();
$paramsManager->setValue(PrmMng::PARAM_WP_ADDON_SITES_PATHS, DUPX_Validation_test_addon_sites::getAddonsListsFolders());
ParamDescDatabase::updateCharsetAndCollateByDatabaseSettings();
$configsChecks = DUPX_Validation_test_iswritable_configs::configsWritableChecks();
if ($configsChecks['wpconfig'] === false) {
Log::info("WP-CONFIG ISN\'T READABLE SO SET noting ON " . PrmMng::PARAM_WP_CONFIG . ' PARAM');
$paramsManager->setValue(PrmMng::PARAM_WP_CONFIG, 'nothing');
$paramsManager->setFormStatus(PrmMng::PARAM_WP_CONFIG, ParamForm::STATUS_INFO_ONLY);
Log::info('SET AND DISABLE ALL DB PARAMS');
$overwriteData = $paramsManager->getValue(PrmMng::PARAM_OVERWRITE_SITE_DATA);
$paramsManager->setValue(PrmMng::PARAM_DB_HOST, $overwriteData['dbhost']);
$paramsManager->setFormStatus(PrmMng::PARAM_DB_HOST, ParamForm::STATUS_INFO_ONLY);
$paramsManager->setValue(PrmMng::PARAM_DB_NAME, $overwriteData['dbname']);
$paramsManager->setFormStatus(PrmMng::PARAM_DB_NAME, ParamForm::STATUS_INFO_ONLY);
$paramsManager->setValue(PrmMng::PARAM_DB_USER, $overwriteData['dbuser']);
$paramsManager->setFormStatus(PrmMng::PARAM_DB_USER, ParamForm::STATUS_INFO_ONLY);
$paramsManager->setValue(PrmMng::PARAM_DB_PASS, $overwriteData['dbpass']);
$paramsManager->setFormStatus(PrmMng::PARAM_DB_PASS, ParamForm::STATUS_INFO_ONLY);
$paramsManager->setValue(PrmMng::PARAM_DB_TABLE_PREFIX, $overwriteData['table_prefix']);
$paramsManager->setFormStatus(PrmMng::PARAM_DB_TABLE_PREFIX, ParamForm::STATUS_INFO_ONLY);
}
if ($configsChecks['htaccess'] === false) {
Log::info("HTACCESS ISN\'T READABLE SO SET noting ON " . PrmMng::PARAM_HTACCESS_CONFIG . ' PARAM');
$paramsManager->setValue(PrmMng::PARAM_HTACCESS_CONFIG, 'nothing');
$paramsManager->setFormStatus(PrmMng::PARAM_HTACCESS_CONFIG, ParamForm::STATUS_INFO_ONLY);
}
if ($configsChecks['other'] === false) {
Log::info("OTHER CONFIGS ISN\'T READABLE SO SET noting ON " . PrmMng::PARAM_OTHER_CONFIG . ' PARAM');
$paramsManager->setValue(PrmMng::PARAM_OTHER_CONFIG, 'nothing');
$paramsManager->setFormStatus(PrmMng::PARAM_OTHER_CONFIG, ParamForm::STATUS_INFO_ONLY);
}
$paramsManager->save();
return self::$paramsValidated;
}
/**
* update blog name if subsite id is changed
*
* @param int $oldSubsiteId old subsite id
*
* @return void
*/
protected static function updateBlogname($oldSubsiteId)
{
$paramsManager = PrmMng::getInstance();
$archive_config = DUPX_ArchiveConfig::getInstance();
if ($paramsManager->getInitStatus(PrmMng::PARAM_SUBSITE_ID) === ParamForm::STATUS_OVERWRITE) {
return;
}
if ($oldSubsiteId == $paramsManager->getValue(PrmMng::PARAM_SUBSITE_ID)) {
return;
}
$blogName = $archive_config->getBlognameFromSelectedSubsiteId();
// If provided use name set by user
if ($paramsManager->getValue(PrmMng::PARAM_BLOGNAME) !== $archive_config->blogname) {
$blogName = $paramsManager->getValue(PrmMng::PARAM_BLOGNAME);
}
$paramsManager->setValue(PrmMng::PARAM_BLOGNAME, $blogName);
}
/**
*
* @return bool
*/
protected static function setParamsDatabase()
{
$paramsManager = PrmMng::getInstance();
$paramsManager->setValueFromInput(PrmMng::PARAM_DB_VIEW_MODE, ParamForm::INPUT_POST);
switch ($paramsManager->getValue(PrmMng::PARAM_DB_VIEW_MODE)) {
case 'basic':
$readParamsList = array(
PrmMng::PARAM_DB_ACTION,
PrmMng::PARAM_DB_HOST,
PrmMng::PARAM_DB_NAME,
PrmMng::PARAM_DB_USER,
PrmMng::PARAM_DB_PASS,
);
foreach ($readParamsList as $cParam) {
if ($paramsManager->setValueFromInput($cParam, ParamForm::INPUT_POST, false, true) === false) {
self::$paramsValidated = false;
}
}
break;
case 'cpnl':
$readParamsList = array(
PrmMng::PARAM_CPNL_HOST,
PrmMng::PARAM_CPNL_USER,
PrmMng::PARAM_CPNL_PASS,
PrmMng::PARAM_CPNL_DB_USER_CHK,
PrmMng::PARAM_CPNL_PREFIX,
PrmMng::PARAM_CPNL_DB_ACTION,
PrmMng::PARAM_CPNL_DB_HOST,
PrmMng::PARAM_CPNL_DB_NAME_SEL,
PrmMng::PARAM_CPNL_DB_NAME_TXT,
PrmMng::PARAM_CPNL_DB_USER_SEL,
PrmMng::PARAM_CPNL_DB_USER_TXT,
PrmMng::PARAM_CPNL_DB_PASS,
PrmMng::PARAM_CPNL_IGNORE_PREFIX,
);
foreach ($readParamsList as $cParam) {
if ($paramsManager->setValueFromInput($cParam, ParamForm::INPUT_POST, false, true) === false) {
self::$paramsValidated = false;
}
}
// NORMALIZE VALUES FOR DB TEST
if ($paramsManager->setValue(PrmMng::PARAM_DB_ACTION, $paramsManager->getValue(PrmMng::PARAM_CPNL_DB_ACTION)) === false) {
self::$paramsValidated = false;
}
// DBHOST
if ($paramsManager->setValue(PrmMng::PARAM_DB_HOST, $paramsManager->getValue(PrmMng::PARAM_CPNL_DB_HOST)) === false) {
self::$paramsValidated = false;
}
$cpnlPrefix = $paramsManager->getValue(PrmMng::PARAM_CPNL_PREFIX);
$ignorePrefix = $paramsManager->getValue(PrmMng::PARAM_CPNL_IGNORE_PREFIX);
// DBNAME
if ($paramsManager->getValue(PrmMng::PARAM_CPNL_DB_ACTION) === 'create') {
// CREATE NEW DATABASE
$dbName = $paramsManager->getValue(PrmMng::PARAM_CPNL_DB_NAME_TXT);
} else {
// GET EXISTS DATABASE
$dbName = $paramsManager->getValue(PrmMng::PARAM_CPNL_DB_NAME_SEL);
}
if ($ignorePrefix === false && strpos($dbName, $cpnlPrefix) !== 0) {
$dbName = $cpnlPrefix . $dbName;
}
if ($paramsManager->setValue(PrmMng::PARAM_DB_NAME, $dbName) === false) {
self::$paramsValidated = false;
}
// DB USER
if ($paramsManager->getValue(PrmMng::PARAM_CPNL_DB_USER_CHK)) {
// CREATE NEW USER
$dbUser = $paramsManager->getValue(PrmMng::PARAM_CPNL_DB_USER_TXT);
} else {
// GET EXIST USER
$dbUser = $paramsManager->getValue(PrmMng::PARAM_CPNL_DB_USER_SEL);
}
if ($ignorePrefix === false && strpos($dbUser, $cpnlPrefix) !== 0) {
$dbUser = $cpnlPrefix . $dbUser;
}
if ($paramsManager->setValue(PrmMng::PARAM_DB_USER, $dbUser) === false) {
self::$paramsValidated = false;
}
//DBPASS
if ($paramsManager->setValue(PrmMng::PARAM_DB_PASS, $paramsManager->getValue(PrmMng::PARAM_CPNL_DB_PASS)) === false) {
self::$paramsValidated = false;
}
break;
}
$readParamsList = array(
PrmMng::PARAM_DB_TABLE_PREFIX,
PrmMng::PARAM_DB_VIEW_CREATION,
PrmMng::PARAM_DB_PROC_CREATION,
PrmMng::PARAM_DB_FUNC_CREATION,
PrmMng::PARAM_DB_REMOVE_DEFINER,
PrmMng::PARAM_DB_SPLIT_CREATES,
PrmMng::PARAM_DB_MYSQL_MODE,
PrmMng::PARAM_DB_MYSQL_MODE_OPTS,
);
foreach ($readParamsList as $cParam) {
if ($paramsManager->setValueFromInput($cParam, ParamForm::INPUT_POST, false, true) === false) {
self::$paramsValidated = false;
}
}
if (
DUPX_Validation_database_service::getInstance()->caseSensitiveTablesValue() !== 0
&& ($redundantTables = DUPX_ArchiveConfig::getInstance()->getRedundantDuplicateTableNames()) !== []
) {
$defaultTables = DUPX_DB_Tables::getInstance()->getFilteredParamValue($redundantTables);
} else {
$defaultTables = DUPX_DB_Tables::getInstance()->getDefaultParamValue();
}
if ($paramsManager->setValue(PrmMng::PARAM_DB_TABLES, $defaultTables) === false) {
self::$paramsValidated = false;
}
return self::$paramsValidated;
}
/**
* resets the original values in case of D&G import
*
* @return void
*/
protected static function resetUrlAndPathsFromOverwriteData()
{
if (!InstState::isImportFromBackendMode()) {
return;
}
$paramsManager = PrmMng::getInstance();
$overwriteData = $paramsManager->getValue(PrmMng::PARAM_OVERWRITE_SITE_DATA);
if (!isset($overwriteData['urls']['home']) || !isset($overwriteData['paths']['home'])) {
return;
}
$paramsManager->setValue(PrmMng::PARAM_URL_NEW, $overwriteData['urls']['home']);
$paramsManager->setValue(PrmMng::PARAM_PATH_NEW, $overwriteData['paths']['home']);
$paramsManager->setValue(PrmMng::PARAM_SITE_URL, $overwriteData['urls']['abs']);
$paramsManager->setValue(PrmMng::PARAM_PATH_WP_CORE_NEW, $overwriteData['paths']['abs']);
$paramsManager->setValue(PrmMng::PARAM_URL_UPLOADS_NEW, $overwriteData['urls']['uploads']);
$paramsManager->setValue(PrmMng::PARAM_PATH_UPLOADS_NEW, $overwriteData['paths']['uploads']);
}
/**
*
* @return void
*/
public static function setParamsOnAddSiteOnMultisite()
{
if (!InstState::isAddSiteOnMultisite()) {
return;
}
$paramsManager = PrmMng::getInstance();
$overwriteData = $paramsManager->getValue(PrmMng::PARAM_OVERWRITE_SITE_DATA);
if (empty($overwriteData['adminUsers'])) {
throw new Exception('Empty admin users');
}
$paramsManager->setValue(PrmMng::PARAM_DB_ACTION, DUPX_DBInstall::DBACTION_REMOVE_ONLY_TABLES);
$paramsManager->setValue(PrmMng::PARAM_ARCHIVE_ENGINE_SKIP_WP_FILES, DUP_PRO_Extraction::FILTER_ONLY_MEDIA_PLUG_THEMES);
$paramsManager->setValue(PrmMng::PARAM_ARCHIVE_ACTION, DUP_PRO_Extraction::ACTION_REMOVE_UPLOADS);
$paramsManager->setValue(PrmMng::PARAM_WP_CONFIG, 'nothing');
$paramsManager->setValue(PrmMng::PARAM_HTACCESS_CONFIG, 'nothing');
$paramsManager->setValue(PrmMng::PARAM_OTHER_CONFIG, 'nothing');
$paramsManager->setValue(PrmMng::PARAM_DB_TABLE_PREFIX, $overwriteData['table_prefix']);
$paramsManager->setValue(PrmMng::PARAM_EMPTY_SCHEDULE_STORAGE, false);
$paramsManager->setValue(PrmMng::PARAM_URL_UPLOADS_NEW, $overwriteData['urls']['uploads']);
$paramsManager->setValue(PrmMng::PARAM_PATH_UPLOADS_NEW, $overwriteData['paths']['uploads']);
$paramsManager->setValue(PrmMng::PARAM_SITE_URL, $overwriteData['urls']['abs']);
$paramsManager->setValue(PrmMng::PARAM_PATH_WP_CORE_NEW, $overwriteData['paths']['abs']);
$paramsManager->setValue(PrmMng::PARAM_URL_CONTENT_NEW, $overwriteData['urls']['wpcontent']);
$paramsManager->setValue(PrmMng::PARAM_PATH_CONTENT_NEW, $overwriteData['paths']['wpcontent']);
$paramsManager->setValue(PrmMng::PARAM_URL_PLUGINS_NEW, $overwriteData['urls']['plugins']);
$paramsManager->setValue(PrmMng::PARAM_PATH_PLUGINS_NEW, $overwriteData['paths']['plugins']);
$paramsManager->setValue(PrmMng::PARAM_URL_MUPLUGINS_NEW, $overwriteData['urls']['muplugins']);
$paramsManager->setValue(PrmMng::PARAM_PATH_MUPLUGINS_NEW, $overwriteData['paths']['muplugins']);
// Make sure to update path extraction mapping
DUPX_ArchiveConfig::getInstance()->getPathsMapping(true);
}
/**
*
* @return boolean
*/
public static function setParamsStep2()
{
Log::info('CTRL PARAMS S2', Log::LV_DETAILED);
Log::info('REQUEST: ' . Log::v2str($_REQUEST), Log::LV_HARD_DEBUG);
$paramsManager = PrmMng::getInstance();
$readParamsList = array(
PrmMng::PARAM_DB_CHARSET,
PrmMng::PARAM_DB_COLLATE,
);
if (!InstState::dbDoNothing()) {
$readParamsList[] = PrmMng::PARAM_DB_TABLES;
}
foreach ($readParamsList as $cParam) {
if ($paramsManager->setValueFromInput($cParam, ParamForm::INPUT_POST, false, true) === false) {
self::$paramsValidated = false;
}
}
$paramsManager->save();
return self::$paramsValidated;
}
/**
*
* @return boolean
*/
public static function setParamsStep3()
{
Log::info('CTRL PARAMS S3', Log::LV_DETAILED);
Log::info('REQUEST: ' . Log::v2str($_REQUEST), Log::LV_HARD_DEBUG);
$paramsManager = PrmMng::getInstance();
$readParamsList = array(
PrmMng::PARAM_EMPTY_SCHEDULE_STORAGE,
PrmMng::PARAM_EMAIL_REPLACE,
PrmMng::PARAM_FULL_SEARCH,
PrmMng::PARAM_SKIP_PATH_REPLACE,
PrmMng::PARAM_POSTGUID,
PrmMng::PARAM_MAX_SERIALIZE_CHECK,
PrmMng::PARAM_MULTISITE_CROSS_SEARCH,
PrmMng::PARAM_PLUGINS,
PrmMng::PARAM_CUSTOM_SEARCH,
PrmMng::PARAM_CUSTOM_REPLACE,
PrmMng::PARAM_WP_CONF_DISALLOW_FILE_EDIT,
PrmMng::PARAM_WP_CONF_DISALLOW_FILE_MODS,
PrmMng::PARAM_WP_CONF_AUTOSAVE_INTERVAL,
PrmMng::PARAM_WP_CONF_WP_POST_REVISIONS,
PrmMng::PARAM_WP_CONF_FORCE_SSL_ADMIN,
PrmMng::PARAM_WP_CONF_IMAGE_EDIT_OVERWRITE,
PrmMng::PARAM_GEN_WP_AUTH_KEY,
PrmMng::PARAM_WP_CONF_AUTOMATIC_UPDATER_DISABLED,
PrmMng::PARAM_WP_CONF_WP_AUTO_UPDATE_CORE,
PrmMng::PARAM_WP_CONF_WP_CACHE,
PrmMng::PARAM_WP_CONF_WPCACHEHOME,
PrmMng::PARAM_WP_CONF_WP_DEBUG,
PrmMng::PARAM_WP_CONF_WP_DEBUG_LOG,
PrmMng::PARAM_WP_CONF_WP_DISABLE_FATAL_ERROR_HANDLER,
PrmMng::PARAM_WP_CONF_WP_DEBUG_DISPLAY,
PrmMng::PARAM_WP_CONF_SCRIPT_DEBUG,
PrmMng::PARAM_WP_CONF_CONCATENATE_SCRIPTS,
PrmMng::PARAM_WP_CONF_SAVEQUERIES,
PrmMng::PARAM_WP_CONF_ALTERNATE_WP_CRON,
PrmMng::PARAM_WP_CONF_DISABLE_WP_CRON,
PrmMng::PARAM_WP_CONF_WP_CRON_LOCK_TIMEOUT,
PrmMng::PARAM_WP_CONF_EMPTY_TRASH_DAYS,
PrmMng::PARAM_WP_CONF_COOKIE_DOMAIN,
PrmMng::PARAM_WP_CONF_WP_MEMORY_LIMIT,
PrmMng::PARAM_WP_CONF_WP_MAX_MEMORY_LIMIT,
PrmMng::PARAM_WP_CONF_WP_TEMP_DIR,
PrmMng::PARAM_WP_CONF_MYSQL_CLIENT_FLAGS,
PrmMng::PARAM_USERS_PWD_RESET,
PrmMng::PARAM_WP_ADMIN_CREATE_NEW,
);
foreach ($readParamsList as $cParam) {
if ($paramsManager->setValueFromInput($cParam, ParamForm::INPUT_POST, false, true) === false) {
self::$paramsValidated = false;
}
}
if ($paramsManager->getValue(PrmMng::PARAM_WP_ADMIN_CREATE_NEW)) {
$readParamsList = array(
PrmMng::PARAM_WP_ADMIN_NAME,
PrmMng::PARAM_WP_ADMIN_PASSWORD,
PrmMng::PARAM_WP_ADMIN_MAIL,
PrmMng::PARAM_WP_ADMIN_NICKNAME,
PrmMng::PARAM_WP_ADMIN_FIRST_NAME,
PrmMng::PARAM_WP_ADMIN_LAST_NAME,
);
foreach ($readParamsList as $cParam) {
if ($paramsManager->setValueFromInput($cParam, ParamForm::INPUT_POST, false, true) === false) {
self::$paramsValidated = false;
}
}
if (DUPX_DB_Functions::getInstance()->checkIfUserNameExists($paramsManager->getValue(PrmMng::PARAM_WP_ADMIN_NAME))) {
self::$paramsValidated = false;
DUPX_NOTICE_MANAGER::getInstance()->addNextStepNotice(array(
'shortMsg' => 'The user ' . $paramsManager->getValue(PrmMng::PARAM_WP_ADMIN_NAME) . ' can\'t be created, already exists',
'level' => DUPX_NOTICE_ITEM::CRITICAL,
'longMsg' => 'Please insert another new user login name',
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
));
}
}
$paramsManager->save();
return self::$paramsValidated;
}
/**
*
* @return boolean
*/
public static function setParamAutoClean()
{
$paramsManager = PrmMng::getInstance();
if ($paramsManager->setValueFromInput(PrmMng::PARAM_AUTO_CLEAN_INSTALLER_FILES, ParamForm::INPUT_POST, false, true) === false) {
self::$paramsValidated = false;
}
$paramsManager->save();
return self::$paramsValidated;
}
}

View File

@@ -0,0 +1,108 @@
<?php
/**
* controller step 0
*
* Standard: PSR-2
*
* @link http://www.php-fig.org/psr/psr-2 Full Documentation
*
* @package SC\DUPX
*/
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
use Duplicator\Installer\Core\Security;
use Duplicator\Installer\Addons\ProBase\License;
use Duplicator\Installer\Core\InstState;
use Duplicator\Installer\Package\PComponents;
use Duplicator\Installer\Utils\Log\Log;
use Duplicator\Installer\Core\Params\PrmMng;
final class DUPX_Ctrl_S0
{
/**
* Header log
*
* @return void
*/
public static function stepHeaderLog()
{
$archive_path = Security::getInstance()->getArchivePath();
$paramsManager = PrmMng::getInstance();
$archiveConfig = DUPX_ArchiveConfig::getInstance();
$labelPadSize = 20;
Log::info("INSTALLER INFO\n");
Log::info(str_pad('INSTALL MODES', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . implode(', ', InstState::getLogicModes()));
Log::info(str_pad('TEMPLATE', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . Log::v2str($paramsManager->getValue(PrmMng::PARAM_TEMPLATE)));
Log::info(str_pad('VALIDATE ON START', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . Log::v2str($paramsManager->getValue(PrmMng::PARAM_VALIDATION_ACTION_ON_START)));
Log::info(str_pad('PATH_NEW', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . Log::v2str($paramsManager->getValue(PrmMng::PARAM_PATH_NEW)));
Log::info(str_pad('URL_NEW', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . Log::v2str($paramsManager->getValue(PrmMng::PARAM_URL_NEW)));
Log::info("********************************************************************************");
if (InstState::isImportFromBackendMode() || InstState::isRecoveryMode()) {
$overwriteData = $paramsManager->getValue(PrmMng::PARAM_OVERWRITE_SITE_DATA);
Log::info("IMPORTER INFO\n");
Log::info(str_pad('WP VERSION ', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . (isset($overwriteData['wpVersion']) ? $overwriteData['wpVersion'] : 'unknown'));
Log::info(str_pad('DUP VERSION ', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . (isset($overwriteData['dupVersion']) ? $overwriteData['dupVersion'] : 'unknown'));
Log::info(str_pad('LICENSE', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . License::getLicenseToString());
Log::info("********************************************************************************");
}
$log = '';
$log .= "ARCHIVE INFO\n\n";
$log .= str_pad('ARCHIVE NAME', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . Log::v2str($archive_path) . "\n";
$log .= str_pad('ARCHIVE SIZE', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . DUPX_U::readableByteSize(DUPX_Conf_Utils::archiveSize()) . "\n";
$log .= str_pad('CREATED', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . $archiveConfig->created . "\n";
$log .= str_pad('WP VERSION', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . $archiveConfig->version_wp . "\n";
$log .= str_pad('DUP VERSION', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . $archiveConfig->version_dup . "\n";
$log .= str_pad('LICENSE', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . License::getLicenseToString() . "\n";
$log .= str_pad('PACKAGE COMPONENTS', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . PComponents::displayComponentsList($archiveConfig->components) . "\n";
$log .= str_pad('DB VERSION', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . $archiveConfig->version_db . "\n";
$log .= str_pad('DB FILE SIZE', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . DUPX_U::readableByteSize($archiveConfig->dbInfo->tablesSizeOnDisk) . "\n";
$log .= str_pad('DB TABLES', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . $archiveConfig->dbInfo->tablesFinalCount . "\n";
$log .= str_pad('DB ROWS', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . $archiveConfig->dbInfo->tablesRowCount . "\n";
$log .= str_pad('URL HOME', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . $archiveConfig->getRealValue('homeUrl') . "\n";
$log .= str_pad('URL CORE', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . $archiveConfig->getRealValue('siteUrl') . "\n";
$log .= str_pad('URL CONTENT', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . $archiveConfig->getRealValue('contentUrl') . "\n";
$log .= str_pad('URL UPLOAD', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . $archiveConfig->getRealValue('uploadBaseUrl') . "\n";
$log .= str_pad('URL PLUGINS', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . $archiveConfig->getRealValue('pluginsUrl') . "\n";
$log .= str_pad('URL MU PLUGINS', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . $archiveConfig->getRealValue('mupluginsUrl') . "\n";
$log .= str_pad('URL THEMES', $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . $archiveConfig->getRealValue('themesUrl') . "\n";
$paths = (array) $archiveConfig->getRealValue('archivePaths');
foreach ($paths as $key => $value) {
$log .= str_pad('PATH ' . strtoupper($key), $labelPadSize, '_', STR_PAD_RIGHT) . ': ' . $value . "\n";
}
if (count($archiveConfig->subsites) > 0) {
$log .= "\nSUBSITES\n";
foreach ($archiveConfig->subsites as $subsite) {
$log .= 'SUBSITE [ID:' . str_pad((string) $subsite->id, 4, ' ', STR_PAD_LEFT) . '] ' .
Log::v2str($subsite->domain . $subsite->path) . "\n";
}
}
$plugins = (array) $archiveConfig->wpInfo->plugins;
$log .= "\nPLUGINS\n";
foreach ($plugins as $plugin) {
$log .= 'PLUGIN [SLUG:' . str_pad($plugin->slug, 50, ' ', STR_PAD_RIGHT) . ']';
if (is_array($plugin->active)) {
$log .= '[ON:' . str_pad(implode(',', $plugin->active), 5, ' ', STR_PAD_RIGHT) . ']';
} else {
$log .= '[ON:' . str_pad(Log::v2str($plugin->active), 5, ' ', STR_PAD_RIGHT) . ']';
}
if (DUPX_ArchiveConfig::getInstance()->isNetwork()) {
$log .= '[NETWORK:' . str_pad(Log::v2str($plugin->networkActive), 5, ' ', STR_PAD_RIGHT) . ']';
}
$log .= ' ' . $plugin->name . "\n";
}
Log::info($log, Log::LV_DEFAULT);
Log::info("********************************************************************************");
Log::flush();
}
}

View File

@@ -0,0 +1,161 @@
<?php
/**
*
* @package templates/default
*/
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
use Duplicator\Installer\Core\Params\PrmMng;
/**
* Class for final step
*/
final class DUPX_Ctrl_S4
{
/**
* Update the final report
*
* @return void
*/
public static function updateFinalReport()
{
self::finalReportDatabase();
self::finalReportSearchReplace();
DUPX_NOTICE_MANAGER::getInstance()->sortFinalReport();
}
/**
* Get the final report notices count
*
* @return array<string, int>
*/
public static function getNoticesCount()
{
$nManager = DUPX_NOTICE_MANAGER::getInstance();
return array(
'general' => $nManager->countFinalReportNotices('general', DUPX_NOTICE_ITEM::NOTICE, '>='),
'files' => $nManager->countFinalReportNotices('files', DUPX_NOTICE_ITEM::NOTICE, '>='),
'database' => $nManager->countFinalReportNotices('database', DUPX_NOTICE_ITEM::NOTICE, '>'),
'search_replace' => $nManager->countFinalReportNotices('search_replace', DUPX_NOTICE_ITEM::NOTICE, '>='),
'plugins' => $nManager->countFinalReportNotices('plugins', DUPX_NOTICE_ITEM::NOTICE, '>='),
);
}
/**
* Return the final report search replace notices
*
* @return void
*/
protected static function finalReportDatabase()
{
$paramsManager = PrmMng::getInstance();
$finalReportData = $paramsManager->getValue(PrmMng::PARAM_FINAL_REPORT_DATA);
$nManager = DUPX_NOTICE_MANAGER::getInstance();
if ($finalReportData['extraction']['query_errs'] > 0) {
$longMsg = 'Queries that error during the deploy step are logged to the ' . DUPX_View_Funcs::installerLogLink(false);
$longMsg .= <<<LONGMSG
file and
and marked with an **ERROR** status. If you experience a few errors (under 5), in many cases they can be ignored as long as your site is working correctly.
However if you see a large amount of errors or you experience an issue with your site then the error messages in the log file will need to be investigated.
<br/><br/>
<b>COMMON FIXES:</b>
<ul>
<li>
<b>Unknown collation:</b> See Online FAQ:
<a href="https://duplicator.com/knowledge-base/how-to-fix-database-write-issues" target="_blank">What is Compatibility mode & 'Unknown collation' errors?</a>
</li>
<li>
<b>Query Limits:</b> Update MySQL server with the <a href="https://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html" target="_blank">max_allowed_packet</a>
setting for larger payloads.
</li>
</ul>
LONGMSG;
$nManager->addFinalReportNotice(array(
'shortMsg' => 'DB EXTRACTION - INSTALL NOTICES (' . $finalReportData['extraction']['query_errs'] . ')',
'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
'longMsg' => $longMsg,
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
'sections' => array('database'),
'priority' => 5,
'open' => true,
));
}
if ($finalReportData['replace']['errsql_sum'] > 0) {
$longMsg = <<<LONGMSG
Update errors that show here are queries that could not be performed because the database server being used has issues running it.
Please validate the query, if it looks to be of concern please try to run the query manually.
In many cases if your site performs well without any issues you can ignore the error.
LONGMSG;
$nManager->addFinalReportNotice(array(
'shortMsg' => 'STEP 3 - UPDATE NOTICES (' . $finalReportData['replace']['errsql_sum'] . ')',
'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
'longMsg' => $longMsg,
'sections' => array('database'),
'priority' => 5,
'open' => true,
));
}
if ($finalReportData['replace']['errkey_sum'] > 0) {
$longMsg = <<<LONGMSG
Notices should be ignored unless issues are found after you have tested an installed site.
This notice indicates that a primary key is required to run the update engine. Below is a list of tables and the rows that were not updated.
On some databases you can remove these notices by checking the box 'Enable Full Search' under options in step3 of the installer.
<br/><br/>
<small>
<b>Advanced Searching:</b><br/>
Use the following query to locate the table that was not updated: <br/>
<i>SELECT @row := @row + 1 as row, t.* FROM some_table t, (SELECT @row := 0) r</i>
</small>
LONGMSG;
$nManager->addFinalReportNotice(array(
'shortMsg' => 'TABLE KEY NOTICES (' . $finalReportData['replace']['errkey_sum'] . ')',
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
'longMsg' => $longMsg,
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
'sections' => array('database'),
'priority' => 5,
'open' => true,
));
}
}
/**
* Final report search replace
*
* @return void
*/
protected static function finalReportSearchReplace()
{
$paramsManager = PrmMng::getInstance();
$finalReportData = $paramsManager->getValue(PrmMng::PARAM_FINAL_REPORT_DATA);
$nManager = DUPX_NOTICE_MANAGER::getInstance();
if ($finalReportData['replace']['errser_sum'] > 0) {
$longMsg = <<<LONGMSG
Notices should be ignored unless issues are found after you have tested an installed site.
The SQL below will show data that may have not been updated during the serialization process.
Best practices for serialization notices is to just re-save the plugin/post/page in question.
LONGMSG;
$nManager->addFinalReportNotice(array(
'shortMsg' => 'SERIALIZATION NOTICES (' . $finalReportData['replace']['errser_sum'] . ')',
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
'longMsg' => $longMsg,
'sections' => array('search_replace'),
'priority' => 5,
'open' => true,
));
}
}
}

View File

@@ -0,0 +1,209 @@
<?php
/**
* Base controller class for installer controllers
*
* Standard: PSR-2
*
* @link http://www.php-fig.org/psr/psr-2 Full Documentation
*
* @package SC\DUPX\CTRL\Base
*/
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
use Duplicator\Installer\Core\Security;
use Duplicator\Installer\Core\Bootstrap;
use Duplicator\Installer\Core\InstState;
use Duplicator\Installer\Utils\Log\Log;
use Duplicator\Installer\Core\Params\PrmMng;
require_once(DUPX_INIT . '/ctrls/classes/class.ctrl.s0.php');
require_once(DUPX_INIT . '/ctrls/classes/class.ctrl.s4.php');
class DUPX_CTRL
{
const ACTION_STEP_INIZIALIZED = 'initialized';
const ACTION_STEP_ON_VALIDATE = 'on-validate';
const ACTION_STEP_SET_TEMPLATE = 'settpm';
/** @var ?self */
protected static $instance = null;
/** @var bool|string */
protected $pageView = false;
/** @var mixed[] */
protected $extraParamsPage = array();
/**
* Get instance
*
* @return self
*/
public static function getInstance()
{
if (is_null(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Class constructor
*/
private function __construct()
{
}
/**
* Main controller
*
* @return void
*/
public function mainController()
{
$paramsManager = PrmMng::getInstance();
$ctrlAction = $paramsManager->getValue(PrmMng::PARAM_CTRL_ACTION);
$stepAction = $paramsManager->getValue(PrmMng::PARAM_STEP_ACTION);
Log::info("\n" . '---------------', Log::LV_DETAILED);
Log::info('CONTROLLER ACTION: ' . Log::v2str($ctrlAction), Log::LV_DETAILED);
if (!empty($stepAction)) {
Log::info('STEP ACTION: ' . Log::v2str($stepAction));
}
Log::info('---------------' . "\n", Log::LV_DETAILED);
DUPX_Template::getInstance()->setTemplate(PrmMng::getInstance()->getValue(PrmMng::PARAM_TEMPLATE));
if (Bootstrap::isInit()) {
if (!DUPX_Ctrl_Params::setParamsStep0()) {
Log::info('PARAMS AREN\'T VALID', Log::LV_DETAILED);
Log::error('PARAMS AREN\'T VALID');
}
DUPX_Ctrl_S0::stepHeaderLog();
}
if (
$ctrlAction !== 'help' &&
Security::getInstance()->getSecurityType() != Security::SECURITY_NONE
) {
Log::info('SECURE CHECK -> GO TO SECURE PAGE');
$this->pageView = 'secure';
return;
}
switch ($ctrlAction) {
case "ctrl-step1":
if ($stepAction === DUPX_CTRL::ACTION_STEP_SET_TEMPLATE) {
$paramsManager->setValueFromInput(PrmMng::PARAM_TEMPLATE);
Log::info('NEW TEMPLATE:' . $paramsManager->getValue(PrmMng::PARAM_TEMPLATE));
$paramsManager->save();
DUPX_Template::getInstance()->setTemplate($paramsManager->getValue(PrmMng::PARAM_TEMPLATE));
}
$this->pageView = 'step1';
break;
case "ctrl-step2":
$this->pageView = 'step2';
break;
case "ctrl-step3":
$this->pageView = 'step3';
break;
case "ctrl-step4":
DUPX_Ctrl_S4::updateFinalReport();
$this->pageView = 'step4';
break;
case "help":
$this->pageView = 'help';
break;
default:
Log::error('No valid action request ' . $ctrlAction);
}
}
/**
* Set exception page
*
* @param Exception $e exception
*
* @return void
*/
public function setExceptionPage(Exception $e)
{
Log::info("--------------------------------------");
Log::info('EXCEPTION: ' . $e->getMessage());
Log::info('TRACE:');
Log::info($e->getTraceAsString());
Log::info("--------------------------------------");
$this->extraParamsPage['exception'] = $e;
$this->pageView = 'exception';
}
/**
* Render page
*
* @return string
*/
public function renderPage()
{
Log::logTime('RENDER PAGE ' . Log::v2str($this->pageView), Log::LV_DETAILED);
$echo = false;
$paramsManager = PrmMng::getInstance();
$this->extraParamsPage['bodyClasses'] = 'template_' . $paramsManager->getValue(PrmMng::PARAM_TEMPLATE);
$this->extraParamsPage['bodyClasses'] .= ' ' . (InstState::isClassicInstall() ? 'classic-install' : 'import-install');
if ($paramsManager->getValue(PrmMng::PARAM_DEBUG_PARAMS)) {
$this->extraParamsPage['bodyClasses'] .= ' debug-params';
}
$result = '';
switch ($this->pageView) {
case 'secure':
$result = dupxTplRender('page-secure', $this->extraParamsPage, $echo);
break;
case 'step1':
$result = dupxTplRender('page-step1', $this->extraParamsPage, $echo);
break;
case 'step2':
$result = dupxTplRender('page-step2', $this->extraParamsPage, $echo);
break;
case 'step3':
$result = dupxTplRender('page-step3', $this->extraParamsPage, $echo);
break;
case 'step4':
$result = dupxTplRender('page-step4', $this->extraParamsPage, $echo);
DUPX_NOTICE_MANAGER::getInstance()->finalReportLog(
array(
'general',
'files',
'database',
'search_replace',
'plugins',
)
);
break;
case 'exception':
$result = dupxTplRender('page-exception', $this->extraParamsPage, $echo);
break;
case 'help':
$result = dupxTplRender('page-help', $this->extraParamsPage, $echo);
break;
case false:
// no page
break;
default:
Log::error('No valid render page ' . Log::v2str($this->pageView));
}
Log::logTime('END RENDER PAGE');
return self::renderPostProcessings($result);
}
/**
* Apply post processing to string
*
* @param string $string string input
*
* @return string
*/
public static function renderPostProcessings($string)
{
return str_replace(array(
DUPX_Package::getArchiveFileHash(),
DUPX_Package::getPackageHash(),
), '[HASH]', $string);
}
}

View File

@@ -0,0 +1,3 @@
<?php
//silent