InfiniteWP Client - Version 1.2.0

Version Description

  • Improvement: Backup fail safe option now uses only php db dump and pclZip
  • Improvement: Better feedback regarding completion of backups even in case of error
  • Improvement: Restore using file system (better handling of file permissions)
  • Fix: Notice issue with unserialise
Download this release

Release Info

Developer infinitewp
Plugin Icon 128x128 InfiniteWP Client
Version 1.2.0
Comparing to
See all releases

Code changes from version 1.1.10 to 1.2.0

addons/backup_repository/backup_repository.class.php CHANGED
@@ -58,23 +58,29 @@ class IWP_MMB_Backup_Repository extends IWP_MMB_Backup
58
  if ($backup_file && file_exists($backup_file)) {
59
  //FTP, Amazon S3 or Dropbox
60
  if (isset($account_info['iwp_ftp']) && !empty($account_info)) {
 
61
  $account_info['iwp_ftp']['backup_file'] = $backup_file;
62
  iwp_mmb_print_flush('FTP upload: Start');
63
  $return = $this->ftp_backup($account_info['iwp_ftp']);
 
64
  iwp_mmb_print_flush('FTP upload: End');
65
  }
66
 
67
  if (isset($account_info['iwp_amazon_s3']) && !empty($account_info['iwp_amazon_s3'])) {
 
68
  $account_info['iwp_amazon_s3']['backup_file'] = $backup_file;
69
  iwp_mmb_print_flush('Amazon S3 upload: Start');
70
  $return = $this->amazons3_backup($account_info['iwp_amazon_s3']);
 
71
  iwp_mmb_print_flush('Amazon S3 upload: End');
72
  }
73
 
74
  if (isset($account_info['iwp_dropbox']) && !empty($account_info['iwp_dropbox'])) {
 
75
  $account_info['iwp_dropbox']['backup_file'] = $backup_file;
76
  iwp_mmb_print_flush('Dropbox upload: Start');
77
  $return = $this->dropbox_backup($account_info['iwp_dropbox']);
 
78
  iwp_mmb_print_flush('Dropbox upload: End');
79
  }
80
 
58
  if ($backup_file && file_exists($backup_file)) {
59
  //FTP, Amazon S3 or Dropbox
60
  if (isset($account_info['iwp_ftp']) && !empty($account_info)) {
61
+ $this->update_status($task_name, 'ftp');
62
  $account_info['iwp_ftp']['backup_file'] = $backup_file;
63
  iwp_mmb_print_flush('FTP upload: Start');
64
  $return = $this->ftp_backup($account_info['iwp_ftp']);
65
+ $this->update_status($task_name, 'ftp', true);
66
  iwp_mmb_print_flush('FTP upload: End');
67
  }
68
 
69
  if (isset($account_info['iwp_amazon_s3']) && !empty($account_info['iwp_amazon_s3'])) {
70
+ $this->update_status($task_name, 's3');
71
  $account_info['iwp_amazon_s3']['backup_file'] = $backup_file;
72
  iwp_mmb_print_flush('Amazon S3 upload: Start');
73
  $return = $this->amazons3_backup($account_info['iwp_amazon_s3']);
74
+ $this->update_status($task_name, 's3', true);
75
  iwp_mmb_print_flush('Amazon S3 upload: End');
76
  }
77
 
78
  if (isset($account_info['iwp_dropbox']) && !empty($account_info['iwp_dropbox'])) {
79
+ $this->update_status($task_name, 'dropbox');
80
  $account_info['iwp_dropbox']['backup_file'] = $backup_file;
81
  iwp_mmb_print_flush('Dropbox upload: Start');
82
  $return = $this->dropbox_backup($account_info['iwp_dropbox']);
83
+ $this->update_status($task_name, 'dropbox', true);
84
  iwp_mmb_print_flush('Dropbox upload: End');
85
  }
86
 
backup.class.php CHANGED
@@ -172,12 +172,13 @@ if (is_array($params['account_info'])) { //only if sends from IWP Admin Panel fi
172
  }
173
  }
174
 
175
- if (isset($time) && $time) { //set next result time before backup
176
  if (is_array($before[$task_name]['task_results'])) {
177
  $before[$task_name]['task_results'] = array_values($before[$task_name]['task_results']);
178
  }
179
- $before[$task_name]['task_results'][count($before[$task_name]['task_results'])]['time'] = $time;
180
- }
 
181
 
182
  $this->update_tasks($before);
183
  //update_option('iwp_client_backup_tasks', $before);
@@ -321,7 +322,10 @@ function delete_task_now($task_name){
321
 
322
  extract($args); //extract settings
323
 
324
- //Try increase memory limit and execution time
 
 
 
325
  $this->set_memory();
326
 
327
  //Remove old backup(s)
@@ -356,7 +360,7 @@ function delete_task_now($task_name){
356
  //What to backup - db or full?
357
  if (trim($what) == 'db') {
358
  //Take database backup
359
- $this->update_status($task_name, $this->statuses['db_dump']);
360
  $GLOBALS['fail_safe_db'] = $this->tasks[$task_name]['task_args']['fail_safe_db'];
361
 
362
  $db_result = $this->backup_db();
@@ -369,12 +373,17 @@ function delete_task_now($task_name){
369
  'error' => $db_result['error']
370
  );
371
  } else {
372
- $this->update_status($task_name, $this->statuses['db_dump'], true);
373
- $this->update_status($task_name, $this->statuses['db_zip']);
374
 
375
  /*zip_backup_db*/
376
  $fail_safe_files = $this->tasks[$task_name]['task_args']['fail_safe_files'];
377
  $disable_comp = $this->tasks[$task_name]['task_args']['disable_comp'];
 
 
 
 
 
378
  $comp_level = $disable_comp ? '-0' : '-1';
379
  chdir(IWP_BACKUP_DIR);
380
  $zip = $this->get_zip();
@@ -395,33 +404,7 @@ function delete_task_now($task_name){
395
  }
396
 
397
  if (!$zip_archive_db_result) {
398
- iwp_mmb_print_flush('DB ZIP PCL: Start');
399
- // fallback to pclzip
400
- define('PCLZIP_TEMPORARY_DIR', IWP_BACKUP_DIR . '/');
401
- //require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
402
- require_once $GLOBALS['iwp_mmb_plugin_dir'].'/pclzip.class.php';
403
- $archive = new IWPPclZip($backup_file);
404
-
405
- if($fail_safe_files && $disable_comp){
406
- $result = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1);
407
- }
408
- elseif(!$fail_safe_files && $disable_comp){
409
- $result = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_NO_COMPRESSION);
410
- }
411
- elseif($fail_safe_files && !$disable_comp){
412
- $result = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1);
413
- }
414
- else{
415
- $result = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR);
416
- }
417
- iwp_mmb_print_flush('DB ZIP PCL: End');
418
- @unlink($db_result);
419
- @unlink(IWP_BACKUP_DIR.'/iwp_db/index.php');
420
- @rmdir(IWP_DB_DIR);
421
- if (!$result) {
422
- return array(
423
- 'error' => 'Failed to zip database (pclZip - ' . $archive->error_code . '): .' . $archive->error_string
424
- );
425
  }
426
  }
427
  }
@@ -434,7 +417,7 @@ function delete_task_now($task_name){
434
  'error' => 'Failed to zip database.'
435
  );
436
  }*///commented because of zipArchive
437
- $this->update_status($task_name, $this->statuses['db_zip'], true);
438
  }
439
  } elseif (trim($what) == 'full') {
440
  $content_backup = $this->backup_full($task_name, $backup_file, $exclude, $include);
@@ -496,27 +479,27 @@ function delete_task_now($task_name){
496
  $paths['time'] = time();
497
 
498
 
499
- if ($task_name != 'Backup Now') {
500
- $paths['status'] = $temp[count($temp) - 1]['status'];
 
501
  $temp[count($temp) - 1] = $paths;
502
 
 
503
  } else {
504
  $temp[count($temp)] = $paths;
505
  }
 
506
 
507
  $backup_settings[$task_name]['task_results'] = $temp;
508
  $this->update_tasks($backup_settings);
509
  //update_option('iwp_client_backup_tasks', $backup_settings);
510
  }
511
 
512
- //Additional: Email, ftp, amazon_s3, dropbox...
513
- /*
514
- //IWP Remove starts here //IWP Remove ends here
515
- */
516
  if ($task_name != 'Backup Now') {
517
 
518
  if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
519
- $this->update_status($task_name, $this->statuses['ftp']);
520
  $account_info['iwp_ftp']['backup_file'] = $backup_file;
521
  iwp_mmb_print_flush('FTP upload: Start');
522
  $ftp_result = $this->ftp_backup($account_info['iwp_ftp']);
@@ -529,11 +512,11 @@ function delete_task_now($task_name){
529
  return $ftp_result;
530
  }
531
  $this->wpdb_reconnect();
532
- $this->update_status($task_name, $this->statuses['ftp'], true);
533
  }
534
 
535
  if (isset($account_info['iwp_amazon_s3']) && !empty($account_info['iwp_amazon_s3'])) {
536
- $this->update_status($task_name, $this->statuses['s3']);
537
  $account_info['iwp_amazon_s3']['backup_file'] = $backup_file;
538
  iwp_mmb_print_flush('Amazon S3 upload: Start');
539
  $amazons3_result = $this->amazons3_backup($account_info['iwp_amazon_s3']);
@@ -545,11 +528,11 @@ function delete_task_now($task_name){
545
  return $amazons3_result;
546
  }
547
  $this->wpdb_reconnect();
548
- $this->update_status($task_name, $this->statuses['s3'], true);
549
  }
550
 
551
  if (isset($account_info['iwp_dropbox']) && !empty($account_info['iwp_dropbox'])) {
552
- $this->update_status($task_name, $this->statuses['dropbox']);
553
  $account_info['iwp_dropbox']['backup_file'] = $backup_file;
554
  iwp_mmb_print_flush('Dropbox upload: Start');
555
  $dropbox_result = $this->dropbox_backup($account_info['iwp_dropbox']);
@@ -562,7 +545,7 @@ function delete_task_now($task_name){
562
  return $dropbox_result;
563
  }
564
  $this->wpdb_reconnect();
565
- $this->update_status($task_name, $this->statuses['dropbox'], true);
566
  }
567
 
568
  if ($del_host_file) {
@@ -571,7 +554,8 @@ function delete_task_now($task_name){
571
 
572
  } //end additional
573
 
574
- //$this->update_status($task_name,$this->statuses['finished'],true);
 
575
  return $backup_url; //Return url to backup file
576
  }
577
 
@@ -582,7 +566,7 @@ function delete_task_now($task_name){
582
  global $zip_errors;
583
  $sys = substr(PHP_OS, 0, 3);
584
 
585
- $this->update_status($task_name, $this->statuses['db_dump']);
586
  $GLOBALS['fail_safe_db'] = $this->tasks[$task_name]['task_args']['fail_safe_db'];
587
  $db_result = $this->backup_db();
588
 
@@ -596,12 +580,17 @@ function delete_task_now($task_name){
596
  );
597
  }
598
 
599
- $this->update_status($task_name, $this->statuses['db_dump'], true);
600
- $this->update_status($task_name, $this->statuses['db_zip']);
601
 
602
  /*zip_backup_db*/
603
  $fail_safe_files = $this->tasks[$task_name]['task_args']['fail_safe_files'];
604
  $disable_comp = $this->tasks[$task_name]['task_args']['disable_comp'];
 
 
 
 
 
605
  $comp_level = $disable_comp ? '-0' : '-1';
606
  $zip = $this->get_zip();
607
  iwp_mmb_print_flush('DB ZIP CMD: Start');
@@ -624,42 +613,15 @@ function delete_task_now($task_name){
624
  }
625
 
626
  if (!$zip_archive_db_result) {
627
- iwp_mmb_print_flush('DB ZIP PCL: Start');
628
- define('PCLZIP_TEMPORARY_DIR', IWP_BACKUP_DIR . '/');
629
- require_once $GLOBALS['iwp_mmb_plugin_dir'].'/pclzip.class.php';
630
- $archive = new IWPPclZip($backup_file);
631
-
632
- if($fail_safe_files && $disable_comp){
633
- $result_db = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1);
634
  }
635
- elseif(!$fail_safe_files && $disable_comp){
636
- $result_db = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_NO_COMPRESSION);
637
  }
638
- elseif($fail_safe_files && !$disable_comp){
639
- $result_db = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1);
640
- }
641
- else{
642
- $result_db = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR);
643
  }
644
- iwp_mmb_print_flush('DB ZIP PCL: End');
645
-
646
  @unlink($db_result);
647
  @unlink(IWP_BACKUP_DIR.'/iwp_db/index.php');
648
  @rmdir(IWP_DB_DIR);
649
 
650
- if (!$result_db) {
651
- return array(
652
- 'error' => 'Failed to zip database. pclZip error (' . $archive->error_code . '): .' . $archive->error_string
653
- );
654
- }
655
- }
656
- }
657
-
658
- @unlink($db_result);
659
- @unlink(IWP_BACKUP_DIR.'/iwp_db/index.php');
660
- @rmdir(IWP_DB_DIR);
661
-
662
- $this->update_status($task_name, $this->statuses['db_zip'], true);
663
 
664
 
665
  //Always remove backup folders
@@ -744,9 +706,13 @@ function delete_task_now($task_name){
744
  }
745
  }
746
 
747
- $this->update_status($task_name, $this->statuses['files_zip']);
748
  chdir(ABSPATH);
749
 
 
 
 
 
750
  $do_cmd_zip_alternative = false;
751
  @copy($backup_file, $backup_file.'_2');
752
 
@@ -802,7 +768,22 @@ function delete_task_now($task_name){
802
  }
803
 
804
 
805
- if (!$zip_archive_result) { //Try pclZip
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
806
  iwp_mmb_print_flush('Files ZIP PCL: Start');
807
  if (!isset($archive)) {
808
  define('PCLZIP_TEMPORARY_DIR', IWP_BACKUP_DIR . '/');
@@ -871,15 +852,41 @@ function delete_task_now($task_name){
871
  'error' => 'Failed to zip files. pclZip error (' . $archive->error_code . '): .' . $archive->error_string
872
  );
873
  }
874
- }
875
  }
876
  //Reconnect
877
- $this->wpdb_reconnect();
878
-
879
- $this->update_status($task_name, $this->statuses['files_zip'], true);
880
- return true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
881
  }
 
 
 
 
 
 
882
 
 
 
 
 
 
 
883
  /**
884
  * Zipping database dump and index.php in folder iwp_db by ZipArchive class, requires php zip extension.
885
  *
@@ -994,6 +1001,12 @@ function delete_task_now($task_name){
994
  }
995
 
996
  $file = $db_folder . DB_NAME . '.sql';
 
 
 
 
 
 
997
  $result = $this->backup_db_dump($file); // try mysqldump always then fallback to php dump
998
  return $result;
999
  }
@@ -1174,11 +1187,112 @@ function delete_task_now($task_name){
1174
  return $file;
1175
 
1176
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1177
 
1178
  function restore($args)
1179
  {
1180
 
1181
- global $wpdb;
1182
  if (empty($args)) {
1183
  return false;
1184
  }
@@ -1187,11 +1301,13 @@ function delete_task_now($task_name){
1187
  $this->set_memory();
1188
 
1189
  $unlink_file = true; //Delete file after restore
 
 
1190
 
1191
  //Detect source
1192
  if ($backup_url) {
1193
  //This is for clone (overwrite)
1194
- include_once ABSPATH . 'wp-admin/includes/file.php';
1195
  $backup_file = download_url($backup_url);
1196
  if (is_wp_error($backup_file)) {
1197
  return array(
@@ -1248,13 +1364,69 @@ function delete_task_now($task_name){
1248
 
1249
  $what = $tasks[$task_name]['task_args']['what'];
1250
  }
 
 
1251
 
1252
  $this->wpdb_reconnect();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1253
 
1254
  if ($backup_file && file_exists($backup_file)) {
1255
  if ($overwrite) {
1256
  //Keep old db credentials before overwrite
1257
- if (!copy(ABSPATH . 'wp-config.php', ABSPATH . 'iwp-temp-wp-config.php')) {
1258
  @unlink($backup_file);
1259
  return array(
1260
  'error' => 'Error creating wp-config. Please check your write permissions.'
@@ -1288,11 +1460,15 @@ function delete_task_now($task_name){
1288
  $restore_options['iwp_client_user_hit_count'] = serialize(get_option('iwp_client_user_hit_count'));
1289
  $restore_options['iwp_client_backup_tasks'] = serialize(get_option('iwp_client_backup_tasks'));
1290
  }
 
 
1291
 
1292
-
1293
- chdir(ABSPATH);
 
 
1294
  $unzip = $this->get_unzip();
1295
- $command = "$unzip -o $backup_file";
1296
  iwp_mmb_print_flush('ZIP Extract CMD: Start');
1297
  ob_start();
1298
  $result = $this->iwp_mmb_exec($command);
@@ -1305,14 +1481,14 @@ function delete_task_now($task_name){
1305
  require_once $GLOBALS['iwp_mmb_plugin_dir'].'/pclzip.class.php';
1306
  iwp_mmb_print_flush('ZIP Extract PCL: Start');
1307
  $archive = new IWPPclZip($backup_file);
1308
- $result = $archive->extract(PCLZIP_OPT_PATH, ABSPATH, PCLZIP_OPT_REPLACE_NEWER);
1309
  iwp_mmb_print_flush('ZIP Extract PCL: End');
1310
  }
1311
  $this->wpdb_reconnect();
1312
 
1313
- if ($unlink_file) {
1314
  @unlink($backup_file);
1315
- }
1316
 
1317
  if (!$result) {
1318
  return array(
@@ -1320,7 +1496,7 @@ function delete_task_now($task_name){
1320
  );
1321
  }
1322
 
1323
- $db_result = $this->restore_db();
1324
 
1325
  if (!$db_result) {
1326
  return array(
@@ -1337,26 +1513,46 @@ function delete_task_now($task_name){
1337
  'error' => 'Error while restoring. The WP root directory is not writable. Set write permission(755 or 777).'
1338
  );
1339
  }
 
 
 
 
 
 
 
 
 
 
 
1340
 
1341
  $this->wpdb_reconnect();
 
 
1342
 
1343
  //Replace options and content urls
1344
  if ($overwrite) {
1345
  //Get New Table prefix
1346
  $new_table_prefix = trim($this->get_table_prefix());
1347
  //Retrieve old wp_config
1348
- @unlink(ABSPATH . 'wp-config.php');
 
1349
  //Replace table prefix
1350
- $lines = file(ABSPATH . 'iwp-temp-wp-config.php');
 
1351
 
 
1352
  foreach ($lines as $line) {
1353
  if (strstr($line, '$table_prefix')) {
1354
  $line = '$table_prefix = "' . $new_table_prefix . '";' . PHP_EOL;
1355
  }
1356
- file_put_contents(ABSPATH . 'wp-config.php', $line, FILE_APPEND);
 
1357
  }
 
 
1358
 
1359
- @unlink(ABSPATH . 'iwp-temp-wp-config.php');
 
1360
 
1361
  //Replace options
1362
  $query = "SELECT option_value FROM " . $new_table_prefix . "options WHERE option_name = 'home'";
@@ -1428,7 +1624,7 @@ function delete_task_now($task_name){
1428
  $wpdb->query($query);
1429
 
1430
  //Check for .htaccess permalinks update
1431
- $this->replace_htaccess($home);
1432
  } else {
1433
  //restore client options
1434
  if (is_array($restore_options) && !empty($restore_options)) {
@@ -1449,15 +1645,19 @@ function delete_task_now($task_name){
1449
  }
1450
  }
1451
  }
 
 
 
 
1452
 
1453
  return !empty($new_user) ? $new_user : true ;
1454
  }
1455
 
1456
- function restore_db()
1457
  {
1458
  global $wpdb;
1459
  $paths = $this->check_mysql_paths();
1460
- $file_path = ABSPATH . 'iwp_db';
1461
  @chmod($file_path,0755);
1462
  $file_name = glob($file_path . '/*.sql');
1463
  $file_name = $file_name[0];
@@ -1480,7 +1680,8 @@ function delete_task_now($task_name){
1480
 
1481
 
1482
  @unlink($file_name);
1483
- @unlink(dirname($file_name));//remove its folder
 
1484
  return true;
1485
  }
1486
 
@@ -1864,7 +2065,9 @@ function ftp_backup($args)
1864
  @ftp_pasv($conn_id,true);
1865
  }
1866
 
1867
- $temp = ABSPATH . 'iwp_temp_backup.zip';
 
 
1868
  $get = ftp_get($conn_id, $temp, $ftp_remote_folder . '/' . $backup_file, FTP_BINARY);
1869
  if ($get === false) {
1870
  return false;
@@ -1948,7 +2151,8 @@ function ftp_backup($args)
1948
  if ($dropbox_site_folder == true)
1949
  $dropbox_destination .= '/' . $this->site_name;
1950
 
1951
- $temp = ABSPATH . 'iwp_temp_backup.zip';
 
1952
 
1953
  try {
1954
 
@@ -2045,7 +2249,8 @@ function ftp_backup($args)
2045
  if ($as3_site_folder == true)
2046
  $as3_directory .= '/' . $this->site_name;
2047
 
2048
- $temp = ABSPATH . 'iwp_temp_backup.zip';
 
2049
  $s3->get_object($as3_bucket, $as3_directory . '/' . $backup_file, array("fileDownload" => $temp));
2050
  } catch (Exception $e){
2051
  return $temp;
@@ -2169,9 +2374,7 @@ function ftp_backup($args)
2169
  return $stats;
2170
  }
2171
 
2172
- /*
2173
- //IWP Remove starts here//IWP Remove ends here
2174
- */
2175
  function get_next_schedules()
2176
  {
2177
  $stats = array();
@@ -2409,22 +2612,27 @@ function get_next_schedules()
2409
  7 - Email
2410
  100 - Finished
2411
  */
2412
- if ($task_name != 'Backup Now') {
2413
  $tasks = $this->tasks;
2414
  $index = count($tasks[$task_name]['task_results']) - 1;
2415
- if (!is_array($tasks[$task_name]['task_results'][$index]['status'])) {
2416
- $tasks[$task_name]['task_results'][$index]['status'] = array();
 
 
2417
  }
 
2418
  if (!$completed) {
2419
- $tasks[$task_name]['task_results'][$index]['status'][] = (int) $status * (-1);
 
2420
  } else {
2421
  $status_index = count($tasks[$task_name]['task_results'][$index]['status']) - 1;
2422
- $tasks[$task_name]['task_results'][$index]['status'][$status_index] = abs($tasks[$task_name]['task_results'][$index]['status'][$status_index]);
 
2423
  }
2424
 
2425
  $this->update_tasks($tasks);
2426
  //update_option('iwp_client_backup_tasks',$tasks);
2427
- }
2428
  }
2429
 
2430
  function update_tasks($tasks)
@@ -2445,17 +2653,20 @@ function get_next_schedules()
2445
  }
2446
  }
2447
 
2448
- function replace_htaccess($url)
2449
  {
2450
- $file = @file_get_contents(ABSPATH.'.htaccess');
2451
- if ($file && strlen($file)) {
2452
- $args = parse_url($url);
2453
- $string = rtrim($args['path'], "/");
2454
- $regex = "/BEGIN WordPress(.*?)RewriteBase(.*?)\n(.*?)RewriteRule \.(.*?)index\.php(.*?)END WordPress/sm";
2455
- $replace = "BEGIN WordPress$1RewriteBase " . $string . "/ \n$3RewriteRule . " . $string . "/index.php$5END WordPress";
2456
- $file = preg_replace($regex, $replace, $file);
2457
- @file_put_contents(ABSPATH.'.htaccess', $file);
2458
- }
 
 
 
2459
  }
2460
 
2461
  function check_cron_remove(){
@@ -2513,6 +2724,13 @@ function get_next_schedules()
2513
  unset($params['backups']);
2514
  return $params;
2515
  }
 
 
 
 
 
 
 
2516
  }
2517
 
2518
  /*if( function_exists('add_filter') ){
172
  }
173
  }
174
 
175
+ // if (isset($time) && $time) { //set next result time before backup
176
  if (is_array($before[$task_name]['task_results'])) {
177
  $before[$task_name]['task_results'] = array_values($before[$task_name]['task_results']);
178
  }
179
+ $before[$task_name]['task_results'][count($before[$task_name]['task_results'])]['time'] = (isset($time) && $time) ? $time : time();
180
+ //}
181
+
182
 
183
  $this->update_tasks($before);
184
  //update_option('iwp_client_backup_tasks', $before);
322
 
323
  extract($args); //extract settings
324
 
325
+ //$adminHistoryID - admin panel history ID for backup task.
326
+
327
+
328
+ //Try increase memory limit and execution time
329
  $this->set_memory();
330
 
331
  //Remove old backup(s)
360
  //What to backup - db or full?
361
  if (trim($what) == 'db') {
362
  //Take database backup
363
+ $this->update_status($task_name, 'db_dump');
364
  $GLOBALS['fail_safe_db'] = $this->tasks[$task_name]['task_args']['fail_safe_db'];
365
 
366
  $db_result = $this->backup_db();
373
  'error' => $db_result['error']
374
  );
375
  } else {
376
+ $this->update_status($task_name, 'db_dump', true);
377
+ $this->update_status($task_name, 'db_zip');
378
 
379
  /*zip_backup_db*/
380
  $fail_safe_files = $this->tasks[$task_name]['task_args']['fail_safe_files'];
381
  $disable_comp = $this->tasks[$task_name]['task_args']['disable_comp'];
382
+
383
+ if($fail_safe_files){
384
+ $this->fail_safe_pcl_db($backup_file,$fail_safe_files,$disable_comp);
385
+ }
386
+ else{
387
  $comp_level = $disable_comp ? '-0' : '-1';
388
  chdir(IWP_BACKUP_DIR);
389
  $zip = $this->get_zip();
404
  }
405
 
406
  if (!$zip_archive_db_result) {
407
+ $this->fail_safe_pcl_db($backup_file,$fail_safe_files,$disable_comp);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
408
  }
409
  }
410
  }
417
  'error' => 'Failed to zip database.'
418
  );
419
  }*///commented because of zipArchive
420
+ $this->update_status($task_name, 'db_zip', true);
421
  }
422
  } elseif (trim($what) == 'full') {
423
  $content_backup = $this->backup_full($task_name, $backup_file, $exclude, $include);
479
  $paths['time'] = time();
480
 
481
 
482
+ //if ($task_name != 'Backup Now') {
483
+ $paths['backhack_status'] = $temp[count($temp) - 1]['backhack_status'];
484
+ //$paths['status'] = $temp[count($temp) - 1]['status'];
485
  $temp[count($temp) - 1] = $paths;
486
 
487
+ /*
488
  } else {
489
  $temp[count($temp)] = $paths;
490
  }
491
+ */
492
 
493
  $backup_settings[$task_name]['task_results'] = $temp;
494
  $this->update_tasks($backup_settings);
495
  //update_option('iwp_client_backup_tasks', $backup_settings);
496
  }
497
 
498
+
 
 
 
499
  if ($task_name != 'Backup Now') {
500
 
501
  if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
502
+ $this->update_status($task_name, 'ftp');
503
  $account_info['iwp_ftp']['backup_file'] = $backup_file;
504
  iwp_mmb_print_flush('FTP upload: Start');
505
  $ftp_result = $this->ftp_backup($account_info['iwp_ftp']);
512
  return $ftp_result;
513
  }
514
  $this->wpdb_reconnect();
515
+ $this->update_status($task_name, 'ftp', true);
516
  }
517
 
518
  if (isset($account_info['iwp_amazon_s3']) && !empty($account_info['iwp_amazon_s3'])) {
519
+ $this->update_status($task_name, 's3');
520
  $account_info['iwp_amazon_s3']['backup_file'] = $backup_file;
521
  iwp_mmb_print_flush('Amazon S3 upload: Start');
522
  $amazons3_result = $this->amazons3_backup($account_info['iwp_amazon_s3']);
528
  return $amazons3_result;
529
  }
530
  $this->wpdb_reconnect();
531
+ $this->update_status($task_name, 's3', true);
532
  }
533
 
534
  if (isset($account_info['iwp_dropbox']) && !empty($account_info['iwp_dropbox'])) {
535
+ $this->update_status($task_name, 'dropbox');
536
  $account_info['iwp_dropbox']['backup_file'] = $backup_file;
537
  iwp_mmb_print_flush('Dropbox upload: Start');
538
  $dropbox_result = $this->dropbox_backup($account_info['iwp_dropbox']);
545
  return $dropbox_result;
546
  }
547
  $this->wpdb_reconnect();
548
+ $this->update_status($task_name, 'dropbox', true);
549
  }
550
 
551
  if ($del_host_file) {
554
 
555
  } //end additional
556
 
557
+ $this->update_status($task_name,'finished',true);
558
+
559
  return $backup_url; //Return url to backup file
560
  }
561
 
566
  global $zip_errors;
567
  $sys = substr(PHP_OS, 0, 3);
568
 
569
+ $this->update_status($task_name, 'db_dump');
570
  $GLOBALS['fail_safe_db'] = $this->tasks[$task_name]['task_args']['fail_safe_db'];
571
  $db_result = $this->backup_db();
572
 
580
  );
581
  }
582
 
583
+ $this->update_status($task_name, 'db_dump', true);
584
+ $this->update_status($task_name, 'db_zip');
585
 
586
  /*zip_backup_db*/
587
  $fail_safe_files = $this->tasks[$task_name]['task_args']['fail_safe_files'];
588
  $disable_comp = $this->tasks[$task_name]['task_args']['disable_comp'];
589
+
590
+ if($fail_safe_files){
591
+ $this->fail_safe_pcl_db($backup_file,$fail_safe_files,$disable_comp);
592
+ }
593
+ else{
594
  $comp_level = $disable_comp ? '-0' : '-1';
595
  $zip = $this->get_zip();
596
  iwp_mmb_print_flush('DB ZIP CMD: Start');
613
  }
614
 
615
  if (!$zip_archive_db_result) {
616
+ $this->fail_safe_pcl_db($backup_file,$fail_safe_files,$disable_comp);
 
 
 
 
 
 
617
  }
 
 
618
  }
 
 
 
 
 
619
  }
 
 
620
  @unlink($db_result);
621
  @unlink(IWP_BACKUP_DIR.'/iwp_db/index.php');
622
  @rmdir(IWP_DB_DIR);
623
 
624
+ $this->update_status($task_name, 'db_zip', true);
 
 
 
 
 
 
 
 
 
 
 
 
625
 
626
 
627
  //Always remove backup folders
706
  }
707
  }
708
 
709
+ $this->update_status($task_name, 'files_zip');
710
  chdir(ABSPATH);
711
 
712
+ if($fail_safe_files){
713
+ $this->fail_safe_pcl_files($task_name, $backup_file, $exclude, $include, $fail_safe_files, $disable_comp, $add, $remove);
714
+ }
715
+ else{
716
  $do_cmd_zip_alternative = false;
717
  @copy($backup_file, $backup_file.'_2');
718
 
768
  }
769
 
770
 
771
+ if (!$zip_archive_result) {
772
+ $this->fail_safe_pcl_files($task_name, $backup_file, $exclude, $include, $fail_safe_files, $disable_comp, $add, $remove);
773
+ }
774
+ }
775
+ }
776
+
777
+ //Reconnect
778
+ $this->wpdb_reconnect();
779
+
780
+ $this->update_status($task_name, 'files_zip', true);
781
+ return true;
782
+ }
783
+
784
+
785
+ function fail_safe_pcl_files($task_name, $backup_file, $exclude, $include, $fail_safe_files, $disable_comp, $add, $remove){ //Try pclZip
786
+ //$this->back_hack($task_name, 'Files ZIP PCL: Start');
787
  iwp_mmb_print_flush('Files ZIP PCL: Start');
788
  if (!isset($archive)) {
789
  define('PCLZIP_TEMPORARY_DIR', IWP_BACKUP_DIR . '/');
852
  'error' => 'Failed to zip files. pclZip error (' . $archive->error_code . '): .' . $archive->error_string
853
  );
854
  }
855
+ //}
856
  }
857
  //Reconnect
858
+ function fail_safe_pcl_db($backup_file,$fail_safe_files,$disable_comp){
859
+ //$this->back_hack($task_name, 'DB ZIP PCL: Start');
860
+ iwp_mmb_print_flush('DB ZIP PCL: Start');
861
+ define('PCLZIP_TEMPORARY_DIR', IWP_BACKUP_DIR . '/');
862
+ require_once $GLOBALS['iwp_mmb_plugin_dir'].'/pclzip.class.php';
863
+ $archive = new IWPPclZip($backup_file);
864
+
865
+ if($fail_safe_files && $disable_comp){
866
+ $result_db = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1);
867
+ }
868
+ elseif(!$fail_safe_files && $disable_comp){
869
+ $result_db = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_NO_COMPRESSION);
870
+ }
871
+ elseif($fail_safe_files && !$disable_comp){
872
+ $result_db = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1);
873
+ }
874
+ else{
875
+ $result_db = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR);
876
  }
877
+ //$this->back_hack($task_name, 'DB ZIP PCL: End');
878
+ iwp_mmb_print_flush('DB ZIP PCL: End');
879
+
880
+ @unlink($db_result);
881
+ @unlink(IWP_BACKUP_DIR.'/iwp_db/index.php');
882
+ @rmdir(IWP_DB_DIR);
883
 
884
+ if (!$result_db) {
885
+ return array(
886
+ 'error' => 'Failed to zip database. pclZip error (' . $archive->error_code . '): .' . $archive->error_string
887
+ );
888
+ }
889
+ }
890
  /**
891
  * Zipping database dump and index.php in folder iwp_db by ZipArchive class, requires php zip extension.
892
  *
1001
  }
1002
 
1003
  $file = $db_folder . DB_NAME . '.sql';
1004
+
1005
+ if($GLOBALS['fail_safe_db']){
1006
+ $result = $this->backup_db_php($file);
1007
+ return $result;
1008
+ }
1009
+
1010
  $result = $this->backup_db_dump($file); // try mysqldump always then fallback to php dump
1011
  return $result;
1012
  }
1187
  return $file;
1188
 
1189
  }
1190
+
1191
+ /**
1192
+ * Copies a directory from one location to another via the WordPress Filesystem Abstraction.
1193
+ * Assumes that WP_Filesystem() has already been called and setup.
1194
+ *
1195
+ * @since 2.5.0
1196
+ *
1197
+ * @param string $from source directory
1198
+ * @param string $to destination directory
1199
+ * @param array $skip_list a list of files/folders to skip copying
1200
+ * @return mixed WP_Error on failure, True on success.
1201
+ */
1202
+ function iwp_mmb_direct_to_any_copy_dir($from, $to, $skip_list = array() ) {//$from => direct file system, $to => automatic filesystem
1203
+ global $wp_filesystem;
1204
+
1205
+ $wp_temp_direct = new WP_Filesystem_Direct();
1206
+
1207
+
1208
+ $dirlist = $wp_temp_direct->dirlist($from);
1209
+
1210
+ $from = trailingslashit($from);
1211
+ $to = trailingslashit($to);
1212
+
1213
+ $skip_regex = '';
1214
+ foreach ( (array)$skip_list as $key => $skip_file )
1215
+ $skip_regex .= preg_quote($skip_file, '!') . '|';
1216
+
1217
+ if ( !empty($skip_regex) )
1218
+ $skip_regex = '!(' . rtrim($skip_regex, '|') . ')$!i';
1219
+
1220
+ foreach ( (array) $dirlist as $filename => $fileinfo ) {
1221
+ if ( !empty($skip_regex) )
1222
+ if ( preg_match($skip_regex, $from . $filename) )
1223
+ continue;
1224
+
1225
+ if ( 'f' == $fileinfo['type'] ) {
1226
+ if ( ! $this->iwp_mmb_direct_to_any_copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) ) {
1227
+ // If copy failed, chmod file to 0644 and try again.
1228
+ $wp_filesystem->chmod($to . $filename, 0644);
1229
+ if ( ! $this->iwp_mmb_direct_to_any_copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) )
1230
+ return new WP_Error('copy_failed', __('Could not copy file.'), $to . $filename);
1231
+ }
1232
+ } elseif ( 'd' == $fileinfo['type'] ) {
1233
+ if ( !$wp_filesystem->is_dir($to . $filename) ) {
1234
+ if ( !$wp_filesystem->mkdir($to . $filename, FS_CHMOD_DIR) )
1235
+ return new WP_Error('mkdir_failed', __('Could not create directory.'), $to . $filename);
1236
+ }
1237
+ $result = $this->iwp_mmb_direct_to_any_copy_dir($from . $filename, $to . $filename, $skip_list);
1238
+ if ( is_wp_error($result) )
1239
+ return $result;
1240
+ }
1241
+ }
1242
+ return true;
1243
+ }
1244
+
1245
+ function iwp_mmb_direct_to_any_copy($source, $destination, $overwrite = false, $mode = false){
1246
+ global $wp_filesystem;
1247
+ if($wp_filesystem->method == 'direct'){
1248
+ return $wp_filesystem->copy($source, $destination, $overwrite, $mode);
1249
+ }
1250
+ elseif($wp_filesystem->method == 'ftpext' || $wp_filesystem->method == 'ftpsockets'){
1251
+ if ( ! $overwrite && $wp_filesystem->exists($destination) )
1252
+ return false;
1253
+ //$content = $this->get_contents($source);
1254
+ // if ( false === $content)
1255
+ // return false;
1256
+
1257
+ //put content
1258
+ //$tempfile = wp_tempnam($file);
1259
+ $source_handle = fopen($source, 'r');
1260
+ if ( ! $source_handle )
1261
+ return false;
1262
+
1263
+ //fwrite($temp, $contents);
1264
+ //fseek($temp, 0); //Skip back to the start of the file being written to
1265
+
1266
+ $sample_content = fread($source_handle, (1024 * 1024 * 2));//1024 * 1024 * 2 => 2MB
1267
+ fseek($source_handle, 0); //Skip back to the start of the file being written to
1268
+
1269
+ $type = $wp_filesystem->is_binary($sample_content) ? FTP_BINARY : FTP_ASCII;
1270
+ unset($sample_content);
1271
+ if($wp_filesystem->method == 'ftpext'){
1272
+ $ret = @ftp_fput($wp_filesystem->link, $destination, $source_handle, $type);
1273
+ }
1274
+ elseif($wp_filesystem->method == 'ftpsockets'){
1275
+ $wp_filesystem->ftp->SetType($type);
1276
+ $ret = $wp_filesystem->ftp->fput($destination, $source_handle);
1277
+ }
1278
+
1279
+ fclose($source_handle);
1280
+ unlink($source);//to immediately save system space
1281
+ //unlink($tempfile);
1282
+
1283
+ $wp_filesystem->chmod($destination, $mode);
1284
+
1285
+ return $ret;
1286
+
1287
+ //return $this->put_contents($destination, $content, $mode);
1288
+ }
1289
+ }
1290
+
1291
 
1292
  function restore($args)
1293
  {
1294
 
1295
+ global $wpdb, $wp_filesystem;
1296
  if (empty($args)) {
1297
  return false;
1298
  }
1301
  $this->set_memory();
1302
 
1303
  $unlink_file = true; //Delete file after restore
1304
+
1305
+ include_once ABSPATH . 'wp-admin/includes/file.php';
1306
 
1307
  //Detect source
1308
  if ($backup_url) {
1309
  //This is for clone (overwrite)
1310
+
1311
  $backup_file = download_url($backup_url);
1312
  if (is_wp_error($backup_file)) {
1313
  return array(
1364
 
1365
  $what = $tasks[$task_name]['task_args']['what'];
1366
  }
1367
+
1368
+
1369
 
1370
  $this->wpdb_reconnect();
1371
+
1372
+ /////////////////// dev ////////////////////////
1373
+
1374
+
1375
+ if (!$this->is_server_writable()) {
1376
+ return array(
1377
+ 'error' => 'Failed, please add FTP details'
1378
+ );
1379
+ }
1380
+
1381
+ $url = wp_nonce_url('index.php?page=iwp_no_page','iwp_fs_cred');
1382
+ ob_start();
1383
+ if (false === ($creds = request_filesystem_credentials($url, '', false, ABSPATH, null) ) ) {
1384
+ return array(
1385
+ 'error' => 'Unable to get file system credentials'
1386
+ ); // stop processing here
1387
+ }
1388
+ ob_end_clean();
1389
+
1390
+ if ( ! WP_Filesystem($creds, ABSPATH) ) {
1391
+ //request_filesystem_credentials($url, '', true, false, null);
1392
+ return array(
1393
+ 'error' => 'Unable to initiate file system. Please check you have entered valid FTP credentials.'
1394
+ ); // stop processing here
1395
+ //return;
1396
+ }
1397
+
1398
+ require_once(ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php');//will be used to copy from temp directory
1399
+
1400
+ // do process
1401
+ $temp_dir = get_temp_dir();
1402
+ $new_temp_folder = trailingslashit($temp_dir).'IWP_Restore_temp_dir_kjhdsjfkhsdkhfksjhdfkjh/';//should be random
1403
+ mkdir($new_temp_folder, 0755);// new folder should be empty
1404
+
1405
+ //echo '<pre>$new_temp_folder:'; var_dump($new_temp_folder); echo '</pre>';
1406
+
1407
+
1408
+ $remote_abspath = $wp_filesystem->abspath();
1409
+ if(!empty($remote_abspath)){
1410
+ $remote_abspath = trailingslashit($remote_abspath);
1411
+ }else{
1412
+ return array(
1413
+ 'error' => 'Unable to locate WP root directory using file system.'
1414
+ );
1415
+ }
1416
+
1417
+ //global $wp_filesystem;
1418
+ // $wp_filesystem->put_contents(
1419
+ // '/tmp/example.txt',
1420
+ // 'Example contents of a file',
1421
+ // FS_CHMOD_FILE // predefined mode settings for WP files
1422
+ // );
1423
+
1424
+ /////////////////// dev ////////////////////////
1425
 
1426
  if ($backup_file && file_exists($backup_file)) {
1427
  if ($overwrite) {
1428
  //Keep old db credentials before overwrite
1429
+ if (!$wp_filesystem->copy($remote_abspath . 'wp-config.php', $remote_abspath . 'iwp-temp-wp-config.php', true)) {
1430
  @unlink($backup_file);
1431
  return array(
1432
  'error' => 'Error creating wp-config. Please check your write permissions.'
1460
  $restore_options['iwp_client_user_hit_count'] = serialize(get_option('iwp_client_user_hit_count'));
1461
  $restore_options['iwp_client_backup_tasks'] = serialize(get_option('iwp_client_backup_tasks'));
1462
  }
1463
+
1464
+
1465
 
1466
+
1467
+ //Backup file will be extracted to a temporary path
1468
+
1469
+ //chdir(ABSPATH);
1470
  $unzip = $this->get_unzip();
1471
+ $command = "$unzip -o $backup_file -d $new_temp_folder";
1472
  iwp_mmb_print_flush('ZIP Extract CMD: Start');
1473
  ob_start();
1474
  $result = $this->iwp_mmb_exec($command);
1481
  require_once $GLOBALS['iwp_mmb_plugin_dir'].'/pclzip.class.php';
1482
  iwp_mmb_print_flush('ZIP Extract PCL: Start');
1483
  $archive = new IWPPclZip($backup_file);
1484
+ $result = $archive->extract(PCLZIP_OPT_PATH, $new_temp_folder, PCLZIP_OPT_REPLACE_NEWER);
1485
  iwp_mmb_print_flush('ZIP Extract PCL: End');
1486
  }
1487
  $this->wpdb_reconnect();
1488
 
1489
+ /*if ($unlink_file) {
1490
  @unlink($backup_file);
1491
+ }*/
1492
 
1493
  if (!$result) {
1494
  return array(
1496
  );
1497
  }
1498
 
1499
+ $db_result = $this->restore_db($new_temp_folder);
1500
 
1501
  if (!$db_result) {
1502
  return array(
1513
  'error' => 'Error while restoring. The WP root directory is not writable. Set write permission(755 or 777).'
1514
  );
1515
  }
1516
+
1517
+
1518
+ //copy files from temp to ABSPATH
1519
+ $copy_result = $this->iwp_mmb_direct_to_any_copy_dir($new_temp_folder, $remote_abspath);
1520
+
1521
+ if ( is_wp_error($copy_result) ){
1522
+ $wp_temp_direct2 = WP_Filesystem_Direct();
1523
+ $wp_temp_direct2->delete($new_temp_folder, 2);
1524
+ return $copy_result;
1525
+ }
1526
+
1527
 
1528
  $this->wpdb_reconnect();
1529
+
1530
+
1531
 
1532
  //Replace options and content urls
1533
  if ($overwrite) {
1534
  //Get New Table prefix
1535
  $new_table_prefix = trim($this->get_table_prefix());
1536
  //Retrieve old wp_config
1537
+ //@unlink(ABSPATH . 'wp-config.php');
1538
+ $wp_filesystem->delete($remote_abspath . 'wp-config.php', false, 'f');
1539
  //Replace table prefix
1540
+ //$lines = file(ABSPATH . 'iwp-temp-wp-config.php');
1541
+ $lines = $wp_filesystem->get_contents_array($remote_abspath . 'iwp-temp-wp-config.php');
1542
 
1543
+ $new_lines = '';
1544
  foreach ($lines as $line) {
1545
  if (strstr($line, '$table_prefix')) {
1546
  $line = '$table_prefix = "' . $new_table_prefix . '";' . PHP_EOL;
1547
  }
1548
+ $new_lines .= $line;
1549
+ //file_put_contents(ABSPATH . 'wp-config.php', $line, FILE_APPEND);
1550
  }
1551
+
1552
+ $wp_filesystem->put_contents($remote_abspath . 'wp-config.php', $new_lines);
1553
 
1554
+ //@unlink(ABSPATH . 'iwp-temp-wp-config.php');
1555
+ $wp_filesystem->prefix($remote_abspath . 'iwp-temp-wp-config.php', false, 'f');
1556
 
1557
  //Replace options
1558
  $query = "SELECT option_value FROM " . $new_table_prefix . "options WHERE option_name = 'home'";
1624
  $wpdb->query($query);
1625
 
1626
  //Check for .htaccess permalinks update
1627
+ $this->replace_htaccess($home, $remote_abspath);
1628
  } else {
1629
  //restore client options
1630
  if (is_array($restore_options) && !empty($restore_options)) {
1645
  }
1646
  }
1647
  }
1648
+
1649
+ //clear the temp directory
1650
+ $wp_temp_direct2 = new WP_Filesystem_Direct();
1651
+ $wp_temp_direct2->delete($new_temp_folder, 2);
1652
 
1653
  return !empty($new_user) ? $new_user : true ;
1654
  }
1655
 
1656
+ function restore_db($new_temp_folder)
1657
  {
1658
  global $wpdb;
1659
  $paths = $this->check_mysql_paths();
1660
+ $file_path = $new_temp_folder . '/iwp_db';
1661
  @chmod($file_path,0755);
1662
  $file_name = glob($file_path . '/*.sql');
1663
  $file_name = $file_name[0];
1680
 
1681
 
1682
  @unlink($file_name);
1683
+ @unlink(dirname($file_name).'/index.php');
1684
+ @rmdir(dirname($file_name));//remove its folder
1685
  return true;
1686
  }
1687
 
2065
  @ftp_pasv($conn_id,true);
2066
  }
2067
 
2068
+ //$temp = ABSPATH . 'iwp_temp_backup.zip';
2069
+ $temp = wp_tempnam('iwp_temp_backup.zip');
2070
+
2071
  $get = ftp_get($conn_id, $temp, $ftp_remote_folder . '/' . $backup_file, FTP_BINARY);
2072
  if ($get === false) {
2073
  return false;
2151
  if ($dropbox_site_folder == true)
2152
  $dropbox_destination .= '/' . $this->site_name;
2153
 
2154
+ //$temp = ABSPATH . 'iwp_temp_backup.zip';
2155
+ $temp = wp_tempnam('iwp_temp_backup.zip');
2156
 
2157
  try {
2158
 
2249
  if ($as3_site_folder == true)
2250
  $as3_directory .= '/' . $this->site_name;
2251
 
2252
+ //$temp = ABSPATH . 'iwp_temp_backup.zip';
2253
+ $temp = wp_tempnam('iwp_temp_backup.zip');
2254
  $s3->get_object($as3_bucket, $as3_directory . '/' . $backup_file, array("fileDownload" => $temp));
2255
  } catch (Exception $e){
2256
  return $temp;
2374
  return $stats;
2375
  }
2376
 
2377
+
 
 
2378
  function get_next_schedules()
2379
  {
2380
  $stats = array();
2612
  7 - Email
2613
  100 - Finished
2614
  */
2615
+ //if ($task_name != 'Backup Now') {
2616
  $tasks = $this->tasks;
2617
  $index = count($tasks[$task_name]['task_results']) - 1;
2618
+ //!is_array($tasks[$task_name]['task_results'][$index]['status']) &&
2619
+ if (!is_array($tasks[$task_name]['task_results'][$index]['backhack_status'])) {
2620
+ //$tasks[$task_name]['task_results'][$index]['status'] = array();
2621
+ $tasks[$task_name]['task_results'][$index]['backhack_status'] = array();
2622
  }
2623
+ $tasks[$task_name]['task_results'][$index]['backhack_status']['adminHistoryID'] = $GLOBALS['IWP_CLIENT_HISTORY_ID'];
2624
  if (!$completed) {
2625
+ //$tasks[$task_name]['task_results'][$index]['status'][] = (int) $status * (-1);
2626
+ $tasks[$task_name]['task_results'][$index]['backhack_status'][$status]['start'] = microtime(true);
2627
  } else {
2628
  $status_index = count($tasks[$task_name]['task_results'][$index]['status']) - 1;
2629
+ //$tasks[$task_name]['task_results'][$index]['status'][$status_index] = abs($tasks[$task_name]['task_results'][$index]['status'][$status_index]);
2630
+ $tasks[$task_name]['task_results'][$index]['backhack_status'][$status]['end'] = microtime(true);
2631
  }
2632
 
2633
  $this->update_tasks($tasks);
2634
  //update_option('iwp_client_backup_tasks',$tasks);
2635
+ //}
2636
  }
2637
 
2638
  function update_tasks($tasks)
2653
  }
2654
  }
2655
 
2656
+ function replace_htaccess($url, $remote_abspath)
2657
  {
2658
+ global $wp_filesystem;
2659
+ //$file = @file_get_contents(ABSPATH.'.htaccess');
2660
+ $file = $wp_filesystem->get_contents($remote_abspath.'.htaccess');
2661
+ if ($file && strlen($file)) {
2662
+ $args = parse_url($url);
2663
+ $string = rtrim($args['path'], "/");
2664
+ $regex = "/BEGIN WordPress(.*?)RewriteBase(.*?)\n(.*?)RewriteRule \.(.*?)index\.php(.*?)END WordPress/sm";
2665
+ $replace = "BEGIN WordPress$1RewriteBase " . $string . "/ \n$3RewriteRule . " . $string . "/index.php$5END WordPress";
2666
+ $file = preg_replace($regex, $replace, $file);
2667
+ //@file_put_contents(ABSPATH.'.htaccess', $file);
2668
+ $wp_filesystem->put_contents($remote_abspath.'.htaccess', $file);
2669
+ }
2670
  }
2671
 
2672
  function check_cron_remove(){
2724
  unset($params['backups']);
2725
  return $params;
2726
  }
2727
+
2728
+ function is_server_writable(){
2729
+ if((!defined('FTP_HOST') || !defined('FTP_USER') || !defined('FTP_PASS')) && (get_filesystem_method(array(), ABSPATH) != 'direct'))
2730
+ return false;
2731
+ else
2732
+ return true;
2733
+ }
2734
  }
2735
 
2736
  /*if( function_exists('add_filter') ){
init.php CHANGED
@@ -4,7 +4,7 @@ Plugin Name: InfiniteWP - Client
4
  Plugin URI: http://infinitewp.com/
5
  Description: This is the client plugin of InfiniteWP that communicates with the InfiniteWP Admin panel.
6
  Author: Revmakx
7
- Version: 1.1.10
8
  Author URI: http://www.revmakx.com
9
  */
10
  /************************************************************
@@ -26,7 +26,7 @@ Author URI: http://www.revmakx.com
26
  **************************************************************/
27
 
28
  if(!defined('IWP_MMB_CLIENT_VERSION'))
29
- define('IWP_MMB_CLIENT_VERSION', '1.1.10');
30
 
31
 
32
  if ( !defined('IWP_MMB_XFRAME_COOKIE')){
@@ -83,9 +83,6 @@ if( !function_exists ( 'iwp_mmb_filter_params' )) {
83
  }
84
  }
85
 
86
-
87
-
88
-
89
  if( !function_exists ('iwp_mmb_parse_request')) {
90
  function iwp_mmb_parse_request()
91
  {
@@ -99,7 +96,7 @@ if( !function_exists ('iwp_mmb_parse_request')) {
99
  $data = base64_decode($HTTP_RAW_POST_DATA);
100
  if ($data){
101
  //$num = @extract(unserialize($data));
102
- $unserialized_data = unserialize($data);
103
  if(isset($unserialized_data['params'])){
104
  $unserialized_data['params'] = iwp_mmb_filter_params($unserialized_data['params']);
105
  }
@@ -133,6 +130,7 @@ if( !function_exists ('iwp_mmb_parse_request')) {
133
 
134
  $auth = $iwp_mmb_core->authenticate_message($action . $id, $signature, $id);
135
  if ($auth === true) {
 
136
 
137
  if(isset($params['username']) && !is_user_logged_in()){
138
  $user = function_exists('get_user_by') ? get_user_by('login', $params['username']) : get_userdatabylogin( $params['username'] );
4
  Plugin URI: http://infinitewp.com/
5
  Description: This is the client plugin of InfiniteWP that communicates with the InfiniteWP Admin panel.
6
  Author: Revmakx
7
+ Version: 1.2.0
8
  Author URI: http://www.revmakx.com
9
  */
10
  /************************************************************
26
  **************************************************************/
27
 
28
  if(!defined('IWP_MMB_CLIENT_VERSION'))
29
+ define('IWP_MMB_CLIENT_VERSION', '1.2.0');
30
 
31
 
32
  if ( !defined('IWP_MMB_XFRAME_COOKIE')){
83
  }
84
  }
85
 
 
 
 
86
  if( !function_exists ('iwp_mmb_parse_request')) {
87
  function iwp_mmb_parse_request()
88
  {
96
  $data = base64_decode($HTTP_RAW_POST_DATA);
97
  if ($data){
98
  //$num = @extract(unserialize($data));
99
+ $unserialized_data = @unserialize($data);
100
  if(isset($unserialized_data['params'])){
101
  $unserialized_data['params'] = iwp_mmb_filter_params($unserialized_data['params']);
102
  }
130
 
131
  $auth = $iwp_mmb_core->authenticate_message($action . $id, $signature, $id);
132
  if ($auth === true) {
133
+ $GLOBALS['IWP_CLIENT_HISTORY_ID'] = $id;
134
 
135
  if(isset($params['username']) && !is_user_logged_in()){
136
  $user = function_exists('get_user_by') ? get_user_by('login', $params['username']) : get_userdatabylogin( $params['username'] );
lib/amazon_s3/services/s3.class.php CHANGED
@@ -3686,10 +3686,10 @@ class AmazonS3 extends CFRuntime
3686
  {
3687
  $opt['partSize'] = 5242880; // 5 MB
3688
  }
3689
- // If more than 500 MB...
3690
- elseif ((integer) $opt['partSize'] > 524288000)
3691
  {
3692
- $opt['partSize'] = 524288000; // 500 MB
3693
  }
3694
  }
3695
  else
@@ -3737,6 +3737,7 @@ class AmazonS3 extends CFRuntime
3737
  $batch = new CFBatchRequest(isset($opt['limit']) ? (integer) $opt['limit'] : null);
3738
  foreach ($pieces as $i => $piece)
3739
  {
 
3740
  $this->batch($batch)->upload_part($bucket, $filename, $upload_id, array(
3741
  'expect' => '100-continue',
3742
  'fileUpload' => $opt['fileUpload'],
@@ -3745,6 +3746,7 @@ class AmazonS3 extends CFRuntime
3745
  'length' => (integer) $piece['length'],
3746
  ));
3747
  }
 
3748
 
3749
  // Send batch requests
3750
  $batch_responses = $this->batch($batch)->send();
3686
  {
3687
  $opt['partSize'] = 5242880; // 5 MB
3688
  }
3689
+ // If more than 50 MB...
3690
+ elseif ((integer) $opt['partSize'] > 52428800)
3691
  {
3692
+ $opt['partSize'] = 52428800; // 50 MB
3693
  }
3694
  }
3695
  else
3737
  $batch = new CFBatchRequest(isset($opt['limit']) ? (integer) $opt['limit'] : null);
3738
  foreach ($pieces as $i => $piece)
3739
  {
3740
+ iwp_mmb_auto_print('amazonS3_chucked_upload');
3741
  $this->batch($batch)->upload_part($bucket, $filename, $upload_id, array(
3742
  'expect' => '100-continue',
3743
  'fileUpload' => $opt['fileUpload'],
3746
  'length' => (integer) $piece['length'],
3747
  ));
3748
  }
3749
+ iwp_mmb_auto_print('amazonS3_chucked_upload');
3750
 
3751
  // Send batch requests
3752
  $batch_responses = $this->batch($batch)->send();
readme.txt CHANGED
@@ -2,7 +2,7 @@
2
  Contributors: infinitewp
3
  Tags: admin, administration, amazon, api, authentication, automatic, dashboard, dropbox, events, integration, manage, multisite, multiple, notification, performance, s3, security, seo, stats, tracking, infinitewp, updates, backup, restore, iwp, infinite
4
  Requires at least: 3.0
5
- Tested up to: 3.5.1
6
  Stable tag: trunk
7
 
8
  Install this plugin on unlimited sites and manage them all from a central dashboard.
@@ -48,6 +48,12 @@ Credits: [Vladimir Prelovac](http://prelovac.com/vladimir) for his worker plugin
48
 
49
  == Changelog ==
50
 
 
 
 
 
 
 
51
  = 1.1.10 =
52
  * Charset issue fixed for restore / clone
53
  * Dropbox improved
2
  Contributors: infinitewp
3
  Tags: admin, administration, amazon, api, authentication, automatic, dashboard, dropbox, events, integration, manage, multisite, multiple, notification, performance, s3, security, seo, stats, tracking, infinitewp, updates, backup, restore, iwp, infinite
4
  Requires at least: 3.0
5
+ Tested up to: 3.6
6
  Stable tag: trunk
7
 
8
  Install this plugin on unlimited sites and manage them all from a central dashboard.
48
 
49
  == Changelog ==
50
 
51
+ = 1.2.0 =
52
+ * Improvement: Backup fail safe option now uses only php db dump and pclZip
53
+ * Improvement: Better feedback regarding completion of backups even in case of error
54
+ * Improvement: Restore using file system (better handling of file permissions)
55
+ * Fix: Notice issue with unserialise
56
+
57
  = 1.1.10 =
58
  * Charset issue fixed for restore / clone
59
  * Dropbox improved