first commit

This commit is contained in:
Roman Pyrih
2026-04-21 15:48:41 +02:00
commit 7483681901
10216 changed files with 3236626 additions and 0 deletions

View File

@@ -0,0 +1,413 @@
<?php
/**
* @package Duplicator
*/
defined("ABSPATH") or die("");
/**
* Variables
*
* @var Duplicator\Core\Controllers\ControllersManager $ctrlMng
* @var Duplicator\Core\Views\TplMng $tplMng
* @var array<string, mixed> $tplData
*/
use Duplicator\Models\GlobalEntity;
use Duplicator\Libs\Snap\SnapIO;
use Duplicator\Libs\Snap\SnapUtil;
use Duplicator\Models\DynamicGlobalEntity;
use Duplicator\Utils\LockUtil;
use Duplicator\Libs\WpUtils\WpArchiveUtils;
$global = GlobalEntity::getInstance();
$dGlobal = DynamicGlobalEntity::getInstance();
$max_execution_time = (int) SnapUtil::phpIniGet("max_execution_time", 0);
$max_execution_time = $max_execution_time < 0 ? PHP_INT_MAX : $max_execution_time;
$max_execution_time = empty($max_execution_time) ? 30 : $max_execution_time;
$workerTimeCapRange = [
10,
min(180, max(30, (int) (0.7 * (float) $max_execution_time))),
];
$workerTimeValue = (int) max($workerTimeCapRange[0], min((int) $global->php_max_worker_time_in_sec, $workerTimeCapRange[1]));
?>
<div class="dup-accordion-wrapper display-separators close">
<div class="accordion-header">
<h3 class="title">
<?php esc_html_e("Advanced", 'duplicator-pro'); ?>
</h3>
</div>
<div class="accordion-content">
<label class="lbl-larger">
<?php esc_html_e("Thread Lock", 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<input
type="radio"
name="lock_mode"
id="lock_mode_flock"
class="margin-0"
value="<?php echo (int) LockUtil::LOCK_MODE_FILE; ?>"
<?php checked($global->lock_mode, LockUtil::LOCK_MODE_FILE); ?>>
<label for="lock_mode_flock">
<?php esc_html_e("File", 'duplicator-pro'); ?>
</label>&nbsp;
<input
type="radio"
name="lock_mode"
id="lock_mode_sql"
class="margin-0"
value="<?php echo (int) LockUtil::LOCK_MODE_SQL; ?>"
<?php checked($global->lock_mode, LockUtil::LOCK_MODE_SQL); ?>>
<label for="lock_mode_sql">
<?php esc_html_e("SQL", 'duplicator-pro'); ?>
</label>&nbsp;
</div>
<label class="lbl-larger">
<?php esc_html_e("Max Worker Time", 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<input
data-parsley-required
data-parsley-errors-container="#php_max_worker_time_in_sec_error_container"
data-parsley-range="<?php echo esc_attr(wp_json_encode($workerTimeCapRange)); ?>"
data-parsley-type="number"
class="width-small inline-display margin-0"
type="text"
name="php_max_worker_time_in_sec"
id="php_max_worker_time_in_sec"
value="<?php echo (int) $workerTimeValue; ?>">&nbsp;
<span>
<?php esc_html_e('Seconds', 'duplicator-pro'); ?>
</span>
<div id="php_max_worker_time_in_sec_error_container" class="duplicator-error-container"></div>
<p class="description">
<?php
esc_html_e(
'This setting controls how long each processing chunk can run. A lower value makes the process more reliable but slower.',
'duplicator-pro'
);
?><br />
<?php
esc_html_e(
"Try a low value (30 seconds or lower) if the build fails with the recommended setting.",
'duplicator-pro'
); ?>
</p>
</div>
<label class="lbl-larger">
<?php esc_html_e("Ajax", 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<input
type="radio"
id="ajax_protocol_1"
name="ajax_protocol"
class="ajax_protocol margin-0"
value="admin"
<?php checked($global->ajax_protocol, 'admin'); ?>>
<label for="ajax_protocol_1">
<?php esc_html_e("Auto", 'duplicator-pro'); ?>
</label> &nbsp;
<input
type="radio"
id="ajax_protocol_2"
name="ajax_protocol"
class="ajax_protocol margin-0"
value="http"
<?php checked($global->ajax_protocol == 'http'); ?>>
<label for="ajax_protocol_2">
<?php esc_html_e("HTTP", 'duplicator-pro'); ?>
</label> &nbsp;
<input
type="radio"
id="ajax_protocol_3"
name="ajax_protocol"
class="ajax_protocol margin-0"
value="https"
<?php checked($global->ajax_protocol == 'https'); ?>>
<label for="ajax_protocol_3">
<?php esc_html_e("HTTPS", 'duplicator-pro'); ?>
</label> &nbsp;
<input
type="radio"
id="ajax_protocol_4"
name="ajax_protocol"
class="ajax_protocol margin-0"
value="custom"
<?php checked($global->ajax_protocol, 'custom'); ?>>
<label for="ajax_protocol_4">
<?php esc_html_e("Custom URL", 'duplicator-pro'); ?>
</label> <br />
<input
type="<?php echo ($global->ajax_protocol == 'custom' ? 'text' : 'hidden'); ?>"
id="custom_ajax_url"
name="custom_ajax_url"
class="width-xlarge"
placeholder="<?php esc_attr_e('Consult support before changing.', 'duplicator-pro'); ?>"
value="<?php echo esc_url($global->custom_ajax_url); ?>">
<span id="custom_ajax_url_error" class="alert-color">
<?php esc_html_e("Bad URL!", 'duplicator-pro'); ?>
</span>
<p class="description">
<?php esc_html_e("Used to kick off build worker. Only change if Backups get stuck at the start of a build.", 'duplicator-pro'); ?>
</p>
</div>
<label class="lbl-larger">
<?php esc_html_e('Root path', 'duplicator-pro') ?>
</label>
<div class="margin-bottom-1">
<input
type="checkbox"
name="homepath_as_abspath"
id="homepath_as_abspath"
class="margin-0"
<?php disabled(WpArchiveUtils::isAbspathHomepathEquivalent()); ?>
<?php checked($global->homepath_as_abspath); ?>
value="1">
<label for="homepath_as_abspath">
<?php
printf(
esc_html_x(
'Use ABSPATH %s as root path.',
'%s represents the ABSPATH surrounded with bold (<b>) tags',
'duplicator-pro'
),
'<b>' . esc_html(WpArchiveUtils::getArchiveListPaths('abs')) . '</b>'
);
?>
<br>
</label>
<p class="description">
<?php
if (WpArchiveUtils::isAbspathHomepathEquivalent()) {
esc_html_e('Abspath and home path are equivalent so this option is disabled', 'duplicator-pro');
} else {
?>
<?php
printf(
esc_html_x(
'In this installation the default root path is %s.',
'%s represents the root path surrounded with bold (<b>) tags',
'duplicator-pro'
),
'<b>' . esc_html(SnapIO::safePathUntrailingslashit(get_home_path(), true)) . '</b>'
); ?><br>
<?php
esc_html_e(
'The path of the WordPress core is different. Activate this option if you want to consider ABSPATH as root path.',
'duplicator-pro'
);
}
?>
</p>
</div>
<label class="lbl-larger">
<?php esc_html_e('Scan File Checks', 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<input
type="checkbox"
name="_skip_archive_scan"
id="_skip_archive_scan"
class="margin-0"
<?php checked($global->skip_archive_scan); ?>>
<label for="_skip_archive_scan">
<?php esc_html_e("Skip", 'duplicator-pro') ?>
</label><br />
<p class="description">
<?php
esc_html_e(
'If enabled all files check on scan will be skipped before Backup creation.
In some cases, this option can be beneficial if the scan process is having issues running or returning errors.',
'duplicator-pro'
);
?>
</p>
</div>
<label class="lbl-larger">
<?php esc_html_e('Client-side Kickoff', 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<input
type="checkbox"
name="_clientside_kickoff"
id="_clientside_kickoff"
class="margin-0"
<?php checked($global->clientside_kickoff); ?> />
<label for="_clientside_kickoff">
<?php esc_html_e("Enabled", 'duplicator-pro') ?>
</label><br />
<p class="description">
<?php esc_html_e('Initiate Backup build from client. Only check this if instructed to by Duplicator support.', 'duplicator-pro'); ?>
</p>
</div>
<label class="lbl-larger">
<?php esc_html_e("Password-Protected Access", 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<input
type="checkbox"
name="_basic_auth_enabled"
id="_basic_auth_enabled"
value="1"
class="margin-0"
<?php checked($dGlobal->getValBool('basic_auth_enabled')); ?>>
<label for="_basic_auth_enabled">
<?php esc_html_e("Enabled", 'duplicator-pro') ?>
</label>
<i class="fa-solid fa-question-circle fa-sm dark-gray-color"
data-tooltip-title="<?php esc_attr_e("HTTP Basic authentication", 'duplicator-pro'); ?>"
data-tooltip="<?php esc_attr_e(
"When HTTP Basic authentication is applied Duplicator needs to attach the login credentials to each request to the server.
This is required for the build process to work properly. If you see a browser popup login window when accessing the admin area,
then basic authentication should be enabled. If you are not sure, please consult your hosting provider.",
'duplicator-pro'
); ?>"></i>
<div id="dup-basic-auth-login-wrapper">
<input
autocomplete="off"
placeholder="<?php esc_attr_e('User', 'duplicator-pro'); ?>"
type="text"
name="basic_auth_user"
id="basic_auth_user"
class="margin-0"
value="<?php echo esc_attr($dGlobal->getValString('basic_auth_user')); ?>"
<?php disabled(!$dGlobal->getValBool('basic_auth_enabled')); ?>>
<span class="dup-password-toggle">
<input
id="auth_password"
autocomplete="off"
placeholder="<?php esc_attr_e('Password', 'duplicator-pro'); ?>"
type="password"
name="basic_auth_password"
id="basic_auth_password"
class="margin-0"
value="<?php echo esc_attr($dGlobal->getValString('basic_auth_password')); ?>"
<?php disabled(!$dGlobal->getValBool('basic_auth_enabled')); ?>>
<button type="button">
<i class="fas fa-eye fa-sm"></i>
</button>
</span>
</div>
<p class="description">
<?php esc_html_e(
'Enable this function and provide username and password in case Backup creation error.
Essential for making authorized HTTP requests in a server protected folder.',
'duplicator-pro'
); ?>
</p>
</div>
</div>
</div>
<script>
(function($) {
$('#_basic_auth_enabled').on('change', function() {
if ($(this).is(':checked')) {
$('#dup-basic-auth-login-wrapper input').prop('disabled', false);
} else {
$('#dup-basic-auth-login-wrapper input').prop('disabled', true);
}
});
var url_error = $('#custom_ajax_url_error');
// Check URL is valid
$.urlExists = function(url) {
var http = new XMLHttpRequest();
try {
http.open('HEAD', url, false);
http.send();
} catch (err) {
$('#custom_ajax_url_error').html(err.message);
return false;
}
return http.status != 404;
};
var debounce;
$('#custom_ajax_url').on('input keyup keydown change paste focus', function(e) {
clearTimeout(debounce);
var $this = $(this);
debounce = setTimeout(function() {
$this.css({
'border': ''
});
url_error.hide();
if (!$.urlExists($this.val())) {
$this.css({
'border': 'maroon 1px solid'
});
url_error.show();
}
}, 500);
});
(function($this) {
$this.css({
'border': ''
});
url_error.hide();
setTimeout(function() {
var isCustomAjaxUrl = $('#ajax_protocol_4').is(':checked');
if (isCustomAjaxUrl && !$.urlExists($this.val())) {
$this.css({
'border': 'maroon 1px solid'
});
url_error.show();
}
if (isCustomAjaxUrl) {
$('#custom_ajax_url').attr('data-parsley-required', 'true');
} else {
$('#custom_ajax_url').removeAttr('data-parsley-required');
}
}, 0);
}($('#custom_ajax_url')))
/*
* DISPLAY OR HIDE CUSTOM_AJAX_URL
*/
$('.ajax_protocol').on('input click change select touchstart', function(e) {
// Setup and collect value
var $this = $(this),
value = $this.val(),
hideField = $('#custom_ajax_url'),
hideFieldState = hideField.attr('type'),
offset = 200;
url_error.hide();
if (value == 'custom') {
// Display hidden field
if (hideFieldState == 'hidden') {
hideField.hide().attr('type', 'text').fadeIn(offset).attr('data-parsley-required', 'true');
hideField.css({
'border': ''
});
url_error.hide();
if (!$.urlExists(hideField.val())) {
hideField.css({
'border': 'maroon 1px solid'
});
url_error.show();
}
}
} else {
// Hide field but keep it active for POST reading
if (hideFieldState == 'text') {
var parsleyId = $('#custom_ajax_url').data('parsley-id');
var errorUlId = '#parsley-id-' + parsleyId;
if ($(errorUlId).length)
$(errorUlId).remove();
hideField.fadeOut(Math.round(offset / 2), function() {
$(this).attr('type', 'hidden').show();
}).removeAttr('data-parsley-required');;
}
}
});
}(window.jQuery || jQuery))
</script>

View File

@@ -0,0 +1,191 @@
<?php
/**
* @package Duplicator
*/
use Duplicator\Libs\Shell\ShellZipUtils;
use Duplicator\Models\GlobalEntity;
use Duplicator\Package\Archive\PackageArchive;
use Duplicator\Utils\ZipArchiveExtended;
defined("ABSPATH") or die("");
/**
* Variables
*
* @var Duplicator\Core\Controllers\ControllersManager $ctrlMng
* @var Duplicator\Core\Views\TplMng $tplMng
* @var array<string, mixed> $tplData
*/
$global = GlobalEntity::getInstance();
$isZipArchiveAvailable = ZipArchiveExtended::isPhpZipAvailable();
$isShellZipAvailable = (ShellZipUtils::getShellExecZipPath() != null);
?>
<h3 class="title">
<?php esc_html_e("Archive", 'duplicator-pro') ?>
</h3>
<hr size="1" />
<label class="lbl-larger">
<?php esc_html_e("Compression", 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<input
type="radio"
name="archive_compression"
id="archive_compression_off"
value="0"
class="margin-0"
<?php checked($global->archive_compression, false); ?>>
<label for="archive_compression_off">
<?php esc_html_e("Off", 'duplicator-pro'); ?>
</label> &nbsp;
<input
type="radio"
name="archive_compression"
id="archive_compression_on"
value="1"
class="margin-0"
<?php checked($global->archive_compression); ?>>
<label for="archive_compression_on">
<?php esc_html_e("On", 'duplicator-pro'); ?>
</label>
<?php $tipContent = __(
'This setting controls archive compression. The setting apply to all Archive Engine formats.
For ZipArchive this setting only works on PHP 7.0 or higher.',
'duplicator-pro'
); ?>&nbsp;
<i style="margin-right:7px;" class="fa-solid fa-question-circle fa-sm dark-gray-color"
data-tooltip-title="<?php esc_attr_e("Archive Compression", 'duplicator-pro'); ?>"
data-tooltip="<?php echo esc_attr($tipContent); ?>">
</i>
</div>
<label class="lbl-larger">
<?php esc_html_e("Archive Engine", 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<div class="engine-radio">
<input
onclick="DupliJs.UI.SetArchiveOptionStates();"
type="radio"
name="archive_build_mode" id="archive_build_mode3"
class="margin-0"
value="<?php echo (int) PackageArchive::BUILD_MODE_DUP_ARCHIVE; ?>"
<?php checked($global->getBuildMode() == PackageArchive::BUILD_MODE_DUP_ARCHIVE); ?>
<?php disabled(!$global->isBuildModeAvailable(PackageArchive::BUILD_MODE_DUP_ARCHIVE)) ?>>
<label for="archive_build_mode3"><?php esc_html_e("DupArchive", 'duplicator-pro'); ?></label> &nbsp; &nbsp;
</div>
<div class="engine-radio <?php echo ($isShellZipAvailable) ? '' : 'engine-radio-disabled'; ?>">
<input
onclick="DupliJs.UI.SetArchiveOptionStates();"
type="radio"
name="archive_build_mode"
id="archive_build_mode1"
class="margin-0"
value="<?php echo (int) PackageArchive::BUILD_MODE_SHELL_EXEC; ?>"
<?php checked($global->getBuildMode() == PackageArchive::BUILD_MODE_SHELL_EXEC); ?>
<?php disabled(!$global->isBuildModeAvailable(PackageArchive::BUILD_MODE_SHELL_EXEC)) ?>>
<label for="archive_build_mode1"><?php esc_html_e("Shell Zip", 'duplicator-pro'); ?></label>
</div>
<div class="engine-radio">
<input
onclick="DupliJs.UI.SetArchiveOptionStates();"
type="radio"
name="archive_build_mode"
id="archive_build_mode2"
class="margin-0"
value="<?php echo (int) PackageArchive::BUILD_MODE_ZIP_ARCHIVE; ?>"
<?php checked($global->getBuildMode() == PackageArchive::BUILD_MODE_ZIP_ARCHIVE); ?>
<?php disabled(!$global->isBuildModeAvailable(PackageArchive::BUILD_MODE_ZIP_ARCHIVE)) ?>>
<label for="archive_build_mode2"><?php esc_html_e("ZipArchive", 'duplicator-pro'); ?></label>
</div>
<br style="clear:both" />
<!-- DUPARCHIVE -->
<div class="engine-sub-opts" id="engine-details-3" style="display:none">
<?php
esc_html_e('This option creates a custom Duplicator Archive Format (.daf) archive file.', 'duplicator-pro');
echo '<br/> ';
esc_html_e('This option is fully multi-threaded and recommended for large sites or throttled servers.', 'duplicator-pro');
echo '<br/> ';
printf(
'%s <a href="' . esc_url(DUPLICATOR_DUPLICATOR_DOCS_URL . 'how-to-work-with-daf-files-and-the-duparchive-extraction-tool')
. '" target="_blank">%s</a> ',
esc_html__('For details on how to use and manually extract the DAF format please see the ', 'duplicator-pro'),
esc_html__('online documentation.', 'duplicator-pro')
);
?>
</div>
<!-- SHELL EXEC -->
<div class="engine-sub-opts" id="engine-details-1" style="display:none">
<?php
$tplMng->render(
'parts/settings/shellZipMessage',
['hasShellZip' => $isShellZipAvailable]
);
?>
</div>
<!-- ZIP ARCHIVE -->
<div class="engine-sub-opts" id="engine-details-2" style="display:none;">
<div class="margin-bottom-1">
<span><?php esc_html_e("Process Mode", 'duplicator-pro'); ?></span>&nbsp;
<select name="ziparchive_mode" id="ziparchive_mode" onchange="DupliJs.UI.setZipArchiveMode();" class="inline-display width-medium margin-0">
<option <?php selected($global->ziparchive_mode, PackageArchive::ZIP_MODE_MULTI_THREAD); ?>
value="<?php echo (int) PackageArchive::ZIP_MODE_MULTI_THREAD ?>">
<?php esc_html_e("Multi-Threaded", 'duplicator-pro'); ?>
</option>
<option <?php selected($global->ziparchive_mode == PackageArchive::ZIP_MODE_SINGLE_THREAD); ?>
value="<?php echo (int) PackageArchive::ZIP_MODE_SINGLE_THREAD ?>">
<?php esc_html_e("Single-Threaded", 'duplicator-pro'); ?>
</option>
</select>&nbsp;
<i style="margin-right:7px;" class="fa-solid fa-question-circle fa-sm dark-gray-color"
data-tooltip-title="<?php esc_attr_e("PHP ZipArchive Mode", 'duplicator-pro'); ?>"
data-tooltip="<?php
esc_attr_e(
'Single-Threaded mode attempts to create the entire archive in one request.
Multi-Threaded mode allows the archive to be chunked over multiple requests.
Multi-Threaded mode is typically slower but much more reliable especially for larger sites.',
'duplicator-pro'
);
?>"></i>
</div>
<div id="dupli-ziparchive-mode-st">
<input type="checkbox" id="ziparchive_validation" name="ziparchive_validation" class="margin-0"
<?php checked($global->ziparchive_validation); ?>>
<label for="ziparchive_validation">Enable file validation</label>
</div>
<div id="dupli-ziparchive-mode-mt">
<span><?php esc_html_e("Buffer Size", 'duplicator-pro'); ?></span>&nbsp;
<input
maxlength="4"
class="inline-display width-small margin-0"
data-parsley-required data-parsley-errors-container="#ziparchive_chunk_size_error_container"
data-parsley-min="5" data-parsley-type="number"
type="text" name="ziparchive_chunk_size_in_mb" id="ziparchive_chunk_size_in_mb"
value="<?php echo (int) $global->ziparchive_chunk_size_in_mb; ?>">
<?php esc_html_e('MB', 'duplicator-pro'); ?>
<?php
$toolTipContent = __(
'Buffer size only applies to multi-threaded requests and indicates how large an archive will get before a close is registered.
Higher values are faster but can be more unstable based on the hosts max_execution_time.',
'duplicator-pro'
);
?>
<i style="margin-right:7px" class="fa-solid fa-question-circle fa-sm dark-gray-color"
data-tooltip-title="<?php esc_attr_e("PHP ZipArchive Buffer", 'duplicator-pro'); ?>"
data-tooltip="<?php echo esc_attr($toolTipContent); ?>">
</i>
<div id="ziparchive_chunk_size_error_container" class="duplicator-error-container"></div>
</div>
</div>
</div>

View File

@@ -0,0 +1,137 @@
<?php
/**
* @package Duplicator
*/
use Duplicator\Controllers\SettingsPageController;
use Duplicator\Core\Controllers\ControllersManager;
defined("ABSPATH") or die("");
/**
* Variables
*
* @var Duplicator\Core\Controllers\ControllersManager $ctrlMng
* @var Duplicator\Core\Views\TplMng $tplMng
* @var array<string, mixed> $tplData
*/
?>
<form
id="dup-settings-form" class="dup-settings-pack-basic"
action="<?php echo esc_url(ControllersManager::getCurrentLink()); ?>"
method="post" data-parsley-validate
>
<?php $tplData['actions'][SettingsPageController::ACTION_PACKAGE_BASIC_SAVE]->getActionNonceFileds(); ?>
<div class="dup-settings-wrapper margin-bottom-1">
<?php $tplMng->render('admin_pages/settings/backup/database_settings'); ?>
<?php $tplMng->render('admin_pages/settings/backup/archive_settings'); ?>
<?php $tplMng->render('admin_pages/settings/backup/processing_settings'); ?>
<?php $tplMng->render('admin_pages/settings/backup/installer_settings'); ?>
<?php $tplMng->render('admin_pages/settings/backup/advanced_settings'); ?>
</div>
<p class="submit dupli-save-submit">
<input
type="submit"
name="submit"
id="submit"
class="button primary small"
value="<?php esc_attr_e('Save Settings', 'duplicator-pro') ?>" style="display: inline-block;"
>
</p>
</form>
<script>
jQuery(document).ready(function ($)
{
DupliJs.UI.SetDBEngineMode = function ()
{
var isMysqlDump = $('#package_mysqldump').is(':checked');
var isPHPMode = $('#package_phpdump').is(':checked');
var isPHPChunkMode = $('#package_phpchunkingdump').is(':checked');
$('#dbengine-details-1, #dbengine-details-2').hide();
switch (true) {
case isMysqlDump :
$('#dbengine-details-1').show();
break;
case isPHPMode :
case isPHPChunkMode :
$('#dbengine-details-2').show();
break;
}
}
DupliJs.UI.setZipArchiveMode = function ()
{
$('#dupli-ziparchive-mode-st, #dupli-ziparchive-mode-mt').hide();
if ($('#ziparchive_mode').val() == 0) {
$('#dupli-ziparchive-mode-mt').show();
} else {
$('#dupli-ziparchive-mode-st').show();
}
}
DupliJs.UI.SetArchiveOptionStates = function ()
{
var php70 = <?php echo (version_compare(PHP_VERSION, '7', '>=') ? 'true' : 'false'); ?>;
var isShellZipSelected = $('#archive_build_mode1').is(':checked');
var isZipArchiveSelected = $('#archive_build_mode2').is(':checked');
var isDupArchiveSelected = $('#archive_build_mode3').is(':checked');
if (isShellZipSelected || isDupArchiveSelected) {
$("[name='archive_compression']").prop('disabled', false);
$("[name='ziparchive_mode']").prop('disabled', true);
} else {
$("[name='ziparchive_mode']").prop('disabled', false);
if (php70) {
$("[name='archive_compression']").prop('disabled', false);
} else {
$('#archive_compression_on').prop('checked', true);
$("[name='archive_compression']").prop('disabled', true);
}
}
$('#engine-details-1, #engine-details-2, #engine-details-3').hide();
switch (true) {
case isShellZipSelected :
$('#engine-details-1').show();
break;
case isZipArchiveSelected :
$('#engine-details-2').show();
break;
case isDupArchiveSelected :
$('#engine-details-3').show();
break;
}
DupliJs.UI.setZipArchiveMode();
}
//INIT
DupliJs.UI.SetArchiveOptionStates();
DupliJs.UI.SetDBEngineMode();
DupliJs.UI.cleanupModeRadioSwitched = function() {
if ($('#cleanup_mode_Cleanup_Off').is(":checked")){
$('#auto_cleanup_hours').attr('readonly','readonly');
$('#cleanup_email').attr('readonly','readonly');
} else if ($('#cleanup_mode_Email_Notice').is(":checked")) {
$('#auto_cleanup_hours').attr('readonly','readonly');
$("#cleanup_email").removeAttr('readonly');
} else if ($('#cleanup_mode_Auto_Cleanup').is(":checked")) {
$("#auto_cleanup_hours").removeAttr('readonly');
$("#cleanup_email").removeAttr('readonly');
}
}
$('input[type=radio][name=cleanup_mode]').change(function () {
DupliJs.UI.cleanupModeRadioSwitched();
});
// We must call this also once in the beginning, after UI is loaded
DupliJs.UI.cleanupModeRadioSwitched();
});
</script>

View File

@@ -0,0 +1,220 @@
<?php
/**
* @package Duplicator
*/
use Duplicator\Models\GlobalEntity;
use Duplicator\Controllers\SettingsPageController;
use Duplicator\Core\Constants;
use Duplicator\Libs\Shell\Shell;
use Duplicator\Libs\WpUtils\WpDbUtils;
defined("ABSPATH") or die("");
/**
* Variables
*
* @var Duplicator\Core\Controllers\ControllersManager $ctrlMng
* @var Duplicator\Core\Views\TplMng $tplMng
* @var array<string, mixed> $tplData
*/
$global = GlobalEntity::getInstance();
$is_shellexec_on = Shell::test();
$mysqlDumpPath = WpDbUtils::getMySqlDumpPath();
$mysqlDumpFound = (bool) $mysqlDumpPath;
?>
<h3 class="title">
<?php esc_html_e("Database", 'duplicator-pro') ?>
</h3>
<hr size="1" />
<label class="lbl-larger">
<?php esc_html_e("SQL Mode", 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<div class="margin-bottom-1">
<div class="engine-radio <?php echo ($is_shellexec_on) ? '' : 'engine-radio-disabled'; ?> inline-display">
<input
type="radio"
name="_package_dbmode"
value="mysql"
id="package_mysqldump"
class="margin-0"
<?php checked($global->package_mysqldump); ?> onclick="DupliJs.UI.SetDBEngineMode();">
<label for="package_mysqldump"><?php esc_html_e("Mysqldump", 'duplicator-pro'); ?> </label> &nbsp; &nbsp; &nbsp;
</div>
<div class="engine-radio inline-display">
<input
type="radio"
name="_package_dbmode"
id="package_phpdump"
value="php"
class="margin-0"
<?php checked(!$global->package_mysqldump); ?> onclick="DupliJs.UI.SetDBEngineMode();">
<label for="package_phpdump"><?php esc_html_e("PHP Code", 'duplicator-pro'); ?></label>
</div>
</div>
<!-- SHELL EXEC -->
<div class="engine-sub-opts" id="dbengine-details-1" style="display:none">
<!-- MYSQLDUMP IN-ACTIVE -->
<?php if (!$is_shellexec_on) :
?>
<div class="dup-feature-notfound">
<?php
esc_html_e(
'In order to use Mysqldump, the PHP function popen/pclose must be enabled.',
'duplicator-pro'
);
echo ' ';
esc_html_e('Please contact your host or server admin to enable this function.', 'duplicator-pro');
echo ' ';
printf(
esc_html_x(
'For a list of approved providers that support this function, %1$sclick here%2$s.',
'%1$s and %2$s are the opening and closing tags of a link.',
'duplicator-pro'
),
'<a href="' . esc_url(DUPLICATOR_DUPLICATOR_DOCS_URL . 'what-host-providers-are-recommended-for-duplicator/')
. '" target="_blank">',
'</a>'
);
echo ' ';
esc_html_e('The "PHP Code" setting will be used until this issue is resolved by your hosting provider.', 'duplicator-pro');
?>
<p>
<?php
esc_html_e('Below is a list of possible functions to activate to solve the problem.', 'duplicator-pro');
echo ' ';
esc_html_e('If the problem persists, look at the log for a more thorough analysis.', 'duplicator-pro');
?>
</p>
<br />
<b><?php esc_html_e('Disabled Functions:', 'duplicator-pro'); ?></b>
<code class="display-block margin-bottom-1">
<?php
foreach (['escapeshellarg', 'escapeshellcmd', 'extension_loaded', 'popen', 'pclose'] as $func) {
if (Shell::hasDisabledFunctions($func)) {
echo esc_html($func);
echo '<br>';
}
}
?>
</code>
<?php
printf(
esc_html_x(
'FAQ: %1$sHow to enable disabled PHP functions.%2$s',
'%1$s and %2$s are the opening and closing tags of a link.',
'duplicator-pro'
),
'<a href="' . esc_url(DUPLICATOR_DUPLICATOR_DOCS_URL . 'how-to-resolve-dependency-checks') . '" target="_blank">',
'</a>'
);
?>
</div>
<!-- MYSQLDUMP ACTIVE -->
<?php
else :
$tipContent = esc_attr__(
'Add a custom path if the path to mysqldump is not properly detected.
For all paths use a forward slash as the path seperator.
On Linux systems use mysqldump for Windows systems use mysqldump.exe.
If the path tried does not work please contact your hosting provider for details on the correct path.',
'duplicator-pro'
);
?>
<span><?php esc_html_e("Current Path:", 'duplicator-pro'); ?></span>&nbsp;
<?php
SettingsPageController::getMySQLDumpMessage(
$mysqlDumpFound,
(!empty($mysqlDumpPath) ? $mysqlDumpPath : $global->package_mysqldump_path)
); ?><br><br>
<span><?php esc_html_e("Custom Path:", 'duplicator-pro'); ?></span>&nbsp;
<input
class="width-large inline-display"
type="text"
name="_package_mysqldump_path"
id="_package_mysqldump_path"
value="<?php echo esc_attr($global->package_mysqldump_path); ?>"
placeholder="<?php esc_attr_e("/usr/bin/mypath/mysqldump", 'duplicator-pro'); ?>">&nbsp;
<i class="fa-solid fa-question-circle fa-sm dark-gray-color"
data-tooltip-title="<?php esc_attr_e("mysqldump", 'duplicator-pro'); ?>"
data-tooltip="<?php echo esc_attr($tipContent); ?>">
</i><br>
<label><?php esc_html_e("Switch Options:", 'duplicator-pro'); ?></label>
<div class="dup-group-option-wrapper">
<?php
$mysqldumpOptions = $global->getMysqldumpOptions();
foreach ($mysqldumpOptions as $key => $option) {
?>
<div class="dup-group-option-item">
<input
type="checkbox"
name="<?php echo esc_attr($option->getInputName()); ?>"
id="<?php echo esc_attr($option->getInputName()); ?>"
class="margin-0"
<?php checked($option->getEnabled()); ?>>
--<?php echo esc_html($option->getOptionName()); ?>
</div>
<?php } ?>
</div>
<?php
endif; ?>
</div>
<!-- PHP OPTION -->
<div class="engine-sub-opts" id="dbengine-details-2" style="display:none; line-height: 35px; margin-top:-5px">
<span><?php esc_html_e("Process Mode", 'duplicator-pro'); ?></span>&nbsp;
<select name="_phpdump_mode" class="width-medium inline-display margin-0">
<option
<?php selected($global->package_phpdump_mode, WpDbUtils::PHPDUMP_MODE_MULTI); ?>
value="<?php echo (int) WpDbUtils::PHPDUMP_MODE_MULTI; ?>">
<?php esc_html_e("Multi-Threaded", 'duplicator-pro'); ?>
</option>
<option
<?php selected($global->package_phpdump_mode, WpDbUtils::PHPDUMP_MODE_SINGLE); ?>
value="<?php echo (int) WpDbUtils::PHPDUMP_MODE_SINGLE; ?>">
<?php esc_html_e("Single-Threaded", 'duplicator-pro'); ?>
</option>
</select>&nbsp;
<i style="margin-right:7px;" class="fa-solid fa-question-circle fa-sm dark-gray-color"
data-tooltip-title="<?php esc_attr_e("PHP Code Mode", 'duplicator-pro'); ?>"
data-tooltip="<?php
esc_attr_e(
'Single-Threaded mode attempts to create the entire database script in one request.
Multi-Threaded mode allows the database script to be chunked over multiple requests.
Multi-Threaded mode is typically slower but much more reliable especially for larger databases.',
'duplicator-pro'
);
?>"></i>
</div>
</div>
<label class="lbl-larger" for="_package_mysqldump_qrylimit">
<?php esc_html_e("Query Size", 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<select name="_package_mysqldump_qrylimit" id="_package_mysqldump_qrylimit" class="width-small inline-display margin-0">
<?php
foreach (Constants::MYSQL_DUMP_CHUNK_SIZES as $value => $label) {
echo '<option ' . selected($global->package_mysqldump_qrylimit, $value, false) . ' value="' . (int) $value . '">'
. esc_html($label) . '</option>';
}
?>
</select>&nbsp;
<?php $tipContent = __(
'A higher limit size will speed up the database build time, however it will use more memory.
If your host has memory caps start off low.',
'duplicator-pro'
); ?>
<i style="margin-right:7px" class="fa-solid fa-question-circle fa-sm dark-gray-color"
data-tooltip-title="<?php esc_attr_e("MYSQL Query Limit Size", 'duplicator-pro'); ?>"
data-tooltip="<?php echo esc_attr($tipContent); ?>">
</i>
</div>

View File

@@ -0,0 +1,172 @@
<?php
/**
* @package Duplicator
*/
use Duplicator\Models\GlobalEntity;
use Duplicator\Package\Create\PackInstaller;
defined("ABSPATH") or die("");
/**
* Variables
*
* @var Duplicator\Core\Controllers\ControllersManager $ctrlMng
* @var Duplicator\Core\Views\TplMng $tplMng
* @var array<string, mixed> $tplData
*/
$global = GlobalEntity::getInstance();
$installerNameMode = $global->installer_name_mode;
?>
<h3 class="title">
<?php esc_html_e("Installer Settings", 'duplicator-pro'); ?>
</h3>
<hr size="1" />
<label class="lbl-larger">
<?php esc_html_e("Name", 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<b><?php esc_html_e("Default 'Save as' name:", 'duplicator-pro'); ?></b> <br />
<label>
<i class='fas fa-lock lock-info fa-fw'></i>&nbsp;
<input
type="radio"
name="installer_name_mode"
class="margin-0"
value="<?php echo esc_attr(GlobalEntity::INSTALLER_NAME_MODE_WITH_HASH); ?>"
<?php checked($installerNameMode === GlobalEntity::INSTALLER_NAME_MODE_WITH_HASH); ?>>&nbsp;
[name]_[hash]_[date]_installer.php <i>(<?php esc_html_e("recommended", 'duplicator-pro'); ?>)</i>
</label><br>
<label>
<i class='fas fa-lock-open lock-info fa-fw'></i>&nbsp;
<input
type="radio"
name="installer_name_mode"
class="margin-0"
value="<?php echo esc_attr(GlobalEntity::INSTALLER_NAME_MODE_SIMPLE); ?>"
<?php checked($installerNameMode === GlobalEntity::INSTALLER_NAME_MODE_SIMPLE); ?>>&nbsp;
<?php echo esc_html(PackInstaller::DEFAULT_INSTALLER_FILE_NAME_WITHOUT_HASH); ?>
</label>
<p class="description">
<?php
printf(
esc_html_x(
'To understand the importance and usage of the installer name, please %1$sread this section%2$s.',
'1 and 2 are opening and closing anchor or link tags',
'duplicator-pro'
),
'<a href="javascript:void(0)" onclick="jQuery(\'#dupli-inst-mode-details\').toggle()">',
'</a>'
);
?>
</p>
<div id="dupli-inst-mode-details">
<p>
<i>
<?php esc_html_e(
'Using the full hashed format provides a higher level of security by helping to prevent the discovery of the installer file.',
'duplicator-pro'
); ?>
</i> <br />
<b><?php esc_html_e('Hashed example', 'duplicator-pro'); ?>:</b> my-name_64fc6df76c17f2023225_19990101010101_installer.php
</p>
<p>
<?php
esc_html_e(
'The Installer \'Name\' setting specifies the name of the installer used at download-time.
It\'s recommended you choose the hashed name to better protect the installer file.
Independent of the value of this setting, you can always change the name in the \'Save as\' file dialog at download-time.
If you choose to use a custom name, use a filename that is known only to you. Installer filenames must end in \'.php\'.',
'duplicator-pro'
);
?>
</p>
<p>
<?php
esc_html_e(
'It\'s important not to leave the installer files on the destination server longer than necessary.
After installing the migrated or restored site, just logon as a WordPress administrator and
follow the prompts to have the plugin remove the files.
Alternatively, you can remove them manually.',
'duplicator-pro'
);
?>
</p>
<p>
<i class="fas fa-info-circle"></i>
<?php
esc_html_e(
'Tip: Each row on the Backups screen includes a copy button that copies the installer name to the clipboard.
After clicking this button, paste the installer name into the URL you\'re using to install the destination site.
This feature is handy when using the hashed installer name.',
'duplicator-pro'
);
?>
</p>
</div>
</div>
<h3 class="title">
<?php esc_html_e("Installer Cleanup", 'duplicator-pro') ?>
</h3>
<hr size="1" />
<label class="lbl-larger">
<?php esc_html_e("Mode", 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<input
type="radio"
name="cleanup_mode"
id="cleanup_mode_Cleanup_Off"
class="margin-0"
value="<?php echo (int) GlobalEntity::CLEANUP_MODE_OFF; ?>"
<?php checked($global->cleanup_mode, GlobalEntity::CLEANUP_MODE_OFF); ?>>
<label for="cleanup_mode_Cleanup_Off"><?php esc_html_e("Off", 'duplicator-pro'); ?></label> &nbsp;
<input
type="radio"
name="cleanup_mode"
id="cleanup_mode_Email_Notice"
class="margin-0"
value="<?php echo (int) GlobalEntity::CLEANUP_MODE_MAIL; ?>"
<?php checked($global->cleanup_mode, GlobalEntity::CLEANUP_MODE_MAIL); ?>>
<label for="cleanup_mode_Email_Notice"><?php esc_html_e("Email Notice", 'duplicator-pro'); ?></label> &nbsp;
<input
type="radio"
name="cleanup_mode"
id="cleanup_mode_Auto_Cleanup"
class="margin-0"
value="<?php echo (int) GlobalEntity::CLEANUP_MODE_AUTO; ?>"
<?php checked($global->cleanup_mode, GlobalEntity::CLEANUP_MODE_AUTO); ?>>
<label for="cleanup_mode_Auto_Cleanup"><?php esc_html_e("Auto Cleanup", 'duplicator-pro'); ?></label> &nbsp;
<p class="description">
<?php esc_html_e("Email Notice: An email will be sent daily until the installer files are removed.", 'duplicator-pro'); ?>
</p>
<p class="description">
<?php esc_html_e("Auto Cleanup: Installer files will be cleaned up automatically based on setting below.", 'duplicator-pro'); ?>
</p>
</div>
<label class="lbl-larger">
<?php esc_html_e("Auto Cleanup", 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<input
data-parsley-required
data-parsley-errors-container="#auto_cleanup_hours_error_container"
data-parsley-min="1"
data-parsley-type="number"
class="inline-display width-small margin-0"
type="text"
name="auto_cleanup_hours" id="auto_cleanup_hours"
value="<?php echo (int) $global->auto_cleanup_hours; ?>"
size="7" />
<?php esc_html_e('Hours', 'duplicator-pro'); ?>
<div id="auto_cleanup_hours_error_container" class="duplicator-error-container"></div>
<p class="description"> <?php esc_html_e('Auto cleanup will run every N hours based on value above.', 'duplicator-pro'); ?> </p>
</div>

View File

@@ -0,0 +1,119 @@
<?php
/**
* @package Duplicator
*/
use Duplicator\Models\GlobalEntity;
use Duplicator\Utils\Settings\ServerThrottle;
defined("ABSPATH") or die("");
/**
* Variables
*
* @var Duplicator\Core\Controllers\ControllersManager $ctrlMng
* @var Duplicator\Core\Views\TplMng $tplMng
* @var array<string, mixed> $tplData
*/
$global = GlobalEntity::getInstance();
?>
<h3 class="title">
<?php esc_html_e("Processing", 'duplicator-pro') ?>
</h3>
<hr size="1" />
<label class="lbl-larger">
<?php esc_html_e("Server Throttle", 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<input
type="radio"
name="server_load_reduction"
id="server_load_reduction_off"
value="<?php echo (int) ServerThrottle::NONE; ?>"
class="margin-0"
<?php checked($global->server_load_reduction, ServerThrottle::NONE); ?>>
<label for="server_load_reduction_off">
<?php esc_html_e("Off", 'duplicator-pro'); ?>
</label> &nbsp;
<input
type="radio"
name="server_load_reduction"
id="server_load_reduction_low"
value="<?php echo (int) ServerThrottle::A_BIT; ?>"
class="margin-0"
<?php checked($global->server_load_reduction, ServerThrottle::A_BIT); ?>>
<label for="server_load_reduction_low">
<?php esc_html_e("Low", 'duplicator-pro'); ?>
</label> &nbsp;
<input
type="radio"
name="server_load_reduction"
id="server_load_reduction_medium"
value="<?php echo (int) ServerThrottle::MORE; ?>"
class="margin-0"
<?php checked($global->server_load_reduction, ServerThrottle::MORE); ?>>
<label for="server_load_reduction_medium">
<?php esc_html_e("Medium", 'duplicator-pro'); ?>
</label> &nbsp;
<input
type="radio"
name="server_load_reduction"
id="server_load_reduction_high"
value="<?php echo (int) ServerThrottle::A_LOT ?>"
class="margin-0"
<?php checked($global->server_load_reduction, ServerThrottle::A_LOT); ?>>
<label for="server_load_reduction_high">
<?php esc_html_e("High", 'duplicator-pro'); ?>
</label>
<p class="description">
<?php esc_html_e(
"Throttle to prevent resource complaints on budget hosts. The higher the value the slower the backup.",
'duplicator-pro'
); ?>
</p>
</div>
<label class="lbl-larger">
<?php esc_html_e("Max Build Time", 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<input
data-parsley-required data-parsley-errors-container="#max_package_runtime_in_min_error_container"
data-parsley-min="0"
data-parsley-type="number"
class="inline-display width-small margin-0"
type="text"
name="max_package_runtime_in_min"
id="max_package_runtime_in_min"
value="<?php echo (int) $global->max_package_runtime_in_min; ?>">
<span>&nbsp;<?php esc_html_e('Minutes', 'duplicator-pro'); ?></span>
<div id="max_package_runtime_in_min_error_container" class="duplicator-error-container"></div>
<p class="description">
<?php esc_html_e('Max build time until Backup is auto-cancelled. Set to 0 for no limit.', 'duplicator-pro'); ?>
</p>
</div>
<label class="lbl-larger">
<?php esc_html_e("Max Transfer Time", 'duplicator-pro'); ?>
</label>
<div class="margin-bottom-1">
<input
data-parsley-required data-parsley-errors-container="#max_package_transfer_time_in_min_error_container"
data-parsley-min="1"
data-parsley-type="number"
class="inline-display width-small margin-0"
type="text"
name="max_package_transfer_time_in_min"
id="max_package_transfer_time_in_min"
value="<?php echo (int) $global->max_package_transfer_time_in_min; ?>">
<span>&nbsp;<?php esc_html_e('Minutes', 'duplicator-pro'); ?></span>
<div id="max_package_transfer_time_in_min_error_container" class="duplicator-error-container"></div>
<p class="description">
<?php esc_html_e('Max Backup transfer time in minutes until the transfer is auto-cancelled.', 'duplicator-pro'); ?>
</p>
</div>