XCloner – Backup and Restore - Version 4.6.1

Version Description

  • fix: Backup archives not containing all files: https://github.com/watchfulli/XCloner-Wordpress/issues/179
  • fix: File not found error while scanning for files: https://github.com/watchfulli/XCloner-Wordpress/issues/266
Download this release

Release Info

Developer watchful
Plugin Icon 128x128 XCloner – Backup and Restore
Version 4.6.1
Comparing to
See all releases

Code changes from version 4.6.0 to 4.6.1

README.txt CHANGED
@@ -5,7 +5,7 @@ Tags: backup, database backup, cloud backup, WordPress backup, WordPress migrati
5
  Requires at least: 5.1
6
  Requires PHP: 7.3
7
  Tested up to: 6.1
8
- Stable tag: 4.6.0
9
 
10
 
11
  XCloner is a backup plugin that allows you to safely back up and restore your WordPress sites. You can send site backups to SFTP, Dropbox, Amazon, Google Drive, Backblaze and other locations.
@@ -117,6 +117,10 @@ Of course, schedules can be adjusted accordingly to how often you update your si
117
 
118
  == Changelog ==
119
 
 
 
 
 
120
  = 4.6.0 =
121
  * Split UI of local restore and site cloning: https://github.com/watchfulli/XCloner-Wordpress/issues/258
122
 
5
  Requires at least: 5.1
6
  Requires PHP: 7.3
7
  Tested up to: 6.1
8
+ Stable tag: 4.6.1
9
 
10
 
11
  XCloner is a backup plugin that allows you to safely back up and restore your WordPress sites. You can send site backups to SFTP, Dropbox, Amazon, Google Drive, Backblaze and other locations.
117
 
118
  == Changelog ==
119
 
120
+ = 4.6.1 =
121
+ * fix: Backup archives not containing all files: https://github.com/watchfulli/XCloner-Wordpress/issues/179
122
+ * fix: File not found error while scanning for files: https://github.com/watchfulli/XCloner-Wordpress/issues/266
123
+
124
  = 4.6.0 =
125
  * Split UI of local restore and site cloning: https://github.com/watchfulli/XCloner-Wordpress/issues/258
126
 
lib/Xcloner.php CHANGED
@@ -88,12 +88,17 @@ class Xcloner
88
  /**
89
  * @throws Exception
90
  */
91
- public function __construct()
92
  {
 
 
 
 
 
 
 
93
  $this->xcloner_logger = new Xcloner_Logger($this, "xcloner_api");
94
  $this->xcloner_loader = new Xcloner_Loader($this);
95
- $this->xcloner_settings = new Xcloner_Settings($this);
96
- $this->xcloner_sanitization = new Xcloner_Sanitization();
97
  $this->xcloner_requirements = new Xcloner_Requirements($this);
98
  $this->xcloner_filesystem = new Xcloner_Filesystem($this);
99
  $this->archive_system = new Xcloner_Archive($this);
@@ -105,13 +110,53 @@ class Xcloner
105
  $this->xcloner_api = new Xcloner_Api($this);
106
  $this->xcloner_restore = new Xcloner_Restore($this);
107
 
108
- if (!class_exists('Xcloner_Admin')) {
109
  require_once XCLONER_PLUGIN_DIR . '/admin/class-xcloner-admin.php';
110
  }
111
 
112
  $this->xcloner_admin = new Xcloner_Admin($this);
113
  }
114
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  public function get_xcloner_loader()
116
  {
117
  return $this->xcloner_loader;
@@ -368,7 +413,6 @@ class Xcloner
368
 
369
  public function define_plugin_settings()
370
  {
371
- require_once( ABSPATH . '/wp-includes/pluggable.php' );
372
  /**
373
  * register wporg_settings_init to the admin_init action hook
374
  */
@@ -549,7 +593,6 @@ class Xcloner
549
  $this->xcloner_loader->add_action('wp_ajax_upload_backup_to_remote', [$this->xcloner_api, 'upload_backup_to_remote']);
550
  $this->xcloner_loader->add_action('wp_ajax_list_backup_files', [$this->xcloner_api, 'list_backup_files']);
551
  $this->xcloner_loader->add_action('wp_ajax_restore_upload_backup', [$this->xcloner_api, 'restore_upload_backup']);
552
- $this->xcloner_loader->add_action('wp_ajax_download_restore_script', [$this->xcloner_api, 'download_restore_script']);
553
  $this->xcloner_loader->add_action('wp_ajax_copy_backup_remote_to_local', [$this->xcloner_api, 'copy_backup_remote_to_local']);
554
  $this->xcloner_loader->add_action('wp_ajax_restore_backup', [$this, 'restore_backup']);
555
  $this->xcloner_loader->add_action('wp_ajax_backup_encryption', [$this->xcloner_api, 'backup_encryption']);
@@ -816,7 +859,7 @@ class Xcloner
816
  */
817
  public function restore_backup()
818
  {
819
- $this->xcloner_api->check_access();
820
 
821
  $action = $this->xcloner_sanitization->sanitize_input_as_string($_POST['xcloner_action']);
822
  if (empty($action)) {
88
  /**
89
  * @throws Exception
90
  */
91
+ public function __construct($hash = null)
92
  {
93
+ $this->xcloner_sanitization = new Xcloner_Sanitization();
94
+ $this->xcloner_settings = new Xcloner_Settings($this);
95
+ $hash = $hash ?? $this->get_hash_from_request();
96
+ if ($hash) {
97
+ $this->xcloner_settings->set_hash($hash);
98
+ }
99
+
100
  $this->xcloner_logger = new Xcloner_Logger($this, "xcloner_api");
101
  $this->xcloner_loader = new Xcloner_Loader($this);
 
 
102
  $this->xcloner_requirements = new Xcloner_Requirements($this);
103
  $this->xcloner_filesystem = new Xcloner_Filesystem($this);
104
  $this->archive_system = new Xcloner_Archive($this);
110
  $this->xcloner_api = new Xcloner_Api($this);
111
  $this->xcloner_restore = new Xcloner_Restore($this);
112
 
113
+ if (!class_exists('Xcloner_Admin') && defined('XCLONER_PLUGIN_DIR')) {
114
  require_once XCLONER_PLUGIN_DIR . '/admin/class-xcloner-admin.php';
115
  }
116
 
117
  $this->xcloner_admin = new Xcloner_Admin($this);
118
  }
119
 
120
+ private function get_hash_from_request()
121
+ {
122
+ try {
123
+ $this->check_access();
124
+ } catch (Exception $e) {
125
+ return null;
126
+ }
127
+
128
+ if (!isset($_POST['hash'])) {
129
+ return null;
130
+ }
131
+
132
+ return $this->xcloner_sanitization->sanitize_input_as_string($_POST['hash']) ?: null;
133
+ }
134
+
135
+ /**
136
+ * Checks API access
137
+ * @throws Exception
138
+ */
139
+ public function check_access()
140
+ {
141
+ require_once( ABSPATH . '/wp-includes/pluggable.php' );
142
+
143
+ if (!function_exists('wp_verify_nonce')) {
144
+ throw new Exception("wp_verify_nonce function not found");
145
+ }
146
+
147
+ if (!isset($_REQUEST['_wpnonce']) || !wp_verify_nonce($_REQUEST['_wpnonce'], 'xcloner-api-nonce')) {
148
+ throw new Exception("Invalid nonce, please try again by refreshing the page!");
149
+ }
150
+
151
+ if (!function_exists('current_user_can')) {
152
+ throw new Exception("current_user_can function not found");
153
+ }
154
+
155
+ if (!current_user_can('manage_options')) {
156
+ throw new Exception("Access denied!");
157
+ }
158
+ }
159
+
160
  public function get_xcloner_loader()
161
  {
162
  return $this->xcloner_loader;
413
 
414
  public function define_plugin_settings()
415
  {
 
416
  /**
417
  * register wporg_settings_init to the admin_init action hook
418
  */
593
  $this->xcloner_loader->add_action('wp_ajax_upload_backup_to_remote', [$this->xcloner_api, 'upload_backup_to_remote']);
594
  $this->xcloner_loader->add_action('wp_ajax_list_backup_files', [$this->xcloner_api, 'list_backup_files']);
595
  $this->xcloner_loader->add_action('wp_ajax_restore_upload_backup', [$this->xcloner_api, 'restore_upload_backup']);
 
596
  $this->xcloner_loader->add_action('wp_ajax_copy_backup_remote_to_local', [$this->xcloner_api, 'copy_backup_remote_to_local']);
597
  $this->xcloner_loader->add_action('wp_ajax_restore_backup', [$this, 'restore_backup']);
598
  $this->xcloner_loader->add_action('wp_ajax_backup_encryption', [$this->xcloner_api, 'backup_encryption']);
859
  */
860
  public function restore_backup()
861
  {
862
+ $this->check_access();
863
 
864
  $action = $this->xcloner_sanitization->sanitize_input_as_string($_POST['xcloner_action']);
865
  if (empty($action)) {
lib/Xcloner_Api.php CHANGED
@@ -67,8 +67,6 @@ class Xcloner_Api
67
  */
68
  public function __construct(Xcloner $xcloner_container)
69
  {
70
- //global $wpdb;
71
-
72
  if (ob_get_length()) {
73
  ob_end_clean();
74
  }
@@ -99,37 +97,11 @@ class Xcloner_Api
99
  }
100
 
101
  /**
102
- * Get XCloner Container
103
- */
104
- public function get_xcloner_container()
105
- {
106
- return $this->xcloner_container;
107
- }
108
-
109
-
110
- /**
111
- * Checks API access
112
- */
113
- public function check_access()
114
- {
115
- //preparing nonce verification
116
- if (function_exists('wp_verify_nonce')) {
117
- if (!isset($_REQUEST['_wpnonce']) || !wp_verify_nonce($_REQUEST['_wpnonce'], 'xcloner-api-nonce')) {
118
- throw new Error(json_encode("Invalid nonce, please try again by refreshing the page!"));
119
- }
120
- }
121
-
122
- if (function_exists('current_user_can') && !current_user_can('manage_options')) {
123
- throw new Error(json_encode("Access not allowed!"));
124
- }
125
- }
126
-
127
- /*
128
- * Save Schedule API
129
  */
130
  public function save_schedule()
131
  {
132
- $this->check_access();
133
 
134
  $scheduler = $this->xcloner_scheduler;
135
  $schedule = array();
@@ -274,12 +246,16 @@ class Xcloner_Api
274
  $this->send_response($response);
275
  }
276
 
 
 
 
 
277
  public function backup_files()
278
  {
279
  $data = array();
280
  $additional = array();
281
 
282
- $this->check_access();
283
 
284
  $init = (int)$this->xcloner_sanitization->sanitize_input_as_int($_POST['init']);
285
 
@@ -340,12 +316,13 @@ class Xcloner_Api
340
  /**
341
  * @throws FileNotFoundException
342
  * @throws FileExistsException
 
343
  */
344
  public function backup_database()
345
  {
346
  $data = array();
347
 
348
- $this->check_access();
349
 
350
  $init = (int)$this->xcloner_sanitization->sanitize_input_as_int($_POST['init']);
351
 
@@ -368,16 +345,17 @@ class Xcloner_Api
368
  $this->send_response($data);
369
  }
370
 
371
- /*
372
- *
373
- * Scan Filesystem API
374
- *
 
375
  */
376
  public function scan_filesystem()
377
  {
378
  $data = array();
379
 
380
- $this->check_access();
381
 
382
  $init = (int)$this->xcloner_sanitization->sanitize_input_as_int($_POST['init']);
383
 
@@ -407,10 +385,6 @@ class Xcloner_Api
407
  return;
408
  }
409
 
410
- if (isset($params->hash)) {
411
- $this->xcloner_settings->set_hash($this->xcloner_sanitization->sanitize_input_as_string($params->hash));
412
- }
413
-
414
  $this->form_params['extra'] = array();
415
  $this->form_params['backup_params'] = array();
416
 
@@ -479,19 +453,15 @@ class Xcloner_Api
479
  $this->send_response('{"status":false,"msg":"The data parameter must be valid JSON"}');
480
  }
481
 
482
- $params->hash = $this->xcloner_sanitization->sanitize_input_as_string($_POST['hash']);
483
-
484
  return $params;
485
  }
486
 
487
- /*
488
- *
489
- * Get file list for tree view API
490
- *
491
  */
492
  public function get_file_system_action()
493
  {
494
- $this->check_access();
495
 
496
  $folder = $this->xcloner_sanitization->sanitize_input_as_relative_path($_POST['id']);
497
 
@@ -559,14 +529,12 @@ class Xcloner_Api
559
  $this->send_response($data, 0);
560
  }
561
 
562
- /*
563
- *
564
- * Get databases/tables list for frontend tree display API
565
- *
566
  */
567
  public function get_database_tables_action()
568
  {
569
- $this->check_access();
570
 
571
  $database = $this->xcloner_sanitization->sanitize_input_as_raw($_POST['id']);
572
 
@@ -644,7 +612,7 @@ class Xcloner_Api
644
  */
645
  public function get_schedule_by_id()
646
  {
647
- $this->check_access();
648
 
649
  $schedule_id = $this->xcloner_sanitization->sanitize_input_as_int($_GET['id']);
650
  $scheduler = $this->xcloner_scheduler;
@@ -661,11 +629,15 @@ class Xcloner_Api
661
  $this->send_response($data);
662
  }
663
 
 
 
 
 
664
  public function get_scheduler_list()
665
  {
666
  $return = array();
667
 
668
- $this->check_access();
669
 
670
  $scheduler = $this->xcloner_scheduler;
671
  $data = $scheduler->get_scheduler_list();
@@ -744,16 +716,14 @@ class Xcloner_Api
744
  $this->send_response($return, 0);
745
  }
746
 
747
- /*
748
- *
749
- * Delete Schedule by ID API
750
- *
751
  */
752
  public function delete_schedule_by_id()
753
  {
754
  $data = array();
755
 
756
- $this->check_access();
757
 
758
  $schedule_id = $this->xcloner_sanitization->sanitize_input_as_int($_GET['id']);
759
  $scheduler = $this->xcloner_scheduler;
@@ -762,16 +732,15 @@ class Xcloner_Api
762
  $this->send_response($data);
763
  }
764
 
765
- /*
766
- *
767
- * Delete backup by name from the storage path
768
- *
769
  */
770
  public function delete_backup_by_name()
771
  {
772
  $data = array();
773
 
774
- $this->check_access();
775
 
776
  $backup_name = $this->xcloner_sanitization->sanitize_input_as_string($_POST['name']);
777
  $storage_selection = $this->xcloner_sanitization->sanitize_input_as_string($_POST['storage_selection']);
@@ -787,7 +756,7 @@ class Xcloner_Api
787
  */
788
  public function backup_encryption()
789
  {
790
- $this->check_access();
791
 
792
  $backup_parts = array();
793
  $return = array();
@@ -871,7 +840,7 @@ class Xcloner_Api
871
  */
872
  public function backup_decryption()
873
  {
874
- $this->check_access();
875
 
876
  $backup_parts = array();
877
  $return = array();
@@ -917,9 +886,12 @@ class Xcloner_Api
917
  $this->send_response($return, 0);
918
  }
919
 
 
 
 
920
  public function get_manage_backups_list()
921
  {
922
- $this->check_access();
923
 
924
  $return = array(
925
  "data" => array()
@@ -1124,7 +1096,7 @@ class Xcloner_Api
1124
  */
1125
  public function list_backup_files()
1126
  {
1127
- $this->check_access();
1128
 
1129
  $backup_parts = array();
1130
  $return = array();
@@ -1194,17 +1166,17 @@ class Xcloner_Api
1194
  $this->send_response($return, 0);
1195
  }
1196
 
1197
- /*
1198
- * Copy remote backup to local storage
1199
  */
1200
  public function copy_backup_remote_to_local()
1201
  {
1202
- $this->check_access();
1203
 
1204
  $backup_file = $this->xcloner_sanitization->sanitize_input_as_string($_POST['file']);
1205
  $storage_type = $this->xcloner_sanitization->sanitize_input_as_string($_POST['storage_type']);
1206
 
1207
- $xcloner_remote_storage = $this->get_xcloner_container()->get_xcloner_remote_storage();
1208
 
1209
  $return = array();
1210
 
@@ -1229,14 +1201,12 @@ class Xcloner_Api
1229
  $this->send_response($return, 0);
1230
  }
1231
 
1232
- /*
1233
- *
1234
- * Upload backup to remote API
1235
- *
1236
  */
1237
  public function upload_backup_to_remote()
1238
  {
1239
- $this->check_access();
1240
 
1241
  $return = array();
1242
 
@@ -1249,7 +1219,7 @@ class Xcloner_Api
1249
  $storage_type = $this->xcloner_sanitization->sanitize_input_as_string($_POST['storage_type']);
1250
  $delete_local_copy_after_transfer = $this->xcloner_sanitization->sanitize_input_as_string($_POST['delete_after_transfer']);
1251
  }
1252
- $xcloner_remote_storage = $this->get_xcloner_container()->get_xcloner_remote_storage();
1253
 
1254
  try {
1255
  if (method_exists($xcloner_remote_storage, "upload_backup_to_storage")) {
@@ -1272,120 +1242,29 @@ class Xcloner_Api
1272
  $this->send_response($return, 0);
1273
  }
1274
 
1275
- /*
1276
- *
1277
- * Remote Storage Status Save
1278
- *
1279
  */
1280
  public function remote_storage_save_status()
1281
  {
1282
- $this->check_access();
1283
 
1284
  $return = array();
1285
 
1286
- $xcloner_remote_storage = $this->get_xcloner_container()->get_xcloner_remote_storage();
1287
 
1288
  $return['finished'] = $xcloner_remote_storage->change_storage_status($_POST['id'], $_POST['value']);
1289
 
1290
  $this->send_response($return, 0);
1291
  }
1292
 
1293
-
1294
- /**
1295
- * @throws ArchiveIllegalCompressionException
1296
- * @throws ArchiveIOException
1297
- * @throws ArchiveCorruptedException
1298
- * @throws FileInfoException
1299
- */
1300
- public function download_restore_script()
1301
- {
1302
- $this->check_access();
1303
-
1304
- ob_end_clean();
1305
-
1306
- $adapter = new Local(dirname(__DIR__), LOCK_EX, '0001');
1307
- $xcloner_plugin_filesystem = new Filesystem($adapter, new Config([
1308
- 'disable_asserts' => true,
1309
- ]));
1310
-
1311
- /* Generate PHAR FILE
1312
- $file = 'restore/vendor.built';
1313
-
1314
- if(file_exists($file))
1315
- unlink($file);
1316
- $phar2 = new Phar($file, 0, 'vendor.phar');
1317
-
1318
- // add all files in the project, only include php files
1319
- $phar2->buildFromIterator(
1320
- new RecursiveIteratorIterator(
1321
- new RecursiveDirectoryIterator(__DIR__.'/vendor/')),
1322
- __DIR__);
1323
-
1324
- $phar2->setStub($phar2->createDefaultStub('vendor/autoload.php', 'vendor/autoload.php'));
1325
- * */
1326
-
1327
- $tmp_file = $this->xcloner_settings->get_xcloner_tmp_path() . DS . "xcloner-restore.tgz";
1328
-
1329
- $tar = $this->archive_system;
1330
- $tar->create($tmp_file);
1331
-
1332
- $vendor_phar_file = __DIR__ . "/../../../../restore/vendor.build.txt";
1333
- if (!file_exists($vendor_phar_file)) {
1334
- $vendor_phar_file = __DIR__ . "/../../restore/vendor.build.txt";
1335
- }
1336
-
1337
- $tar->addFile($vendor_phar_file, "vendor.phar");
1338
-
1339
- //$tar->addFile(dirname(__DIR__)."/restore/vendor.tgz", "vendor.tgz");
1340
-
1341
- $files = $xcloner_plugin_filesystem->listContents("vendor/", true);
1342
- foreach ($files as $file) {
1343
- $tar->addFile(dirname(__DIR__) . DS . $file['path'], $file['path']);
1344
- }
1345
-
1346
- $xcloner_restore_file = (__DIR__ . "/../../../../restore/xcloner_restore.php");
1347
- if (!file_exists($xcloner_restore_file)) {
1348
- $xcloner_restore_file = (__DIR__ . "/../../restore/xcloner_restore.php");
1349
- }
1350
-
1351
- $content = file_get_contents($xcloner_restore_file);
1352
- $content = str_replace("define('AUTH_KEY', '');", "define('AUTH_KEY', '" . md5(AUTH_KEY) . "');", $content);
1353
-
1354
- $tar->addData("xcloner_restore.php", $content);
1355
-
1356
- $tar->close();
1357
-
1358
- if (file_exists($tmp_file)) {
1359
- header('Content-Description: File Transfer');
1360
- header('Content-Type: application/octet-stream');
1361
- header('Content-Disposition: attachment; filename="' . basename($tmp_file) . '"');
1362
- header('Expires: 0');
1363
- header('Cache-Control: must-revalidate');
1364
- header('Pragma: public');
1365
- header('Content-Length: ' . filesize($tmp_file));
1366
- readfile($tmp_file);
1367
- }
1368
-
1369
- try {
1370
- unlink($tmp_file);
1371
- } catch (Exception $e) {
1372
- //We are not interested in the error here
1373
- }
1374
-
1375
- die();
1376
- }
1377
-
1378
- /*
1379
- *
1380
- * Download backup by Name from the Storage Path
1381
- *
1382
- */
1383
  /**
1384
  * @throws FileNotFoundException
 
1385
  */
1386
  public function download_backup_by_name()
1387
  {
1388
- $this->check_access();
1389
 
1390
  ob_end_clean();
1391
 
@@ -1428,15 +1307,13 @@ class Xcloner_Api
1428
  wp_die();
1429
  }
1430
 
1431
- /*
1432
- * Restore upload backup
1433
- */
1434
  /**
1435
  * @throws FileNotFoundException
 
1436
  */
1437
  public function restore_upload_backup()
1438
  {
1439
- $this->check_access();
1440
 
1441
  $return = array();
1442
 
@@ -1474,7 +1351,7 @@ class Xcloner_Api
1474
  }
1475
 
1476
  try {
1477
- $xcloner_file_transfer = $this->get_xcloner_container()->get_xcloner_file_transfer();
1478
  $xcloner_file_transfer->set_target($target_url);
1479
  $return['start'] = $xcloner_file_transfer->transfer_file($file, $start, $hash);
1480
  } catch (Exception $e) {
67
  */
68
  public function __construct(Xcloner $xcloner_container)
69
  {
 
 
70
  if (ob_get_length()) {
71
  ob_end_clean();
72
  }
97
  }
98
 
99
  /**
100
+ * @throws Exception
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  */
102
  public function save_schedule()
103
  {
104
+ $this->xcloner_container->check_access();
105
 
106
  $scheduler = $this->xcloner_scheduler;
107
  $schedule = array();
246
  $this->send_response($response);
247
  }
248
 
249
+ /**
250
+ * @throws FileNotFoundException
251
+ * @throws Exception
252
+ */
253
  public function backup_files()
254
  {
255
  $data = array();
256
  $additional = array();
257
 
258
+ $this->xcloner_container->check_access();
259
 
260
  $init = (int)$this->xcloner_sanitization->sanitize_input_as_int($_POST['init']);
261
 
316
  /**
317
  * @throws FileNotFoundException
318
  * @throws FileExistsException
319
+ * @throws Exception
320
  */
321
  public function backup_database()
322
  {
323
  $data = array();
324
 
325
+ $this->xcloner_container->check_access();
326
 
327
  $init = (int)$this->xcloner_sanitization->sanitize_input_as_int($_POST['init']);
328
 
345
  $this->send_response($data);
346
  }
347
 
348
+
349
+ /**
350
+ * @throws FileNotFoundException
351
+ * @throws FileExistsException
352
+ * @throws Exception
353
  */
354
  public function scan_filesystem()
355
  {
356
  $data = array();
357
 
358
+ $this->xcloner_container->check_access();
359
 
360
  $init = (int)$this->xcloner_sanitization->sanitize_input_as_int($_POST['init']);
361
 
385
  return;
386
  }
387
 
 
 
 
 
388
  $this->form_params['extra'] = array();
389
  $this->form_params['backup_params'] = array();
390
 
453
  $this->send_response('{"status":false,"msg":"The data parameter must be valid JSON"}');
454
  }
455
 
 
 
456
  return $params;
457
  }
458
 
459
+ /**
460
+ * @throws Exception
 
 
461
  */
462
  public function get_file_system_action()
463
  {
464
+ $this->xcloner_container->check_access();
465
 
466
  $folder = $this->xcloner_sanitization->sanitize_input_as_relative_path($_POST['id']);
467
 
529
  $this->send_response($data, 0);
530
  }
531
 
532
+ /**
533
+ * @throws Exception
 
 
534
  */
535
  public function get_database_tables_action()
536
  {
537
+ $this->xcloner_container->check_access();
538
 
539
  $database = $this->xcloner_sanitization->sanitize_input_as_raw($_POST['id']);
540
 
612
  */
613
  public function get_schedule_by_id()
614
  {
615
+ $this->xcloner_container->check_access();
616
 
617
  $schedule_id = $this->xcloner_sanitization->sanitize_input_as_int($_GET['id']);
618
  $scheduler = $this->xcloner_scheduler;
629
  $this->send_response($data);
630
  }
631
 
632
+ /**
633
+ * @throws FileNotFoundException
634
+ * @throws Exception
635
+ */
636
  public function get_scheduler_list()
637
  {
638
  $return = array();
639
 
640
+ $this->xcloner_container->check_access();
641
 
642
  $scheduler = $this->xcloner_scheduler;
643
  $data = $scheduler->get_scheduler_list();
716
  $this->send_response($return, 0);
717
  }
718
 
719
+ /**
720
+ * @throws Exception
 
 
721
  */
722
  public function delete_schedule_by_id()
723
  {
724
  $data = array();
725
 
726
+ $this->xcloner_container->check_access();
727
 
728
  $schedule_id = $this->xcloner_sanitization->sanitize_input_as_int($_GET['id']);
729
  $scheduler = $this->xcloner_scheduler;
732
  $this->send_response($data);
733
  }
734
 
735
+ /**
736
+ * @throws FileNotFoundException
737
+ * @throws Exception
 
738
  */
739
  public function delete_backup_by_name()
740
  {
741
  $data = array();
742
 
743
+ $this->xcloner_container->check_access();
744
 
745
  $backup_name = $this->xcloner_sanitization->sanitize_input_as_string($_POST['name']);
746
  $storage_selection = $this->xcloner_sanitization->sanitize_input_as_string($_POST['storage_selection']);
756
  */
757
  public function backup_encryption()
758
  {
759
+ $this->xcloner_container->check_access();
760
 
761
  $backup_parts = array();
762
  $return = array();
840
  */
841
  public function backup_decryption()
842
  {
843
+ $this->xcloner_container->check_access();
844
 
845
  $backup_parts = array();
846
  $return = array();
886
  $this->send_response($return, 0);
887
  }
888
 
889
+ /**
890
+ * @throws Exception
891
+ */
892
  public function get_manage_backups_list()
893
  {
894
+ $this->xcloner_container->check_access();
895
 
896
  $return = array(
897
  "data" => array()
1096
  */
1097
  public function list_backup_files()
1098
  {
1099
+ $this->xcloner_container->check_access();
1100
 
1101
  $backup_parts = array();
1102
  $return = array();
1166
  $this->send_response($return, 0);
1167
  }
1168
 
1169
+ /**
1170
+ * @throws Exception
1171
  */
1172
  public function copy_backup_remote_to_local()
1173
  {
1174
+ $this->xcloner_container->check_access();
1175
 
1176
  $backup_file = $this->xcloner_sanitization->sanitize_input_as_string($_POST['file']);
1177
  $storage_type = $this->xcloner_sanitization->sanitize_input_as_string($_POST['storage_type']);
1178
 
1179
+ $xcloner_remote_storage = $this->xcloner_container->get_xcloner_remote_storage();
1180
 
1181
  $return = array();
1182
 
1201
  $this->send_response($return, 0);
1202
  }
1203
 
1204
+ /**
1205
+ * @throws Exception
 
 
1206
  */
1207
  public function upload_backup_to_remote()
1208
  {
1209
+ $this->xcloner_container->check_access();
1210
 
1211
  $return = array();
1212
 
1219
  $storage_type = $this->xcloner_sanitization->sanitize_input_as_string($_POST['storage_type']);
1220
  $delete_local_copy_after_transfer = $this->xcloner_sanitization->sanitize_input_as_string($_POST['delete_after_transfer']);
1221
  }
1222
+ $xcloner_remote_storage = $this->xcloner_container->get_xcloner_remote_storage();
1223
 
1224
  try {
1225
  if (method_exists($xcloner_remote_storage, "upload_backup_to_storage")) {
1242
  $this->send_response($return, 0);
1243
  }
1244
 
1245
+ /**
1246
+ * @throws Exception
 
 
1247
  */
1248
  public function remote_storage_save_status()
1249
  {
1250
+ $this->xcloner_container->check_access();
1251
 
1252
  $return = array();
1253
 
1254
+ $xcloner_remote_storage = $this->xcloner_container->get_xcloner_remote_storage();
1255
 
1256
  $return['finished'] = $xcloner_remote_storage->change_storage_status($_POST['id'], $_POST['value']);
1257
 
1258
  $this->send_response($return, 0);
1259
  }
1260
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1261
  /**
1262
  * @throws FileNotFoundException
1263
+ * @throws Exception
1264
  */
1265
  public function download_backup_by_name()
1266
  {
1267
+ $this->xcloner_container->check_access();
1268
 
1269
  ob_end_clean();
1270
 
1307
  wp_die();
1308
  }
1309
 
 
 
 
1310
  /**
1311
  * @throws FileNotFoundException
1312
+ * @throws Exception
1313
  */
1314
  public function restore_upload_backup()
1315
  {
1316
+ $this->xcloner_container->check_access();
1317
 
1318
  $return = array();
1319
 
1351
  }
1352
 
1353
  try {
1354
+ $xcloner_file_transfer = $this->xcloner_container->get_xcloner_file_transfer();
1355
  $xcloner_file_transfer->set_target($target_url);
1356
  $return['start'] = $xcloner_file_transfer->transfer_file($file, $start, $hash);
1357
  } catch (Exception $e) {
lib/Xcloner_Archive.php CHANGED
@@ -476,7 +476,7 @@ class Xcloner_Archive extends Tar
476
 
477
  $byte_limit = 0;
478
 
479
- while (!$file->eof() and $counter <= $this->files_to_process_per_request) {
480
  $current_line_str = $file->current();
481
 
482
  $line = str_getcsv($current_line_str);
@@ -718,7 +718,7 @@ class Xcloner_Archive extends Tar
718
  /**
719
  * @param integer $append
720
  */
721
- public function add_file_to_archive($file_info, $start_at_byte, $byte_limit = 0, $append, $filesystem)
722
  {
723
  $start_adapter = $this->filesystem->get_adapter($filesystem);
724
  $start_filesystem = $this->filesystem->get_adapter($filesystem);
@@ -828,7 +828,6 @@ class Xcloner_Archive extends Tar
828
  *
829
  * @param string $file path to the original file
830
  * @param int $start starting reading position in file
831
- * @param int $end end position in reading multiple with 512
832
  * @param string|FileInfo $fileinfo either the name to us in archive (string) or a FileInfo oject with
833
  * all meta data, empty to take from original
834
  * @throws ArchiveIOException
476
 
477
  $byte_limit = 0;
478
 
479
+ while (!$file->eof() && $counter <= $this->files_to_process_per_request) {
480
  $current_line_str = $file->current();
481
 
482
  $line = str_getcsv($current_line_str);
718
  /**
719
  * @param integer $append
720
  */
721
+ public function add_file_to_archive($file_info, $start_at_byte, $byte_limit, $append, $filesystem)
722
  {
723
  $start_adapter = $this->filesystem->get_adapter($filesystem);
724
  $start_filesystem = $this->filesystem->get_adapter($filesystem);
828
  *
829
  * @param string $file path to the original file
830
  * @param int $start starting reading position in file
 
831
  * @param string|FileInfo $fileinfo either the name to us in archive (string) or a FileInfo oject with
832
  * all meta data, empty to take from original
833
  * @throws ArchiveIOException
lib/Xcloner_Database.php CHANGED
@@ -27,10 +27,6 @@ use League\Flysystem\FileExistsException;
27
  use League\Flysystem\FileNotFoundException;
28
  use wpdb;
29
 
30
- if (!class_exists('wpdb')) {
31
- require_once __DIR__ . "/../lib/wp-db.php";
32
- }
33
-
34
  class Xcloner_Database extends wpdb
35
  {
36
  public $debug = 0;
27
  use League\Flysystem\FileNotFoundException;
28
  use wpdb;
29
 
 
 
 
 
30
  class Xcloner_Database extends wpdb
31
  {
32
  public $debug = 0;
lib/Xcloner_Encryption.php CHANGED
@@ -20,11 +20,7 @@ class Xcloner_Encryption
20
  public function __construct(Xcloner $xcloner_container)
21
  {
22
  $this->xcloner_container = $xcloner_container;
23
- //if (property_exists($xcloner_container, 'xcloner_settings')) {
24
  $this->xcloner_settings = $xcloner_container->get_xcloner_settings();
25
- //} else {
26
- // $this->xcloner_settings = "";
27
- //}
28
 
29
  if (property_exists($xcloner_container, 'xcloner_logger')) {
30
  $this->logger = $xcloner_container->get_xcloner_logger()->withName("xcloner_encryption");
20
  public function __construct(Xcloner $xcloner_container)
21
  {
22
  $this->xcloner_container = $xcloner_container;
 
23
  $this->xcloner_settings = $xcloner_container->get_xcloner_settings();
 
 
 
24
 
25
  if (property_exists($xcloner_container, 'xcloner_logger')) {
26
  $this->logger = $xcloner_container->get_xcloner_logger()->withName("xcloner_encryption");
lib/Xcloner_Filesystem.php CHANGED
@@ -147,11 +147,6 @@ class Xcloner_Filesystem
147
  return $this->xcloner_container;
148
  }
149
 
150
- public function get_hash()
151
- {
152
- return $this->xcloner_settings->get_hash();
153
- }
154
-
155
  public function get_tmp_filesystem()
156
  {
157
  return $this->tmp_filesystem;
@@ -454,6 +449,11 @@ class Xcloner_Filesystem
454
  }
455
 
456
  if ($this->scan_finished()) {
 
 
 
 
 
457
  $metadata_dumpfile = $this->get_tmp_filesystem()->getMetadata("index.html");
458
  $this->store_file($metadata_dumpfile, 'tmp_filesystem');
459
  $this->files_counter++;
@@ -465,11 +465,6 @@ class Xcloner_Filesystem
465
  $this->files_counter++;
466
  }
467
 
468
- //adding a default index.html to the temp xcloner folder
469
- if (!$this->get_tmp_filesystem()->has("index.html")) {
470
- $this->get_tmp_filesystem()->write("index.html", "");
471
- }
472
-
473
  //adding the default log file
474
  if ($this->get_tmp_filesystem()->has($this->xcloner_settings->get_logger_filename(1))) {
475
  $metadata_dumpfile = $this->get_tmp_filesystem()->getMetadata($this->xcloner_settings->get_logger_filename(1));
@@ -567,7 +562,6 @@ class Xcloner_Filesystem
567
  }
568
 
569
  /**
570
- * @throws FileNotFoundException
571
  * @throws FileExistsException
572
  */
573
  private function do_system_init()
@@ -581,14 +575,6 @@ class Xcloner_Filesystem
581
  if (!$this->tmp_filesystem->has("index.html")) {
582
  $this->tmp_filesystem->write("index.html", "");
583
  }
584
-
585
- if ($this->tmp_filesystem->has($this->get_included_files_handler())) {
586
- $this->tmp_filesystem->delete($this->get_included_files_handler());
587
- }
588
-
589
- if ($this->tmp_filesystem->has($this->get_temp_dir_handler())) {
590
- $this->tmp_filesystem->delete($this->get_temp_dir_handler());
591
- }
592
  }
593
 
594
  public function get_scanned_files_num()
147
  return $this->xcloner_container;
148
  }
149
 
 
 
 
 
 
150
  public function get_tmp_filesystem()
151
  {
152
  return $this->tmp_filesystem;
449
  }
450
 
451
  if ($this->scan_finished()) {
452
+ //adding a default index.html to the temp xcloner folder
453
+ if (!$this->get_tmp_filesystem()->has("index.html")) {
454
+ $this->get_tmp_filesystem()->write("index.html", "");
455
+ }
456
+
457
  $metadata_dumpfile = $this->get_tmp_filesystem()->getMetadata("index.html");
458
  $this->store_file($metadata_dumpfile, 'tmp_filesystem');
459
  $this->files_counter++;
465
  $this->files_counter++;
466
  }
467
 
 
 
 
 
 
468
  //adding the default log file
469
  if ($this->get_tmp_filesystem()->has($this->xcloner_settings->get_logger_filename(1))) {
470
  $metadata_dumpfile = $this->get_tmp_filesystem()->getMetadata($this->xcloner_settings->get_logger_filename(1));
562
  }
563
 
564
  /**
 
565
  * @throws FileExistsException
566
  */
567
  private function do_system_init()
575
  if (!$this->tmp_filesystem->has("index.html")) {
576
  $this->tmp_filesystem->write("index.html", "");
577
  }
 
 
 
 
 
 
 
 
578
  }
579
 
580
  public function get_scanned_files_num()
lib/Xcloner_Restore.php CHANGED
@@ -68,7 +68,7 @@ class Xcloner_Restore
68
 
69
  if (isset($_POST['API_ID'])) {
70
  $request_id = $this->xcloner_sanitization->sanitize_input_as_string($_POST['API_ID']);
71
- $this->logger->info("Processing ajax request ID " . substr(filter_input(INPUT_POST, 'API_ID', FILTER_SANITIZE_STRING), 0, 15));
72
  }
73
  }
74
 
68
 
69
  if (isset($_POST['API_ID'])) {
70
  $request_id = $this->xcloner_sanitization->sanitize_input_as_string($_POST['API_ID']);
71
+ $this->logger->info("Processing ajax request ID " . $request_id);
72
  }
73
  }
74
 
lib/Xcloner_Settings.php CHANGED
@@ -15,8 +15,6 @@ class Xcloner_Settings
15
  private $xcloner_sanitization;
16
  /** @var Xcloner */
17
  private $xcloner_container;
18
- /** @var Xcloner_Database */
19
- private $xcloner_database;
20
 
21
  /**
22
  * XCloner General Settings Class
@@ -26,7 +24,6 @@ class Xcloner_Settings
26
  public function __construct(Xcloner $xcloner_container)
27
  {
28
  $this->xcloner_container = $xcloner_container;
29
- $this->xcloner_database = $this->xcloner_container->get_xcloner_database();
30
  $this->xcloner_sanitization = $this->xcloner_container->get_xcloner_sanitization();
31
  }
32
 
@@ -48,16 +45,6 @@ class Xcloner_Settings
48
  return $this->xcloner_options_prefix;
49
  }
50
 
51
- /**
52
- * Get XCloner Main Container
53
- *
54
- * @return Xcloner_Standalone
55
- */
56
- private function get_xcloner_container()
57
- {
58
- return $this->xcloner_container;
59
- }
60
-
61
  /**
62
  * Get Logger Filename Setting
63
  *
@@ -174,10 +161,6 @@ class Xcloner_Settings
174
  return $path;
175
  }
176
 
177
- /**
178
- * Get Enable Mysql Backup Option
179
- *
180
- */
181
  public function get_enable_mysql_backup()
182
  {
183
  if ($this->get_xcloner_option('xcloner_enable_mysql_backup')) {
@@ -207,11 +190,9 @@ class Xcloner_Settings
207
  }
208
 
209
  /**
210
- * Get Backup Hash
211
- *
212
  * @return string
213
  */
214
- public function get_hash($readonly = false)
215
  {
216
  return $this->hash;
217
  }
15
  private $xcloner_sanitization;
16
  /** @var Xcloner */
17
  private $xcloner_container;
 
 
18
 
19
  /**
20
  * XCloner General Settings Class
24
  public function __construct(Xcloner $xcloner_container)
25
  {
26
  $this->xcloner_container = $xcloner_container;
 
27
  $this->xcloner_sanitization = $this->xcloner_container->get_xcloner_sanitization();
28
  }
29
 
45
  return $this->xcloner_options_prefix;
46
  }
47
 
 
 
 
 
 
 
 
 
 
 
48
  /**
49
  * Get Logger Filename Setting
50
  *
161
  return $path;
162
  }
163
 
 
 
 
 
164
  public function get_enable_mysql_backup()
165
  {
166
  if ($this->get_xcloner_option('xcloner_enable_mysql_backup')) {
190
  }
191
 
192
  /**
 
 
193
  * @return string
194
  */
195
+ public function get_hash()
196
  {
197
  return $this->hash;
198
  }
vendor/autoload.php CHANGED
@@ -22,4 +22,4 @@ if (PHP_VERSION_ID < 50600) {
22
 
23
  require_once __DIR__ . '/composer/autoload_real.php';
24
 
25
- return ComposerAutoloaderInit0da8400daae1fee94a27c0097f9e5eb5::getLoader();
22
 
23
  require_once __DIR__ . '/composer/autoload_real.php';
24
 
25
+ return ComposerAutoloaderInitd09cf045970fa10e33072aaab268d79a::getLoader();
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit0da8400daae1fee94a27c0097f9e5eb5
6
  {
7
  private static $loader;
8
 
@@ -24,18 +24,18 @@ class ComposerAutoloaderInit0da8400daae1fee94a27c0097f9e5eb5
24
 
25
  require __DIR__ . '/platform_check.php';
26
 
27
- spl_autoload_register(array('ComposerAutoloaderInit0da8400daae1fee94a27c0097f9e5eb5', 'loadClassLoader'), true, true);
28
  self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
29
- spl_autoload_unregister(array('ComposerAutoloaderInit0da8400daae1fee94a27c0097f9e5eb5', 'loadClassLoader'));
30
 
31
  require __DIR__ . '/autoload_static.php';
32
- call_user_func(\Composer\Autoload\ComposerStaticInit0da8400daae1fee94a27c0097f9e5eb5::getInitializer($loader));
33
 
34
  $loader->register(true);
35
 
36
- $includeFiles = \Composer\Autoload\ComposerStaticInit0da8400daae1fee94a27c0097f9e5eb5::$files;
37
  foreach ($includeFiles as $fileIdentifier => $file) {
38
- composerRequire0da8400daae1fee94a27c0097f9e5eb5($fileIdentifier, $file);
39
  }
40
 
41
  return $loader;
@@ -47,7 +47,7 @@ class ComposerAutoloaderInit0da8400daae1fee94a27c0097f9e5eb5
47
  * @param string $file
48
  * @return void
49
  */
50
- function composerRequire0da8400daae1fee94a27c0097f9e5eb5($fileIdentifier, $file)
51
  {
52
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
53
  $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInitd09cf045970fa10e33072aaab268d79a
6
  {
7
  private static $loader;
8
 
24
 
25
  require __DIR__ . '/platform_check.php';
26
 
27
+ spl_autoload_register(array('ComposerAutoloaderInitd09cf045970fa10e33072aaab268d79a', 'loadClassLoader'), true, true);
28
  self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
29
+ spl_autoload_unregister(array('ComposerAutoloaderInitd09cf045970fa10e33072aaab268d79a', 'loadClassLoader'));
30
 
31
  require __DIR__ . '/autoload_static.php';
32
+ call_user_func(\Composer\Autoload\ComposerStaticInitd09cf045970fa10e33072aaab268d79a::getInitializer($loader));
33
 
34
  $loader->register(true);
35
 
36
+ $includeFiles = \Composer\Autoload\ComposerStaticInitd09cf045970fa10e33072aaab268d79a::$files;
37
  foreach ($includeFiles as $fileIdentifier => $file) {
38
+ composerRequired09cf045970fa10e33072aaab268d79a($fileIdentifier, $file);
39
  }
40
 
41
  return $loader;
47
  * @param string $file
48
  * @return void
49
  */
50
+ function composerRequired09cf045970fa10e33072aaab268d79a($fileIdentifier, $file)
51
  {
52
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
53
  $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInit0da8400daae1fee94a27c0097f9e5eb5
8
  {
9
  public static $files = array (
10
  '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
@@ -7873,10 +7873,10 @@ class ComposerStaticInit0da8400daae1fee94a27c0097f9e5eb5
7873
  public static function getInitializer(ClassLoader $loader)
7874
  {
7875
  return \Closure::bind(function () use ($loader) {
7876
- $loader->prefixLengthsPsr4 = ComposerStaticInit0da8400daae1fee94a27c0097f9e5eb5::$prefixLengthsPsr4;
7877
- $loader->prefixDirsPsr4 = ComposerStaticInit0da8400daae1fee94a27c0097f9e5eb5::$prefixDirsPsr4;
7878
- $loader->prefixesPsr0 = ComposerStaticInit0da8400daae1fee94a27c0097f9e5eb5::$prefixesPsr0;
7879
- $loader->classMap = ComposerStaticInit0da8400daae1fee94a27c0097f9e5eb5::$classMap;
7880
 
7881
  }, null, ClassLoader::class);
7882
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInitd09cf045970fa10e33072aaab268d79a
8
  {
9
  public static $files = array (
10
  '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
7873
  public static function getInitializer(ClassLoader $loader)
7874
  {
7875
  return \Closure::bind(function () use ($loader) {
7876
+ $loader->prefixLengthsPsr4 = ComposerStaticInitd09cf045970fa10e33072aaab268d79a::$prefixLengthsPsr4;
7877
+ $loader->prefixDirsPsr4 = ComposerStaticInitd09cf045970fa10e33072aaab268d79a::$prefixDirsPsr4;
7878
+ $loader->prefixesPsr0 = ComposerStaticInitd09cf045970fa10e33072aaab268d79a::$prefixesPsr0;
7879
+ $loader->classMap = ComposerStaticInitd09cf045970fa10e33072aaab268d79a::$classMap;
7880
 
7881
  }, null, ClassLoader::class);
7882
  }
vendor/composer/installed.php CHANGED
@@ -1,9 +1,9 @@
1
  <?php return array(
2
  'root' => array(
3
  'name' => 'watchfulli/xcloner-wordpress',
4
- 'pretty_version' => 'v4.6.0',
5
- 'version' => '4.6.0.0',
6
- 'reference' => '7733d8ed945254d945226814636fe12847a21112',
7
  'type' => 'library',
8
  'install_path' => __DIR__ . '/../../',
9
  'aliases' => array(),
@@ -494,9 +494,9 @@
494
  'dev_requirement' => false,
495
  ),
496
  'watchfulli/xcloner-wordpress' => array(
497
- 'pretty_version' => 'v4.6.0',
498
- 'version' => '4.6.0.0',
499
- 'reference' => '7733d8ed945254d945226814636fe12847a21112',
500
  'type' => 'library',
501
  'install_path' => __DIR__ . '/../../',
502
  'aliases' => array(),
1
  <?php return array(
2
  'root' => array(
3
  'name' => 'watchfulli/xcloner-wordpress',
4
+ 'pretty_version' => 'v4.6.1',
5
+ 'version' => '4.6.1.0',
6
+ 'reference' => 'b1ea01652136244d63023c609b5377aa927ec5ea',
7
  'type' => 'library',
8
  'install_path' => __DIR__ . '/../../',
9
  'aliases' => array(),
494
  'dev_requirement' => false,
495
  ),
496
  'watchfulli/xcloner-wordpress' => array(
497
+ 'pretty_version' => 'v4.6.1',
498
+ 'version' => '4.6.1.0',
499
+ 'reference' => 'b1ea01652136244d63023c609b5377aa927ec5ea',
500
  'type' => 'library',
501
  'install_path' => __DIR__ . '/../../',
502
  'aliases' => array(),
xcloner.php CHANGED
@@ -15,7 +15,7 @@
15
  * Plugin Name: XCloner - Site Backup and Restore
16
  * Plugin URI: https://xcloner.com/
17
  * Description: XCloner is a tool that will help you manage your website backups, generate/restore/move so your website will be always secured! With XCloner you will be able to clone your site to any other location with just a few clicks, as well as transfer the backup archives to remote FTP, SFTP, DropBox, Amazon S3, Google Drive, WebDAV, Backblaze, Azure accounts.
18
- * Version: 4.6.0
19
  * Author: watchful
20
  * Author URI: https://watchful.net/
21
  * License: GPL-2.0+
15
  * Plugin Name: XCloner - Site Backup and Restore
16
  * Plugin URI: https://xcloner.com/
17
  * Description: XCloner is a tool that will help you manage your website backups, generate/restore/move so your website will be always secured! With XCloner you will be able to clone your site to any other location with just a few clicks, as well as transfer the backup archives to remote FTP, SFTP, DropBox, Amazon S3, Google Drive, WebDAV, Backblaze, Azure accounts.
18
+ * Version: 4.6.1
19
  * Author: watchful
20
  * Author URI: https://watchful.net/
21
  * License: GPL-2.0+