Version Description
Download this release
Release Info
Developer | cory@lamle.org |
Plugin | Duplicator – WordPress Migration Plugin |
Version | 1.3.40 |
Comparing to | |
See all releases |
Code changes from version 1.3.38 to 1.3.40
- classes/class.archive.config.php +2 -0
- classes/class.logging.php +1 -1
- classes/package/class.pack.database.php +2 -2
- classes/package/class.pack.installer.php +9 -0
- classes/package/class.pack.php +16 -5
- classes/ui/class.ui.screen.base.php +16 -10
- define.php +2 -2
- duplicator.php +1 -1
- installer/dup-installer/classes/class.logging.php +0 -4
- installer/dup-installer/classes/class.s3.func.php +0 -14
- installer/dup-installer/classes/class.server.php +52 -0
- installer/dup-installer/classes/config/class.archive.config.php +2 -0
- installer/dup-installer/classes/config/class.boot.php +1 -0
- installer/dup-installer/classes/config/class.constants.php +19 -2
- installer/dup-installer/classes/utilities/class.u.notices.manager.php +35 -4
- installer/dup-installer/ctrls/ctrl.s2.dbinstall.php +60 -4
- installer/dup-installer/views/view.s1.base.php +14 -1
- installer/dup-installer/views/view.s2.base.php +12 -2
- installer/dup-installer/views/view.s2.basic.php +12 -2
- lib/snaplib/class.snaplib.u.io.php +56 -0
- readme.txt +3 -3
- uninstall.php +2 -0
- views/packages/main/s1.setup2.php +8 -0
- views/settings/controller.php +8 -6
- views/settings/general.php +1 -1
- views/settings/gopro.php +10 -9
- views/tools/controller.php +9 -1
- views/tools/import.php +28 -0
- views/tools/recovery.php +28 -0
classes/class.archive.config.php
CHANGED
@@ -35,6 +35,8 @@ class DUP_Archive_Config
|
|
35 |
public $dbname;
|
36 |
public $dbuser;
|
37 |
public $dbpass;
|
|
|
|
|
38 |
|
39 |
// MULTISITE
|
40 |
public $mu_mode;
|
35 |
public $dbname;
|
36 |
public $dbuser;
|
37 |
public $dbpass;
|
38 |
+
public $dbcharset;
|
39 |
+
public $dbcollation;
|
40 |
|
41 |
// MULTISITE
|
42 |
public $mu_mode;
|
classes/class.logging.php
CHANGED
@@ -272,7 +272,7 @@ class DUP_Log
|
|
272 |
|
273 |
case Dup_ErrorBehavior::ThrowException:
|
274 |
DUP_LOG::trace("throwing exception");
|
275 |
-
|
276 |
break;
|
277 |
|
278 |
case Dup_ErrorBehavior::Quit:
|
272 |
|
273 |
case Dup_ErrorBehavior::ThrowException:
|
274 |
DUP_LOG::trace("throwing exception");
|
275 |
+
throw new Exception($msg);
|
276 |
break;
|
277 |
|
278 |
case Dup_ErrorBehavior::Quit:
|
classes/package/class.pack.database.php
CHANGED
@@ -218,7 +218,7 @@ class DUP_Database
|
|
218 |
}
|
219 |
catch (Exception $e) {
|
220 |
do_action('duplicator_lite_build_database_fail', $package);
|
221 |
-
DUP_Log::Error("Runtime error in DUP_Database::Build", "Exception: {$e}", $errorBehavior);
|
222 |
}
|
223 |
}
|
224 |
|
@@ -542,7 +542,7 @@ class DUP_Database
|
|
542 |
* 2 - Exception
|
543 |
*/
|
544 |
DUP_Log::Info('MYSQL DUMP ERROR '.print_r($mysqlResult, true));
|
545 |
-
DUP_Log::error(__('Shell mysql dump error. Change
|
546 |
DUPLICATOR_DB_MYSQLDUMP_ERROR_CONTAINING_LINE_COUNT, DUPLICATOR_DB_MYSQLDUMP_ERROR_CHARS_IN_LINE_COUNT)), Dup_ErrorBehavior::ThrowException);
|
547 |
return false;
|
548 |
}
|
218 |
}
|
219 |
catch (Exception $e) {
|
220 |
do_action('duplicator_lite_build_database_fail', $package);
|
221 |
+
DUP_Log::Error("Runtime error in DUP_Database::Build. ".$e->getMessage(), "Exception: {$e}", $errorBehavior);
|
222 |
}
|
223 |
}
|
224 |
|
542 |
* 2 - Exception
|
543 |
*/
|
544 |
DUP_Log::Info('MYSQL DUMP ERROR '.print_r($mysqlResult, true));
|
545 |
+
DUP_Log::error(__('Shell mysql dump error. Change SQL Script to the "PHP Code" in the Duplicator > Settings > Packages.', 'duplicator'), implode("\n", DupLiteSnapLibIOU::getLastLinesOfFile($this->tempDbPath,
|
546 |
DUPLICATOR_DB_MYSQLDUMP_ERROR_CONTAINING_LINE_COUNT, DUPLICATOR_DB_MYSQLDUMP_ERROR_CHARS_IN_LINE_COUNT)), Dup_ErrorBehavior::ThrowException);
|
547 |
return false;
|
548 |
}
|
classes/package/class.pack.installer.php
CHANGED
@@ -20,6 +20,8 @@ class DUP_Installer
|
|
20 |
public $OptsDBPort;
|
21 |
public $OptsDBName;
|
22 |
public $OptsDBUser;
|
|
|
|
|
23 |
public $OptsSecureOn = 0;
|
24 |
public $OptsSecurePass;
|
25 |
public $numFilesAdded = 0;
|
@@ -50,6 +52,10 @@ class DUP_Installer
|
|
50 |
|
51 |
|
52 |
if ($success) {
|
|
|
|
|
|
|
|
|
53 |
$package->BuildProgress->installer_built = true;
|
54 |
} else {
|
55 |
$error_message = 'Error adding installer';
|
@@ -165,6 +171,9 @@ class DUP_Installer
|
|
165 |
$ac->dbname = $this->Package->Installer->OptsDBName;
|
166 |
$ac->dbuser = $this->Package->Installer->OptsDBUser;
|
167 |
$ac->dbpass = '';
|
|
|
|
|
|
|
168 |
$ac->wp_tableprefix = $wpdb->base_prefix;
|
169 |
|
170 |
$ac->mu_mode = DUP_MU::getMode();
|
20 |
public $OptsDBPort;
|
21 |
public $OptsDBName;
|
22 |
public $OptsDBUser;
|
23 |
+
public $OptsDBCharset;
|
24 |
+
public $OptsDBCollation;
|
25 |
public $OptsSecureOn = 0;
|
26 |
public $OptsSecurePass;
|
27 |
public $numFilesAdded = 0;
|
52 |
|
53 |
|
54 |
if ($success) {
|
55 |
+
// No longer need to store wp-config.txt file in main storage area
|
56 |
+
$temp_conf_ark_file_path = $this->getTempWPConfArkFilePath();
|
57 |
+
@unlink($temp_conf_ark_file_path);
|
58 |
+
|
59 |
$package->BuildProgress->installer_built = true;
|
60 |
} else {
|
61 |
$error_message = 'Error adding installer';
|
171 |
$ac->dbname = $this->Package->Installer->OptsDBName;
|
172 |
$ac->dbuser = $this->Package->Installer->OptsDBUser;
|
173 |
$ac->dbpass = '';
|
174 |
+
$ac->dbcharset = $this->Package->Installer->OptsDBCharset;
|
175 |
+
$ac->dbcollation = $this->Package->Installer->OptsDBCollation;
|
176 |
+
|
177 |
$ac->wp_tableprefix = $wpdb->base_prefix;
|
178 |
|
179 |
$ac->mu_mode = DUP_MU::getMode();
|
classes/package/class.pack.php
CHANGED
@@ -482,30 +482,39 @@ class DUP_Package
|
|
482 |
if ($delResult != 0) {
|
483 |
$tmpPath = DUP_Settings::getSsdirTmpPath();
|
484 |
$ssdPath = DUP_Settings::getSsdirPath();
|
485 |
-
|
|
|
|
|
|
|
486 |
//Perms
|
487 |
-
@chmod($tmpPath."/{$
|
488 |
@chmod($tmpPath."/{$nameHash}_database.sql", 0644);
|
489 |
@chmod($tmpPath."/{$nameHash}_installer.php", 0644);
|
490 |
@chmod($tmpPath."/{$nameHash}_scan.json", 0644);
|
|
|
491 |
@chmod($tmpPath."/{$nameHash}.log", 0644);
|
492 |
|
493 |
-
@chmod($ssdPath."/{$
|
494 |
@chmod($ssdPath."/{$nameHash}_database.sql", 0644);
|
495 |
@chmod($ssdPath."/{$nameHash}_installer.php", 0644);
|
496 |
@chmod($ssdPath."/{$nameHash}_scan.json", 0644);
|
|
|
|
|
497 |
@chmod($ssdPath."/{$nameHash}.log", 0644);
|
498 |
//Remove
|
499 |
-
@unlink($tmpPath."/{$
|
500 |
@unlink($tmpPath."/{$nameHash}_database.sql");
|
501 |
@unlink($tmpPath."/{$nameHash}_installer.php");
|
502 |
@unlink($tmpPath."/{$nameHash}_scan.json");
|
|
|
503 |
@unlink($tmpPath."/{$nameHash}.log");
|
504 |
|
505 |
-
@unlink($ssdPath."/{$
|
506 |
@unlink($ssdPath."/{$nameHash}_database.sql");
|
507 |
@unlink($ssdPath."/{$nameHash}_installer.php");
|
508 |
@unlink($ssdPath."/{$nameHash}_scan.json");
|
|
|
|
|
509 |
@unlink($ssdPath."/{$nameHash}.log");
|
510 |
}
|
511 |
}
|
@@ -1423,6 +1432,8 @@ class DUP_Package
|
|
1423 |
$this->Installer->OptsDBPort = sanitize_text_field($post['dbport']);
|
1424 |
$this->Installer->OptsDBName = sanitize_text_field($post['dbname']);
|
1425 |
$this->Installer->OptsDBUser = sanitize_text_field($post['dbuser']);
|
|
|
|
|
1426 |
$this->Installer->OptsSecureOn = isset($post['secure-on']) ? 1 : 0;
|
1427 |
$post_secure_pass = sanitize_text_field($post['secure-pass']);
|
1428 |
$this->Installer->OptsSecurePass = DUP_Util::installerScramble($post_secure_pass);
|
482 |
if ($delResult != 0) {
|
483 |
$tmpPath = DUP_Settings::getSsdirTmpPath();
|
484 |
$ssdPath = DUP_Settings::getSsdirPath();
|
485 |
+
|
486 |
+
$archiveFile = $this->getArchiveFilename();
|
487 |
+
$wpConfigFile = "{$this->NameHash}_wp-config.txt";
|
488 |
+
|
489 |
//Perms
|
490 |
+
@chmod($tmpPath."/{$archiveFile}", 0644);
|
491 |
@chmod($tmpPath."/{$nameHash}_database.sql", 0644);
|
492 |
@chmod($tmpPath."/{$nameHash}_installer.php", 0644);
|
493 |
@chmod($tmpPath."/{$nameHash}_scan.json", 0644);
|
494 |
+
@chmod($tmpPath."/{$wpConfigFile}", 0644);
|
495 |
@chmod($tmpPath."/{$nameHash}.log", 0644);
|
496 |
|
497 |
+
@chmod($ssdPath."/{$archiveFile}", 0644);
|
498 |
@chmod($ssdPath."/{$nameHash}_database.sql", 0644);
|
499 |
@chmod($ssdPath."/{$nameHash}_installer.php", 0644);
|
500 |
@chmod($ssdPath."/{$nameHash}_scan.json", 0644);
|
501 |
+
// In older version, The plugin was storing [HASH]_wp-config.txt in main storage area. The below line code is for backward compatibility
|
502 |
+
@chmod($ssdPath."/{$wpConfigFile}", 0644);
|
503 |
@chmod($ssdPath."/{$nameHash}.log", 0644);
|
504 |
//Remove
|
505 |
+
@unlink($tmpPath."/{$archiveFile}");
|
506 |
@unlink($tmpPath."/{$nameHash}_database.sql");
|
507 |
@unlink($tmpPath."/{$nameHash}_installer.php");
|
508 |
@unlink($tmpPath."/{$nameHash}_scan.json");
|
509 |
+
@unlink($tmpPath."/{$wpConfigFile}");
|
510 |
@unlink($tmpPath."/{$nameHash}.log");
|
511 |
|
512 |
+
@unlink($ssdPath."/{$archiveFile}");
|
513 |
@unlink($ssdPath."/{$nameHash}_database.sql");
|
514 |
@unlink($ssdPath."/{$nameHash}_installer.php");
|
515 |
@unlink($ssdPath."/{$nameHash}_scan.json");
|
516 |
+
// In older version, The plugin was storing [HASH]_wp-config.txt in main storage area. The below line code is for backward compatibility
|
517 |
+
@unlink($ssdPath."/{$wpConfigFile}");
|
518 |
@unlink($ssdPath."/{$nameHash}.log");
|
519 |
}
|
520 |
}
|
1432 |
$this->Installer->OptsDBPort = sanitize_text_field($post['dbport']);
|
1433 |
$this->Installer->OptsDBName = sanitize_text_field($post['dbname']);
|
1434 |
$this->Installer->OptsDBUser = sanitize_text_field($post['dbuser']);
|
1435 |
+
$this->Installer->OptsDBCharset = sanitize_text_field($post['dbcharset']);
|
1436 |
+
$this->Installer->OptsDBCollation = sanitize_text_field($post['dbcollation']);
|
1437 |
$this->Installer->OptsSecureOn = isset($post['secure-on']) ? 1 : 0;
|
1438 |
$post_secure_pass = sanitize_text_field($post['secure-pass']);
|
1439 |
$this->Installer->OptsSecurePass = DUP_Util::installerScramble($post_secure_pass);
|
classes/ui/class.ui.screen.base.php
CHANGED
@@ -45,22 +45,28 @@ class DUP_UI_Screen
|
|
45 |
}
|
46 |
|
47 |
$colorScheme = self::getCurrentColorScheme();
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
|
|
53 |
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
|
|
59 |
}
|
60 |
|
61 |
public static function getCurrentColorScheme()
|
62 |
{
|
63 |
global $_wp_admin_css_colors;
|
|
|
|
|
|
|
|
|
64 |
$colorScheme = get_user_option('admin_color');
|
65 |
|
66 |
if (isset($_wp_admin_css_colors[$colorScheme])) {
|
45 |
}
|
46 |
|
47 |
$colorScheme = self::getCurrentColorScheme();
|
48 |
+
if ($colorScheme !== false) {
|
49 |
+
?>
|
50 |
+
<style>
|
51 |
+
.link-style {
|
52 |
+
color: <?php echo $colorScheme->colors[2]; ?>;
|
53 |
+
}
|
54 |
|
55 |
+
.link-style:hover {
|
56 |
+
color: <?php echo $colorScheme->colors[3]; ?>;
|
57 |
+
}
|
58 |
+
</style>
|
59 |
+
<?php
|
60 |
+
}
|
61 |
}
|
62 |
|
63 |
public static function getCurrentColorScheme()
|
64 |
{
|
65 |
global $_wp_admin_css_colors;
|
66 |
+
if(!isset($_wp_admin_css_colors) || !is_array($_wp_admin_css_colors)){
|
67 |
+
return false;
|
68 |
+
}
|
69 |
+
|
70 |
$colorScheme = get_user_option('admin_color');
|
71 |
|
72 |
if (isset($_wp_admin_css_colors[$colorScheme])) {
|
define.php
CHANGED
@@ -5,8 +5,8 @@ defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
|
5 |
|
6 |
if (function_exists('plugin_dir_url'))
|
7 |
{
|
8 |
-
define('DUPLICATOR_VERSION', '1.3.
|
9 |
-
define('DUPLICATOR_VERSION_BUILD', '2020-
|
10 |
define('DUPLICATOR_PLUGIN_URL', plugin_dir_url(__FILE__));
|
11 |
define('DUPLICATOR_SITE_URL', get_site_url());
|
12 |
|
5 |
|
6 |
if (function_exists('plugin_dir_url'))
|
7 |
{
|
8 |
+
define('DUPLICATOR_VERSION', '1.3.40');
|
9 |
+
define('DUPLICATOR_VERSION_BUILD', '2020-11-14_09:00');
|
10 |
define('DUPLICATOR_PLUGIN_URL', plugin_dir_url(__FILE__));
|
11 |
define('DUPLICATOR_SITE_URL', get_site_url());
|
12 |
|
duplicator.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
Plugin Name: Duplicator
|
4 |
Plugin URI: https://snapcreek.com/duplicator/duplicator-free/
|
5 |
Description: Migrate and backup a copy of your WordPress files and database. Duplicate and move a site from one location to another quickly.
|
6 |
-
Version: 1.3.
|
7 |
Author: Snap Creek
|
8 |
Author URI: http://www.snapcreek.com/duplicator/
|
9 |
Text Domain: duplicator
|
3 |
Plugin Name: Duplicator
|
4 |
Plugin URI: https://snapcreek.com/duplicator/duplicator-free/
|
5 |
Description: Migrate and backup a copy of your WordPress files and database. Duplicate and move a site from one location to another quickly.
|
6 |
+
Version: 1.3.40
|
7 |
Author: Snap Creek
|
8 |
Author URI: http://www.snapcreek.com/duplicator/
|
9 |
Text Domain: duplicator
|
installer/dup-installer/classes/class.logging.php
CHANGED
@@ -196,10 +196,6 @@ class DUPX_Log
|
|
196 |
|
197 |
self::info("\nINSTALLER ERROR:\n{$log_msg}\n");
|
198 |
|
199 |
-
if ($GLOBALS['DUPX_STATE']->mode == DUPX_InstallerMode::OverwriteInstall) {
|
200 |
-
DUPX_U::maintenanceMode(false, $GLOBALS['DUPX_ROOT']);
|
201 |
-
}
|
202 |
-
|
203 |
if (self::$thowExceptionOnError) {
|
204 |
throw new Exception($errorMessage);
|
205 |
} else {
|
196 |
|
197 |
self::info("\nINSTALLER ERROR:\n{$log_msg}\n");
|
198 |
|
|
|
|
|
|
|
|
|
199 |
if (self::$thowExceptionOnError) {
|
200 |
throw new Exception($errorMessage);
|
201 |
} else {
|
installer/dup-installer/classes/class.s3.func.php
CHANGED
@@ -529,20 +529,6 @@ final class DUPX_S3_Funcs
|
|
529 |
DUPX_UpdateEngine::logErrors();
|
530 |
}
|
531 |
|
532 |
-
public function removeMaincenanceMode()
|
533 |
-
{
|
534 |
-
self::logSectionHeader('REMOVE MAINTENANCE MODE', __FUNCTION__, __LINE__);
|
535 |
-
// make sure post data is initialized
|
536 |
-
$this->getPost();
|
537 |
-
|
538 |
-
|
539 |
-
if (isset($this->post['remove_redundant']) && $this->post['remove_redundant']) {
|
540 |
-
if ($GLOBALS['DUPX_STATE']->mode == DUPX_InstallerMode::OverwriteInstall) {
|
541 |
-
DUPX_U::maintenanceMode(false, $GLOBALS['DUPX_ROOT']);
|
542 |
-
}
|
543 |
-
}
|
544 |
-
}
|
545 |
-
|
546 |
public function removeLicenseKey()
|
547 |
{
|
548 |
self::logSectionHeader('REMOVE LICENSE KEY', __FUNCTION__, __LINE__);
|
529 |
DUPX_UpdateEngine::logErrors();
|
530 |
}
|
531 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
532 |
public function removeLicenseKey()
|
533 |
{
|
534 |
self::logSectionHeader('REMOVE LICENSE KEY', __FUNCTION__, __LINE__);
|
installer/dup-installer/classes/class.server.php
CHANGED
@@ -122,6 +122,58 @@ class DUPX_Server
|
|
122 |
}
|
123 |
return ($search_count == $file_count);
|
124 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
125 |
|
126 |
/**
|
127 |
* Is the web server IIS
|
122 |
}
|
123 |
return ($search_count == $file_count);
|
124 |
}
|
125 |
+
|
126 |
+
public static function parentWordfencePath()
|
127 |
+
{
|
128 |
+
$scanPath = $GLOBALS['DUPX_ROOT'];
|
129 |
+
$rootPath = DupLiteSnapLibIOU::getMaxAllowedRootOfPath($scanPath);
|
130 |
+
|
131 |
+
if ($rootPath === false) {
|
132 |
+
//$scanPath is not contained in open_basedir paths skip
|
133 |
+
return false;
|
134 |
+
}
|
135 |
+
|
136 |
+
DUPX_Handler::setMode(DUPX_Handler::MODE_OFF);
|
137 |
+
$continueScan = true;
|
138 |
+
while ($continueScan) {
|
139 |
+
if (self::wordFenceFirewallEnabled($scanPath)) {
|
140 |
+
return $scanPath;
|
141 |
+
break;
|
142 |
+
}
|
143 |
+
$continueScan = $scanPath !== $rootPath && $scanPath != dirname($scanPath);
|
144 |
+
$scanPath = dirname($scanPath);
|
145 |
+
}
|
146 |
+
DUPX_Handler::setMode();
|
147 |
+
|
148 |
+
return false;
|
149 |
+
}
|
150 |
+
|
151 |
+
protected static function wordFenceFirewallEnabled($path)
|
152 |
+
{
|
153 |
+
$configFiles = array(
|
154 |
+
'php.ini',
|
155 |
+
'.user.ini',
|
156 |
+
'.htaccess'
|
157 |
+
);
|
158 |
+
|
159 |
+
foreach ($configFiles as $configFile) {
|
160 |
+
$file = $path.'/'.$configFile;
|
161 |
+
|
162 |
+
if (!@is_readable($file)) {
|
163 |
+
continue;
|
164 |
+
}
|
165 |
+
|
166 |
+
if (($content = @file_get_contents($file)) === false) {
|
167 |
+
continue;
|
168 |
+
}
|
169 |
+
|
170 |
+
if (strpos($content, 'wordfence-waf.php') !== false) {
|
171 |
+
return true;
|
172 |
+
}
|
173 |
+
}
|
174 |
+
|
175 |
+
return false;
|
176 |
+
}
|
177 |
|
178 |
/**
|
179 |
* Is the web server IIS
|
installer/dup-installer/classes/config/class.archive.config.php
CHANGED
@@ -40,6 +40,8 @@ class DUPX_ArchiveConfig
|
|
40 |
public $dbname;
|
41 |
public $dbuser;
|
42 |
public $dbpass;
|
|
|
|
|
43 |
|
44 |
//ADV OPTS
|
45 |
public $wproot;
|
40 |
public $dbname;
|
41 |
public $dbuser;
|
42 |
public $dbpass;
|
43 |
+
public $dbcharset;
|
44 |
+
public $dbcollation;
|
45 |
|
46 |
//ADV OPTS
|
47 |
public $wproot;
|
installer/dup-installer/classes/config/class.boot.php
CHANGED
@@ -147,6 +147,7 @@ class DUPX_Boot
|
|
147 |
require_once($GLOBALS['DUPX_INIT'].'/classes/utilities/class.u.notices.manager.php');
|
148 |
require_once($GLOBALS['DUPX_INIT'].'/classes/utilities/class.u.html.php');
|
149 |
require_once($GLOBALS['DUPX_INIT'].'/classes/config/class.constants.php');
|
|
|
150 |
require_once($GLOBALS['DUPX_INIT'].'/ctrls/ctrl.base.php');
|
151 |
require_once($GLOBALS['DUPX_INIT'].'/classes/config/class.archive.config.php');
|
152 |
require_once($GLOBALS['DUPX_INIT'].'/classes/class.logging.php');
|
147 |
require_once($GLOBALS['DUPX_INIT'].'/classes/utilities/class.u.notices.manager.php');
|
148 |
require_once($GLOBALS['DUPX_INIT'].'/classes/utilities/class.u.html.php');
|
149 |
require_once($GLOBALS['DUPX_INIT'].'/classes/config/class.constants.php');
|
150 |
+
require_once($GLOBALS['DUPX_INIT'].'/classes/class.package.php');
|
151 |
require_once($GLOBALS['DUPX_INIT'].'/ctrls/ctrl.base.php');
|
152 |
require_once($GLOBALS['DUPX_INIT'].'/classes/config/class.archive.config.php');
|
153 |
require_once($GLOBALS['DUPX_INIT'].'/classes/class.logging.php');
|
installer/dup-installer/classes/config/class.constants.php
CHANGED
@@ -77,7 +77,12 @@ class DUPX_Constants
|
|
77 |
//SHARED POST PARAMS
|
78 |
$_GET['debug'] = isset($_GET['debug']) ? true : false;
|
79 |
$_GET['basic'] = isset($_GET['basic']) ? true : false;
|
80 |
-
|
|
|
|
|
|
|
|
|
|
|
81 |
|
82 |
//GLOBALS
|
83 |
$GLOBALS["VIEW"] = isset($_GET["view"]) ? $_GET["view"] : $_POST["view"];
|
@@ -146,7 +151,19 @@ class DUPX_Constants
|
|
146 |
|
147 |
define('ERR_DBCONNECT_CREATE', 'DATABASE CREATION FAILURE!<br/> Unable to create database "%s". Check to make sure the user has "Create" privileges. Some hosts will restrict the creation of a database only through the cpanel. Try creating the database manually to proceed with installation. If the database already exists select the action "Connect and Remove All Data" which will remove all existing tables.');
|
148 |
|
149 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
150 |
|
151 |
define('ERR_DBTRYRENAME', 'DATABASE CREATION FAILURE!<br/> Unable to rename a table from database "%s".<br/> Be sure the database user has RENAME privileges for this specific database on all tables.');
|
152 |
|
77 |
//SHARED POST PARAMS
|
78 |
$_GET['debug'] = isset($_GET['debug']) ? true : false;
|
79 |
$_GET['basic'] = isset($_GET['basic']) ? true : false;
|
80 |
+
// For setting of help view
|
81 |
+
if (isset($_GET['view'])) {
|
82 |
+
$_POST['view'] = $_GET['view'];
|
83 |
+
} elseif (!isset($_POST['view'])) {
|
84 |
+
$_POST['view'] = "step1";
|
85 |
+
}
|
86 |
|
87 |
//GLOBALS
|
88 |
$GLOBALS["VIEW"] = isset($_GET["view"]) ? $_GET["view"] : $_POST["view"];
|
151 |
|
152 |
define('ERR_DBCONNECT_CREATE', 'DATABASE CREATION FAILURE!<br/> Unable to create database "%s". Check to make sure the user has "Create" privileges. Some hosts will restrict the creation of a database only through the cpanel. Try creating the database manually to proceed with installation. If the database already exists select the action "Connect and Remove All Data" which will remove all existing tables.');
|
153 |
|
154 |
+
define('ERR_DROP_TABLE_TRYCLEAN', 'TABLE CLEAN FAILURE'
|
155 |
+
.'Unable to remove TABLE "%s" from database "%s".<br/>'
|
156 |
+
.'Please remove all tables from this database and try the installation again. '
|
157 |
+
.'If no tables show in the database, then Drop the database and re-create it.<br/>'
|
158 |
+
.'ERROR MESSAGE: %s');
|
159 |
+
define('ERR_DROP_PROCEDURE_TRYCLEAN', 'PROCEDURE CLEAN FAILURE. '
|
160 |
+
.'Please remove all procedures from this database and try the installation again. '
|
161 |
+
.'If no procedures show in the database, then Drop the database and re-create it.<br/>'
|
162 |
+
.'ERROR MESSAGE: %s <br/><br/>');
|
163 |
+
define('ERR_DROP_VIEW_TRYCLEAN', 'VIEW CLEAN FAILURE. '
|
164 |
+
.'Please remove all views from this database and try the installation again. '
|
165 |
+
.'If no views show in the database, then Drop the database and re-create it.<br/>'
|
166 |
+
.'ERROR MESSAGE: %s <br/><br/>');
|
167 |
|
168 |
define('ERR_DBTRYRENAME', 'DATABASE CREATION FAILURE!<br/> Unable to rename a table from database "%s".<br/> Be sure the database user has RENAME privileges for this specific database on all tables.');
|
169 |
|
installer/dup-installer/classes/utilities/class.u.notices.manager.php
CHANGED
@@ -16,10 +16,13 @@ defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
|
16 |
*/
|
17 |
final class DUPX_NOTICE_MANAGER
|
18 |
{
|
19 |
-
const ADD_NORMAL
|
20 |
-
const ADD_UNIQUE
|
21 |
-
const ADD_UNIQUE_UPDATE
|
22 |
-
const ADD_UNIQUE_APPEND
|
|
|
|
|
|
|
23 |
const DEFAULT_UNIQUE_ID_PREFIX = '__auto_unique_id__';
|
24 |
|
25 |
private static $uniqueCountId = 0;
|
@@ -324,6 +327,14 @@ final class DUPX_NOTICE_MANAGER
|
|
324 |
}
|
325 |
$insertId = $uniqueId;
|
326 |
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
327 |
case self::ADD_UNIQUE_APPEND:
|
328 |
if (empty($uniqueId)) {
|
329 |
throw new Exception('uniqueId can\'t be empty');
|
@@ -336,6 +347,26 @@ final class DUPX_NOTICE_MANAGER
|
|
336 |
$item = $list[$uniqueId];
|
337 |
}
|
338 |
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
339 |
case self::ADD_NORMAL:
|
340 |
default:
|
341 |
if (empty($uniqueId)) {
|
16 |
*/
|
17 |
final class DUPX_NOTICE_MANAGER
|
18 |
{
|
19 |
+
const ADD_NORMAL = 0; // add notice in list
|
20 |
+
const ADD_UNIQUE = 1; // add if unique id don't exists
|
21 |
+
const ADD_UNIQUE_UPDATE = 2; // add or update notice unique id
|
22 |
+
const ADD_UNIQUE_APPEND = 3; // append long msg
|
23 |
+
const ADD_UNIQUE_APPEND_IF_EXISTS = 4; // append long msg if already exists item
|
24 |
+
const ADD_UNIQUE_PREPEND = 5; // append long msg
|
25 |
+
const ADD_UNIQUE_PREPEND_IF_EXISTS = 6; // prepend long msg if already exists item
|
26 |
const DEFAULT_UNIQUE_ID_PREFIX = '__auto_unique_id__';
|
27 |
|
28 |
private static $uniqueCountId = 0;
|
327 |
}
|
328 |
$insertId = $uniqueId;
|
329 |
break;
|
330 |
+
case self::ADD_UNIQUE_APPEND_IF_EXISTS:
|
331 |
+
if (empty($uniqueId)) {
|
332 |
+
throw new Exception('uniqueId can\'t be empty');
|
333 |
+
}
|
334 |
+
if (!isset($list[$uniqueId])) {
|
335 |
+
return false;
|
336 |
+
}
|
337 |
+
// no break
|
338 |
case self::ADD_UNIQUE_APPEND:
|
339 |
if (empty($uniqueId)) {
|
340 |
throw new Exception('uniqueId can\'t be empty');
|
347 |
$item = $list[$uniqueId];
|
348 |
}
|
349 |
break;
|
350 |
+
case self::ADD_UNIQUE_PREPEND_IF_EXISTS:
|
351 |
+
if (empty($uniqueId)) {
|
352 |
+
throw new Exception('uniqueId can\'t be empty');
|
353 |
+
}
|
354 |
+
if (!isset($list[$uniqueId])) {
|
355 |
+
return false;
|
356 |
+
}
|
357 |
+
// no break
|
358 |
+
case self::ADD_UNIQUE_PREPEND:
|
359 |
+
if (empty($uniqueId)) {
|
360 |
+
throw new Exception('uniqueId can\'t be empty');
|
361 |
+
}
|
362 |
+
$insertId = $uniqueId;
|
363 |
+
// if item id exist append long msg
|
364 |
+
if (isset($list[$uniqueId])) {
|
365 |
+
$tempObj = self::getObjFromParams($item);
|
366 |
+
$list[$uniqueId]->longMsg = $tempObj->longMsg.$list[$uniqueId]->longMsg;
|
367 |
+
$item = $list[$uniqueId];
|
368 |
+
}
|
369 |
+
break;
|
370 |
case self::ADD_NORMAL:
|
371 |
default:
|
372 |
if (empty($uniqueId)) {
|
installer/dup-installer/ctrls/ctrl.s2.dbinstall.php
CHANGED
@@ -6,6 +6,7 @@ class DUPX_DBInstall
|
|
6 |
const USER_DEFINER_PATTERN = "/^(\s*(?:\/\*!\d+\s)?\s*(?:CREATE.+)?DEFINER\s*=)(\S+)(.*)$/m";
|
7 |
const SQL_SECURITY_INVOKER_PATTERN = "/^([\s\t]*CREATE.+PROCEDURE[\s\S]*)(BEGIN)([\s\S]*)$/";
|
8 |
const SQL_SECURITY_INVOKER_REPLACE = "$1SQL SECURITY INVOKER\n$2$3";
|
|
|
9 |
|
10 |
private $dbh;
|
11 |
private $post;
|
@@ -390,32 +391,60 @@ class DUPX_DBInstall
|
|
390 |
$found_tables[] = $row[0];
|
391 |
}
|
392 |
if (count($found_tables) > 0) {
|
|
|
393 |
foreach ($found_tables as $table_name) {
|
394 |
$sql = "DROP TABLE `".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."`.`".mysqli_real_escape_string($this->dbh, $table_name)."`";
|
395 |
if (!$result = mysqli_query($this->dbh, $sql)) {
|
396 |
-
DUPX_Log::error(sprintf(
|
397 |
}
|
398 |
}
|
399 |
$this->drop_tbl_log = count($found_tables);
|
|
|
400 |
}
|
401 |
}
|
402 |
}
|
403 |
|
404 |
private function dropProcs()
|
405 |
{
|
406 |
-
$sql = "SHOW PROCEDURE STATUS";
|
407 |
$found = array();
|
408 |
if ($result = mysqli_query($this->dbh, $sql)) {
|
409 |
while ($row = mysqli_fetch_row($result)) {
|
410 |
$found[] = $row[1];
|
411 |
}
|
412 |
if (count($found) > 0) {
|
|
|
|
|
413 |
foreach ($found as $proc_name) {
|
414 |
$sql = "DROP PROCEDURE IF EXISTS `".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."`.`".mysqli_real_escape_string($this->dbh, $proc_name)."`";
|
415 |
if (!$result = mysqli_query($this->dbh, $sql)) {
|
416 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
417 |
}
|
418 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
419 |
}
|
420 |
}
|
421 |
}
|
@@ -429,12 +458,39 @@ class DUPX_DBInstall
|
|
429 |
$found_views[] = $row[0];
|
430 |
}
|
431 |
if (!is_null($found_views) && count($found_views) > 0) {
|
|
|
|
|
432 |
foreach ($found_views as $view_name) {
|
433 |
$sql = "DROP VIEW `".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."`.`".mysqli_real_escape_string($this->dbh, $view_name)."`";
|
434 |
if (!$result = mysqli_query($this->dbh, $sql)) {
|
435 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
436 |
}
|
437 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
438 |
}
|
439 |
}
|
440 |
}
|
6 |
const USER_DEFINER_PATTERN = "/^(\s*(?:\/\*!\d+\s)?\s*(?:CREATE.+)?DEFINER\s*=)(\S+)(.*)$/m";
|
7 |
const SQL_SECURITY_INVOKER_PATTERN = "/^([\s\t]*CREATE.+PROCEDURE[\s\S]*)(BEGIN)([\s\S]*)$/";
|
8 |
const SQL_SECURITY_INVOKER_REPLACE = "$1SQL SECURITY INVOKER\n$2$3";
|
9 |
+
const QUERY_ERROR_LOG_LEN = 200;
|
10 |
|
11 |
private $dbh;
|
12 |
private $post;
|
391 |
$found_tables[] = $row[0];
|
392 |
}
|
393 |
if (count($found_tables) > 0) {
|
394 |
+
mysqli_query($this->dbh, "SET FOREIGN_KEY_CHECKS = 0;");
|
395 |
foreach ($found_tables as $table_name) {
|
396 |
$sql = "DROP TABLE `".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."`.`".mysqli_real_escape_string($this->dbh, $table_name)."`";
|
397 |
if (!$result = mysqli_query($this->dbh, $sql)) {
|
398 |
+
DUPX_Log::error(sprintf(ERR_DROP_TABLE_TRYCLEAN, $table_name, $this->post['dbname'], mysqli_error($this->dbh)));
|
399 |
}
|
400 |
}
|
401 |
$this->drop_tbl_log = count($found_tables);
|
402 |
+
mysqli_query($this->dbh, "SET FOREIGN_KEY_CHECKS = 1;");
|
403 |
}
|
404 |
}
|
405 |
}
|
406 |
|
407 |
private function dropProcs()
|
408 |
{
|
409 |
+
$sql = "SHOW PROCEDURE STATUS WHERE db='{$this->post['dbname']}'";
|
410 |
$found = array();
|
411 |
if ($result = mysqli_query($this->dbh, $sql)) {
|
412 |
while ($row = mysqli_fetch_row($result)) {
|
413 |
$found[] = $row[1];
|
414 |
}
|
415 |
if (count($found) > 0) {
|
416 |
+
$nManager = DUPX_NOTICE_MANAGER::getInstance();
|
417 |
+
|
418 |
foreach ($found as $proc_name) {
|
419 |
$sql = "DROP PROCEDURE IF EXISTS `".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."`.`".mysqli_real_escape_string($this->dbh, $proc_name)."`";
|
420 |
if (!$result = mysqli_query($this->dbh, $sql)) {
|
421 |
+
$err = mysqli_error($this->dbh);
|
422 |
+
|
423 |
+
$nManager->addNextStepNotice(array(
|
424 |
+
'shortMsg' => 'PROCEDURE CLEAN ERROR',
|
425 |
+
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
|
426 |
+
'longMsg' => sprintf('Unable to remove PROCEDURE "%s" from database "%s".<br/>', $proc_name, $this->post['dbname']),
|
427 |
+
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
|
428 |
+
), DUPX_NOTICE_MANAGER::ADD_UNIQUE_APPEND, 'drop-proc-fail-msg');
|
429 |
+
|
430 |
+
$nManager->addFinalReportNotice(array(
|
431 |
+
'shortMsg' => 'PROCEDURE CLEAN ERROR: '.$err,
|
432 |
+
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
|
433 |
+
'longMsg' => sprintf('Unable to remove PROCEDURE "%s" from database "%s".', $proc_name, $this->post['dbname']),
|
434 |
+
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
|
435 |
+
'sections' => 'database',
|
436 |
+
));
|
437 |
+
|
438 |
+
DUPX_Log::info("PROCEDURE CLEAN ERROR: '{$err}'\n\t[SQL=".substr($sql, 0, self::QUERY_ERROR_LOG_LEN)."...]\n\n");
|
439 |
}
|
440 |
}
|
441 |
+
|
442 |
+
$nManager->addNextStepNotice(array(
|
443 |
+
'shortMsg' => 'PROCEDURE CLEAN ERROR',
|
444 |
+
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
|
445 |
+
'longMsg' => sprintf(ERR_DROP_PROCEDURE_TRYCLEAN, mysqli_error($this->dbh)),
|
446 |
+
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
|
447 |
+
), DUPX_NOTICE_MANAGER::ADD_UNIQUE_PREPEND_IF_EXISTS, 'drop-proc-fail-msg');
|
448 |
}
|
449 |
}
|
450 |
}
|
458 |
$found_views[] = $row[0];
|
459 |
}
|
460 |
if (!is_null($found_views) && count($found_views) > 0) {
|
461 |
+
$nManager = DUPX_NOTICE_MANAGER::getInstance();
|
462 |
+
|
463 |
foreach ($found_views as $view_name) {
|
464 |
$sql = "DROP VIEW `".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."`.`".mysqli_real_escape_string($this->dbh, $view_name)."`";
|
465 |
if (!$result = mysqli_query($this->dbh, $sql)) {
|
466 |
+
$err = mysqli_error($this->dbh);
|
467 |
+
|
468 |
+
$nManager->addNextStepNotice(array(
|
469 |
+
'shortMsg' => 'VIEW CLEAN ERROR',
|
470 |
+
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
|
471 |
+
'longMsg' => sprintf('Unable to remove VIEW "%s" from database "%s".<br/>', $view_name, $this->post['dbname']),
|
472 |
+
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
|
473 |
+
), DUPX_NOTICE_MANAGER::ADD_UNIQUE_APPEND, 'drop-view-fail-msg');
|
474 |
+
|
475 |
+
$nManager->addFinalReportNotice(array(
|
476 |
+
'shortMsg' => 'VIEW CLEAN ERROR: '.$err,
|
477 |
+
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
|
478 |
+
'longMsg' => sprintf('Unable to remove VIEW "%s" from database "%s"', $view_name, $this->post['dbname']),
|
479 |
+
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
|
480 |
+
'sections' => 'database',
|
481 |
+
));
|
482 |
+
|
483 |
+
DUPX_Log::info("VIEW CLEAN ERROR: '{$err}'\n\t[SQL=".substr($sql, 0, self::QUERY_ERROR_LOG_LEN)."...]\n\n");
|
484 |
}
|
485 |
}
|
486 |
+
|
487 |
+
$nManager->addNextStepNotice(array(
|
488 |
+
'shortMsg' => 'VIEW CLEAN ERROR',
|
489 |
+
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
|
490 |
+
'longMsg' => sprintf(ERR_DROP_VIEW_TRYCLEAN, mysqli_error($this->dbh)),
|
491 |
+
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
|
492 |
+
), DUPX_NOTICE_MANAGER::ADD_UNIQUE_PREPEND_IF_EXISTS, 'drop-view-fail-msg');
|
493 |
+
|
494 |
}
|
495 |
}
|
496 |
}
|
installer/dup-installer/views/view.s1.base.php
CHANGED
@@ -45,7 +45,7 @@ $max_time_zero = ($GLOBALS['DUPX_ENFORCE_PHP_INI']) ? false : @set_time_limit(0)
|
|
45 |
$max_time_size = 314572800; //300MB
|
46 |
$max_time_ini = ini_get('max_execution_time');
|
47 |
$max_time_warn = (is_numeric($max_time_ini) && $max_time_ini < 31 && $max_time_ini > 0) && $arcSize > $max_time_size;
|
48 |
-
|
49 |
|
50 |
$notice = array();
|
51 |
$notice['10'] = ! $is_overwrite_mode ? 'Good' : 'Warn';
|
@@ -79,6 +79,7 @@ $archive_size = file_exists($GLOBALS['FW_PACKAGE_PATH']) ? filesize($GLOBALS['FW
|
|
79 |
$notice['100'] = ($space_free && $archive_size > $space_free)
|
80 |
? 'Warn'
|
81 |
: 'Good';
|
|
|
82 |
|
83 |
$all_notice = in_array('Warn', $notice) ? 'Warn' : 'Good';
|
84 |
|
@@ -546,6 +547,18 @@ VALIDATION
|
|
546 |
?>
|
547 |
</div>
|
548 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
549 |
</div>
|
550 |
|
551 |
</div>
|
45 |
$max_time_size = 314572800; //300MB
|
46 |
$max_time_ini = ini_get('max_execution_time');
|
47 |
$max_time_warn = (is_numeric($max_time_ini) && $max_time_ini < 31 && $max_time_ini > 0) && $arcSize > $max_time_size;
|
48 |
+
$parentWordFencePath = DUPX_Server::parentWordfencePath();
|
49 |
|
50 |
$notice = array();
|
51 |
$notice['10'] = ! $is_overwrite_mode ? 'Good' : 'Warn';
|
79 |
$notice['100'] = ($space_free && $archive_size > $space_free)
|
80 |
? 'Warn'
|
81 |
: 'Good';
|
82 |
+
$notice['110'] = $parentWordFencePath === false ? 'Good' : 'Warn';
|
83 |
|
84 |
$all_notice = in_array('Warn', $notice) ? 'Warn' : 'Good';
|
85 |
|
547 |
?>
|
548 |
</div>
|
549 |
|
550 |
+
<!-- NOTICE 110 -->
|
551 |
+
<div class="status <?php echo ($notice['110'] == 'Good') ? 'pass' : 'fail' ?>"><?php echo DUPX_U::esc_html($notice['110']); ?></div>
|
552 |
+
<div class="title" data-type="toggle" data-target="#s1-notice110"><i class="fa fa-caret-right"></i> Wordfence</div>
|
553 |
+
<div class="info" id="s1-notice110">
|
554 |
+
<b>Wordfence Firewall:</b> <?php echo ($notice['110'] == 'Warn') ? "<span style='color:red;'>detected at {$parentWordFencePath}</span>" : "<span style='color:green;'>not detected</span>"; ?>
|
555 |
+
<p>
|
556 |
+
The Wordfence Web Application Firewall is a PHP based, application level firewall that filters out malicious
|
557 |
+
requests to your site. Sometimes Wordfence returns false positives on requests done during the installation process,
|
558 |
+
because of which it might fail. We recommend turning off the Wordfence firewall of the WordPress instance located at the mentioned path.
|
559 |
+
</p>
|
560 |
+
</div>
|
561 |
+
|
562 |
</div>
|
563 |
|
564 |
</div>
|
installer/dup-installer/views/view.s2.base.php
CHANGED
@@ -7,8 +7,18 @@ defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
|
7 |
require_once($GLOBALS['DUPX_INIT'] . '/classes/config/class.archive.config.php');
|
8 |
|
9 |
//-- START OF VIEW STEP 2
|
10 |
-
$
|
11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
$_POST['exe_safe_mode'] = (isset($_POST['exe_safe_mode'])) ? DUPX_U::sanitize_text_field($_POST['exe_safe_mode']) : 0;
|
13 |
$is_dbtest_mode = isset($_POST['dbonlytest']) ? 1 : 0;
|
14 |
|
7 |
require_once($GLOBALS['DUPX_INIT'] . '/classes/config/class.archive.config.php');
|
8 |
|
9 |
//-- START OF VIEW STEP 2
|
10 |
+
$archive_config = DUPX_ArchiveConfig::getInstance();
|
11 |
+
|
12 |
+
$dbcharset = empty($archive_config->dbcharset)
|
13 |
+
? $GLOBALS['DBCHARSET_DEFAULT']
|
14 |
+
: $archive_config->dbcharset;
|
15 |
+
$_POST['dbcharset'] = isset($_POST['dbcharset']) ? trim($_POST['dbcharset']) : $dbcharset;
|
16 |
+
|
17 |
+
$dbcollate = empty($archive_config->dbcollation)
|
18 |
+
? $GLOBALS['DBCOLLATE_DEFAULT']
|
19 |
+
: $archive_config->dbcollation;
|
20 |
+
$_POST['dbcollate'] = isset($_POST['dbcollate']) ? trim($_POST['dbcollate']) : $dbcollate;
|
21 |
+
|
22 |
$_POST['exe_safe_mode'] = (isset($_POST['exe_safe_mode'])) ? DUPX_U::sanitize_text_field($_POST['exe_safe_mode']) : 0;
|
23 |
$is_dbtest_mode = isset($_POST['dbonlytest']) ? 1 : 0;
|
24 |
|
installer/dup-installer/views/view.s2.basic.php
CHANGED
@@ -189,8 +189,18 @@ BASIC: DB VALIDATION -->
|
|
189 |
<td></td>
|
190 |
<td><input type="checkbox" name="dbobj_procs" id="dbobj_procs" checked="true" /><label for="dbobj_procs">Enable Stored Procedure Creation</label></td>
|
191 |
</tr>
|
192 |
-
<tr
|
193 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
194 |
</table>
|
195 |
</div>
|
196 |
<br/><br/>
|
189 |
<td></td>
|
190 |
<td><input type="checkbox" name="dbobj_procs" id="dbobj_procs" checked="true" /><label for="dbobj_procs">Enable Stored Procedure Creation</label></td>
|
191 |
</tr>
|
192 |
+
<tr>
|
193 |
+
<td>Charset:</td>
|
194 |
+
<td>
|
195 |
+
<input type="text" name="dbcharset" id="dbcharset" value="<?php echo DUPX_U::esc_attr($_POST['dbcharset']); ?>" />
|
196 |
+
</td>
|
197 |
+
</tr>
|
198 |
+
<tr>
|
199 |
+
<td>Collation: </td>
|
200 |
+
<td>
|
201 |
+
<input type="text" name="dbcollate" id="dbcollate" value="<?php echo DUPX_U::esc_attr($_POST['dbcollate']); ?>" />
|
202 |
+
</td>
|
203 |
+
</tr>
|
204 |
</table>
|
205 |
</div>
|
206 |
<br/><br/>
|
lib/snaplib/class.snaplib.u.io.php
CHANGED
@@ -905,5 +905,61 @@ if (!class_exists('DupLiteSnapLibIOU', false)) {
|
|
905 |
|
906 |
return array_reverse($result);
|
907 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
908 |
}
|
909 |
}
|
905 |
|
906 |
return array_reverse($result);
|
907 |
}
|
908 |
+
|
909 |
+
/**
|
910 |
+
* Returns a path to the base root folder of path taking into account the
|
911 |
+
* open_basedir setting.
|
912 |
+
*
|
913 |
+
* @param $path
|
914 |
+
* @return bool|string Base root path of $path if it's accessible, otherwise false;
|
915 |
+
*/
|
916 |
+
public static function getMaxAllowedRootOfPath($path)
|
917 |
+
{
|
918 |
+
$path = self::safePathUntrailingslashit($path, true);
|
919 |
+
|
920 |
+
if (!self::isOpenBaseDirEnabled()) {
|
921 |
+
$parts = explode("/", $path);
|
922 |
+
return $parts[0]."/";
|
923 |
+
} else {
|
924 |
+
return self::getOpenBaseDirRootOfPath($path);
|
925 |
+
}
|
926 |
+
}
|
927 |
+
|
928 |
+
/**
|
929 |
+
* @return bool true if open_basedir is set
|
930 |
+
*/
|
931 |
+
public static function isOpenBaseDirEnabled()
|
932 |
+
{
|
933 |
+
$iniVar = ini_get("open_basedir");
|
934 |
+
return !empty($iniVar);
|
935 |
+
}
|
936 |
+
|
937 |
+
/**
|
938 |
+
* @return array Paths contained in the open_basedir setting. Empty array if the setting
|
939 |
+
* is not enabled.
|
940 |
+
*/
|
941 |
+
public static function getOpenBaseDirPaths()
|
942 |
+
{
|
943 |
+
if (!($openBase = ini_get("open_basedir"))) {
|
944 |
+
return array();
|
945 |
+
}
|
946 |
+
return explode(PATH_SEPARATOR, $openBase);
|
947 |
+
}
|
948 |
+
|
949 |
+
/**
|
950 |
+
* @param $path
|
951 |
+
* @return bool|mixed|string Path to the base dir of $path if it exists, otherwise false
|
952 |
+
*/
|
953 |
+
public static function getOpenBaseDirRootOfPath($path)
|
954 |
+
{
|
955 |
+
foreach (self::getOpenBaseDirPaths() as $allowedPath) {
|
956 |
+
$allowedPath = $allowedPath !== "/" ? self::safePathUntrailingslashit($allowedPath) : "/";
|
957 |
+
if (strpos($path, $allowedPath) === 0) {
|
958 |
+
return $allowedPath;
|
959 |
+
}
|
960 |
+
}
|
961 |
+
|
962 |
+
return false;
|
963 |
+
}
|
964 |
}
|
965 |
}
|
readme.txt
CHANGED
@@ -2,9 +2,9 @@
|
|
2 |
Contributors: corylamleorg, bobriley
|
3 |
Tags: migration, backup, duplicate, move, migrate, restore, transfer, clone, automate, copy site, migrator
|
4 |
Requires at least: 4.0
|
5 |
-
Tested up to: 5.
|
6 |
Requires PHP: 5.2.17
|
7 |
-
Stable tag: 1.3.
|
8 |
License: GPLv2
|
9 |
|
10 |
WordPress migration and backups are much easier with Duplicator! Clone, backup, move and transfer an entire site from one location to another.
|
@@ -38,7 +38,7 @@ Duplicator lets you make your own preconfigured sites to eliminate rework. Inst
|
|
38 |
= Duplicator Pro =
|
39 |
Duplicator Pro takes Duplicator to the next level with features you'll really appreciate, such as:
|
40 |
|
41 |
-
* Drag and Drop
|
42 |
* Scheduled backups
|
43 |
* Cloud Storage to Dropbox, Google Drive, Microsoft OneDrive, Amazon S3 and FTP/SFTP
|
44 |
* A special 2-step streamlined installer mode for mega-fast installs
|
2 |
Contributors: corylamleorg, bobriley
|
3 |
Tags: migration, backup, duplicate, move, migrate, restore, transfer, clone, automate, copy site, migrator
|
4 |
Requires at least: 4.0
|
5 |
+
Tested up to: 5.6
|
6 |
Requires PHP: 5.2.17
|
7 |
+
Stable tag: 1.3.40
|
8 |
License: GPLv2
|
9 |
|
10 |
WordPress migration and backups are much easier with Duplicator! Clone, backup, move and transfer an entire site from one location to another.
|
38 |
= Duplicator Pro =
|
39 |
Duplicator Pro takes Duplicator to the next level with features you'll really appreciate, such as:
|
40 |
|
41 |
+
* Drag and Drop installs - just drag an archive to the destination site!
|
42 |
* Scheduled backups
|
43 |
* Cloud Storage to Dropbox, Google Drive, Microsoft OneDrive, Amazon S3 and FTP/SFTP
|
44 |
* A special 2-step streamlined installer mode for mega-fast installs
|
uninstall.php
CHANGED
@@ -54,6 +54,7 @@ if (DUP_Settings::Get('uninstall_files')) {
|
|
54 |
if (strstr($file, '_scan.json'))
|
55 |
@unlink("{$file}");
|
56 |
}
|
|
|
57 |
foreach (glob("{$ssdir}/*_wp-config.txt") as $file) {
|
58 |
if (strstr($file, '_wp-config.txt'))
|
59 |
@unlink("{$file}");
|
@@ -101,4 +102,5 @@ if (DUP_Settings::Get('uninstall_settings')) {
|
|
101 |
delete_option('duplicator_ui_view_state');
|
102 |
delete_option('duplicator_package_active');
|
103 |
delete_option("duplicator_exe_safe_mode");
|
|
|
104 |
}
|
54 |
if (strstr($file, '_scan.json'))
|
55 |
@unlink("{$file}");
|
56 |
}
|
57 |
+
// before 1.3.38 the [HASH]_wp-config.txt was present in main storage area
|
58 |
foreach (glob("{$ssdir}/*_wp-config.txt") as $file) {
|
59 |
if (strstr($file, '_wp-config.txt'))
|
60 |
@unlink("{$file}");
|
102 |
delete_option('duplicator_ui_view_state');
|
103 |
delete_option('duplicator_package_active');
|
104 |
delete_option("duplicator_exe_safe_mode");
|
105 |
+
delete_option('duplicator_lite_inst_hash_notice');
|
106 |
}
|
views/packages/main/s1.setup2.php
CHANGED
@@ -487,6 +487,14 @@ INSTALLER -->
|
|
487 |
<td><?php esc_html_e("User", 'duplicator') ?></td>
|
488 |
<td><input type="text" name="dbuser" id="dbuser" value="<?php echo esc_attr($Package->Installer->OptsDBUser); ?>" maxlength="100" placeholder="<?php esc_attr_e('example: DatabaseUserName (value is optional)', 'duplicator'); ?>" /></td>
|
489 |
</tr>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
490 |
</table><br />
|
491 |
</div>
|
492 |
|
487 |
<td><?php esc_html_e("User", 'duplicator') ?></td>
|
488 |
<td><input type="text" name="dbuser" id="dbuser" value="<?php echo esc_attr($Package->Installer->OptsDBUser); ?>" maxlength="100" placeholder="<?php esc_attr_e('example: DatabaseUserName (value is optional)', 'duplicator'); ?>" /></td>
|
489 |
</tr>
|
490 |
+
<tr>
|
491 |
+
<td><?php esc_html_e("Charset", 'duplicator') ?></td>
|
492 |
+
<td><input type="text" name="dbcharset" id="dbcharset" value="<?php echo esc_attr($Package->Installer->OptsDBCharset); ?>" maxlength="100" placeholder="<?php esc_attr_e('example: utf8 (value is optional)', 'duplicator'); ?>" /></td>
|
493 |
+
</tr>
|
494 |
+
<tr>
|
495 |
+
<td><?php esc_html_e("Collation", 'duplicator') ?></td>
|
496 |
+
<td><input type="text" name="dbcollation" id="dbcollation" value="<?php echo esc_attr($Package->Installer->OptsDBCollation); ?>" maxlength="100" placeholder="<?php esc_attr_e('example: utf8_general_ci (value is optional)', 'duplicator'); ?>" /></td>
|
497 |
+
</tr>
|
498 |
</table><br />
|
499 |
</div>
|
500 |
|
views/settings/controller.php
CHANGED
@@ -6,6 +6,8 @@ DUP_Util::hasCapability('manage_options');
|
|
6 |
|
7 |
global $wpdb;
|
8 |
|
|
|
|
|
9 |
//COMMON HEADER DISPLAY
|
10 |
require_once(DUPLICATOR_PLUGIN_PATH . '/assets/js/javascript.php');
|
11 |
require_once(DUPLICATOR_PLUGIN_PATH . '/views/inc.header.php');
|
@@ -29,17 +31,17 @@ $current_tab = isset($_REQUEST['tab']) ? sanitize_text_field($_REQUEST['tab']) :
|
|
29 |
|
30 |
<?php
|
31 |
switch ($current_tab) {
|
32 |
-
case 'general': include(
|
33 |
break;
|
34 |
-
case 'package': include(
|
35 |
break;
|
36 |
-
case 'schedule': include(
|
37 |
break;
|
38 |
-
case 'storage': include(
|
39 |
break;
|
40 |
-
case 'license': include(
|
41 |
break;
|
42 |
-
case 'about': include(
|
43 |
break;
|
44 |
}
|
45 |
?>
|
6 |
|
7 |
global $wpdb;
|
8 |
|
9 |
+
$dup_local_settings_path = dirname(__FILE__);
|
10 |
+
|
11 |
//COMMON HEADER DISPLAY
|
12 |
require_once(DUPLICATOR_PLUGIN_PATH . '/assets/js/javascript.php');
|
13 |
require_once(DUPLICATOR_PLUGIN_PATH . '/views/inc.header.php');
|
31 |
|
32 |
<?php
|
33 |
switch ($current_tab) {
|
34 |
+
case 'general': include("{$dup_local_settings_path}/general.php");
|
35 |
break;
|
36 |
+
case 'package': include("{$dup_local_settings_path}/packages.php");
|
37 |
break;
|
38 |
+
case 'schedule': include("{$dup_local_settings_path}/schedule.php");
|
39 |
break;
|
40 |
+
case 'storage': include("{$dup_local_settings_path}/storage.php");
|
41 |
break;
|
42 |
+
case 'license': include("{$dup_local_settings_path}/license.php");
|
43 |
break;
|
44 |
+
case 'about': include("{$dup_local_settings_path}/about-info.php");
|
45 |
break;
|
46 |
}
|
47 |
?>
|
views/settings/general.php
CHANGED
@@ -281,7 +281,7 @@ $reset_confirm->cancelText = __('No', 'duplicator');
|
|
281 |
$reset_confirm->closeOnConfirm = true;
|
282 |
$reset_confirm->initConfirm();
|
283 |
|
284 |
-
$msg_ajax_error = new DUP_UI_Messages(__('AJAX
|
285 |
$msg_ajax_error->hide_on_init = true;
|
286 |
$msg_ajax_error->is_dismissible = true;
|
287 |
$msg_ajax_error->initMessage();
|
281 |
$reset_confirm->closeOnConfirm = true;
|
282 |
$reset_confirm->initConfirm();
|
283 |
|
284 |
+
$msg_ajax_error = new DUP_UI_Messages(__('AJAX Call Error!', 'duplicator').'<br>'.__('AJAX error encountered when resetting packages. Please see <a href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-053-q" target="_blank">this FAQ entry</a> for possible resolutions.', 'duplicator'), DUP_UI_Messages::ERROR);
|
285 |
$msg_ajax_error->hide_on_init = true;
|
286 |
$msg_ajax_error->is_dismissible = true;
|
287 |
$msg_ajax_error->initMessage();
|
views/settings/gopro.php
CHANGED
@@ -67,7 +67,16 @@ require_once(DUPLICATOR_PLUGIN_PATH . '/views/inc.header.php');
|
|
67 |
<td class="check-column"><i class="fa fa-check"></i></td>
|
68 |
<td class="check-column"><i class="fa fa-check"></i></td>
|
69 |
</tr>
|
70 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
71 |
<td class="feature-column"><?php esc_html_e('Scheduled Backups', 'duplicator') ?></td>
|
72 |
<td class="check-column"></td>
|
73 |
<td class="check-column"><i class="fa fa-check"></i></td>
|
@@ -113,14 +122,6 @@ require_once(DUPLICATOR_PLUGIN_PATH . '/views/inc.header.php');
|
|
113 |
<td class="check-column"><i class="fa fa-check"></i></td>
|
114 |
</tr>
|
115 |
<tr>
|
116 |
-
<td class="feature-column"><?php esc_html_e('Overwrite Live Site', 'duplicator') ?><sup>
|
117 |
-
<i class="fa fa-question-circle dup-gopro-help"
|
118 |
-
data-tooltip-title="<?php esc_attr_e("Overwrite Live Site", 'duplicator'); ?>"
|
119 |
-
data-tooltip="<?php esc_attr_e('Overwrite a live site. Makes installing super-fast!', 'duplicator'); ?>"/></i></sup>
|
120 |
-
</td>
|
121 |
-
<td class="check-column"></td>
|
122 |
-
<td class="check-column"><i class="fa fa-check"></i></td>
|
123 |
-
</tr>
|
124 |
<td class="feature-column"><?php esc_html_e('Large Site Support', 'duplicator') ?><sup>
|
125 |
<i class="fa fa-question-circle dup-gopro-help"
|
126 |
data-tooltip-title="<?php esc_attr_e("Large Site Support", 'duplicator'); ?>"
|
67 |
<td class="check-column"><i class="fa fa-check"></i></td>
|
68 |
<td class="check-column"><i class="fa fa-check"></i></td>
|
69 |
</tr>
|
70 |
+
<tr>
|
71 |
+
<td class="feature-column"><?php esc_html_e('Drag and Drop Installs', 'duplicator') ?><sup>
|
72 |
+
<i class="fa fa-question-circle dup-gopro-help"
|
73 |
+
data-tooltip-title="<?php esc_attr_e("Drag and Drop Site Overwrites", 'duplicator'); ?>"
|
74 |
+
data-tooltip="<?php esc_attr_e('Overwrite a live site just by dragging an archive to the destination site. No FTP or database creation required!', 'duplicator'); ?>"/></i></sup>
|
75 |
+
</td>
|
76 |
+
<td class="check-column"></td>
|
77 |
+
<td class="check-column"><i class="fa fa-check"></i></td>
|
78 |
+
</tr>
|
79 |
+
<tr>
|
80 |
<td class="feature-column"><?php esc_html_e('Scheduled Backups', 'duplicator') ?></td>
|
81 |
<td class="check-column"></td>
|
82 |
<td class="check-column"><i class="fa fa-check"></i></td>
|
122 |
<td class="check-column"><i class="fa fa-check"></i></td>
|
123 |
</tr>
|
124 |
<tr>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
125 |
<td class="feature-column"><?php esc_html_e('Large Site Support', 'duplicator') ?><sup>
|
126 |
<i class="fa fa-question-circle dup-gopro-help"
|
127 |
data-tooltip-title="<?php esc_attr_e("Large Site Support", 'duplicator'); ?>"
|
views/tools/controller.php
CHANGED
@@ -7,6 +7,8 @@ require_once(DUPLICATOR_PLUGIN_PATH . '/views/inc.header.php');
|
|
7 |
global $wpdb;
|
8 |
global $wp_version;
|
9 |
|
|
|
|
|
10 |
DUP_Handler::init_error_handler();
|
11 |
DUP_Util::hasCapability('manage_options');
|
12 |
$current_tab = isset($_REQUEST['tab']) ? esc_html($_REQUEST['tab']) : 'diagnostics';
|
@@ -21,13 +23,19 @@ if ('d' == $current_tab) {
|
|
21 |
<h2 class="nav-tab-wrapper">
|
22 |
<a href="?page=duplicator-tools&tab=diagnostics" class="nav-tab <?php echo ($current_tab == 'diagnostics') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('Diagnostics', 'duplicator'); ?></a>
|
23 |
<a href="?page=duplicator-tools&tab=templates" class="nav-tab <?php echo ($current_tab == 'templates') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('Templates', 'duplicator'); ?></a>
|
|
|
|
|
24 |
</h2>
|
25 |
|
26 |
<?php
|
27 |
switch ($current_tab) {
|
28 |
case 'diagnostics': include('diagnostics/main.php');
|
29 |
break;
|
30 |
-
|
|
|
|
|
|
|
|
|
31 |
break;
|
32 |
}
|
33 |
?>
|
7 |
global $wpdb;
|
8 |
global $wp_version;
|
9 |
|
10 |
+
$dup_local_tools_path = dirname(__FILE__);
|
11 |
+
|
12 |
DUP_Handler::init_error_handler();
|
13 |
DUP_Util::hasCapability('manage_options');
|
14 |
$current_tab = isset($_REQUEST['tab']) ? esc_html($_REQUEST['tab']) : 'diagnostics';
|
23 |
<h2 class="nav-tab-wrapper">
|
24 |
<a href="?page=duplicator-tools&tab=diagnostics" class="nav-tab <?php echo ($current_tab == 'diagnostics') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('Diagnostics', 'duplicator'); ?></a>
|
25 |
<a href="?page=duplicator-tools&tab=templates" class="nav-tab <?php echo ($current_tab == 'templates') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('Templates', 'duplicator'); ?></a>
|
26 |
+
<a href="?page=duplicator-tools&tab=recovery" class="nav-tab <?php echo ($current_tab == 'recovery') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('Recovery', 'duplicator'); ?></a>
|
27 |
+
<a href="?page=duplicator-tools&tab=import" class="nav-tab <?php echo ($current_tab == 'import') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('Import', 'duplicator'); ?></a>
|
28 |
</h2>
|
29 |
|
30 |
<?php
|
31 |
switch ($current_tab) {
|
32 |
case 'diagnostics': include('diagnostics/main.php');
|
33 |
break;
|
34 |
+
case 'templates': include("{$dup_local_tools_path}/templates.php");
|
35 |
+
break;
|
36 |
+
case 'recovery': include("{$dup_local_tools_path}/recovery.php");
|
37 |
+
break;
|
38 |
+
case 'import': include("{$dup_local_tools_path}/import.php");
|
39 |
break;
|
40 |
}
|
41 |
?>
|
views/tools/import.php
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
3 |
+
?>
|
4 |
+
<style>
|
5 |
+
div.panel {padding: 20px 5px 10px 10px;}
|
6 |
+
div.area {font-size:16px; text-align: center; line-height: 30px}
|
7 |
+
</style>
|
8 |
+
|
9 |
+
<div class="panel">
|
10 |
+
|
11 |
+
<br/>
|
12 |
+
<div class="area">
|
13 |
+
<img src="<?php echo DUPLICATOR_PLUGIN_URL ?>assets/img/logo-dpro-300x50.png" />
|
14 |
+
<?php
|
15 |
+
echo '<h2><i class="fas fa-arrow-alt-circle-down"></i> ' . esc_html__('Drag and Drop imports are available in Duplicator Pro.', 'duplicator') . '</h2>';
|
16 |
+
esc_html_e('The Import feature lets you skip the FTP and database creation steps when installing a site.', 'duplicator');
|
17 |
+
echo '<br/>';
|
18 |
+
esc_html_e('Just drag and drop an archive to quickly replace an existing WordPress installation!', 'duplicator');
|
19 |
+
?>
|
20 |
+
</div>
|
21 |
+
<p style="text-align:center">
|
22 |
+
<a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_tools_imports&utm_campaign=duplicator_pro" target="_blank" class="button button-primary button-large dup-check-it-btn" >
|
23 |
+
<?php esc_html_e('Check Out Pro', 'duplicator') ?>
|
24 |
+
</a>
|
25 |
+
</p>
|
26 |
+
</div>
|
27 |
+
|
28 |
+
|
views/tools/recovery.php
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
|
3 |
+
?>
|
4 |
+
<style>
|
5 |
+
div.panel {padding: 20px 5px 10px 10px;}
|
6 |
+
div.area {font-size:16px; text-align: center; line-height: 30px}
|
7 |
+
</style>
|
8 |
+
|
9 |
+
<div class="panel">
|
10 |
+
|
11 |
+
<br/>
|
12 |
+
<div class="area">
|
13 |
+
<img src="<?php echo DUPLICATOR_PLUGIN_URL ?>assets/img/logo-dpro-300x50.png" />
|
14 |
+
<?php
|
15 |
+
echo '<h2><i class="fas fa-undo-alt"></i> ' . esc_html__('Recovery Points are available in Duplicator Pro.', 'duplicator') . '</h2>';
|
16 |
+
esc_html_e('Recovery Points allow you to quickly revert your website to a specific point in time.', 'duplicator');
|
17 |
+
echo '<br/>';
|
18 |
+
esc_html_e('Upgrade plugins or make risky site changes with confidence!', 'duplicator');
|
19 |
+
?>
|
20 |
+
</div>
|
21 |
+
<p style="text-align:center">
|
22 |
+
<a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_tools_recovery&utm_campaign=duplicator_pro" target="_blank" class="button button-primary button-large dup-check-it-btn" >
|
23 |
+
<?php esc_html_e('Check Out Pro', 'duplicator') ?>
|
24 |
+
</a>
|
25 |
+
</p>
|
26 |
+
</div>
|
27 |
+
|
28 |
+
|