Duplicator – WordPress Migration Plugin - Version 1.3.40

Version Description

Download this release

Release Info

Developer cory@lamle.org
Plugin Icon 128x128 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 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
- throw new Exception("DUPLICATOR ERROR: Please see the 'Package Log' file link below.");
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 Mysql dump engine in PHP mode', '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
  }
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."/{$nameHash}_archive.zip", 0644);
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."/{$nameHash}_archive.zip", 0644);
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."/{$nameHash}_archive.zip");
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."/{$nameHash}_archive.zip");
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
- <style>
50
- .link-style {
51
- color: <?php echo $colorScheme->colors[2]; ?>;
52
- }
 
53
 
54
- .link-style:hover {
55
- color: <?php echo $colorScheme->colors[3]; ?>;
56
- }
57
- </style>
58
- <?php
 
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.38');
9
- define('DUPLICATOR_VERSION_BUILD', '2020-09-16_09:00');
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.38
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
- $_POST['view'] = isset($_POST['view']) ? $_POST['view'] : "step1";
 
 
 
 
 
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
- define('ERR_DBTRYCLEAN', 'DATABASE CREATION FAILURE!<br/> Unable to remove table from database "%s".<br/> Please remove all tables from this database and try the installation again. If no tables show in the database, then Drop the database and re-create it.');
 
 
 
 
 
 
 
 
 
 
 
 
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 = 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 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(ERR_DBTRYCLEAN, "{$this->post['dbname']}.{$table_name}")."<br/>ERROR MESSAGE:{$err}");
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
- DUPX_Log::error(sprintf(ERR_DBTRYCLEAN, "{$this->post['dbname']}.{$proc_name}")."<br/>ERROR MESSAGE:{$err}");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- DUPX_Log::error(sprintf(ERR_DBTRYCLEAN, "{$this->post['dbname']}.{$view_name}")."<br/>ERROR MESSAGE:{$err}");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- $_POST['dbcharset'] = isset($_POST['dbcharset']) ? trim($_POST['dbcharset']) : $GLOBALS['DBCHARSET_DEFAULT'];
11
- $_POST['dbcollate'] = isset($_POST['dbcollate']) ? trim($_POST['dbcollate']) : $GLOBALS['DBCOLLATE_DEFAULT'];
 
 
 
 
 
 
 
 
 
 
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><td>Charset:</td><td><input type="text" name="dbcharset" id="dbcharset" value="<?php echo DUPX_U::esc_attr($_POST['dbcharset']); ?>" /> </td></tr>
193
- <tr><td>Collation: </td><td><input type="text" name="dbcollate" id="dbcollate" value="<?php echo DUPX_U::esc_attr($_POST['dbcollate']); ?>" /> </tr>
 
 
 
 
 
 
 
 
 
 
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.5
6
  Requires PHP: 5.2.17
7
- Stable tag: 1.3.38
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 site overwrites - just drag an archive to the destination site to install!
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('general.php');
33
  break;
34
- case 'package': include('packages.php');
35
  break;
36
- case 'schedule': include('schedule.php');
37
  break;
38
- case 'storage': include('storage.php');
39
  break;
40
- case 'license': include('license.php');
41
  break;
42
- case 'about': include('about-info.php');
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 ERROR!', 'duplicator').'<br>'.__('Ajax request error', '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();
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
- <tr>
 
 
 
 
 
 
 
 
 
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
- case 'templates': include('templates.php');
 
 
 
 
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
+