UpdraftPlus WordPress Backup Plugin - Version 1.16.5

Version Description

  • 28/Jan/2019 =

  • FEATURE: If a restoration is interrupted (e.g. PHP timeout), then the "Continue" feature can now resume not just at the most recent zip file, but within the zip file at the point it had reached (https://updraftplus.com/auto-resuming-interrupted-restores-part-2/)

  • FEATURE: Added command in WP-CLI which gives a list of incremental backups restore points.

  • FIX: Regression: When a Dropbox upload failed to complete, UpdraftPlus would log this but fail to retry

  • FIX: Again update phpseclib to the latest version which should now fix the 'SSH2 Server Host Key Algorithm Mismatch' on all installs

  • TWEAK: Fix a wrong variable reference in an error message

  • TWEAK: Only add the JavaScript for the incremental schedule selection on the UD settings page

  • TWEAK: Replace incidental use of ipinfo.io now that it requires a paid API key

  • TWEAK: The print_delete_old_dirs_form method should have been public to allow painting if the user clicked through the previous message

Download this release

Release Info

Developer DavidAnderson
Plugin Icon 128x128 UpdraftPlus WordPress Backup Plugin
Version 1.16.5
Comparing to
See all releases

Code changes from version 1.16.4 to 1.16.5

admin.php CHANGED
@@ -3151,7 +3151,13 @@ class UpdraftPlus_Admin {
3151
  return $this->include_template('wp-admin/advanced/advanced-tools.php', $return_instead_of_echo, $pass_through);
3152
  }
3153
 
3154
- private function print_delete_old_dirs_form($include_blurb = true, $include_div = true) {
 
 
 
 
 
 
3155
  if ($include_blurb) {
3156
  if ($include_div) {
3157
  echo '<div id="updraft_delete_old_dirs_pagediv" class="updated delete-old-directories">';
@@ -4476,7 +4482,7 @@ ENDHERE;
4476
  * Carry out the restore process within the WP admin dashboard, using data from $_POST
4477
  *
4478
  * @param Array $timestamp Identifying the backup to be restored
4479
- * @param Array|null $continuation_data For continuing a multi-stage restore; this is the saved jobdata for the job
4480
  * @return Boolean|WP_Error - a WP_Error indicates a terminal failure; false indicates not-yet complete (not necessarily terminal); true indicates complete.
4481
  */
4482
  private function restore_backup($timestamp, $continuation_data = null) {
@@ -4532,9 +4538,9 @@ ENDHERE;
4532
  add_action('updraftplus_restoration_title', array($this, 'restoration_title'));
4533
 
4534
  // We use a single object for each entity, because we want to store information about the backup set
4535
- $updraftplus_restorer = new Updraft_Restorer(new Updraft_Restorer_Skin, $backup_set, false, $restore_options);
4536
 
4537
- $restore_result = $updraftplus_restorer->perform_restore($entities_to_restore, $restore_options, $continuation_data);
4538
 
4539
  $updraftplus_restorer->post_restore_clean_up($restore_result);
4540
 
3151
  return $this->include_template('wp-admin/advanced/advanced-tools.php', $return_instead_of_echo, $pass_through);
3152
  }
3153
 
3154
+ /**
3155
+ * Paint the HTML for the form for deleting old directories
3156
+ *
3157
+ * @param Boolean $include_blurb - whether to include explanatory text
3158
+ * @param Boolean $include_div - whether to wrap inside a div tag
3159
+ */
3160
+ public function print_delete_old_dirs_form($include_blurb = true, $include_div = true) {
3161
  if ($include_blurb) {
3162
  if ($include_div) {
3163
  echo '<div id="updraft_delete_old_dirs_pagediv" class="updated delete-old-directories">';
4482
  * Carry out the restore process within the WP admin dashboard, using data from $_POST
4483
  *
4484
  * @param Array $timestamp Identifying the backup to be restored
4485
+ * @param Array|null $continuation_data For continuing a multi-stage restore; this is the saved jobdata for the job; in this method the keys used are second_loop_entities, restore_options; but it is also passed on to Updraft_Restorer::perform_restore()
4486
  * @return Boolean|WP_Error - a WP_Error indicates a terminal failure; false indicates not-yet complete (not necessarily terminal); true indicates complete.
4487
  */
4488
  private function restore_backup($timestamp, $continuation_data = null) {
4538
  add_action('updraftplus_restoration_title', array($this, 'restoration_title'));
4539
 
4540
  // We use a single object for each entity, because we want to store information about the backup set
4541
+ $updraftplus_restorer = new Updraft_Restorer(new Updraft_Restorer_Skin, $backup_set, false, $restore_options, $continuation_data);
4542
 
4543
+ $restore_result = $updraftplus_restorer->perform_restore($entities_to_restore, $restore_options);
4544
 
4545
  $updraftplus_restorer->post_restore_clean_up($restore_result);
4546
 
backup.php CHANGED
@@ -55,7 +55,7 @@ class UpdraftPlus_Backup {
55
 
56
  public $updraft_dir;
57
 
58
- private $blog_name;
59
 
60
  private $wpdb_obj;
61
 
@@ -91,19 +91,7 @@ class UpdraftPlus_Backup {
91
 
92
  global $updraftplus;
93
 
94
- // Get the blog name and rip out known-problematic characters. Remember that we may need to be able to upload this to any FTP server or cloud storage, where filename support may be unknown
95
- $blog_name = str_replace('__', '_', preg_replace('/[^A-Za-z0-9_]/', '', str_replace(' ', '_', substr(get_bloginfo(), 0, 32))));
96
- if (!$blog_name || preg_match('#^_+$#', $blog_name)) {
97
- // Try again...
98
- $parsed_url = parse_url(home_url(), PHP_URL_HOST);
99
- $parsed_subdir = untrailingslashit(parse_url(home_url(), PHP_URL_PATH));
100
- if ($parsed_subdir && '/' != $parsed_subdir) $parsed_url .= str_replace(array('/', '\\'), '_', $parsed_subdir);
101
- $blog_name = str_replace('__', '_', preg_replace('/[^A-Za-z0-9_]/', '', str_replace(' ', '_', substr($parsed_url, 0, 32))));
102
- if (!$blog_name || preg_match('#^_+$#', $blog_name)) $blog_name = 'WordPress_Backup';
103
- }
104
-
105
- // Allow an over-ride. Careful about introducing characters not supported by your filesystem or cloud storage.
106
- $this->blog_name = apply_filters('updraftplus_blog_name', $blog_name);
107
 
108
  // Decide which zip engine to begin with
109
  $this->debug = UpdraftPlus_Options::get_updraft_option('updraft_debug_mode');
@@ -160,6 +148,27 @@ class UpdraftPlus_Backup {
160
 
161
  }
162
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  /**
164
  * Called by the WP action updraft_report_remotestorage_extrainfo
165
  *
@@ -1303,7 +1312,7 @@ class UpdraftPlus_Backup {
1303
  */
1304
  private function get_backup_file_basename_from_time($use_time) {
1305
  global $updraftplus;
1306
- return apply_filters('updraftplus_get_backup_file_basename_from_time', 'backup_'.get_date_from_gmt(gmdate('Y-m-d H:i:s', $use_time), 'Y-m-d-Hi').'_'.$this->blog_name.'_'.$updraftplus->file_nonce, $use_time, $this->blog_name);
1307
  }
1308
 
1309
  private function find_existing_zips($dir, $match_nonce) {
55
 
56
  public $updraft_dir;
57
 
58
+ private $site_name;
59
 
60
  private $wpdb_obj;
61
 
91
 
92
  global $updraftplus;
93
 
94
+ $this->site_name = $this->get_site_name();
 
 
 
 
 
 
 
 
 
 
 
 
95
 
96
  // Decide which zip engine to begin with
97
  $this->debug = UpdraftPlus_Options::get_updraft_option('updraft_debug_mode');
148
 
149
  }
150
 
151
+ /**
152
+ * Get a site name suitable for use in the backup filename
153
+ *
154
+ * @return String
155
+ */
156
+ private function get_site_name() {
157
+ // Get the blog name and rip out known-problematic characters. Remember that we may need to be able to upload this to any FTP server or cloud storage, where filename support may be unknown
158
+ $site_name = str_replace('__', '_', preg_replace('/[^A-Za-z0-9_]/', '', str_replace(' ', '_', substr(get_bloginfo(), 0, 32))));
159
+ if (!$site_name || preg_match('#^_+$#', $site_name)) {
160
+ // Try again...
161
+ $parsed_url = parse_url(home_url(), PHP_URL_HOST);
162
+ $parsed_subdir = untrailingslashit(parse_url(home_url(), PHP_URL_PATH));
163
+ if ($parsed_subdir && '/' != $parsed_subdir) $parsed_url .= str_replace(array('/', '\\'), '_', $parsed_subdir);
164
+ $site_name = str_replace('__', '_', preg_replace('/[^A-Za-z0-9_]/', '', str_replace(' ', '_', substr($parsed_url, 0, 32))));
165
+ if (!$site_name || preg_match('#^_+$#', $site_name)) $site_name = 'WordPress_Backup';
166
+ }
167
+
168
+ // Allow an over-ride. Careful about introducing characters not supported by your filesystem or cloud storage.
169
+ return apply_filters('updraftplus_blog_name', $site_name);
170
+ }
171
+
172
  /**
173
  * Called by the WP action updraft_report_remotestorage_extrainfo
174
  *
1312
  */
1313
  private function get_backup_file_basename_from_time($use_time) {
1314
  global $updraftplus;
1315
+ return apply_filters('updraftplus_get_backup_file_basename_from_time', 'backup_'.get_date_from_gmt(gmdate('Y-m-d H:i:s', $use_time), 'Y-m-d-Hi').'_'.$this->site_name.'_'.$updraftplus->file_nonce, $use_time, $this->site_name);
1316
  }
1317
 
1318
  private function find_existing_zips($dir, $match_nonce) {
class-updraftplus.php CHANGED
@@ -4282,6 +4282,22 @@ class UpdraftPlus {
4282
  return array($mess, $warn, $err, $info);
4283
  }
4284
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4285
  /**
4286
  * Get default substitute similar collate related to charset
4287
  *
4282
  return array($mess, $warn, $err, $info);
4283
  }
4284
 
4285
+ /**
4286
+ * Get the current outgoing IP address. Use this wisely; of course, it's not guaranteed to always be the same.
4287
+ *
4288
+ * @return String|Boolean - returns false upon failure
4289
+ */
4290
+ public function get_outgoing_ip_address() {
4291
+ $ip_lookup = wp_remote_get('https://ipvigilante.com/json', array('timeout' => 6));
4292
+ if (200 == wp_remote_retrieve_response_code($ip_lookup)) {
4293
+ $info = json_decode(wp_remote_retrieve_body($ip_lookup), true);
4294
+ if (!empty($info['status']) && !empty($info['data']) && 'success' === $info['status']);
4295
+ if (!empty($info['data']['ipv4'])) return $info['data']['ipv4'];
4296
+ if (!empty($info['data']['ipv6'])) return $info['data']['ipv6'];
4297
+ }
4298
+ return false;
4299
+ }
4300
+
4301
  /**
4302
  * Get default substitute similar collate related to charset
4303
  *
includes/class-filesystem-functions.php CHANGED
@@ -521,6 +521,8 @@ class UpdraftPlus_Filesystem_Functions {
521
  static $last_logged_time;
522
  static $last_saved_time;
523
 
 
 
524
  // Detect a new zip file; reset state
525
  if ($file !== $last_file_seen) {
526
  $last_file_seen = $file;
@@ -530,10 +532,13 @@ class UpdraftPlus_Filesystem_Functions {
530
  $last_saved_time = time();
531
  }
532
 
 
 
 
533
  // We always log the last one for clarity (the log/display looks odd if the last mention of something being unzipped isn't the last). Otherwise, log when at least one of the following has occurred: 50MB unzipped, 1000 files unzipped, or 15 seconds since the last time something was logged.
534
- if ($i >= $num_files -1 || $size_written > $last_logged_bytes + 100 * 1048576 || $i > $last_logged_index + 1000 || time() > $last_logged_time + 15) {
535
 
536
- $updraftplus->jobdata_set('last_index_'.md5(basename($file)), $i);
537
 
538
  $updraftplus->log(sprintf(__('Unzip progress: %d out of %d files', 'updraftplus').' (%s, %s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice-restore');
539
  $updraftplus->log(sprintf('Unzip progress: %d out of %d files (%s, %s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice');
@@ -547,11 +552,22 @@ class UpdraftPlus_Filesystem_Functions {
547
  // Because a lot can happen in 5 seconds, we update the job data more often
548
  if (time() > $last_saved_time + 5) {
549
  // N.B. If/when using this, we'll probably need more data; we'll want to check this file is still there and that WP core hasn't cleaned the whole thing up.
550
- $updraftplus->jobdata_set('last_index_'.md5(basename($file)), $i);
551
  $last_saved_time = time();
552
  }
553
  }
554
 
 
 
 
 
 
 
 
 
 
 
 
555
  /**
556
  * Compatibility function (exists in WP 4.8+)
557
  */
@@ -575,14 +591,14 @@ class UpdraftPlus_Filesystem_Functions {
575
  *
576
  * @return Boolean|WP_Error True on success, WP_Error on failure.
577
  */
578
- public static function unzip_file_go($file, $to, $needed_dirs = array(), $method = 'ziparchive', $starting_index = 0) {
579
  global $wp_filesystem, $updraftplus;
580
 
581
  $class_to_use = ('ziparchive' == $method) ? 'UpdraftPlus_ZipArchive' : 'UpdraftPlus_PclZip';
582
 
583
  if (!class_exists($class_to_use)) require_once(UPDRAFTPLUS_DIR.'/includes/class-zip.php');
584
 
585
- $updraftplus->log('Unzipping '.basename($file).' to '.$to.' using '.$class_to_use);
586
 
587
  $z = new $class_to_use;
588
 
@@ -596,7 +612,7 @@ class UpdraftPlus_Filesystem_Functions {
596
  $zopen = $z->open($file, $flags);
597
 
598
  if (true !== $zopen) {
599
- return new WP_Error('incompatible_archive', __('Incompatible Archive.'), array($method.'_error' => $zope));
600
  }
601
 
602
  $uncompressed_size = 0;
521
  static $last_logged_time;
522
  static $last_saved_time;
523
 
524
+ $jobdata_key = self::get_jobdata_progress_key($file);
525
+
526
  // Detect a new zip file; reset state
527
  if ($file !== $last_file_seen) {
528
  $last_file_seen = $file;
532
  $last_saved_time = time();
533
  }
534
 
535
+ // Useful for debugging
536
+ $record_every_indexes = (defined('UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES') && UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES > 0) ? UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES : 1000;
537
+
538
  // We always log the last one for clarity (the log/display looks odd if the last mention of something being unzipped isn't the last). Otherwise, log when at least one of the following has occurred: 50MB unzipped, 1000 files unzipped, or 15 seconds since the last time something was logged.
539
+ if ($i >= $num_files -1 || $size_written > $last_logged_bytes + 100 * 1048576 || $i > $last_logged_index + $record_every_indexes || time() > $last_logged_time + 15) {
540
 
541
+ $updraftplus->jobdata_set($jobdata_key, array('index' => $i, 'info' => $info, 'size_written' => $size_written));
542
 
543
  $updraftplus->log(sprintf(__('Unzip progress: %d out of %d files', 'updraftplus').' (%s, %s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice-restore');
544
  $updraftplus->log(sprintf('Unzip progress: %d out of %d files (%s, %s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice');
552
  // Because a lot can happen in 5 seconds, we update the job data more often
553
  if (time() > $last_saved_time + 5) {
554
  // N.B. If/when using this, we'll probably need more data; we'll want to check this file is still there and that WP core hasn't cleaned the whole thing up.
555
+ $updraftplus->jobdata_set($jobdata_key, array('index' => $i, 'info' => $info, 'size_written' => $size_written));
556
  $last_saved_time = time();
557
  }
558
  }
559
 
560
+ /**
561
+ * This method abstracts the calculation for a consistent jobdata key name for the indicated name
562
+ *
563
+ * @param String $file - the filename; only the basename will be used
564
+ *
565
+ * @return String
566
+ */
567
+ public static function get_jobdata_progress_key($file) {
568
+ return 'last_index_'.md5(basename($file));
569
+ }
570
+
571
  /**
572
  * Compatibility function (exists in WP 4.8+)
573
  */
591
  *
592
  * @return Boolean|WP_Error True on success, WP_Error on failure.
593
  */
594
+ private static function unzip_file_go($file, $to, $needed_dirs = array(), $method = 'ziparchive', $starting_index = 0) {
595
  global $wp_filesystem, $updraftplus;
596
 
597
  $class_to_use = ('ziparchive' == $method) ? 'UpdraftPlus_ZipArchive' : 'UpdraftPlus_PclZip';
598
 
599
  if (!class_exists($class_to_use)) require_once(UPDRAFTPLUS_DIR.'/includes/class-zip.php');
600
 
601
+ $updraftplus->log('Unzipping '.basename($file).' to '.$to.' using '.$class_to_use.', starting index '.$starting_index);
602
 
603
  $z = new $class_to_use;
604
 
612
  $zopen = $z->open($file, $flags);
613
 
614
  if (true !== $zopen) {
615
+ return new WP_Error('incompatible_archive', __('Incompatible Archive.'), array($method.'_error' => $z->last_error));
616
  }
617
 
618
  $uncompressed_size = 0;
languages/updraftplus-nb_NO.mo CHANGED
Binary file
languages/updraftplus-nb_NO.po CHANGED
@@ -2,7 +2,7 @@
2
  # This file is distributed under the same license as the UpdraftPlus package.
3
  msgid ""
4
  msgstr ""
5
- "PO-Revision-Date: 2017-01-31 17:20:08+0000\n"
6
  "MIME-Version: 1.0\n"
7
  "Content-Type: text/plain; charset=UTF-8\n"
8
  "Content-Transfer-Encoding: 8bit\n"
@@ -353,7 +353,7 @@ msgstr ""
353
 
354
  #: src/templates/wp-admin/settings/existing-backups-table.php:158
355
  msgid "Use ctrl / cmd + press to select several items"
356
- msgstr ""
357
 
358
  #: src/methods/dreamobjects.php:20
359
  msgid "Closing 1st October 2018"
@@ -663,11 +663,11 @@ msgstr ""
663
 
664
  #: src/admin.php:2798
665
  msgid "Backup / Restore"
666
- msgstr ""
667
 
668
  #: src/admin.php:663
669
  msgid "Backup"
670
- msgstr ""
671
 
672
  #: src/addons/wp-cli.php:408
673
  msgid "Latest full backup found; identifier:"
@@ -739,7 +739,7 @@ msgstr ""
739
 
740
  #: src/admin.php:671, src/admin.php:2799
741
  msgid "Migrate / Clone"
742
- msgstr ""
743
 
744
  #: src/admin.php:3036, src/admin.php:3961,
745
  #: src/templates/wp-admin/settings/existing-backups-table.php:73,
@@ -2882,7 +2882,7 @@ msgstr "Er du sikker på at du vil fjerne %s fra UpdraftPlus?"
2882
 
2883
  #: src/templates/wp-admin/settings/existing-backups-table.php:157
2884
  msgid "Deselect"
2885
- msgstr "Opphev valg"
2886
 
2887
  #: src/templates/wp-admin/settings/existing-backups-table.php:156
2888
  msgid "Select all"
@@ -7657,7 +7657,7 @@ msgstr "Klarte ikke å opprette filer i backup folderen. Backup avbrutt - sjekk
7657
 
7658
  #: src/class-updraftplus.php:1796
7659
  msgid "Others"
7660
- msgstr "Andre"
7661
 
7662
  #: src/addons/multisite.php:500, src/class-updraftplus.php:1781
7663
  msgid "Uploads"
@@ -7688,4 +7688,4 @@ msgstr "Varsel:"
7688
  #: src/addons/multisite.php:96, src/addons/multisite.php:736,
7689
  #: src/options.php:74
7690
  msgid "UpdraftPlus Backups"
7691
- msgstr "Sikkerhetskopiering"
2
  # This file is distributed under the same license as the UpdraftPlus package.
3
  msgid ""
4
  msgstr ""
5
+ "PO-Revision-Date: 2019-01-17 21:34:57+0000\n"
6
  "MIME-Version: 1.0\n"
7
  "Content-Type: text/plain; charset=UTF-8\n"
8
  "Content-Transfer-Encoding: 8bit\n"
353
 
354
  #: src/templates/wp-admin/settings/existing-backups-table.php:158
355
  msgid "Use ctrl / cmd + press to select several items"
356
+ msgstr "Bruk Ctrl/Cmd + museklikk for å velge flere elementer"
357
 
358
  #: src/methods/dreamobjects.php:20
359
  msgid "Closing 1st October 2018"
663
 
664
  #: src/admin.php:2798
665
  msgid "Backup / Restore"
666
+ msgstr "Backup og gjenoppretting"
667
 
668
  #: src/admin.php:663
669
  msgid "Backup"
670
+ msgstr "Backup"
671
 
672
  #: src/addons/wp-cli.php:408
673
  msgid "Latest full backup found; identifier:"
739
 
740
  #: src/admin.php:671, src/admin.php:2799
741
  msgid "Migrate / Clone"
742
+ msgstr "Migrere og klone"
743
 
744
  #: src/admin.php:3036, src/admin.php:3961,
745
  #: src/templates/wp-admin/settings/existing-backups-table.php:73,
2882
 
2883
  #: src/templates/wp-admin/settings/existing-backups-table.php:157
2884
  msgid "Deselect"
2885
+ msgstr "Velg ingen"
2886
 
2887
  #: src/templates/wp-admin/settings/existing-backups-table.php:156
2888
  msgid "Select all"
7657
 
7658
  #: src/class-updraftplus.php:1796
7659
  msgid "Others"
7660
+ msgstr "Annet"
7661
 
7662
  #: src/addons/multisite.php:500, src/class-updraftplus.php:1781
7663
  msgid "Uploads"
7688
  #: src/addons/multisite.php:96, src/addons/multisite.php:736,
7689
  #: src/options.php:74
7690
  msgid "UpdraftPlus Backups"
7691
+ msgstr "UpdraftPlus-backup"
languages/updraftplus.pot CHANGED
@@ -145,11 +145,11 @@ msgstr ""
145
  msgid "You must add the following as the authorised redirect URI in your Azure console (under \"API Settings\") when asked"
146
  msgstr ""
147
 
148
- #: src/addons/azure.php:601, src/addons/migrator.php:948, src/admin.php:1155, src/admin.php:1159, src/admin.php:1163, src/admin.php:1167, src/admin.php:1171, src/admin.php:1180, src/admin.php:3928, src/admin.php:3935, src/admin.php:3937, src/admin.php:5222, src/methods/cloudfiles-new.php:100, src/methods/cloudfiles.php:440, src/methods/ftp.php:330, src/methods/openstack-base.php:571, src/methods/s3.php:864, src/methods/s3.php:868, src/methods/updraftvault.php:311, src/templates/wp-admin/settings/downloading-and-restoring.php:27, src/templates/wp-admin/settings/tab-backups.php:27, src/udaddons/updraftplus-addons.php:259
149
  msgid "Warning"
150
  msgstr ""
151
 
152
- #: src/addons/azure.php:601, src/admin.php:3928, src/methods/updraftvault.php:311
153
  msgid "Your web server's PHP installation does not included a <strong>required</strong> (for %s) module (%s). Please contact your web hosting provider's support and ask for them to enable it."
154
  msgstr ""
155
 
@@ -157,7 +157,7 @@ msgstr ""
157
  msgid "Create Azure credentials in your Azure developer console."
158
  msgstr ""
159
 
160
- #: src/addons/azure.php:605, src/addons/onedrive.php:1149, src/includes/class-remote-send.php:314
161
  msgid "For longer help, including screenshots, follow this link."
162
  msgstr ""
163
 
@@ -201,7 +201,7 @@ msgstr ""
201
  msgid "You can enter the path of any %s virtual folder you wish to use here."
202
  msgstr ""
203
 
204
- #: src/addons/azure.php:638, src/addons/google-enhanced.php:76, src/addons/onedrive.php:1189
205
  msgid "If you leave it blank, then the backup will be placed in the root of your %s"
206
  msgstr ""
207
 
@@ -233,7 +233,7 @@ msgstr ""
233
  msgid "Error: unexpected file read fail"
234
  msgstr ""
235
 
236
- #: src/addons/backblaze.php:225, src/addons/cloudfiles-enhanced.php:117, src/addons/migrator.php:893, src/addons/migrator.php:1190, src/addons/migrator.php:1271, src/addons/migrator.php:1320, src/addons/migrator.php:1558, src/addons/s3-enhanced.php:164, src/addons/s3-enhanced.php:169, src/addons/s3-enhanced.php:171, src/addons/sftp.php:911, src/addons/webdav.php:203, src/admin.php:91, src/admin.php:817, src/includes/class-remote-send.php:266, src/includes/class-remote-send.php:293, src/includes/class-remote-send.php:299, src/includes/class-remote-send.php:362, src/includes/class-remote-send.php:421, src/includes/class-remote-send.php:448, src/includes/class-remote-send.php:471, src/includes/class-remote-send.php:481, src/includes/class-remote-send.php:486, src/methods/remotesend.php:74, src/methods/remotesend.php:242, src/methods/remotesend.php:298, src/methods/updraftvault.php:532, src/restorer.php:328, src/restorer.php:356, src/restorer.php:2040
237
  msgid "Error:"
238
  msgstr ""
239
 
@@ -253,7 +253,7 @@ msgstr ""
253
  msgid "Failure: We could not successfully access or create such a bucket. Please check your access credentials, and if those are correct then try another bucket name (as another %s user may already have taken your name)."
254
  msgstr ""
255
 
256
- #: src/addons/backblaze.php:580, src/methods/cloudfiles.php:234, src/methods/dropbox.php:358, src/methods/openstack-base.php:118
257
  msgid "No settings were found"
258
  msgstr ""
259
 
@@ -449,11 +449,11 @@ msgstr ""
449
  msgid "Folder"
450
  msgstr ""
451
 
452
- #: src/addons/google-enhanced.php:76, src/addons/onedrive.php:1189
453
  msgid "Enter the path of the %s folder you wish to use here."
454
  msgstr ""
455
 
456
- #: src/addons/google-enhanced.php:76, src/addons/googlecloud.php:1039, src/addons/onedrive.php:1189
457
  msgid "e.g. %s"
458
  msgstr ""
459
 
@@ -625,15 +625,15 @@ msgstr ""
625
  msgid "But no %s settings were found. Please complete all fields in %s settings and save the settings."
626
  msgstr ""
627
 
628
- #: src/addons/googlecloud.php:698, src/addons/onedrive.php:908, src/addons/onedrive.php:919, src/methods/googledrive.php:442, src/methods/googledrive.php:455
629
  msgid "However, subsequent access attempts failed:"
630
  msgstr ""
631
 
632
- #: src/addons/googlecloud.php:718, src/addons/googlecloud.php:839, src/addons/onedrive.php:940, src/addons/sftp.php:591, src/addons/sftp.php:595, src/addons/wp-cli.php:516, src/methods/addon-base-v2.php:327, src/methods/cloudfiles.php:575, src/methods/googledrive.php:475, src/methods/openstack-base.php:530, src/methods/s3.php:1202, src/methods/stream-base.php:372
633
  msgid "Success"
634
  msgstr ""
635
 
636
- #: src/addons/googlecloud.php:718, src/addons/onedrive.php:940, src/methods/googledrive.php:475
637
  msgid "you have authenticated your %s account."
638
  msgstr ""
639
 
@@ -645,7 +645,7 @@ msgstr ""
645
  msgid "You must save and authenticate before you can test your settings."
646
  msgstr ""
647
 
648
- #: src/addons/googlecloud.php:776, src/addons/googlecloud.php:810, src/addons/googlecloud.php:816, src/addons/sftp.php:553, src/admin.php:3482, src/admin.php:3518, src/admin.php:3528, src/methods/addon-base-v2.php:313, src/methods/stream-base.php:356
649
  msgid "Failed"
650
  msgstr ""
651
 
@@ -665,7 +665,7 @@ msgstr ""
665
  msgid "You must enter a project ID in order to be able to create a new bucket."
666
  msgstr ""
667
 
668
- #: src/addons/googlecloud.php:984, src/methods/dropbox.php:577
669
  msgid "%s logo"
670
  msgstr ""
671
 
@@ -693,7 +693,7 @@ msgstr ""
693
  msgid "You must add the following as the authorized redirect URI (under \"More Options\") when asked"
694
  msgstr ""
695
 
696
- #: src/addons/googlecloud.php:1019, src/addons/onedrive.php:1178, src/methods/googledrive.php:1233
697
  msgid "Client ID"
698
  msgstr ""
699
 
@@ -701,7 +701,7 @@ msgstr ""
701
  msgid "If Google later shows you the message \"invalid_client\", then you did not enter a valid client ID here."
702
  msgstr ""
703
 
704
- #: src/addons/googlecloud.php:1027, src/addons/onedrive.php:1182, src/methods/googledrive.php:1237
705
  msgid "Client Secret"
706
  msgstr ""
707
 
@@ -721,7 +721,7 @@ msgstr ""
721
  msgid "Otherwise, you can leave it blank."
722
  msgstr ""
723
 
724
- #: src/addons/googlecloud.php:1034, src/addons/migrator.php:493, src/addons/migrator.php:496, src/addons/migrator.php:499, src/admin.php:1159, src/admin.php:2631, src/backup.php:3465, src/class-updraftplus.php:4134, src/class-updraftplus.php:4134, src/updraftplus.php:157
725
  msgid "Go here for more information."
726
  msgstr ""
727
 
@@ -765,7 +765,7 @@ msgstr ""
765
  msgid "<strong>(You appear to be already authenticated,</strong> though you can authenticate again to refresh your access if you've had a problem)."
766
  msgstr ""
767
 
768
- #: src/addons/googlecloud.php:1108, src/addons/onedrive.php:1249, src/methods/dropbox.php:668, src/methods/googledrive.php:1289
769
  msgid "Account holder's name: %s."
770
  msgstr ""
771
 
@@ -777,63 +777,63 @@ msgstr ""
777
  msgid "Supported backup plugins: %s"
778
  msgstr ""
779
 
780
- #: src/addons/importer.php:276, src/admin.php:4089, src/includes/class-backup-history.php:499
781
  msgid "Backup created by: %s."
782
  msgstr ""
783
 
784
- #: src/addons/incremental.php:82, src/addons/incremental.php:84
785
  msgid "(latest increment: %s)"
786
  msgstr ""
787
 
788
- #: src/addons/incremental.php:84
789
  msgid "Increments exist at: %s"
790
  msgstr ""
791
 
792
- #: src/addons/incremental.php:288
793
  msgid "Files changed since the last backup will be added as a new increment in that backup set."
794
  msgstr ""
795
 
796
- #: src/addons/incremental.php:288
797
  msgid "N.B. No backup of your database will be taken in an incremental backup; if you want a database backup as well, then take that separately."
798
  msgstr ""
799
 
800
- #: src/addons/incremental.php:290
801
  msgid "No incremental backup of your files is possible, as no suitable existing backup was found to add increments to."
802
  msgstr ""
803
 
804
- #: src/addons/incremental.php:335, src/addons/reporting.php:261, src/admin.php:4021
805
  msgid "None"
806
  msgstr ""
807
 
808
- #: src/addons/incremental.php:336, src/updraftplus.php:99
809
  msgid "Every hour"
810
  msgstr ""
811
 
812
- #: src/addons/incremental.php:337, src/addons/incremental.php:338, src/addons/incremental.php:339, src/addons/incremental.php:340, src/admin.php:3736, src/admin.php:3737, src/admin.php:3738, src/updraftplus.php:100, src/updraftplus.php:101, src/updraftplus.php:102
813
  msgid "Every %s hours"
814
  msgstr ""
815
 
816
- #: src/addons/incremental.php:341, src/admin.php:3739
817
  msgid "Daily"
818
  msgstr ""
819
 
820
- #: src/addons/incremental.php:342, src/admin.php:3740
821
  msgid "Weekly"
822
  msgstr ""
823
 
824
- #: src/addons/incremental.php:343, src/admin.php:3741
825
  msgid "Fortnightly"
826
  msgstr ""
827
 
828
- #: src/addons/incremental.php:344, src/admin.php:3742
829
  msgid "Monthly"
830
  msgstr ""
831
 
832
- #: src/addons/incremental.php:358
833
  msgid "And then add an incremental backup"
834
  msgstr ""
835
 
836
- #: src/addons/incremental.php:370
837
  msgid "Tell me more"
838
  msgstr ""
839
 
@@ -949,7 +949,7 @@ msgstr ""
949
  msgid "After pressing this button, you will be given the option to choose which components you wish to migrate"
950
  msgstr ""
951
 
952
- #: src/addons/migrator.php:274, src/admin.php:663, src/admin.php:850, src/admin.php:4187
953
  msgid "Restore"
954
  msgstr ""
955
 
@@ -981,7 +981,7 @@ msgstr ""
981
  msgid "search term"
982
  msgstr ""
983
 
984
- #: src/addons/migrator.php:343, src/addons/migrator.php:358, src/admin.php:2549, src/admin.php:2559, src/admin.php:2568, src/admin.php:2610, src/admin.php:3451
985
  msgid "Return to UpdraftPlus Configuration"
986
  msgstr ""
987
 
@@ -1183,7 +1183,7 @@ msgstr ""
1183
  msgid "Time taken (seconds):"
1184
  msgstr ""
1185
 
1186
- #: src/addons/migrator.php:1320, src/restorer.php:2924
1187
  msgid "the database query being run was:"
1188
  msgstr ""
1189
 
@@ -1247,7 +1247,7 @@ msgstr ""
1247
  msgid "Enter your chosen name"
1248
  msgstr ""
1249
 
1250
- #: src/addons/migrator.php:1761, src/addons/sftp.php:467, src/admin.php:868, src/admin.php:5070, src/templates/wp-admin/settings/temporary-clone.php:63
1251
  msgid "Key"
1252
  msgstr ""
1253
 
@@ -1307,7 +1307,7 @@ msgstr ""
1307
  msgid "database connection attempt failed"
1308
  msgstr ""
1309
 
1310
- #: src/addons/moredatabase.php:112, src/backup.php:1636
1311
  msgid "Connection failed: check your access details, that the database server is up, and that the network connection is not firewalled."
1312
  msgstr ""
1313
 
@@ -1363,7 +1363,7 @@ msgstr ""
1363
  msgid "Username"
1364
  msgstr ""
1365
 
1366
- #: src/addons/moredatabase.php:242, src/addons/reporting.php:276, src/addons/wp-cli.php:432, src/admin.php:344, src/admin.php:3996, src/admin.php:4049, src/includes/class-remote-send.php:331, src/includes/class-wpadmin-commands.php:157, src/includes/class-wpadmin-commands.php:521, src/restorer.php:461, src/templates/wp-admin/settings/delete-and-restore-modals.php:74, src/templates/wp-admin/settings/delete-and-restore-modals.php:75, src/templates/wp-admin/settings/take-backup.php:34
1367
  msgid "Database"
1368
  msgstr ""
1369
 
@@ -1516,7 +1516,7 @@ msgstr ""
1516
  msgid "Exclude these:"
1517
  msgstr ""
1518
 
1519
- #: src/addons/morefiles.php:476, src/admin.php:3850
1520
  msgid "If entering multiple files/directories, then separate them with commas. For entities at the top level, you can use a * at the start or end of the entry as a wildcard."
1521
  msgstr ""
1522
 
@@ -1592,123 +1592,123 @@ msgstr ""
1592
  msgid "The required %s PHP module is not installed - ask your web hosting company to enable it."
1593
  msgstr ""
1594
 
1595
- #: src/addons/onedrive.php:112, src/methods/dropbox.php:267
1596
  msgid "Account full: your %s account has only %d bytes left, but the file to be uploaded has %d bytes remaining (total size: %d bytes)"
1597
  msgstr ""
1598
 
1599
- #: src/addons/onedrive.php:678, src/udaddons/updraftplus-addons.php:937
1600
  msgid "An error response was received; HTTP code:"
1601
  msgstr ""
1602
 
1603
- #: src/addons/onedrive.php:693, src/addons/onedrive.php:717, src/includes/updraftplus-login.php:56, src/methods/updraftvault.php:685, src/udaddons/updraftplus-addons.php:952, src/udaddons/updraftplus-addons.php:966
1604
  msgid "This most likely means that you share a webserver with a hacked website that has been used in previous attacks."
1605
  msgstr ""
1606
 
1607
- #: src/addons/onedrive.php:693, src/udaddons/updraftplus-addons.php:952, src/udaddons/updraftplus-addons.php:966
1608
  msgid "To remove any block, please go here."
1609
  msgstr ""
1610
 
1611
- #: src/addons/onedrive.php:693, src/udaddons/updraftplus-addons.php:952
1612
  msgid "Your IP address:"
1613
  msgstr ""
1614
 
1615
- #: src/addons/onedrive.php:717, src/includes/updraftplus-login.php:56, src/methods/updraftvault.php:685, src/udaddons/updraftplus-addons.php:966
1616
  msgid "UpdraftPlus.com has responded with 'Access Denied'."
1617
  msgstr ""
1618
 
1619
- #: src/addons/onedrive.php:717, src/includes/updraftplus-login.php:56, src/methods/updraftvault.php:685, src/udaddons/updraftplus-addons.php:966
1620
  msgid "It appears that your web server's IP Address (%s) is blocked."
1621
  msgstr ""
1622
 
1623
- #: src/addons/onedrive.php:717, src/includes/updraftplus-login.php:56, src/methods/updraftvault.php:685
1624
  msgid "To remove the block, please go here."
1625
  msgstr ""
1626
 
1627
- #: src/addons/onedrive.php:724
1628
  msgid "Please re-authorize the connection to your %s account."
1629
  msgstr ""
1630
 
1631
- #: src/addons/onedrive.php:733
1632
  msgid "Account is not authorized (%s)."
1633
  msgstr ""
1634
 
1635
- #: src/addons/onedrive.php:865, src/class-updraftplus.php:532, src/methods/dropbox.php:240, src/methods/dropbox.php:753, src/methods/dropbox.php:775, src/methods/dropbox.php:790, src/methods/dropbox.php:803, src/methods/dropbox.php:946
1636
  msgid "%s error: %s"
1637
  msgstr ""
1638
 
1639
- #: src/addons/onedrive.php:865
1640
  msgid "Authentication"
1641
  msgstr ""
1642
 
1643
- #: src/addons/onedrive.php:894, src/methods/dropbox.php:844, src/methods/dropbox.php:853, src/methods/googledrive.php:439
1644
  msgid "Your %s quota usage: %s %% used, %s available"
1645
  msgstr ""
1646
 
1647
- #: src/addons/onedrive.php:902, src/methods/dropbox.php:821
1648
  msgid "Your %s account name: %s"
1649
  msgstr ""
1650
 
1651
- #: src/addons/onedrive.php:940, src/addons/onedrive.php:1178, src/addons/onedrive.php:1182
1652
  msgid "OneDrive"
1653
  msgstr ""
1654
 
1655
- #: src/addons/onedrive.php:1038, src/includes/Dropbox2/OAuth/Consumer/ConsumerAbstract.php:118
1656
  msgid "The %s authentication could not go ahead, because something else on your site is breaking it. Try disabling your other plugins and switching to a default theme. (Specifically, you are looking for the component that sends output (most likely PHP warnings/errors) before the page begins. Turning off any debugging settings may also help)."
1657
  msgstr ""
1658
 
1659
- #: src/addons/onedrive.php:1097, src/addons/onedrive.php:1099
1660
  msgid "authorization failed:"
1661
  msgstr ""
1662
 
1663
- #: src/addons/onedrive.php:1126
1664
  msgid "This site uses a URL which is either non-HTTPS, or is localhost or 127.0.0.1 URL. As such, you must use the main %s %s App to authenticate with your account."
1665
  msgstr ""
1666
 
1667
- #: src/addons/onedrive.php:1134
1668
  msgid "You must add the following as the authorized redirect URI in your OneDrive console (under \"API Settings\") when asked"
1669
  msgstr ""
1670
 
1671
- #: src/addons/onedrive.php:1142
1672
  msgid "Create OneDrive credentials in your OneDrive developer console."
1673
  msgstr ""
1674
 
1675
- #: src/addons/onedrive.php:1158, src/methods/dropbox.php:586, src/methods/googledrive.php:1214
1676
  msgid "Please read %s for use of our %s authorization app (none of your backup data is sent to us)."
1677
  msgstr ""
1678
 
1679
- #: src/addons/onedrive.php:1158, src/methods/dropbox.php:586, src/methods/googledrive.php:1214
1680
  msgid "this privacy policy"
1681
  msgstr ""
1682
 
1683
- #: src/addons/onedrive.php:1179
1684
  msgid "If OneDrive later shows you the message \"unauthorized_client\", then you did not enter a valid client ID here."
1685
  msgstr ""
1686
 
1687
- #: src/addons/onedrive.php:1187, src/restorer.php:1191
1688
  msgid "folder"
1689
  msgstr ""
1690
 
1691
- #: src/addons/onedrive.php:1189
1692
  msgid "N.B. %s is not case-sensitive."
1693
  msgstr ""
1694
 
1695
- #: src/addons/onedrive.php:1194
1696
  msgid "Account type"
1697
  msgstr ""
1698
 
1699
- #: src/addons/onedrive.php:1197
1700
  msgid "OneDrive International"
1701
  msgstr ""
1702
 
1703
- #: src/addons/onedrive.php:1198
1704
  msgid "OneDrive Germany"
1705
  msgstr ""
1706
 
1707
- #: src/addons/onedrive.php:1206, src/methods/dropbox.php:611
1708
  msgid "Authenticate with %s"
1709
  msgstr ""
1710
 
1711
- #: src/addons/onedrive.php:1213, src/methods/dropbox.php:615
1712
  msgid "(You appear to be already authenticated)."
1713
  msgstr ""
1714
 
@@ -1716,7 +1716,7 @@ msgstr ""
1716
  msgid "Your label for this backup (optional)"
1717
  msgstr ""
1718
 
1719
- #: src/addons/reporting.php:86, src/addons/reporting.php:197, src/backup.php:1168, src/class-updraftplus.php:3951
1720
  msgid "Backup of:"
1721
  msgstr ""
1722
 
@@ -1736,7 +1736,7 @@ msgstr ""
1736
  msgid "Backup made by %s"
1737
  msgstr ""
1738
 
1739
- #: src/addons/reporting.php:198, src/backup.php:1171
1740
  msgid "Latest status:"
1741
  msgstr ""
1742
 
@@ -1764,11 +1764,11 @@ msgstr ""
1764
  msgid "Time taken:"
1765
  msgstr ""
1766
 
1767
- #: src/addons/reporting.php:239, src/admin.php:4009
1768
  msgid "Uploaded to:"
1769
  msgstr ""
1770
 
1771
- #: src/addons/reporting.php:281, src/backup.php:1121
1772
  msgid "The log file has been attached to this email."
1773
  msgstr ""
1774
 
@@ -2237,27 +2237,27 @@ msgstr ""
2237
  msgid "Latest full backup found; identifier:"
2238
  msgstr ""
2239
 
2240
- #: src/addons/wp-cli.php:430, src/admin.php:4043, src/admin.php:4091
2241
  msgid "unknown source"
2242
  msgstr ""
2243
 
2244
- #: src/addons/wp-cli.php:432, src/admin.php:4049
2245
  msgid "Database (created by %s)"
2246
  msgstr ""
2247
 
2248
- #: src/addons/wp-cli.php:438, src/admin.php:4051
2249
  msgid "External database"
2250
  msgstr ""
2251
 
2252
- #: src/addons/wp-cli.php:450, src/admin.php:4095
2253
  msgid "Files and database WordPress backup (created by %s)"
2254
  msgstr ""
2255
 
2256
- #: src/addons/wp-cli.php:450, src/admin.php:4095
2257
  msgid "Files backup (created by %s)"
2258
  msgstr ""
2259
 
2260
- #: src/addons/wp-cli.php:519, src/admin.php:818, src/class-updraftplus.php:1298, src/class-updraftplus.php:1342, src/includes/class-filesystem-functions.php:429, src/includes/class-storage-methods-interface.php:324, src/methods/addon-base-v2.php:93, src/methods/addon-base-v2.php:98, src/methods/addon-base-v2.php:205, src/methods/addon-base-v2.php:225, src/methods/stream-base.php:219, src/restorer.php:3074, src/restorer.php:3099, src/restorer.php:3180, src/updraftplus.php:157
2261
  msgid "Error"
2262
  msgstr ""
2263
 
@@ -2273,11 +2273,11 @@ msgstr ""
2273
  msgid "No such backup set exists"
2274
  msgstr ""
2275
 
2276
- #: src/addons/wp-cli.php:648, src/admin.php:4504
2277
  msgid "UpdraftPlus Restoration: Progress"
2278
  msgstr ""
2279
 
2280
- #: src/addons/wp-cli.php:662, src/admin.php:4507
2281
  msgid "Follow this link to download the log file for this restoration (needed for any support requests)."
2282
  msgstr ""
2283
 
@@ -2297,6 +2297,14 @@ msgstr ""
2297
  msgid "Why am I seeing this?"
2298
  msgstr ""
2299
 
 
 
 
 
 
 
 
 
2300
  #: src/admin.php:91
2301
  msgid "template not found"
2302
  msgstr ""
@@ -2309,11 +2317,11 @@ msgstr ""
2309
  msgid "At the same time as the files backup"
2310
  msgstr ""
2311
 
2312
- #: src/admin.php:334, src/admin.php:5039, src/templates/wp-admin/settings/take-backup.php:24
2313
  msgid "Files"
2314
  msgstr ""
2315
 
2316
- #: src/admin.php:334, src/backup.php:1077
2317
  msgid "Files and database"
2318
  msgstr ""
2319
 
@@ -2417,7 +2425,7 @@ msgstr ""
2417
  msgid "Error: the server sent us a response which we did not understand."
2418
  msgstr ""
2419
 
2420
- #: src/admin.php:816, src/restorer.php:175
2421
  msgid "Error data:"
2422
  msgstr ""
2423
 
@@ -2429,7 +2437,7 @@ msgstr ""
2429
  msgid "File ready."
2430
  msgstr ""
2431
 
2432
- #: src/admin.php:821, src/admin.php:2549, src/admin.php:2559, src/admin.php:2568, src/admin.php:2610, src/admin.php:3451, src/templates/wp-admin/settings/existing-backups-table.php:19, src/templates/wp-admin/settings/existing-backups-table.php:137
2433
  msgid "Actions"
2434
  msgstr ""
2435
 
@@ -2457,7 +2465,7 @@ msgstr ""
2457
  msgid "PHP information"
2458
  msgstr ""
2459
 
2460
- #: src/admin.php:828, src/admin.php:3165
2461
  msgid "Delete Old Directories"
2462
  msgstr ""
2463
 
@@ -2517,7 +2525,7 @@ msgstr ""
2517
  msgid "Backup Now"
2518
  msgstr ""
2519
 
2520
- #: src/admin.php:844, src/admin.php:3479, src/admin.php:3513, src/admin.php:4286, src/includes/class-remote-send.php:553, src/templates/wp-admin/settings/existing-backups-table.php:153, src/templates/wp-admin/settings/file-backup-exclude.php:11
2521
  msgid "Delete"
2522
  msgstr ""
2523
 
@@ -2525,7 +2533,7 @@ msgstr ""
2525
  msgid "Create"
2526
  msgstr ""
2527
 
2528
- #: src/admin.php:846, src/admin.php:4266
2529
  msgid "Upload"
2530
  msgstr ""
2531
 
@@ -2537,7 +2545,7 @@ msgstr ""
2537
  msgid "Close"
2538
  msgstr ""
2539
 
2540
- #: src/admin.php:851, src/admin.php:3717
2541
  msgid "Download log file"
2542
  msgstr ""
2543
 
@@ -2713,7 +2721,7 @@ msgstr ""
2713
  msgid "Complete"
2714
  msgstr ""
2715
 
2716
- #: src/admin.php:905, src/admin.php:3224
2717
  msgid "The backup has finished running"
2718
  msgstr ""
2719
 
@@ -3025,7 +3033,7 @@ msgstr ""
3025
  msgid "No local copy present."
3026
  msgstr ""
3027
 
3028
- #: src/admin.php:2286, src/backup.php:1392
3029
  msgid "Backup directory (%s) is not writable, or does not exist."
3030
  msgstr ""
3031
 
@@ -3065,7 +3073,7 @@ msgstr ""
3065
  msgid "Backup directory successfully created."
3066
  msgstr ""
3067
 
3068
- #: src/admin.php:2626, src/class-updraftplus.php:4046, src/restorer.php:2787
3069
  msgid "Warning:"
3070
  msgstr ""
3071
 
@@ -3173,538 +3181,538 @@ msgstr ""
3173
  msgid "Download most recently modified log file"
3174
  msgstr ""
3175
 
3176
- #: src/admin.php:3159
3177
  msgid "Your WordPress install has old directories from its state before you restored/migrated (technical information: these are suffixed with -old). You should press this button to delete them as soon as you have verified that the restoration worked."
3178
  msgstr ""
3179
 
3180
- #: src/admin.php:3224, src/admin.php:4296
3181
  msgid "View Log"
3182
  msgstr ""
3183
 
3184
- #: src/admin.php:3263
3185
  msgid "Backup begun"
3186
  msgstr ""
3187
 
3188
- #: src/admin.php:3268
3189
  msgid "Creating file backup zips"
3190
  msgstr ""
3191
 
3192
- #: src/admin.php:3281
3193
  msgid "Created file backup zips"
3194
  msgstr ""
3195
 
3196
- #: src/admin.php:3286
3197
  msgid "Clone server being provisioned and booted (can take several minutes)"
3198
  msgstr ""
3199
 
3200
- #: src/admin.php:3290
3201
  msgid "Uploading files to remote storage"
3202
  msgstr ""
3203
 
3204
- #: src/admin.php:3291
3205
  msgid "Sending files to remote site"
3206
  msgstr ""
3207
 
3208
- #: src/admin.php:3298
3209
  msgid "(%s%%, file %s of %s)"
3210
  msgstr ""
3211
 
3212
- #: src/admin.php:3303
3213
  msgid "Pruning old backup sets"
3214
  msgstr ""
3215
 
3216
- #: src/admin.php:3307
3217
  msgid "Waiting until scheduled time to retry because of errors"
3218
  msgstr ""
3219
 
3220
- #: src/admin.php:3312
3221
  msgid "Backup finished"
3222
  msgstr ""
3223
 
3224
- #: src/admin.php:3325
3225
  msgid "Created database backup"
3226
  msgstr ""
3227
 
3228
- #: src/admin.php:3336
3229
  msgid "Creating database backup"
3230
  msgstr ""
3231
 
3232
- #: src/admin.php:3338
3233
  msgid "table: %s"
3234
  msgstr ""
3235
 
3236
- #: src/admin.php:3351
3237
  msgid "Encrypting database"
3238
  msgstr ""
3239
 
3240
- #: src/admin.php:3359
3241
  msgid "Encrypted database"
3242
  msgstr ""
3243
 
3244
- #: src/admin.php:3361, src/central/bootstrap.php:444, src/central/bootstrap.php:451, src/methods/updraftvault.php:415, src/methods/updraftvault.php:449, src/methods/updraftvault.php:534
3245
  msgid "Unknown"
3246
  msgstr ""
3247
 
3248
- #: src/admin.php:3378
3249
  msgid "next resumption: %d (after %ss)"
3250
  msgstr ""
3251
 
3252
- #: src/admin.php:3379
3253
  msgid "last activity: %ss ago"
3254
  msgstr ""
3255
 
3256
- #: src/admin.php:3399
3257
  msgid "Job ID: %s"
3258
  msgstr ""
3259
 
3260
- #: src/admin.php:3413, src/admin.php:3703
3261
  msgid "Warning: %s"
3262
  msgstr ""
3263
 
3264
- #: src/admin.php:3433
3265
  msgid "show log"
3266
  msgstr ""
3267
 
3268
- #: src/admin.php:3434
3269
  msgid "Note: the progress bar below is based on stages, NOT time. Do not stop the backup simply because it seems to have remained in the same place for a while - that is normal."
3270
  msgstr ""
3271
 
3272
- #: src/admin.php:3434
3273
  msgid "stop"
3274
  msgstr ""
3275
 
3276
- #: src/admin.php:3444, src/admin.php:3444
3277
  msgid "Remove old directories"
3278
  msgstr ""
3279
 
3280
- #: src/admin.php:3447
3281
  msgid "Old directories successfully removed."
3282
  msgstr ""
3283
 
3284
- #: src/admin.php:3449
3285
  msgid "Old directory removal failed for some reason. You may want to do this manually."
3286
  msgstr ""
3287
 
3288
- #: src/admin.php:3486, src/admin.php:3521, src/admin.php:3525, src/includes/class-remote-send.php:327, src/includes/class-storage-methods-interface.php:315, src/restorer.php:326, src/restorer.php:3078, src/restorer.php:3183
3289
  msgid "OK"
3290
  msgstr ""
3291
 
3292
- #: src/admin.php:3570
3293
  msgid "The request to the filesystem to create the directory failed."
3294
  msgstr ""
3295
 
3296
- #: src/admin.php:3584
3297
  msgid "The folder was created, but we had to change its file permissions to 777 (world-writable) to be able to write to it. You should check with your hosting provider that this will not cause any problems"
3298
  msgstr ""
3299
 
3300
- #: src/admin.php:3589
3301
  msgid "The folder exists, but your webserver does not have permission to write to it."
3302
  msgstr ""
3303
 
3304
- #: src/admin.php:3589
3305
  msgid "You will need to consult with your web hosting provider to find out how to set permissions for a WordPress plugin to write to the directory."
3306
  msgstr ""
3307
 
3308
- #: src/admin.php:3691
3309
  msgid "incremental backup; base backup: %s"
3310
  msgstr ""
3311
 
3312
- #: src/admin.php:3721
3313
  msgid "No backup has been completed"
3314
  msgstr ""
3315
 
3316
- #: src/admin.php:3735
3317
  msgctxt "i.e. Non-automatic"
3318
  msgid "Manual"
3319
  msgstr ""
3320
 
3321
- #: src/admin.php:3748
3322
  msgid "Backup directory specified is writable, which is good."
3323
  msgstr ""
3324
 
3325
- #: src/admin.php:3752
3326
  msgid "Backup directory specified does <b>not</b> exist."
3327
  msgstr ""
3328
 
3329
- #: src/admin.php:3754
3330
  msgid "Backup directory specified exists, but is <b>not</b> writable."
3331
  msgstr ""
3332
 
3333
- #: src/admin.php:3756
3334
  msgid "Follow this link to attempt to create the directory and set the permissions"
3335
  msgstr ""
3336
 
3337
- #: src/admin.php:3756
3338
  msgid "or, to reset this option"
3339
  msgstr ""
3340
 
3341
- #: src/admin.php:3756
3342
  msgid "press here"
3343
  msgstr ""
3344
 
3345
- #: src/admin.php:3756
3346
  msgid "If that is unsuccessful check the permissions on your server or change it to another directory that is writable by your web server process."
3347
  msgstr ""
3348
 
3349
- #: src/admin.php:3836
3350
  msgid "Your wp-content directory server path: %s"
3351
  msgstr ""
3352
 
3353
- #: src/admin.php:3836
3354
  msgid "Any other directories found inside wp-content"
3355
  msgstr ""
3356
 
3357
- #: src/admin.php:3847
3358
  msgid "Exclude these from"
3359
  msgstr ""
3360
 
3361
- #: src/admin.php:3935
3362
  msgid "Your web server's PHP/Curl installation does not support https access. Communications with %s will be unencrypted. Ask your web host to install Curl/SSL in order to gain the ability for encryption (via an add-on)."
3363
  msgstr ""
3364
 
3365
- #: src/admin.php:3937
3366
  msgid "Your web server's PHP/Curl installation does not support https access. We cannot access %s without this support. Please contact your web hosting provider's support. %s <strong>requires</strong> Curl+https. Please do not file any support requests; there is no alternative."
3367
  msgstr ""
3368
 
3369
- #: src/admin.php:3940
3370
  msgid "Good news: Your site's communications with %s can be encrypted. If you see any errors to do with encryption, then look in the 'Expert Settings' for more help."
3371
  msgstr ""
3372
 
3373
- #: src/admin.php:3978, src/templates/wp-admin/settings/backupnow-modal.php:60, src/templates/wp-admin/settings/existing-backups-table.php:71, src/templates/wp-admin/settings/existing-backups-table.php:74
3374
  msgid "Only allow this backup to be deleted manually (i.e. keep it even if retention limits are hit)."
3375
  msgstr ""
3376
 
3377
- #: src/admin.php:4026
3378
  msgid "Total backup size:"
3379
  msgstr ""
3380
 
3381
- #: src/admin.php:4092, src/includes/class-wpadmin-commands.php:162, src/restorer.php:2115
3382
  msgid "Backup created by unknown source (%s) - cannot be restored."
3383
  msgstr ""
3384
 
3385
- #: src/admin.php:4121
3386
  msgid "Press here to download or browse"
3387
  msgstr ""
3388
 
3389
- #: src/admin.php:4126
3390
  msgid "(%d archive(s) in set)."
3391
  msgstr ""
3392
 
3393
- #: src/admin.php:4129
3394
  msgid "You appear to be missing one or more archives from this multi-archive set."
3395
  msgstr ""
3396
 
3397
- #: src/admin.php:4157, src/admin.php:4159
3398
  msgid "(Not finished)"
3399
  msgstr ""
3400
 
3401
- #: src/admin.php:4159
3402
  msgid "If you are seeing more backups than you expect, then it is probably because the deletion of old backup sets does not happen until a fresh backup completes."
3403
  msgstr ""
3404
 
3405
- #: src/admin.php:4184
3406
  msgid "(backup set imported from remote location)"
3407
  msgstr ""
3408
 
3409
- #: src/admin.php:4187
3410
  msgid "After pressing this button, you will be given the option to choose which components you wish to restore"
3411
  msgstr ""
3412
 
3413
- #: src/admin.php:4266
3414
  msgid "After pressing this button, you can select where to upload your backup from a list of your currently saved remote storage locations"
3415
  msgstr ""
3416
 
3417
- #: src/admin.php:4286
3418
  msgid "Delete this backup set"
3419
  msgstr ""
3420
 
3421
- #: src/admin.php:4489
3422
  msgid "This backup does not exist in the backup history - restoration aborted. Timestamp:"
3423
  msgstr ""
3424
 
3425
- #: src/admin.php:4490
3426
  msgid "Backup does not exist in the backup history"
3427
  msgstr ""
3428
 
3429
- #: src/admin.php:4513
3430
  msgid "ABORT: Could not find the information on which entities to restore."
3431
  msgstr ""
3432
 
3433
- #: src/admin.php:4513
3434
  msgid "If making a request for support, please include this information:"
3435
  msgstr ""
3436
 
3437
- #: src/admin.php:4679
3438
  msgid "Backup won't be sent to any remote storage - none has been saved in the %s"
3439
  msgstr ""
3440
 
3441
- #: src/admin.php:4679
3442
  msgid "settings"
3443
  msgstr ""
3444
 
3445
- #: src/admin.php:4679
3446
  msgid "Not got any remote storage?"
3447
  msgstr ""
3448
 
3449
- #: src/admin.php:4679
3450
  msgid "Check out UpdraftPlus Vault."
3451
  msgstr ""
3452
 
3453
- #: src/admin.php:4681
3454
  msgid "Send this backup to remote storage"
3455
  msgstr ""
3456
 
3457
- #: src/admin.php:4771
3458
  msgid "UpdraftPlus seems to have been updated to version (%s), which is different to the version running when this settings page was loaded. Please reload the settings page before trying to save settings."
3459
  msgstr ""
3460
 
3461
- #: src/admin.php:4778, src/templates/wp-admin/settings/take-backup.php:51
3462
  msgid "This button is disabled because your backup directory is not writable (see the settings)."
3463
  msgstr ""
3464
 
3465
- #: src/admin.php:4807
3466
  msgid "Your settings have been saved."
3467
  msgstr ""
3468
 
3469
- #: src/admin.php:4812
3470
  msgid "Your settings failed to save. Please refresh the settings page and try again"
3471
  msgstr ""
3472
 
3473
- #: src/admin.php:4860
3474
  msgid "authentication error"
3475
  msgstr ""
3476
 
3477
- #: src/admin.php:4864
3478
  msgid "Remote storage method and instance id are required for authentication."
3479
  msgstr ""
3480
 
3481
- #: src/admin.php:4931
3482
  msgid "Your settings have been wiped."
3483
  msgstr ""
3484
 
3485
- #: src/admin.php:5032
3486
  msgid "Known backups (raw)"
3487
  msgstr ""
3488
 
3489
- #: src/admin.php:5067
3490
  msgid "Options (raw)"
3491
  msgstr ""
3492
 
3493
- #: src/admin.php:5070
3494
  msgid "Value"
3495
  msgstr ""
3496
 
3497
- #: src/admin.php:5222
3498
  msgid "The file %s has a \"byte order mark\" (BOM) at its beginning."
3499
  msgid_plural "The files %s have a \"byte order mark\" (BOM) at their beginning."
3500
  msgstr[0] ""
3501
  msgstr[1] ""
3502
 
3503
- #: src/admin.php:5222, src/methods/openstack2.php:144, src/restorer.php:178, src/restorer.php:180, src/templates/wp-admin/settings/downloading-and-restoring.php:27, src/templates/wp-admin/settings/tab-backups.php:27, src/templates/wp-admin/settings/updraftcentral-connect.php:14
3504
  msgid "Follow this link for more information"
3505
  msgstr ""
3506
 
3507
- #: src/admin.php:5244, src/admin.php:5248, src/templates/wp-admin/advanced/site-info.php:45, src/templates/wp-admin/advanced/site-info.php:51, src/templates/wp-admin/advanced/site-info.php:58, src/templates/wp-admin/advanced/site-info.php:59
3508
  msgid "%s version:"
3509
  msgstr ""
3510
 
3511
- #: src/admin.php:5252
3512
  msgid "Clone region:"
3513
  msgstr ""
3514
 
3515
- #: src/admin.php:5257
3516
  msgid "Forbid non-administrators to login to WordPress on your clone"
3517
  msgstr ""
3518
 
3519
- #: src/admin.php:5280
3520
  msgid "(current version)"
3521
  msgstr ""
3522
 
3523
- #: src/admin.php:5300
3524
  msgid "Your clone has started and will be available at the following URLs once it is ready."
3525
  msgstr ""
3526
 
3527
- #: src/admin.php:5301
3528
  msgid "Front page:"
3529
  msgstr ""
3530
 
3531
- #: src/admin.php:5302
3532
  msgid "Dashboard:"
3533
  msgstr ""
3534
 
3535
- #: src/admin.php:5304, src/admin.php:5307
3536
  msgid "You can find your temporary clone information in your updraftplus.com account here."
3537
  msgstr ""
3538
 
3539
- #: src/admin.php:5306
3540
  msgid "Your clone has started, network information is not yet available but will be displayed here and at your updraftplus.com account once it is ready."
3541
  msgstr ""
3542
 
3543
- #: src/backup.php:211
3544
  msgid "%s - could not back this entity up; the corresponding directory does not exist (%s)"
3545
  msgstr ""
3546
 
3547
- #: src/backup.php:283
3548
  msgid "Could not create %s zip. Consult the log file for more information."
3549
  msgstr ""
3550
 
3551
- #: src/backup.php:477, src/backup.php:2164, src/class-updraftplus.php:2125, src/class-updraftplus.php:2192, src/includes/class-storage-methods-interface.php:364, src/restorer.php:480
3552
  msgid "A PHP exception (%s) has occurred: %s"
3553
  msgstr ""
3554
 
3555
- #: src/backup.php:483, src/backup.php:2173, src/class-updraftplus.php:2134, src/class-updraftplus.php:2199, src/includes/class-storage-methods-interface.php:373, src/restorer.php:494
3556
  msgid "A PHP fatal error (%s) has occurred: %s"
3557
  msgstr ""
3558
 
3559
- #: src/backup.php:1070
3560
  msgid "Full backup"
3561
  msgstr ""
3562
 
3563
- #: src/backup.php:1070
3564
  msgid "Incremental"
3565
  msgstr ""
3566
 
3567
- #: src/backup.php:1075, src/class-updraftplus.php:2996
3568
  msgid "The backup was aborted by the user"
3569
  msgstr ""
3570
 
3571
- #: src/backup.php:1079
3572
  msgid "Files (database backup has not completed)"
3573
  msgstr ""
3574
 
3575
- #: src/backup.php:1079
3576
  msgid "Files only (database was not part of this particular schedule)"
3577
  msgstr ""
3578
 
3579
- #: src/backup.php:1082
3580
  msgid "Database (files backup has not completed)"
3581
  msgstr ""
3582
 
3583
- #: src/backup.php:1082
3584
  msgid "Database only (files were not part of this particular schedule)"
3585
  msgstr ""
3586
 
3587
- #: src/backup.php:1085
3588
  msgid "Unknown/unexpected error - please raise a support request"
3589
  msgstr ""
3590
 
3591
- #: src/backup.php:1094
3592
  msgid "Errors encountered:"
3593
  msgstr ""
3594
 
3595
- #: src/backup.php:1112
3596
  msgid "Warnings encountered:"
3597
  msgstr ""
3598
 
3599
- #: src/backup.php:1127
3600
  msgid "Backed up: %s"
3601
  msgstr ""
3602
 
3603
- #: src/backup.php:1136
3604
  msgid "Email reports created by UpdraftPlus (free edition) bring you the latest UpdraftPlus.com news"
3605
  msgstr ""
3606
 
3607
- #: src/backup.php:1136
3608
  msgid "read more at %s"
3609
  msgstr ""
3610
 
3611
- #: src/backup.php:1169
3612
  msgid "WordPress backup is complete"
3613
  msgstr ""
3614
 
3615
- #: src/backup.php:1170
3616
  msgid "Backup contains:"
3617
  msgstr ""
3618
 
3619
- #: src/backup.php:1636
3620
  msgid "database connection attempt failed."
3621
  msgstr ""
3622
 
3623
- #: src/backup.php:1682
3624
  msgid "please wait for the rescheduled attempt"
3625
  msgstr ""
3626
 
3627
- #: src/backup.php:1684
3628
  msgid "No database tables found"
3629
  msgstr ""
3630
 
3631
- #: src/backup.php:1695
3632
  msgid "The backup directory is not writable (or disk space is full) - the database backup is expected to shortly fail."
3633
  msgstr ""
3634
 
3635
- #: src/backup.php:1773
3636
  msgid "Table %s has very many rows (%s) - we hope your web hosting company gives you enough resources to dump out that table in the backup"
3637
  msgstr ""
3638
 
3639
- #: src/backup.php:1773
3640
  msgid "If not, you will need to either remove data from this table, or contact your hosting company to request more resources."
3641
  msgstr ""
3642
 
3643
- #: src/backup.php:1823, src/backup.php:1825
3644
  msgid "The database backup appears to have failed"
3645
  msgstr ""
3646
 
3647
- #: src/backup.php:1823
3648
  msgid "no options or sitemeta table was found"
3649
  msgstr ""
3650
 
3651
- #: src/backup.php:1825
3652
  msgid "the options table was not found"
3653
  msgstr ""
3654
 
3655
- #: src/backup.php:1873
3656
  msgid "Failed to open database file for reading:"
3657
  msgstr ""
3658
 
3659
- #: src/backup.php:1892
3660
  msgid "An error occurred whilst closing the final database file"
3661
  msgstr ""
3662
 
3663
- #: src/backup.php:2205
3664
  msgid "Could not open the backup file for writing"
3665
  msgstr ""
3666
 
3667
- #: src/backup.php:2331
3668
  msgid "Infinite recursion: consult your log for more information"
3669
  msgstr ""
3670
 
3671
- #: src/backup.php:2364
3672
  msgid "%s: unreadable file - could not be backed up (check the file permissions and ownership)"
3673
  msgstr ""
3674
 
3675
- #: src/backup.php:2386
3676
  msgid "Failed to open directory (check the file permissions and ownership): %s"
3677
  msgstr ""
3678
 
3679
- #: src/backup.php:2451
3680
  msgid "%s: unreadable file - could not be backed up"
3681
  msgstr ""
3682
 
3683
- #: src/backup.php:3131, src/backup.php:3414
3684
  msgid "Failed to open the zip file (%s) - %s"
3685
  msgstr ""
3686
 
3687
- #: src/backup.php:3157
3688
  msgid "A very large file was encountered: %s (size: %s Mb)"
3689
  msgstr ""
3690
 
3691
- #: src/backup.php:3458, src/class-updraftplus.php:861
3692
  msgid "Your free space in your hosting account is very low - only %s Mb remain"
3693
  msgstr ""
3694
 
3695
- #: src/backup.php:3465
3696
  msgid "The zip engine returned the message: %s."
3697
  msgstr ""
3698
 
3699
- #: src/backup.php:3467
3700
  msgid "A zip error occurred"
3701
  msgstr ""
3702
 
3703
- #: src/backup.php:3469
3704
  msgid "your web hosting account appears to be full; please see: %s"
3705
  msgstr ""
3706
 
3707
- #: src/backup.php:3471
3708
  msgid "check your log for more details."
3709
  msgstr ""
3710
 
@@ -3996,7 +4004,7 @@ msgstr ""
3996
  msgid "Could not save backup history because we have no backup array. Backup probably failed."
3997
  msgstr ""
3998
 
3999
- #: src/class-updraftplus.php:3868, src/includes/class-updraftplus-encryption.php:336, src/restorer.php:876
4000
  msgid "Decryption failed. The database file is encrypted, but you have no encryption key entered."
4001
  msgstr ""
4002
 
@@ -4004,7 +4012,7 @@ msgstr ""
4004
  msgid "Decryption failed. The database file is encrypted."
4005
  msgstr ""
4006
 
4007
- #: src/class-updraftplus.php:3880, src/includes/class-updraftplus-encryption.php:354, src/restorer.php:889
4008
  msgid "Decryption failed. The most likely cause is that you used the wrong key."
4009
  msgstr ""
4010
 
@@ -4048,11 +4056,11 @@ msgstr ""
4048
  msgid "You can search and replace your database (for migrating a website to a new location/URL) with the Migrator add-on - follow this link for more information"
4049
  msgstr ""
4050
 
4051
- #: src/class-updraftplus.php:3990, src/restorer.php:1554
4052
  msgid "You are using the %s webserver, but do not seem to have the %s module loaded."
4053
  msgstr ""
4054
 
4055
- #: src/class-updraftplus.php:3990, src/restorer.php:1554
4056
  msgid "You should enable %s to make any pretty permalinks (e.g. %s) work"
4057
  msgstr ""
4058
 
@@ -4080,7 +4088,7 @@ msgstr ""
4080
  msgid "Any support requests to do with %s should be raised with your web hosting company."
4081
  msgstr ""
4082
 
4083
- #: src/class-updraftplus.php:4024, src/restorer.php:2355, src/restorer.php:2444, src/restorer.php:2470
4084
  msgid "Old table prefix:"
4085
  msgstr ""
4086
 
@@ -4088,7 +4096,7 @@ msgstr ""
4088
  msgid "Backup label:"
4089
  msgstr ""
4090
 
4091
- #: src/class-updraftplus.php:4035, src/class-updraftplus.php:4038, src/restorer.php:638
4092
  msgid "You are running on WordPress multisite - but your backup is not of a multisite site."
4093
  msgstr ""
4094
 
@@ -4100,7 +4108,7 @@ msgstr ""
4100
  msgid "Please read this link for important information on this process."
4101
  msgstr ""
4102
 
4103
- #: src/class-updraftplus.php:4042, src/restorer.php:2367
4104
  msgid "To import an ordinary WordPress site into a multisite installation requires %s."
4105
  msgstr ""
4106
 
@@ -4112,7 +4120,7 @@ msgstr ""
4112
  msgid "If you want to restore a multisite backup, you should first set up your WordPress installation as a multisite."
4113
  msgstr ""
4114
 
4115
- #: src/class-updraftplus.php:4053, src/restorer.php:2373
4116
  msgid "Site information:"
4117
  msgstr ""
4118
 
@@ -4228,11 +4236,11 @@ msgstr ""
4228
  msgid "Your web server's PHP installation has these functions disabled: %s."
4229
  msgstr ""
4230
 
4231
- #: src/includes/class-filesystem-functions.php:294, src/methods/ftp.php:330, src/restorer.php:2146
4232
  msgid "Your hosting company must enable these functions before %s can work."
4233
  msgstr ""
4234
 
4235
- #: src/includes/class-filesystem-functions.php:294, src/restorer.php:2146
4236
  msgid "restoration"
4237
  msgstr ""
4238
 
@@ -4248,7 +4256,7 @@ msgstr ""
4248
  msgid "The attempt to undo the double-compression succeeded."
4249
  msgstr ""
4250
 
4251
- #: src/includes/class-filesystem-functions.php:538
4252
  msgid "Unzip progress: %d out of %d files"
4253
  msgstr ""
4254
 
@@ -4492,7 +4500,7 @@ msgstr ""
4492
  msgid "Allow only administrators to log in"
4493
  msgstr ""
4494
 
4495
- #: src/includes/updraftplus-login.php:58, src/methods/updraftvault.php:687, src/udaddons/updraftplus-addons.php:971
4496
  msgid "UpdraftPlus.Com returned a response which we could not understand (data: %s)"
4497
  msgstr ""
4498
 
@@ -4983,15 +4991,15 @@ msgstr ""
4983
  msgid "%s end-point"
4984
  msgstr ""
4985
 
4986
- #: src/methods/dropbox.php:173, src/methods/dropbox.php:190
4987
  msgid "You do not appear to be authenticated with Dropbox"
4988
  msgstr ""
4989
 
4990
- #: src/methods/dropbox.php:195
4991
  msgid "error: %s (see log file for more)"
4992
  msgstr ""
4993
 
4994
- #: src/methods/dropbox.php:284
4995
  msgid "error: failed to upload file to %s (see log file for more)"
4996
  msgstr ""
4997
 
@@ -4999,67 +5007,67 @@ msgstr ""
4999
  msgid "did not return the expected response - check your log file for more details"
5000
  msgstr ""
5001
 
5002
- #: src/methods/dropbox.php:305, src/methods/dropbox.php:321
5003
  msgid "failed to upload file to %s (see log file for more)"
5004
  msgstr ""
5005
 
5006
- #: src/methods/dropbox.php:377
5007
  msgid "%s returned an unexpected HTTP response: %s"
5008
  msgstr ""
5009
 
5010
- #: src/methods/dropbox.php:440
5011
  msgid "You do not appear to be authenticated with %s (whilst deleting)"
5012
  msgstr ""
5013
 
5014
- #: src/methods/dropbox.php:448
5015
  msgid "Failed to access %s when deleting (see log file for more)"
5016
  msgstr ""
5017
 
5018
- #: src/methods/dropbox.php:481
5019
  msgid "You do not appear to be authenticated with %s"
5020
  msgstr ""
5021
 
5022
- #: src/methods/dropbox.php:603, src/methods/dropbox.php:605
5023
  msgid "Need to use sub-folders?"
5024
  msgstr ""
5025
 
5026
- #: src/methods/dropbox.php:603, src/methods/dropbox.php:605
5027
  msgid "Backups are saved in"
5028
  msgstr ""
5029
 
5030
- #: src/methods/dropbox.php:603, src/methods/dropbox.php:605
5031
  msgid "If you backup several sites into the same Dropbox and want to organize with sub-folders, then "
5032
  msgstr ""
5033
 
5034
- #: src/methods/dropbox.php:603, src/methods/dropbox.php:605
5035
  msgid "there's an add-on for that."
5036
  msgstr ""
5037
 
5038
- #: src/methods/dropbox.php:611
5039
  msgid "Dropbox"
5040
  msgstr ""
5041
 
5042
- #: src/methods/dropbox.php:636
5043
  msgid "You must add the following as the authorised redirect URI in your Dropbox console (under \"API Settings\") when asked"
5044
  msgstr ""
5045
 
5046
- #: src/methods/dropbox.php:753, src/methods/dropbox.php:775
5047
  msgid "%s authentication"
5048
  msgstr ""
5049
 
5050
- #: src/methods/dropbox.php:790
5051
  msgid "%s de-authentication"
5052
  msgstr ""
5053
 
5054
- #: src/methods/dropbox.php:806, src/methods/dropbox.php:808
5055
  msgid "Success:"
5056
  msgstr ""
5057
 
5058
- #: src/methods/dropbox.php:806, src/methods/dropbox.php:808
5059
  msgid "you have authenticated your %s account"
5060
  msgstr ""
5061
 
5062
- #: src/methods/dropbox.php:811, src/methods/dropbox.php:833
5063
  msgid "though part of the returned information was not as expected - your mileage may vary"
5064
  msgstr ""
5065
 
@@ -5557,11 +5565,11 @@ msgstr ""
5557
  msgid "You do not currently have any UpdraftPlus Vault quota"
5558
  msgstr ""
5559
 
5560
- #: src/methods/updraftvault.php:714, src/methods/updraftvault.php:729, src/udaddons/updraftplus-addons.php:1012
5561
  msgid "UpdraftPlus.Com returned a response, but we could not understand it"
5562
  msgstr ""
5563
 
5564
- #: src/methods/updraftvault.php:720, src/udaddons/updraftplus-addons.php:1001
5565
  msgid "Your email address was valid, but your password was not recognised by UpdraftPlus.Com."
5566
  msgstr ""
5567
 
@@ -5569,11 +5577,11 @@ msgstr ""
5569
  msgid "If you have forgotten your password, then go here to change your password on updraftplus.com."
5570
  msgstr ""
5571
 
5572
- #: src/methods/updraftvault.php:723, src/udaddons/updraftplus-addons.php:1005
5573
  msgid "You entered an email address that was not recognised by UpdraftPlus.Com"
5574
  msgstr ""
5575
 
5576
- #: src/methods/updraftvault.php:726, src/udaddons/updraftplus-addons.php:1008
5577
  msgid "Your email address and password were not recognised by UpdraftPlus.Com"
5578
  msgstr ""
5579
 
@@ -5597,290 +5605,290 @@ msgstr ""
5597
  msgid "(This applies to all WordPress backup plugins unless they have been explicitly coded for multisite compatibility)."
5598
  msgstr ""
5599
 
5600
- #: src/restorer.php:169
5601
  msgid "Your WordPress install has old directories from its state before you restored/migrated (technical information: these are suffixed with -old)."
5602
  msgstr ""
5603
 
5604
- #: src/restorer.php:297
5605
  msgid "Skipping restoration of WordPress core when importing a single site into a multisite installation. If you had anything necessary in your WordPress directory then you will need to re-add it manually from the zip file."
5606
  msgstr ""
5607
 
5608
- #: src/restorer.php:308
5609
  msgid "Looking for %s archive: file name: %s"
5610
  msgstr ""
5611
 
5612
- #: src/restorer.php:311
5613
  msgid "Skipping: this archive was already restored."
5614
  msgstr ""
5615
 
5616
- #: src/restorer.php:323
5617
  msgid "Archive is expected to be size:"
5618
  msgstr ""
5619
 
5620
- #: src/restorer.php:328
5621
  msgid "file is size:"
5622
  msgstr ""
5623
 
5624
- #: src/restorer.php:331
5625
  msgid "The backup records do not contain information about the proper size of this file."
5626
  msgstr ""
5627
 
5628
- #: src/restorer.php:334, src/restorer.php:335
5629
  msgid "Could not find one of the files for restoration"
5630
  msgstr ""
5631
 
5632
- #: src/restorer.php:417
5633
  msgid "Final checks"
5634
  msgstr ""
5635
 
5636
- #: src/restorer.php:506
5637
  msgid "Error message"
5638
  msgstr ""
5639
 
5640
- #: src/restorer.php:623
5641
  msgid "UpdraftPlus is not able to directly restore this kind of entity. It must be restored manually."
5642
  msgstr ""
5643
 
5644
- #: src/restorer.php:624
5645
  msgid "Backup file not available."
5646
  msgstr ""
5647
 
5648
- #: src/restorer.php:625
5649
  msgid "Copying this entity failed."
5650
  msgstr ""
5651
 
5652
- #: src/restorer.php:626
5653
  msgid "Unpacking backup..."
5654
  msgstr ""
5655
 
5656
- #: src/restorer.php:627
5657
  msgid "Decrypting database (can take a while)..."
5658
  msgstr ""
5659
 
5660
- #: src/restorer.php:628
5661
  msgid "Database successfully decrypted."
5662
  msgstr ""
5663
 
5664
- #: src/restorer.php:629
5665
  msgid "Moving old data out of the way..."
5666
  msgstr ""
5667
 
5668
- #: src/restorer.php:630
5669
  msgid "Moving unpacked backup into place..."
5670
  msgstr ""
5671
 
5672
- #: src/restorer.php:631
5673
  msgid "Restoring the database (on a large site this can take a long time - if it times out (which can happen if your web hosting company has configured your hosting to limit resources) then you should use a different method, such as phpMyAdmin)..."
5674
  msgstr ""
5675
 
5676
- #: src/restorer.php:632
5677
  msgid "Cleaning up rubbish..."
5678
  msgstr ""
5679
 
5680
- #: src/restorer.php:633
5681
  msgid "Could not move old files out of the way."
5682
  msgstr ""
5683
 
5684
- #: src/restorer.php:633
5685
  msgid "You should check the file ownerships and permissions in your WordPress installation"
5686
  msgstr ""
5687
 
5688
- #: src/restorer.php:634
5689
  msgid "Could not delete old directory."
5690
  msgstr ""
5691
 
5692
- #: src/restorer.php:635
5693
  msgid "Could not move new files into place. Check your wp-content/upgrade folder."
5694
  msgstr ""
5695
 
5696
- #: src/restorer.php:636
5697
  msgid "Could not move the files into place. Check your file permissions."
5698
  msgstr ""
5699
 
5700
- #: src/restorer.php:637
5701
  msgid "Failed to delete working directory after restoring."
5702
  msgstr ""
5703
 
5704
- #: src/restorer.php:639
5705
  msgid "Failed to unpack the archive"
5706
  msgstr ""
5707
 
5708
- #: src/restorer.php:640
5709
  msgid "Failed to read the manifest file from backup."
5710
  msgstr ""
5711
 
5712
- #: src/restorer.php:641
5713
  msgid "Failed to find a manifest file in the backup."
5714
  msgstr ""
5715
 
5716
- #: src/restorer.php:642
5717
  msgid "Failed to read from the working directory."
5718
  msgstr ""
5719
 
5720
- #: src/restorer.php:868
5721
  msgid "Failed to create a temporary directory"
5722
  msgstr ""
5723
 
5724
- #: src/restorer.php:884
5725
  msgid "Failed to write out the decrypted database to the filesystem"
5726
  msgstr ""
5727
 
5728
- #: src/restorer.php:961
5729
  msgid "The directory does not exist"
5730
  msgstr ""
5731
 
5732
- #: src/restorer.php:1001
5733
  msgid "wp-config.php from backup: will restore as wp-config-backup.php"
5734
  msgstr ""
5735
 
5736
- #: src/restorer.php:1008
5737
  msgid "wp-config.php from backup: restoring (as per user's request)"
5738
  msgstr ""
5739
 
5740
- #: src/restorer.php:1191, src/restorer.php:1199
5741
  msgid "UpdraftPlus needed to create a %s in your content directory, but failed - please check your file permissions and enable the access (%s)"
5742
  msgstr ""
5743
 
5744
- #: src/restorer.php:1199
5745
  msgid "file"
5746
  msgstr ""
5747
 
5748
- #: src/restorer.php:1214
5749
  msgid "Existing unremoved folders from a previous restore exist (please use the \"Delete Old Directories\" button to delete them before trying again): %s"
5750
  msgstr ""
5751
 
5752
- #: src/restorer.php:1221
5753
  msgid "This version of UpdraftPlus does not know how to handle this type of foreign backup"
5754
  msgstr ""
5755
 
5756
- #: src/restorer.php:1324
5757
  msgid "Deferring..."
5758
  msgstr ""
5759
 
5760
- #: src/restorer.php:1367, src/restorer.php:1415
5761
  msgid "The WordPress content folder (wp-content) was not found in this zip file."
5762
  msgstr ""
5763
 
5764
- #: src/restorer.php:1508
5765
  msgid "Files found:"
5766
  msgstr ""
5767
 
5768
- #: src/restorer.php:2035
5769
  msgid "Please supply the requested information, and then continue."
5770
  msgstr ""
5771
 
5772
- #: src/restorer.php:2108
5773
  msgid "Warning: PHP safe_mode is active on your server. Timeouts are much more likely. If these happen, then you will need to manually restore the file via phpMyAdmin or another method."
5774
  msgstr ""
5775
 
5776
- #: src/restorer.php:2131
5777
  msgid "Failed to find database file"
5778
  msgstr ""
5779
 
5780
- #: src/restorer.php:2152
5781
  msgid "Failed to open database file"
5782
  msgstr ""
5783
 
5784
- #: src/restorer.php:2232, src/restorer.php:2274
5785
  msgid "Your database user does not have permission to drop tables"
5786
  msgstr ""
5787
 
5788
- #: src/restorer.php:2235
5789
  msgid "Your database user does not have permission to create tables. We will attempt to restore by simply emptying the tables; this should work as long as a) you are restoring from a WordPress version with the same database structure, and b) Your imported database does not contain any tables which are not already present on the importing site."
5790
  msgstr ""
5791
 
5792
- #: src/restorer.php:2279
5793
  msgid "Your database user does not have permission to drop tables. We will attempt to restore by simply emptying the tables; this should work as long as you are restoring from a WordPress version with the same database structure (%s)"
5794
  msgstr ""
5795
 
5796
- #: src/restorer.php:2325
5797
  msgid "Backup of: %s"
5798
  msgstr ""
5799
 
5800
- #: src/restorer.php:2332
5801
  msgid "Backup created by:"
5802
  msgstr ""
5803
 
5804
- #: src/restorer.php:2337
5805
  msgid "Site home:"
5806
  msgstr ""
5807
 
5808
- #: src/restorer.php:2343
5809
  msgid "Content URL:"
5810
  msgstr ""
5811
 
5812
- #: src/restorer.php:2348
5813
  msgid "Uploads URL:"
5814
  msgstr ""
5815
 
5816
- #: src/restorer.php:2359
5817
  msgid "Skipped tables:"
5818
  msgstr ""
5819
 
5820
- #: src/restorer.php:2399
5821
  msgid "Split line to avoid exceeding maximum packet size"
5822
  msgstr ""
5823
 
5824
- #: src/restorer.php:2424, src/restorer.php:2893, src/restorer.php:2934, src/restorer.php:2947
5825
  msgid "An error occurred on the first %s command - aborting run"
5826
  msgstr ""
5827
 
5828
- #: src/restorer.php:2525
5829
  msgid "Requested table engine (%s) is not present - changing to MyISAM."
5830
  msgstr ""
5831
 
5832
- #: src/restorer.php:2538
5833
  msgid "Requested table character set (%s) is not present - changing to %s."
5834
  msgstr ""
5835
 
5836
- #: src/restorer.php:2588
5837
  msgid "Requested table collation (%1$s) is not present - changing to %2$s."
5838
  msgid_plural "Requested table collations (%1$s) are not present - changing to %2$s."
5839
  msgstr[0] ""
5840
  msgstr[1] ""
5841
 
5842
- #: src/restorer.php:2590
5843
  msgid "Processing table (%s)"
5844
  msgstr ""
5845
 
5846
- #: src/restorer.php:2594
5847
  msgid "will restore as:"
5848
  msgstr ""
5849
 
5850
- #: src/restorer.php:2633
5851
  msgid "Found SET NAMES %s, but changing to %s as suggested by WPDB::determine_charset()."
5852
  msgstr ""
5853
 
5854
- #: src/restorer.php:2639
5855
  msgid "Requested character set (%s) is not present - changing to %s."
5856
  msgstr ""
5857
 
5858
- #: src/restorer.php:2787
5859
  msgid "An SQL line that is larger than the maximum packet size and cannot be split was found; this line will not be processed, but will be dropped: %s"
5860
  msgstr ""
5861
 
5862
- #: src/restorer.php:2924
5863
  msgctxt "The user is being told the number of times an error has happened, e.g. An error (27) occurred"
5864
  msgid "An error (%s) occurred:"
5865
  msgstr ""
5866
 
5867
- #: src/restorer.php:2945
5868
  msgid "This problem is caused by trying to restore a database on a very old MySQL version that is incompatible with the source database."
5869
  msgstr ""
5870
 
5871
- #: src/restorer.php:2945
5872
  msgid "This database needs to be deployed on MySQL version %s or later."
5873
  msgstr ""
5874
 
5875
- #: src/restorer.php:2947
5876
  msgid "To use this backup, your database server needs to support the %s character set."
5877
  msgstr ""
5878
 
5879
- #: src/restorer.php:2952
5880
  msgid "Too many database errors have occurred - aborting"
5881
  msgstr ""
5882
 
5883
- #: src/restorer.php:3072, src/restorer.php:3147
5884
  msgid "Table prefix has changed: changing %s table field(s) accordingly:"
5885
  msgstr ""
5886
 
@@ -7265,19 +7273,19 @@ msgstr ""
7265
  msgid "UpdraftPlus.Com responded, but we did not understand the response"
7266
  msgstr ""
7267
 
7268
- #: src/udaddons/updraftplus-addons.php:969
7269
  msgid "No response data was received. This usually indicates a network connectivity issue (e.g. an outgoing firewall or overloaded network) between this site and UpdraftPlus.com."
7270
  msgstr ""
7271
 
7272
- #: src/udaddons/updraftplus-addons.php:1001
7273
  msgid "Go here to re-enter your password."
7274
  msgstr ""
7275
 
7276
- #: src/udaddons/updraftplus-addons.php:1002
7277
  msgid "If you have forgotten your password "
7278
  msgstr ""
7279
 
7280
- #: src/udaddons/updraftplus-addons.php:1002
7281
  msgid "go here to change your password on updraftplus.com."
7282
  msgstr ""
7283
 
145
  msgid "You must add the following as the authorised redirect URI in your Azure console (under \"API Settings\") when asked"
146
  msgstr ""
147
 
148
+ #: src/addons/azure.php:601, src/addons/migrator.php:948, src/admin.php:1155, src/admin.php:1159, src/admin.php:1163, src/admin.php:1167, src/admin.php:1171, src/admin.php:1180, src/admin.php:3934, src/admin.php:3941, src/admin.php:3943, src/admin.php:5228, src/methods/cloudfiles-new.php:100, src/methods/cloudfiles.php:440, src/methods/ftp.php:330, src/methods/openstack-base.php:571, src/methods/s3.php:864, src/methods/s3.php:868, src/methods/updraftvault.php:311, src/templates/wp-admin/settings/downloading-and-restoring.php:27, src/templates/wp-admin/settings/tab-backups.php:27, src/udaddons/updraftplus-addons.php:259
149
  msgid "Warning"
150
  msgstr ""
151
 
152
+ #: src/addons/azure.php:601, src/admin.php:3934, src/methods/updraftvault.php:311
153
  msgid "Your web server's PHP installation does not included a <strong>required</strong> (for %s) module (%s). Please contact your web hosting provider's support and ask for them to enable it."
154
  msgstr ""
155
 
157
  msgid "Create Azure credentials in your Azure developer console."
158
  msgstr ""
159
 
160
+ #: src/addons/azure.php:605, src/addons/onedrive.php:1142, src/includes/class-remote-send.php:314
161
  msgid "For longer help, including screenshots, follow this link."
162
  msgstr ""
163
 
201
  msgid "You can enter the path of any %s virtual folder you wish to use here."
202
  msgstr ""
203
 
204
+ #: src/addons/azure.php:638, src/addons/google-enhanced.php:76, src/addons/onedrive.php:1182
205
  msgid "If you leave it blank, then the backup will be placed in the root of your %s"
206
  msgstr ""
207
 
233
  msgid "Error: unexpected file read fail"
234
  msgstr ""
235
 
236
+ #: src/addons/backblaze.php:225, src/addons/cloudfiles-enhanced.php:117, src/addons/migrator.php:893, src/addons/migrator.php:1190, src/addons/migrator.php:1271, src/addons/migrator.php:1320, src/addons/migrator.php:1558, src/addons/s3-enhanced.php:164, src/addons/s3-enhanced.php:169, src/addons/s3-enhanced.php:171, src/addons/sftp.php:911, src/addons/webdav.php:203, src/admin.php:91, src/admin.php:817, src/includes/class-remote-send.php:266, src/includes/class-remote-send.php:293, src/includes/class-remote-send.php:299, src/includes/class-remote-send.php:362, src/includes/class-remote-send.php:421, src/includes/class-remote-send.php:448, src/includes/class-remote-send.php:471, src/includes/class-remote-send.php:481, src/includes/class-remote-send.php:486, src/methods/remotesend.php:74, src/methods/remotesend.php:242, src/methods/remotesend.php:298, src/methods/updraftvault.php:532, src/restorer.php:332, src/restorer.php:360, src/restorer.php:2093
237
  msgid "Error:"
238
  msgstr ""
239
 
253
  msgid "Failure: We could not successfully access or create such a bucket. Please check your access credentials, and if those are correct then try another bucket name (as another %s user may already have taken your name)."
254
  msgstr ""
255
 
256
+ #: src/addons/backblaze.php:580, src/methods/cloudfiles.php:234, src/methods/dropbox.php:357, src/methods/openstack-base.php:118
257
  msgid "No settings were found"
258
  msgstr ""
259
 
449
  msgid "Folder"
450
  msgstr ""
451
 
452
+ #: src/addons/google-enhanced.php:76, src/addons/onedrive.php:1182
453
  msgid "Enter the path of the %s folder you wish to use here."
454
  msgstr ""
455
 
456
+ #: src/addons/google-enhanced.php:76, src/addons/googlecloud.php:1039, src/addons/onedrive.php:1182
457
  msgid "e.g. %s"
458
  msgstr ""
459
 
625
  msgid "But no %s settings were found. Please complete all fields in %s settings and save the settings."
626
  msgstr ""
627
 
628
+ #: src/addons/googlecloud.php:698, src/addons/onedrive.php:901, src/addons/onedrive.php:912, src/methods/googledrive.php:442, src/methods/googledrive.php:455
629
  msgid "However, subsequent access attempts failed:"
630
  msgstr ""
631
 
632
+ #: src/addons/googlecloud.php:718, src/addons/googlecloud.php:839, src/addons/onedrive.php:933, src/addons/sftp.php:591, src/addons/sftp.php:595, src/addons/wp-cli.php:516, src/methods/addon-base-v2.php:327, src/methods/cloudfiles.php:575, src/methods/googledrive.php:475, src/methods/openstack-base.php:530, src/methods/s3.php:1202, src/methods/stream-base.php:372
633
  msgid "Success"
634
  msgstr ""
635
 
636
+ #: src/addons/googlecloud.php:718, src/addons/onedrive.php:933, src/methods/googledrive.php:475
637
  msgid "you have authenticated your %s account."
638
  msgstr ""
639
 
645
  msgid "You must save and authenticate before you can test your settings."
646
  msgstr ""
647
 
648
+ #: src/addons/googlecloud.php:776, src/addons/googlecloud.php:810, src/addons/googlecloud.php:816, src/addons/sftp.php:553, src/admin.php:3488, src/admin.php:3524, src/admin.php:3534, src/methods/addon-base-v2.php:313, src/methods/stream-base.php:356
649
  msgid "Failed"
650
  msgstr ""
651
 
665
  msgid "You must enter a project ID in order to be able to create a new bucket."
666
  msgstr ""
667
 
668
+ #: src/addons/googlecloud.php:984, src/methods/dropbox.php:576
669
  msgid "%s logo"
670
  msgstr ""
671
 
693
  msgid "You must add the following as the authorized redirect URI (under \"More Options\") when asked"
694
  msgstr ""
695
 
696
+ #: src/addons/googlecloud.php:1019, src/addons/onedrive.php:1171, src/methods/googledrive.php:1233
697
  msgid "Client ID"
698
  msgstr ""
699
 
701
  msgid "If Google later shows you the message \"invalid_client\", then you did not enter a valid client ID here."
702
  msgstr ""
703
 
704
+ #: src/addons/googlecloud.php:1027, src/addons/onedrive.php:1175, src/methods/googledrive.php:1237
705
  msgid "Client Secret"
706
  msgstr ""
707
 
721
  msgid "Otherwise, you can leave it blank."
722
  msgstr ""
723
 
724
+ #: src/addons/googlecloud.php:1034, src/addons/migrator.php:493, src/addons/migrator.php:496, src/addons/migrator.php:499, src/admin.php:1159, src/admin.php:2631, src/backup.php:3474, src/class-updraftplus.php:4134, src/class-updraftplus.php:4134, src/updraftplus.php:157
725
  msgid "Go here for more information."
726
  msgstr ""
727
 
765
  msgid "<strong>(You appear to be already authenticated,</strong> though you can authenticate again to refresh your access if you've had a problem)."
766
  msgstr ""
767
 
768
+ #: src/addons/googlecloud.php:1108, src/addons/onedrive.php:1242, src/methods/dropbox.php:667, src/methods/googledrive.php:1289
769
  msgid "Account holder's name: %s."
770
  msgstr ""
771
 
777
  msgid "Supported backup plugins: %s"
778
  msgstr ""
779
 
780
+ #: src/addons/importer.php:276, src/admin.php:4095, src/includes/class-backup-history.php:499
781
  msgid "Backup created by: %s."
782
  msgstr ""
783
 
784
+ #: src/addons/incremental.php:89, src/addons/incremental.php:91
785
  msgid "(latest increment: %s)"
786
  msgstr ""
787
 
788
+ #: src/addons/incremental.php:91
789
  msgid "Increments exist at: %s"
790
  msgstr ""
791
 
792
+ #: src/addons/incremental.php:295
793
  msgid "Files changed since the last backup will be added as a new increment in that backup set."
794
  msgstr ""
795
 
796
+ #: src/addons/incremental.php:295
797
  msgid "N.B. No backup of your database will be taken in an incremental backup; if you want a database backup as well, then take that separately."
798
  msgstr ""
799
 
800
+ #: src/addons/incremental.php:297
801
  msgid "No incremental backup of your files is possible, as no suitable existing backup was found to add increments to."
802
  msgstr ""
803
 
804
+ #: src/addons/incremental.php:342, src/addons/reporting.php:261, src/admin.php:4027
805
  msgid "None"
806
  msgstr ""
807
 
808
+ #: src/addons/incremental.php:343, src/updraftplus.php:99
809
  msgid "Every hour"
810
  msgstr ""
811
 
812
+ #: src/addons/incremental.php:344, src/addons/incremental.php:345, src/addons/incremental.php:346, src/addons/incremental.php:347, src/admin.php:3742, src/admin.php:3743, src/admin.php:3744, src/updraftplus.php:100, src/updraftplus.php:101, src/updraftplus.php:102
813
  msgid "Every %s hours"
814
  msgstr ""
815
 
816
+ #: src/addons/incremental.php:348, src/admin.php:3745
817
  msgid "Daily"
818
  msgstr ""
819
 
820
+ #: src/addons/incremental.php:349, src/admin.php:3746
821
  msgid "Weekly"
822
  msgstr ""
823
 
824
+ #: src/addons/incremental.php:350, src/admin.php:3747
825
  msgid "Fortnightly"
826
  msgstr ""
827
 
828
+ #: src/addons/incremental.php:351, src/admin.php:3748
829
  msgid "Monthly"
830
  msgstr ""
831
 
832
+ #: src/addons/incremental.php:365
833
  msgid "And then add an incremental backup"
834
  msgstr ""
835
 
836
+ #: src/addons/incremental.php:377
837
  msgid "Tell me more"
838
  msgstr ""
839
 
949
  msgid "After pressing this button, you will be given the option to choose which components you wish to migrate"
950
  msgstr ""
951
 
952
+ #: src/addons/migrator.php:274, src/admin.php:663, src/admin.php:850, src/admin.php:4193
953
  msgid "Restore"
954
  msgstr ""
955
 
981
  msgid "search term"
982
  msgstr ""
983
 
984
+ #: src/addons/migrator.php:343, src/addons/migrator.php:358, src/admin.php:2549, src/admin.php:2559, src/admin.php:2568, src/admin.php:2610, src/admin.php:3457
985
  msgid "Return to UpdraftPlus Configuration"
986
  msgstr ""
987
 
1183
  msgid "Time taken (seconds):"
1184
  msgstr ""
1185
 
1186
+ #: src/addons/migrator.php:1320, src/restorer.php:2977
1187
  msgid "the database query being run was:"
1188
  msgstr ""
1189
 
1247
  msgid "Enter your chosen name"
1248
  msgstr ""
1249
 
1250
+ #: src/addons/migrator.php:1761, src/addons/sftp.php:467, src/admin.php:868, src/admin.php:5076, src/templates/wp-admin/settings/temporary-clone.php:63
1251
  msgid "Key"
1252
  msgstr ""
1253
 
1307
  msgid "database connection attempt failed"
1308
  msgstr ""
1309
 
1310
+ #: src/addons/moredatabase.php:112, src/backup.php:1645
1311
  msgid "Connection failed: check your access details, that the database server is up, and that the network connection is not firewalled."
1312
  msgstr ""
1313
 
1363
  msgid "Username"
1364
  msgstr ""
1365
 
1366
+ #: src/addons/moredatabase.php:242, src/addons/reporting.php:276, src/addons/wp-cli.php:432, src/admin.php:344, src/admin.php:4002, src/admin.php:4055, src/includes/class-remote-send.php:331, src/includes/class-wpadmin-commands.php:157, src/includes/class-wpadmin-commands.php:521, src/restorer.php:466, src/templates/wp-admin/settings/delete-and-restore-modals.php:74, src/templates/wp-admin/settings/delete-and-restore-modals.php:75, src/templates/wp-admin/settings/take-backup.php:34
1367
  msgid "Database"
1368
  msgstr ""
1369
 
1516
  msgid "Exclude these:"
1517
  msgstr ""
1518
 
1519
+ #: src/addons/morefiles.php:476, src/admin.php:3856
1520
  msgid "If entering multiple files/directories, then separate them with commas. For entities at the top level, you can use a * at the start or end of the entry as a wildcard."
1521
  msgstr ""
1522
 
1592
  msgid "The required %s PHP module is not installed - ask your web hosting company to enable it."
1593
  msgstr ""
1594
 
1595
+ #: src/addons/onedrive.php:112, src/methods/dropbox.php:266
1596
  msgid "Account full: your %s account has only %d bytes left, but the file to be uploaded has %d bytes remaining (total size: %d bytes)"
1597
  msgstr ""
1598
 
1599
+ #: src/addons/onedrive.php:677, src/udaddons/updraftplus-addons.php:937
1600
  msgid "An error response was received; HTTP code:"
1601
  msgstr ""
1602
 
1603
+ #: src/addons/onedrive.php:690, src/addons/onedrive.php:710, src/includes/updraftplus-login.php:56, src/methods/updraftvault.php:685, src/udaddons/updraftplus-addons.php:950, src/udaddons/updraftplus-addons.php:963
1604
  msgid "This most likely means that you share a webserver with a hacked website that has been used in previous attacks."
1605
  msgstr ""
1606
 
1607
+ #: src/addons/onedrive.php:690, src/udaddons/updraftplus-addons.php:950, src/udaddons/updraftplus-addons.php:963
1608
  msgid "To remove any block, please go here."
1609
  msgstr ""
1610
 
1611
+ #: src/addons/onedrive.php:690, src/udaddons/updraftplus-addons.php:950
1612
  msgid "Your IP address:"
1613
  msgstr ""
1614
 
1615
+ #: src/addons/onedrive.php:710, src/includes/updraftplus-login.php:56, src/methods/updraftvault.php:685, src/udaddons/updraftplus-addons.php:963
1616
  msgid "UpdraftPlus.com has responded with 'Access Denied'."
1617
  msgstr ""
1618
 
1619
+ #: src/addons/onedrive.php:710, src/includes/updraftplus-login.php:56, src/methods/updraftvault.php:685, src/udaddons/updraftplus-addons.php:963
1620
  msgid "It appears that your web server's IP Address (%s) is blocked."
1621
  msgstr ""
1622
 
1623
+ #: src/addons/onedrive.php:710, src/includes/updraftplus-login.php:56, src/methods/updraftvault.php:685
1624
  msgid "To remove the block, please go here."
1625
  msgstr ""
1626
 
1627
+ #: src/addons/onedrive.php:717
1628
  msgid "Please re-authorize the connection to your %s account."
1629
  msgstr ""
1630
 
1631
+ #: src/addons/onedrive.php:726
1632
  msgid "Account is not authorized (%s)."
1633
  msgstr ""
1634
 
1635
+ #: src/addons/onedrive.php:858, src/class-updraftplus.php:532, src/methods/dropbox.php:239, src/methods/dropbox.php:752, src/methods/dropbox.php:774, src/methods/dropbox.php:789, src/methods/dropbox.php:802, src/methods/dropbox.php:945
1636
  msgid "%s error: %s"
1637
  msgstr ""
1638
 
1639
+ #: src/addons/onedrive.php:858
1640
  msgid "Authentication"
1641
  msgstr ""
1642
 
1643
+ #: src/addons/onedrive.php:887, src/methods/dropbox.php:843, src/methods/dropbox.php:852, src/methods/googledrive.php:439
1644
  msgid "Your %s quota usage: %s %% used, %s available"
1645
  msgstr ""
1646
 
1647
+ #: src/addons/onedrive.php:895, src/methods/dropbox.php:820
1648
  msgid "Your %s account name: %s"
1649
  msgstr ""
1650
 
1651
+ #: src/addons/onedrive.php:933, src/addons/onedrive.php:1171, src/addons/onedrive.php:1175
1652
  msgid "OneDrive"
1653
  msgstr ""
1654
 
1655
+ #: src/addons/onedrive.php:1031, src/includes/Dropbox2/OAuth/Consumer/ConsumerAbstract.php:118
1656
  msgid "The %s authentication could not go ahead, because something else on your site is breaking it. Try disabling your other plugins and switching to a default theme. (Specifically, you are looking for the component that sends output (most likely PHP warnings/errors) before the page begins. Turning off any debugging settings may also help)."
1657
  msgstr ""
1658
 
1659
+ #: src/addons/onedrive.php:1090, src/addons/onedrive.php:1092
1660
  msgid "authorization failed:"
1661
  msgstr ""
1662
 
1663
+ #: src/addons/onedrive.php:1119
1664
  msgid "This site uses a URL which is either non-HTTPS, or is localhost or 127.0.0.1 URL. As such, you must use the main %s %s App to authenticate with your account."
1665
  msgstr ""
1666
 
1667
+ #: src/addons/onedrive.php:1127
1668
  msgid "You must add the following as the authorized redirect URI in your OneDrive console (under \"API Settings\") when asked"
1669
  msgstr ""
1670
 
1671
+ #: src/addons/onedrive.php:1135
1672
  msgid "Create OneDrive credentials in your OneDrive developer console."
1673
  msgstr ""
1674
 
1675
+ #: src/addons/onedrive.php:1151, src/methods/dropbox.php:585, src/methods/googledrive.php:1214
1676
  msgid "Please read %s for use of our %s authorization app (none of your backup data is sent to us)."
1677
  msgstr ""
1678
 
1679
+ #: src/addons/onedrive.php:1151, src/methods/dropbox.php:585, src/methods/googledrive.php:1214
1680
  msgid "this privacy policy"
1681
  msgstr ""
1682
 
1683
+ #: src/addons/onedrive.php:1172
1684
  msgid "If OneDrive later shows you the message \"unauthorized_client\", then you did not enter a valid client ID here."
1685
  msgstr ""
1686
 
1687
+ #: src/addons/onedrive.php:1180, src/restorer.php:1244
1688
  msgid "folder"
1689
  msgstr ""
1690
 
1691
+ #: src/addons/onedrive.php:1182
1692
  msgid "N.B. %s is not case-sensitive."
1693
  msgstr ""
1694
 
1695
+ #: src/addons/onedrive.php:1187
1696
  msgid "Account type"
1697
  msgstr ""
1698
 
1699
+ #: src/addons/onedrive.php:1190
1700
  msgid "OneDrive International"
1701
  msgstr ""
1702
 
1703
+ #: src/addons/onedrive.php:1191
1704
  msgid "OneDrive Germany"
1705
  msgstr ""
1706
 
1707
+ #: src/addons/onedrive.php:1199, src/methods/dropbox.php:610
1708
  msgid "Authenticate with %s"
1709
  msgstr ""
1710
 
1711
+ #: src/addons/onedrive.php:1206, src/methods/dropbox.php:614
1712
  msgid "(You appear to be already authenticated)."
1713
  msgstr ""
1714
 
1716
  msgid "Your label for this backup (optional)"
1717
  msgstr ""
1718
 
1719
+ #: src/addons/reporting.php:86, src/addons/reporting.php:197, src/backup.php:1177, src/class-updraftplus.php:3951
1720
  msgid "Backup of:"
1721
  msgstr ""
1722
 
1736
  msgid "Backup made by %s"
1737
  msgstr ""
1738
 
1739
+ #: src/addons/reporting.php:198, src/backup.php:1180
1740
  msgid "Latest status:"
1741
  msgstr ""
1742
 
1764
  msgid "Time taken:"
1765
  msgstr ""
1766
 
1767
+ #: src/addons/reporting.php:239, src/admin.php:4015
1768
  msgid "Uploaded to:"
1769
  msgstr ""
1770
 
1771
+ #: src/addons/reporting.php:281, src/backup.php:1130
1772
  msgid "The log file has been attached to this email."
1773
  msgstr ""
1774
 
2237
  msgid "Latest full backup found; identifier:"
2238
  msgstr ""
2239
 
2240
+ #: src/addons/wp-cli.php:430, src/admin.php:4049, src/admin.php:4097
2241
  msgid "unknown source"
2242
  msgstr ""
2243
 
2244
+ #: src/addons/wp-cli.php:432, src/admin.php:4055
2245
  msgid "Database (created by %s)"
2246
  msgstr ""
2247
 
2248
+ #: src/addons/wp-cli.php:438, src/admin.php:4057
2249
  msgid "External database"
2250
  msgstr ""
2251
 
2252
+ #: src/addons/wp-cli.php:450, src/admin.php:4101
2253
  msgid "Files and database WordPress backup (created by %s)"
2254
  msgstr ""
2255
 
2256
+ #: src/addons/wp-cli.php:450, src/admin.php:4101
2257
  msgid "Files backup (created by %s)"
2258
  msgstr ""
2259
 
2260
+ #: src/addons/wp-cli.php:519, src/admin.php:818, src/class-updraftplus.php:1298, src/class-updraftplus.php:1342, src/includes/class-filesystem-functions.php:429, src/includes/class-storage-methods-interface.php:324, src/methods/addon-base-v2.php:93, src/methods/addon-base-v2.php:98, src/methods/addon-base-v2.php:205, src/methods/addon-base-v2.php:225, src/methods/stream-base.php:219, src/restorer.php:3127, src/restorer.php:3152, src/restorer.php:3233, src/updraftplus.php:157
2261
  msgid "Error"
2262
  msgstr ""
2263
 
2273
  msgid "No such backup set exists"
2274
  msgstr ""
2275
 
2276
+ #: src/addons/wp-cli.php:648, src/admin.php:4510
2277
  msgid "UpdraftPlus Restoration: Progress"
2278
  msgstr ""
2279
 
2280
+ #: src/addons/wp-cli.php:662, src/admin.php:4513
2281
  msgid "Follow this link to download the log file for this restoration (needed for any support requests)."
2282
  msgstr ""
2283
 
2297
  msgid "Why am I seeing this?"
2298
  msgstr ""
2299
 
2300
+ #: src/addons/wp-cli.php:907
2301
+ msgid "Timestamp"
2302
+ msgstr ""
2303
+
2304
+ #: src/addons/wp-cli.php:912
2305
+ msgid "There are no incremental backup restore points available."
2306
+ msgstr ""
2307
+
2308
  #: src/admin.php:91
2309
  msgid "template not found"
2310
  msgstr ""
2317
  msgid "At the same time as the files backup"
2318
  msgstr ""
2319
 
2320
+ #: src/admin.php:334, src/admin.php:5045, src/templates/wp-admin/settings/take-backup.php:24
2321
  msgid "Files"
2322
  msgstr ""
2323
 
2324
+ #: src/admin.php:334, src/backup.php:1086
2325
  msgid "Files and database"
2326
  msgstr ""
2327
 
2425
  msgid "Error: the server sent us a response which we did not understand."
2426
  msgstr ""
2427
 
2428
+ #: src/admin.php:816, src/restorer.php:180
2429
  msgid "Error data:"
2430
  msgstr ""
2431
 
2437
  msgid "File ready."
2438
  msgstr ""
2439
 
2440
+ #: src/admin.php:821, src/admin.php:2549, src/admin.php:2559, src/admin.php:2568, src/admin.php:2610, src/admin.php:3457, src/templates/wp-admin/settings/existing-backups-table.php:19, src/templates/wp-admin/settings/existing-backups-table.php:137
2441
  msgid "Actions"
2442
  msgstr ""
2443
 
2465
  msgid "PHP information"
2466
  msgstr ""
2467
 
2468
+ #: src/admin.php:828, src/admin.php:3171
2469
  msgid "Delete Old Directories"
2470
  msgstr ""
2471
 
2525
  msgid "Backup Now"
2526
  msgstr ""
2527
 
2528
+ #: src/admin.php:844, src/admin.php:3485, src/admin.php:3519, src/admin.php:4292, src/includes/class-remote-send.php:553, src/templates/wp-admin/settings/existing-backups-table.php:153, src/templates/wp-admin/settings/file-backup-exclude.php:11
2529
  msgid "Delete"
2530
  msgstr ""
2531
 
2533
  msgid "Create"
2534
  msgstr ""
2535
 
2536
+ #: src/admin.php:846, src/admin.php:4272
2537
  msgid "Upload"
2538
  msgstr ""
2539
 
2545
  msgid "Close"
2546
  msgstr ""
2547
 
2548
+ #: src/admin.php:851, src/admin.php:3723
2549
  msgid "Download log file"
2550
  msgstr ""
2551
 
2721
  msgid "Complete"
2722
  msgstr ""
2723
 
2724
+ #: src/admin.php:905, src/admin.php:3230
2725
  msgid "The backup has finished running"
2726
  msgstr ""
2727
 
3033
  msgid "No local copy present."
3034
  msgstr ""
3035
 
3036
+ #: src/admin.php:2286, src/backup.php:1401
3037
  msgid "Backup directory (%s) is not writable, or does not exist."
3038
  msgstr ""
3039
 
3073
  msgid "Backup directory successfully created."
3074
  msgstr ""
3075
 
3076
+ #: src/admin.php:2626, src/class-updraftplus.php:4046, src/restorer.php:2840
3077
  msgid "Warning:"
3078
  msgstr ""
3079
 
3181
  msgid "Download most recently modified log file"
3182
  msgstr ""
3183
 
3184
+ #: src/admin.php:3165
3185
  msgid "Your WordPress install has old directories from its state before you restored/migrated (technical information: these are suffixed with -old). You should press this button to delete them as soon as you have verified that the restoration worked."
3186
  msgstr ""
3187
 
3188
+ #: src/admin.php:3230, src/admin.php:4302
3189
  msgid "View Log"
3190
  msgstr ""
3191
 
3192
+ #: src/admin.php:3269
3193
  msgid "Backup begun"
3194
  msgstr ""
3195
 
3196
+ #: src/admin.php:3274
3197
  msgid "Creating file backup zips"
3198
  msgstr ""
3199
 
3200
+ #: src/admin.php:3287
3201
  msgid "Created file backup zips"
3202
  msgstr ""
3203
 
3204
+ #: src/admin.php:3292
3205
  msgid "Clone server being provisioned and booted (can take several minutes)"
3206
  msgstr ""
3207
 
3208
+ #: src/admin.php:3296
3209
  msgid "Uploading files to remote storage"
3210
  msgstr ""
3211
 
3212
+ #: src/admin.php:3297
3213
  msgid "Sending files to remote site"
3214
  msgstr ""
3215
 
3216
+ #: src/admin.php:3304
3217
  msgid "(%s%%, file %s of %s)"
3218
  msgstr ""
3219
 
3220
+ #: src/admin.php:3309
3221
  msgid "Pruning old backup sets"
3222
  msgstr ""
3223
 
3224
+ #: src/admin.php:3313
3225
  msgid "Waiting until scheduled time to retry because of errors"
3226
  msgstr ""
3227
 
3228
+ #: src/admin.php:3318
3229
  msgid "Backup finished"
3230
  msgstr ""
3231
 
3232
+ #: src/admin.php:3331
3233
  msgid "Created database backup"
3234
  msgstr ""
3235
 
3236
+ #: src/admin.php:3342
3237
  msgid "Creating database backup"
3238
  msgstr ""
3239
 
3240
+ #: src/admin.php:3344
3241
  msgid "table: %s"
3242
  msgstr ""
3243
 
3244
+ #: src/admin.php:3357
3245
  msgid "Encrypting database"
3246
  msgstr ""
3247
 
3248
+ #: src/admin.php:3365
3249
  msgid "Encrypted database"
3250
  msgstr ""
3251
 
3252
+ #: src/admin.php:3367, src/central/bootstrap.php:444, src/central/bootstrap.php:451, src/methods/updraftvault.php:415, src/methods/updraftvault.php:449, src/methods/updraftvault.php:534
3253
  msgid "Unknown"
3254
  msgstr ""
3255
 
3256
+ #: src/admin.php:3384
3257
  msgid "next resumption: %d (after %ss)"
3258
  msgstr ""
3259
 
3260
+ #: src/admin.php:3385
3261
  msgid "last activity: %ss ago"
3262
  msgstr ""
3263
 
3264
+ #: src/admin.php:3405
3265
  msgid "Job ID: %s"
3266
  msgstr ""
3267
 
3268
+ #: src/admin.php:3419, src/admin.php:3709
3269
  msgid "Warning: %s"
3270
  msgstr ""
3271
 
3272
+ #: src/admin.php:3439
3273
  msgid "show log"
3274
  msgstr ""
3275
 
3276
+ #: src/admin.php:3440
3277
  msgid "Note: the progress bar below is based on stages, NOT time. Do not stop the backup simply because it seems to have remained in the same place for a while - that is normal."
3278
  msgstr ""
3279
 
3280
+ #: src/admin.php:3440
3281
  msgid "stop"
3282
  msgstr ""
3283
 
3284
+ #: src/admin.php:3450, src/admin.php:3450
3285
  msgid "Remove old directories"
3286
  msgstr ""
3287
 
3288
+ #: src/admin.php:3453
3289
  msgid "Old directories successfully removed."
3290
  msgstr ""
3291
 
3292
+ #: src/admin.php:3455
3293
  msgid "Old directory removal failed for some reason. You may want to do this manually."
3294
  msgstr ""
3295
 
3296
+ #: src/admin.php:3492, src/admin.php:3527, src/admin.php:3531, src/includes/class-remote-send.php:327, src/includes/class-storage-methods-interface.php:315, src/restorer.php:330, src/restorer.php:3131, src/restorer.php:3236
3297
  msgid "OK"
3298
  msgstr ""
3299
 
3300
+ #: src/admin.php:3576
3301
  msgid "The request to the filesystem to create the directory failed."
3302
  msgstr ""
3303
 
3304
+ #: src/admin.php:3590
3305
  msgid "The folder was created, but we had to change its file permissions to 777 (world-writable) to be able to write to it. You should check with your hosting provider that this will not cause any problems"
3306
  msgstr ""
3307
 
3308
+ #: src/admin.php:3595
3309
  msgid "The folder exists, but your webserver does not have permission to write to it."
3310
  msgstr ""
3311
 
3312
+ #: src/admin.php:3595
3313
  msgid "You will need to consult with your web hosting provider to find out how to set permissions for a WordPress plugin to write to the directory."
3314
  msgstr ""
3315
 
3316
+ #: src/admin.php:3697
3317
  msgid "incremental backup; base backup: %s"
3318
  msgstr ""
3319
 
3320
+ #: src/admin.php:3727
3321
  msgid "No backup has been completed"
3322
  msgstr ""
3323
 
3324
+ #: src/admin.php:3741
3325
  msgctxt "i.e. Non-automatic"
3326
  msgid "Manual"
3327
  msgstr ""
3328
 
3329
+ #: src/admin.php:3754
3330
  msgid "Backup directory specified is writable, which is good."
3331
  msgstr ""
3332
 
3333
+ #: src/admin.php:3758
3334
  msgid "Backup directory specified does <b>not</b> exist."
3335
  msgstr ""
3336
 
3337
+ #: src/admin.php:3760
3338
  msgid "Backup directory specified exists, but is <b>not</b> writable."
3339
  msgstr ""
3340
 
3341
+ #: src/admin.php:3762
3342
  msgid "Follow this link to attempt to create the directory and set the permissions"
3343
  msgstr ""
3344
 
3345
+ #: src/admin.php:3762
3346
  msgid "or, to reset this option"
3347
  msgstr ""
3348
 
3349
+ #: src/admin.php:3762
3350
  msgid "press here"
3351
  msgstr ""
3352
 
3353
+ #: src/admin.php:3762
3354
  msgid "If that is unsuccessful check the permissions on your server or change it to another directory that is writable by your web server process."
3355
  msgstr ""
3356
 
3357
+ #: src/admin.php:3842
3358
  msgid "Your wp-content directory server path: %s"
3359
  msgstr ""
3360
 
3361
+ #: src/admin.php:3842
3362
  msgid "Any other directories found inside wp-content"
3363
  msgstr ""
3364
 
3365
+ #: src/admin.php:3853
3366
  msgid "Exclude these from"
3367
  msgstr ""
3368
 
3369
+ #: src/admin.php:3941
3370
  msgid "Your web server's PHP/Curl installation does not support https access. Communications with %s will be unencrypted. Ask your web host to install Curl/SSL in order to gain the ability for encryption (via an add-on)."
3371
  msgstr ""
3372
 
3373
+ #: src/admin.php:3943
3374
  msgid "Your web server's PHP/Curl installation does not support https access. We cannot access %s without this support. Please contact your web hosting provider's support. %s <strong>requires</strong> Curl+https. Please do not file any support requests; there is no alternative."
3375
  msgstr ""
3376
 
3377
+ #: src/admin.php:3946
3378
  msgid "Good news: Your site's communications with %s can be encrypted. If you see any errors to do with encryption, then look in the 'Expert Settings' for more help."
3379
  msgstr ""
3380
 
3381
+ #: src/admin.php:3984, src/templates/wp-admin/settings/backupnow-modal.php:60, src/templates/wp-admin/settings/existing-backups-table.php:71, src/templates/wp-admin/settings/existing-backups-table.php:74
3382
  msgid "Only allow this backup to be deleted manually (i.e. keep it even if retention limits are hit)."
3383
  msgstr ""
3384
 
3385
+ #: src/admin.php:4032
3386
  msgid "Total backup size:"
3387
  msgstr ""
3388
 
3389
+ #: src/admin.php:4098, src/includes/class-wpadmin-commands.php:162, src/restorer.php:2168
3390
  msgid "Backup created by unknown source (%s) - cannot be restored."
3391
  msgstr ""
3392
 
3393
+ #: src/admin.php:4127
3394
  msgid "Press here to download or browse"
3395
  msgstr ""
3396
 
3397
+ #: src/admin.php:4132
3398
  msgid "(%d archive(s) in set)."
3399
  msgstr ""
3400
 
3401
+ #: src/admin.php:4135
3402
  msgid "You appear to be missing one or more archives from this multi-archive set."
3403
  msgstr ""
3404
 
3405
+ #: src/admin.php:4163, src/admin.php:4165
3406
  msgid "(Not finished)"
3407
  msgstr ""
3408
 
3409
+ #: src/admin.php:4165
3410
  msgid "If you are seeing more backups than you expect, then it is probably because the deletion of old backup sets does not happen until a fresh backup completes."
3411
  msgstr ""
3412
 
3413
+ #: src/admin.php:4190
3414
  msgid "(backup set imported from remote location)"
3415
  msgstr ""
3416
 
3417
+ #: src/admin.php:4193
3418
  msgid "After pressing this button, you will be given the option to choose which components you wish to restore"
3419
  msgstr ""
3420
 
3421
+ #: src/admin.php:4272
3422
  msgid "After pressing this button, you can select where to upload your backup from a list of your currently saved remote storage locations"
3423
  msgstr ""
3424
 
3425
+ #: src/admin.php:4292
3426
  msgid "Delete this backup set"
3427
  msgstr ""
3428
 
3429
+ #: src/admin.php:4495
3430
  msgid "This backup does not exist in the backup history - restoration aborted. Timestamp:"
3431
  msgstr ""
3432
 
3433
+ #: src/admin.php:4496
3434
  msgid "Backup does not exist in the backup history"
3435
  msgstr ""
3436
 
3437
+ #: src/admin.php:4519
3438
  msgid "ABORT: Could not find the information on which entities to restore."
3439
  msgstr ""
3440
 
3441
+ #: src/admin.php:4519
3442
  msgid "If making a request for support, please include this information:"
3443
  msgstr ""
3444
 
3445
+ #: src/admin.php:4685
3446
  msgid "Backup won't be sent to any remote storage - none has been saved in the %s"
3447
  msgstr ""
3448
 
3449
+ #: src/admin.php:4685
3450
  msgid "settings"
3451
  msgstr ""
3452
 
3453
+ #: src/admin.php:4685
3454
  msgid "Not got any remote storage?"
3455
  msgstr ""
3456
 
3457
+ #: src/admin.php:4685
3458
  msgid "Check out UpdraftPlus Vault."
3459
  msgstr ""
3460
 
3461
+ #: src/admin.php:4687
3462
  msgid "Send this backup to remote storage"
3463
  msgstr ""
3464
 
3465
+ #: src/admin.php:4777
3466
  msgid "UpdraftPlus seems to have been updated to version (%s), which is different to the version running when this settings page was loaded. Please reload the settings page before trying to save settings."
3467
  msgstr ""
3468
 
3469
+ #: src/admin.php:4784, src/templates/wp-admin/settings/take-backup.php:51
3470
  msgid "This button is disabled because your backup directory is not writable (see the settings)."
3471
  msgstr ""
3472
 
3473
+ #: src/admin.php:4813
3474
  msgid "Your settings have been saved."
3475
  msgstr ""
3476
 
3477
+ #: src/admin.php:4818
3478
  msgid "Your settings failed to save. Please refresh the settings page and try again"
3479
  msgstr ""
3480
 
3481
+ #: src/admin.php:4866
3482
  msgid "authentication error"
3483
  msgstr ""
3484
 
3485
+ #: src/admin.php:4870
3486
  msgid "Remote storage method and instance id are required for authentication."
3487
  msgstr ""
3488
 
3489
+ #: src/admin.php:4937
3490
  msgid "Your settings have been wiped."
3491
  msgstr ""
3492
 
3493
+ #: src/admin.php:5038
3494
  msgid "Known backups (raw)"
3495
  msgstr ""
3496
 
3497
+ #: src/admin.php:5073
3498
  msgid "Options (raw)"
3499
  msgstr ""
3500
 
3501
+ #: src/admin.php:5076
3502
  msgid "Value"
3503
  msgstr ""
3504
 
3505
+ #: src/admin.php:5228
3506
  msgid "The file %s has a \"byte order mark\" (BOM) at its beginning."
3507
  msgid_plural "The files %s have a \"byte order mark\" (BOM) at their beginning."
3508
  msgstr[0] ""
3509
  msgstr[1] ""
3510
 
3511
+ #: src/admin.php:5228, src/methods/openstack2.php:144, src/restorer.php:183, src/restorer.php:185, src/templates/wp-admin/settings/downloading-and-restoring.php:27, src/templates/wp-admin/settings/tab-backups.php:27, src/templates/wp-admin/settings/updraftcentral-connect.php:14
3512
  msgid "Follow this link for more information"
3513
  msgstr ""
3514
 
3515
+ #: src/admin.php:5250, src/admin.php:5254, src/templates/wp-admin/advanced/site-info.php:45, src/templates/wp-admin/advanced/site-info.php:51, src/templates/wp-admin/advanced/site-info.php:58, src/templates/wp-admin/advanced/site-info.php:59
3516
  msgid "%s version:"
3517
  msgstr ""
3518
 
3519
+ #: src/admin.php:5258
3520
  msgid "Clone region:"
3521
  msgstr ""
3522
 
3523
+ #: src/admin.php:5263
3524
  msgid "Forbid non-administrators to login to WordPress on your clone"
3525
  msgstr ""
3526
 
3527
+ #: src/admin.php:5286
3528
  msgid "(current version)"
3529
  msgstr ""
3530
 
3531
+ #: src/admin.php:5306
3532
  msgid "Your clone has started and will be available at the following URLs once it is ready."
3533
  msgstr ""
3534
 
3535
+ #: src/admin.php:5307
3536
  msgid "Front page:"
3537
  msgstr ""
3538
 
3539
+ #: src/admin.php:5308
3540
  msgid "Dashboard:"
3541
  msgstr ""
3542
 
3543
+ #: src/admin.php:5310, src/admin.php:5313
3544
  msgid "You can find your temporary clone information in your updraftplus.com account here."
3545
  msgstr ""
3546
 
3547
+ #: src/admin.php:5312
3548
  msgid "Your clone has started, network information is not yet available but will be displayed here and at your updraftplus.com account once it is ready."
3549
  msgstr ""
3550
 
3551
+ #: src/backup.php:220
3552
  msgid "%s - could not back this entity up; the corresponding directory does not exist (%s)"
3553
  msgstr ""
3554
 
3555
+ #: src/backup.php:292
3556
  msgid "Could not create %s zip. Consult the log file for more information."
3557
  msgstr ""
3558
 
3559
+ #: src/backup.php:486, src/backup.php:2173, src/class-updraftplus.php:2125, src/class-updraftplus.php:2192, src/includes/class-storage-methods-interface.php:364, src/restorer.php:485
3560
  msgid "A PHP exception (%s) has occurred: %s"
3561
  msgstr ""
3562
 
3563
+ #: src/backup.php:492, src/backup.php:2182, src/class-updraftplus.php:2134, src/class-updraftplus.php:2199, src/includes/class-storage-methods-interface.php:373, src/restorer.php:499
3564
  msgid "A PHP fatal error (%s) has occurred: %s"
3565
  msgstr ""
3566
 
3567
+ #: src/backup.php:1079
3568
  msgid "Full backup"
3569
  msgstr ""
3570
 
3571
+ #: src/backup.php:1079
3572
  msgid "Incremental"
3573
  msgstr ""
3574
 
3575
+ #: src/backup.php:1084, src/class-updraftplus.php:2996
3576
  msgid "The backup was aborted by the user"
3577
  msgstr ""
3578
 
3579
+ #: src/backup.php:1088
3580
  msgid "Files (database backup has not completed)"
3581
  msgstr ""
3582
 
3583
+ #: src/backup.php:1088
3584
  msgid "Files only (database was not part of this particular schedule)"
3585
  msgstr ""
3586
 
3587
+ #: src/backup.php:1091
3588
  msgid "Database (files backup has not completed)"
3589
  msgstr ""
3590
 
3591
+ #: src/backup.php:1091
3592
  msgid "Database only (files were not part of this particular schedule)"
3593
  msgstr ""
3594
 
3595
+ #: src/backup.php:1094
3596
  msgid "Unknown/unexpected error - please raise a support request"
3597
  msgstr ""
3598
 
3599
+ #: src/backup.php:1103
3600
  msgid "Errors encountered:"
3601
  msgstr ""
3602
 
3603
+ #: src/backup.php:1121
3604
  msgid "Warnings encountered:"
3605
  msgstr ""
3606
 
3607
+ #: src/backup.php:1136
3608
  msgid "Backed up: %s"
3609
  msgstr ""
3610
 
3611
+ #: src/backup.php:1145
3612
  msgid "Email reports created by UpdraftPlus (free edition) bring you the latest UpdraftPlus.com news"
3613
  msgstr ""
3614
 
3615
+ #: src/backup.php:1145
3616
  msgid "read more at %s"
3617
  msgstr ""
3618
 
3619
+ #: src/backup.php:1178
3620
  msgid "WordPress backup is complete"
3621
  msgstr ""
3622
 
3623
+ #: src/backup.php:1179
3624
  msgid "Backup contains:"
3625
  msgstr ""
3626
 
3627
+ #: src/backup.php:1645
3628
  msgid "database connection attempt failed."
3629
  msgstr ""
3630
 
3631
+ #: src/backup.php:1691
3632
  msgid "please wait for the rescheduled attempt"
3633
  msgstr ""
3634
 
3635
+ #: src/backup.php:1693
3636
  msgid "No database tables found"
3637
  msgstr ""
3638
 
3639
+ #: src/backup.php:1704
3640
  msgid "The backup directory is not writable (or disk space is full) - the database backup is expected to shortly fail."
3641
  msgstr ""
3642
 
3643
+ #: src/backup.php:1782
3644
  msgid "Table %s has very many rows (%s) - we hope your web hosting company gives you enough resources to dump out that table in the backup"
3645
  msgstr ""
3646
 
3647
+ #: src/backup.php:1782
3648
  msgid "If not, you will need to either remove data from this table, or contact your hosting company to request more resources."
3649
  msgstr ""
3650
 
3651
+ #: src/backup.php:1832, src/backup.php:1834
3652
  msgid "The database backup appears to have failed"
3653
  msgstr ""
3654
 
3655
+ #: src/backup.php:1832
3656
  msgid "no options or sitemeta table was found"
3657
  msgstr ""
3658
 
3659
+ #: src/backup.php:1834
3660
  msgid "the options table was not found"
3661
  msgstr ""
3662
 
3663
+ #: src/backup.php:1882
3664
  msgid "Failed to open database file for reading:"
3665
  msgstr ""
3666
 
3667
+ #: src/backup.php:1901
3668
  msgid "An error occurred whilst closing the final database file"
3669
  msgstr ""
3670
 
3671
+ #: src/backup.php:2214
3672
  msgid "Could not open the backup file for writing"
3673
  msgstr ""
3674
 
3675
+ #: src/backup.php:2340
3676
  msgid "Infinite recursion: consult your log for more information"
3677
  msgstr ""
3678
 
3679
+ #: src/backup.php:2373
3680
  msgid "%s: unreadable file - could not be backed up (check the file permissions and ownership)"
3681
  msgstr ""
3682
 
3683
+ #: src/backup.php:2395
3684
  msgid "Failed to open directory (check the file permissions and ownership): %s"
3685
  msgstr ""
3686
 
3687
+ #: src/backup.php:2460
3688
  msgid "%s: unreadable file - could not be backed up"
3689
  msgstr ""
3690
 
3691
+ #: src/backup.php:3140, src/backup.php:3423
3692
  msgid "Failed to open the zip file (%s) - %s"
3693
  msgstr ""
3694
 
3695
+ #: src/backup.php:3166
3696
  msgid "A very large file was encountered: %s (size: %s Mb)"
3697
  msgstr ""
3698
 
3699
+ #: src/backup.php:3467, src/class-updraftplus.php:861
3700
  msgid "Your free space in your hosting account is very low - only %s Mb remain"
3701
  msgstr ""
3702
 
3703
+ #: src/backup.php:3474
3704
  msgid "The zip engine returned the message: %s."
3705
  msgstr ""
3706
 
3707
+ #: src/backup.php:3476
3708
  msgid "A zip error occurred"
3709
  msgstr ""
3710
 
3711
+ #: src/backup.php:3478
3712
  msgid "your web hosting account appears to be full; please see: %s"
3713
  msgstr ""
3714
 
3715
+ #: src/backup.php:3480
3716
  msgid "check your log for more details."
3717
  msgstr ""
3718
 
4004
  msgid "Could not save backup history because we have no backup array. Backup probably failed."
4005
  msgstr ""
4006
 
4007
+ #: src/class-updraftplus.php:3868, src/includes/class-updraftplus-encryption.php:336, src/restorer.php:929
4008
  msgid "Decryption failed. The database file is encrypted, but you have no encryption key entered."
4009
  msgstr ""
4010
 
4012
  msgid "Decryption failed. The database file is encrypted."
4013
  msgstr ""
4014
 
4015
+ #: src/class-updraftplus.php:3880, src/includes/class-updraftplus-encryption.php:354, src/restorer.php:942
4016
  msgid "Decryption failed. The most likely cause is that you used the wrong key."
4017
  msgstr ""
4018
 
4056
  msgid "You can search and replace your database (for migrating a website to a new location/URL) with the Migrator add-on - follow this link for more information"
4057
  msgstr ""
4058
 
4059
+ #: src/class-updraftplus.php:3990, src/restorer.php:1607
4060
  msgid "You are using the %s webserver, but do not seem to have the %s module loaded."
4061
  msgstr ""
4062
 
4063
+ #: src/class-updraftplus.php:3990, src/restorer.php:1607
4064
  msgid "You should enable %s to make any pretty permalinks (e.g. %s) work"
4065
  msgstr ""
4066
 
4088
  msgid "Any support requests to do with %s should be raised with your web hosting company."
4089
  msgstr ""
4090
 
4091
+ #: src/class-updraftplus.php:4024, src/restorer.php:2408, src/restorer.php:2497, src/restorer.php:2523
4092
  msgid "Old table prefix:"
4093
  msgstr ""
4094
 
4096
  msgid "Backup label:"
4097
  msgstr ""
4098
 
4099
+ #: src/class-updraftplus.php:4035, src/class-updraftplus.php:4038, src/restorer.php:643
4100
  msgid "You are running on WordPress multisite - but your backup is not of a multisite site."
4101
  msgstr ""
4102
 
4108
  msgid "Please read this link for important information on this process."
4109
  msgstr ""
4110
 
4111
+ #: src/class-updraftplus.php:4042, src/restorer.php:2420
4112
  msgid "To import an ordinary WordPress site into a multisite installation requires %s."
4113
  msgstr ""
4114
 
4120
  msgid "If you want to restore a multisite backup, you should first set up your WordPress installation as a multisite."
4121
  msgstr ""
4122
 
4123
+ #: src/class-updraftplus.php:4053, src/restorer.php:2426
4124
  msgid "Site information:"
4125
  msgstr ""
4126
 
4236
  msgid "Your web server's PHP installation has these functions disabled: %s."
4237
  msgstr ""
4238
 
4239
+ #: src/includes/class-filesystem-functions.php:294, src/methods/ftp.php:330, src/restorer.php:2199
4240
  msgid "Your hosting company must enable these functions before %s can work."
4241
  msgstr ""
4242
 
4243
+ #: src/includes/class-filesystem-functions.php:294, src/restorer.php:2199
4244
  msgid "restoration"
4245
  msgstr ""
4246
 
4256
  msgid "The attempt to undo the double-compression succeeded."
4257
  msgstr ""
4258
 
4259
+ #: src/includes/class-filesystem-functions.php:543
4260
  msgid "Unzip progress: %d out of %d files"
4261
  msgstr ""
4262
 
4500
  msgid "Allow only administrators to log in"
4501
  msgstr ""
4502
 
4503
+ #: src/includes/updraftplus-login.php:58, src/methods/updraftvault.php:687, src/udaddons/updraftplus-addons.php:968
4504
  msgid "UpdraftPlus.Com returned a response which we could not understand (data: %s)"
4505
  msgstr ""
4506
 
4991
  msgid "%s end-point"
4992
  msgstr ""
4993
 
4994
+ #: src/methods/dropbox.php:172, src/methods/dropbox.php:189
4995
  msgid "You do not appear to be authenticated with Dropbox"
4996
  msgstr ""
4997
 
4998
+ #: src/methods/dropbox.php:194
4999
  msgid "error: %s (see log file for more)"
5000
  msgstr ""
5001
 
5002
+ #: src/methods/dropbox.php:283
5003
  msgid "error: failed to upload file to %s (see log file for more)"
5004
  msgstr ""
5005
 
5007
  msgid "did not return the expected response - check your log file for more details"
5008
  msgstr ""
5009
 
5010
+ #: src/methods/dropbox.php:305, src/methods/dropbox.php:320
5011
  msgid "failed to upload file to %s (see log file for more)"
5012
  msgstr ""
5013
 
5014
+ #: src/methods/dropbox.php:376
5015
  msgid "%s returned an unexpected HTTP response: %s"
5016
  msgstr ""
5017
 
5018
+ #: src/methods/dropbox.php:439
5019
  msgid "You do not appear to be authenticated with %s (whilst deleting)"
5020
  msgstr ""
5021
 
5022
+ #: src/methods/dropbox.php:447
5023
  msgid "Failed to access %s when deleting (see log file for more)"
5024
  msgstr ""
5025
 
5026
+ #: src/methods/dropbox.php:480
5027
  msgid "You do not appear to be authenticated with %s"
5028
  msgstr ""
5029
 
5030
+ #: src/methods/dropbox.php:602, src/methods/dropbox.php:604
5031
  msgid "Need to use sub-folders?"
5032
  msgstr ""
5033
 
5034
+ #: src/methods/dropbox.php:602, src/methods/dropbox.php:604
5035
  msgid "Backups are saved in"
5036
  msgstr ""
5037
 
5038
+ #: src/methods/dropbox.php:602, src/methods/dropbox.php:604
5039
  msgid "If you backup several sites into the same Dropbox and want to organize with sub-folders, then "
5040
  msgstr ""
5041
 
5042
+ #: src/methods/dropbox.php:602, src/methods/dropbox.php:604
5043
  msgid "there's an add-on for that."
5044
  msgstr ""
5045
 
5046
+ #: src/methods/dropbox.php:610
5047
  msgid "Dropbox"
5048
  msgstr ""
5049
 
5050
+ #: src/methods/dropbox.php:635
5051
  msgid "You must add the following as the authorised redirect URI in your Dropbox console (under \"API Settings\") when asked"
5052
  msgstr ""
5053
 
5054
+ #: src/methods/dropbox.php:752, src/methods/dropbox.php:774
5055
  msgid "%s authentication"
5056
  msgstr ""
5057
 
5058
+ #: src/methods/dropbox.php:789
5059
  msgid "%s de-authentication"
5060
  msgstr ""
5061
 
5062
+ #: src/methods/dropbox.php:805, src/methods/dropbox.php:807
5063
  msgid "Success:"
5064
  msgstr ""
5065
 
5066
+ #: src/methods/dropbox.php:805, src/methods/dropbox.php:807
5067
  msgid "you have authenticated your %s account"
5068
  msgstr ""
5069
 
5070
+ #: src/methods/dropbox.php:810, src/methods/dropbox.php:832
5071
  msgid "though part of the returned information was not as expected - your mileage may vary"
5072
  msgstr ""
5073
 
5565
  msgid "You do not currently have any UpdraftPlus Vault quota"
5566
  msgstr ""
5567
 
5568
+ #: src/methods/updraftvault.php:714, src/methods/updraftvault.php:729, src/udaddons/updraftplus-addons.php:1009
5569
  msgid "UpdraftPlus.Com returned a response, but we could not understand it"
5570
  msgstr ""
5571
 
5572
+ #: src/methods/updraftvault.php:720, src/udaddons/updraftplus-addons.php:998
5573
  msgid "Your email address was valid, but your password was not recognised by UpdraftPlus.Com."
5574
  msgstr ""
5575
 
5577
  msgid "If you have forgotten your password, then go here to change your password on updraftplus.com."
5578
  msgstr ""
5579
 
5580
+ #: src/methods/updraftvault.php:723, src/udaddons/updraftplus-addons.php:1002
5581
  msgid "You entered an email address that was not recognised by UpdraftPlus.Com"
5582
  msgstr ""
5583
 
5584
+ #: src/methods/updraftvault.php:726, src/udaddons/updraftplus-addons.php:1005
5585
  msgid "Your email address and password were not recognised by UpdraftPlus.Com"
5586
  msgstr ""
5587
 
5605
  msgid "(This applies to all WordPress backup plugins unless they have been explicitly coded for multisite compatibility)."
5606
  msgstr ""
5607
 
5608
+ #: src/restorer.php:174
5609
  msgid "Your WordPress install has old directories from its state before you restored/migrated (technical information: these are suffixed with -old)."
5610
  msgstr ""
5611
 
5612
+ #: src/restorer.php:301
5613
  msgid "Skipping restoration of WordPress core when importing a single site into a multisite installation. If you had anything necessary in your WordPress directory then you will need to re-add it manually from the zip file."
5614
  msgstr ""
5615
 
5616
+ #: src/restorer.php:312
5617
  msgid "Looking for %s archive: file name: %s"
5618
  msgstr ""
5619
 
5620
+ #: src/restorer.php:315
5621
  msgid "Skipping: this archive was already restored."
5622
  msgstr ""
5623
 
5624
+ #: src/restorer.php:327
5625
  msgid "Archive is expected to be size:"
5626
  msgstr ""
5627
 
5628
+ #: src/restorer.php:332
5629
  msgid "file is size:"
5630
  msgstr ""
5631
 
5632
+ #: src/restorer.php:335
5633
  msgid "The backup records do not contain information about the proper size of this file."
5634
  msgstr ""
5635
 
5636
+ #: src/restorer.php:338, src/restorer.php:339
5637
  msgid "Could not find one of the files for restoration"
5638
  msgstr ""
5639
 
5640
+ #: src/restorer.php:422
5641
  msgid "Final checks"
5642
  msgstr ""
5643
 
5644
+ #: src/restorer.php:511
5645
  msgid "Error message"
5646
  msgstr ""
5647
 
5648
+ #: src/restorer.php:628
5649
  msgid "UpdraftPlus is not able to directly restore this kind of entity. It must be restored manually."
5650
  msgstr ""
5651
 
5652
+ #: src/restorer.php:629
5653
  msgid "Backup file not available."
5654
  msgstr ""
5655
 
5656
+ #: src/restorer.php:630
5657
  msgid "Copying this entity failed."
5658
  msgstr ""
5659
 
5660
+ #: src/restorer.php:631
5661
  msgid "Unpacking backup..."
5662
  msgstr ""
5663
 
5664
+ #: src/restorer.php:632
5665
  msgid "Decrypting database (can take a while)..."
5666
  msgstr ""
5667
 
5668
+ #: src/restorer.php:633
5669
  msgid "Database successfully decrypted."
5670
  msgstr ""
5671
 
5672
+ #: src/restorer.php:634
5673
  msgid "Moving old data out of the way..."
5674
  msgstr ""
5675
 
5676
+ #: src/restorer.php:635
5677
  msgid "Moving unpacked backup into place..."
5678
  msgstr ""
5679
 
5680
+ #: src/restorer.php:636
5681
  msgid "Restoring the database (on a large site this can take a long time - if it times out (which can happen if your web hosting company has configured your hosting to limit resources) then you should use a different method, such as phpMyAdmin)..."
5682
  msgstr ""
5683
 
5684
+ #: src/restorer.php:637
5685
  msgid "Cleaning up rubbish..."
5686
  msgstr ""
5687
 
5688
+ #: src/restorer.php:638
5689
  msgid "Could not move old files out of the way."
5690
  msgstr ""
5691
 
5692
+ #: src/restorer.php:638
5693
  msgid "You should check the file ownerships and permissions in your WordPress installation"
5694
  msgstr ""
5695
 
5696
+ #: src/restorer.php:639
5697
  msgid "Could not delete old directory."
5698
  msgstr ""
5699
 
5700
+ #: src/restorer.php:640
5701
  msgid "Could not move new files into place. Check your wp-content/upgrade folder."
5702
  msgstr ""
5703
 
5704
+ #: src/restorer.php:641
5705
  msgid "Could not move the files into place. Check your file permissions."
5706
  msgstr ""
5707
 
5708
+ #: src/restorer.php:642
5709
  msgid "Failed to delete working directory after restoring."
5710
  msgstr ""
5711
 
5712
+ #: src/restorer.php:644
5713
  msgid "Failed to unpack the archive"
5714
  msgstr ""
5715
 
5716
+ #: src/restorer.php:645
5717
  msgid "Failed to read the manifest file from backup."
5718
  msgstr ""
5719
 
5720
+ #: src/restorer.php:646
5721
  msgid "Failed to find a manifest file in the backup."
5722
  msgstr ""
5723
 
5724
+ #: src/restorer.php:647
5725
  msgid "Failed to read from the working directory."
5726
  msgstr ""
5727
 
5728
+ #: src/restorer.php:921
5729
  msgid "Failed to create a temporary directory"
5730
  msgstr ""
5731
 
5732
+ #: src/restorer.php:937
5733
  msgid "Failed to write out the decrypted database to the filesystem"
5734
  msgstr ""
5735
 
5736
+ #: src/restorer.php:1014
5737
  msgid "The directory does not exist"
5738
  msgstr ""
5739
 
5740
+ #: src/restorer.php:1054
5741
  msgid "wp-config.php from backup: will restore as wp-config-backup.php"
5742
  msgstr ""
5743
 
5744
+ #: src/restorer.php:1061
5745
  msgid "wp-config.php from backup: restoring (as per user's request)"
5746
  msgstr ""
5747
 
5748
+ #: src/restorer.php:1244, src/restorer.php:1252
5749
  msgid "UpdraftPlus needed to create a %s in your content directory, but failed - please check your file permissions and enable the access (%s)"
5750
  msgstr ""
5751
 
5752
+ #: src/restorer.php:1252
5753
  msgid "file"
5754
  msgstr ""
5755
 
5756
+ #: src/restorer.php:1267
5757
  msgid "Existing unremoved folders from a previous restore exist (please use the \"Delete Old Directories\" button to delete them before trying again): %s"
5758
  msgstr ""
5759
 
5760
+ #: src/restorer.php:1274
5761
  msgid "This version of UpdraftPlus does not know how to handle this type of foreign backup"
5762
  msgstr ""
5763
 
5764
+ #: src/restorer.php:1377
5765
  msgid "Deferring..."
5766
  msgstr ""
5767
 
5768
+ #: src/restorer.php:1420, src/restorer.php:1468
5769
  msgid "The WordPress content folder (wp-content) was not found in this zip file."
5770
  msgstr ""
5771
 
5772
+ #: src/restorer.php:1561
5773
  msgid "Files found:"
5774
  msgstr ""
5775
 
5776
+ #: src/restorer.php:2088
5777
  msgid "Please supply the requested information, and then continue."
5778
  msgstr ""
5779
 
5780
+ #: src/restorer.php:2161
5781
  msgid "Warning: PHP safe_mode is active on your server. Timeouts are much more likely. If these happen, then you will need to manually restore the file via phpMyAdmin or another method."
5782
  msgstr ""
5783
 
5784
+ #: src/restorer.php:2184
5785
  msgid "Failed to find database file"
5786
  msgstr ""
5787
 
5788
+ #: src/restorer.php:2205
5789
  msgid "Failed to open database file"
5790
  msgstr ""
5791
 
5792
+ #: src/restorer.php:2285, src/restorer.php:2327
5793
  msgid "Your database user does not have permission to drop tables"
5794
  msgstr ""
5795
 
5796
+ #: src/restorer.php:2288
5797
  msgid "Your database user does not have permission to create tables. We will attempt to restore by simply emptying the tables; this should work as long as a) you are restoring from a WordPress version with the same database structure, and b) Your imported database does not contain any tables which are not already present on the importing site."
5798
  msgstr ""
5799
 
5800
+ #: src/restorer.php:2332
5801
  msgid "Your database user does not have permission to drop tables. We will attempt to restore by simply emptying the tables; this should work as long as you are restoring from a WordPress version with the same database structure (%s)"
5802
  msgstr ""
5803
 
5804
+ #: src/restorer.php:2378
5805
  msgid "Backup of: %s"
5806
  msgstr ""
5807
 
5808
+ #: src/restorer.php:2385
5809
  msgid "Backup created by:"
5810
  msgstr ""
5811
 
5812
+ #: src/restorer.php:2390
5813
  msgid "Site home:"
5814
  msgstr ""
5815
 
5816
+ #: src/restorer.php:2396
5817
  msgid "Content URL:"
5818
  msgstr ""
5819
 
5820
+ #: src/restorer.php:2401
5821
  msgid "Uploads URL:"
5822
  msgstr ""
5823
 
5824
+ #: src/restorer.php:2412
5825
  msgid "Skipped tables:"
5826
  msgstr ""
5827
 
5828
+ #: src/restorer.php:2452
5829
  msgid "Split line to avoid exceeding maximum packet size"
5830
  msgstr ""
5831
 
5832
+ #: src/restorer.php:2477, src/restorer.php:2946, src/restorer.php:2987, src/restorer.php:3000
5833
  msgid "An error occurred on the first %s command - aborting run"
5834
  msgstr ""
5835
 
5836
+ #: src/restorer.php:2578
5837
  msgid "Requested table engine (%s) is not present - changing to MyISAM."
5838
  msgstr ""
5839
 
5840
+ #: src/restorer.php:2591
5841
  msgid "Requested table character set (%s) is not present - changing to %s."
5842
  msgstr ""
5843
 
5844
+ #: src/restorer.php:2641
5845
  msgid "Requested table collation (%1$s) is not present - changing to %2$s."
5846
  msgid_plural "Requested table collations (%1$s) are not present - changing to %2$s."
5847
  msgstr[0] ""
5848
  msgstr[1] ""
5849
 
5850
+ #: src/restorer.php:2643
5851
  msgid "Processing table (%s)"
5852
  msgstr ""
5853
 
5854
+ #: src/restorer.php:2647
5855
  msgid "will restore as:"
5856
  msgstr ""
5857
 
5858
+ #: src/restorer.php:2686
5859
  msgid "Found SET NAMES %s, but changing to %s as suggested by WPDB::determine_charset()."
5860
  msgstr ""
5861
 
5862
+ #: src/restorer.php:2692
5863
  msgid "Requested character set (%s) is not present - changing to %s."
5864
  msgstr ""
5865
 
5866
+ #: src/restorer.php:2840
5867
  msgid "An SQL line that is larger than the maximum packet size and cannot be split was found; this line will not be processed, but will be dropped: %s"
5868
  msgstr ""
5869
 
5870
+ #: src/restorer.php:2977
5871
  msgctxt "The user is being told the number of times an error has happened, e.g. An error (27) occurred"
5872
  msgid "An error (%s) occurred:"
5873
  msgstr ""
5874
 
5875
+ #: src/restorer.php:2998
5876
  msgid "This problem is caused by trying to restore a database on a very old MySQL version that is incompatible with the source database."
5877
  msgstr ""
5878
 
5879
+ #: src/restorer.php:2998
5880
  msgid "This database needs to be deployed on MySQL version %s or later."
5881
  msgstr ""
5882
 
5883
+ #: src/restorer.php:3000
5884
  msgid "To use this backup, your database server needs to support the %s character set."
5885
  msgstr ""
5886
 
5887
+ #: src/restorer.php:3005
5888
  msgid "Too many database errors have occurred - aborting"
5889
  msgstr ""
5890
 
5891
+ #: src/restorer.php:3125, src/restorer.php:3200
5892
  msgid "Table prefix has changed: changing %s table field(s) accordingly:"
5893
  msgstr ""
5894
 
7273
  msgid "UpdraftPlus.Com responded, but we did not understand the response"
7274
  msgstr ""
7275
 
7276
+ #: src/udaddons/updraftplus-addons.php:966
7277
  msgid "No response data was received. This usually indicates a network connectivity issue (e.g. an outgoing firewall or overloaded network) between this site and UpdraftPlus.com."
7278
  msgstr ""
7279
 
7280
+ #: src/udaddons/updraftplus-addons.php:998
7281
  msgid "Go here to re-enter your password."
7282
  msgstr ""
7283
 
7284
+ #: src/udaddons/updraftplus-addons.php:999
7285
  msgid "If you have forgotten your password "
7286
  msgstr ""
7287
 
7288
+ #: src/udaddons/updraftplus-addons.php:999
7289
  msgid "go here to change your password on updraftplus.com."
7290
  msgstr ""
7291
 
methods/backup-module.php CHANGED
@@ -645,7 +645,7 @@ abstract class UpdraftPlus_BackupModule {
645
 
646
  $prefix = $this->get_storage_label();
647
 
648
- $updraftplus->log("$prefix: $line", $level = 'notice', $uniq_id = false, $skip_dblog = false);
649
  }
650
 
651
  /**
645
 
646
  $prefix = $this->get_storage_label();
647
 
648
+ $updraftplus->log("$prefix: $line", $level, $uniq_id = false, $skip_dblog = false);
649
  }
650
 
651
  /**
methods/dropbox.php CHANGED
@@ -13,11 +13,10 @@ if (!class_exists('UpdraftPlus_BackupModule')) require_once(UPDRAFTPLUS_DIR.'/me
13
  // Can be removed after a few months
14
  $potential_options = UpdraftPlus_Options::get_updraft_option('updraft_dropbox');
15
  if (is_array($potential_options) && isset($potential_options['version']) && isset($potential_options['settings']) && array() === $potential_options['settings']) {
16
- // Wipe it, which wil force its re-creation in proper format
17
  UpdraftPlus_Options::delete_updraft_option('updraft_dropbox');
18
  }
19
 
20
-
21
  class UpdraftPlus_BackupModule_dropbox extends UpdraftPlus_BackupModule {
22
 
23
  private $current_file_hash;
@@ -282,6 +281,7 @@ class UpdraftPlus_BackupModule_dropbox extends UpdraftPlus_BackupModule {
282
  $this->log('Unexpected HTTP code returned from Dropbox: '.$response['code']." (".serialize($response).")");
283
  if ($response['code'] >= 400) {
284
  $this->log(sprintf(__('error: failed to upload file to %s (see log file for more)', 'updraftplus'), $file), 'error');
 
285
  } else {
286
  $this->log(__('did not return the expected response - check your log file for more details', 'updraftplus'), 'warning');
287
  }
@@ -317,7 +317,6 @@ class UpdraftPlus_BackupModule_dropbox extends UpdraftPlus_BackupModule {
317
  if (preg_match('/Upload with upload_id .* already completed/', $msg)) {
318
  $this->log('returned an error, but apparently indicating previous success: '.$msg);
319
  } else {
320
- $this->log($msg);
321
  $this->log(sprintf(__('failed to upload file to %s (see log file for more)', 'updraftplus'), $ufile), 'error');
322
  $file_success = 0;
323
  if (strpos($msg, 'select/poll returned error') !== false && $this->upload_tick > 0 && time() - $this->upload_tick > 800) {
13
  // Can be removed after a few months
14
  $potential_options = UpdraftPlus_Options::get_updraft_option('updraft_dropbox');
15
  if (is_array($potential_options) && isset($potential_options['version']) && isset($potential_options['settings']) && array() === $potential_options['settings']) {
16
+ // Wipe it, which will force its re-creation in proper format
17
  UpdraftPlus_Options::delete_updraft_option('updraft_dropbox');
18
  }
19
 
 
20
  class UpdraftPlus_BackupModule_dropbox extends UpdraftPlus_BackupModule {
21
 
22
  private $current_file_hash;
281
  $this->log('Unexpected HTTP code returned from Dropbox: '.$response['code']." (".serialize($response).")");
282
  if ($response['code'] >= 400) {
283
  $this->log(sprintf(__('error: failed to upload file to %s (see log file for more)', 'updraftplus'), $file), 'error');
284
+ $file_success = 0;
285
  } else {
286
  $this->log(__('did not return the expected response - check your log file for more details', 'updraftplus'), 'warning');
287
  }
317
  if (preg_match('/Upload with upload_id .* already completed/', $msg)) {
318
  $this->log('returned an error, but apparently indicating previous success: '.$msg);
319
  } else {
 
320
  $this->log(sprintf(__('failed to upload file to %s (see log file for more)', 'updraftplus'), $ufile), 'error');
321
  $file_success = 0;
322
  if (strpos($msg, 'select/poll returned error') !== false && $this->upload_tick > 0 && time() - $this->upload_tick > 800) {
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: Backup with UpdraftPlus, DavidAnderson, DNutbourne, aporter, snigh
3
  Tags: backup, restore, database backup, wordpress backup, cloud backup, s3, dropbox, google drive, onedrive, ftp, backups
4
  Requires at least: 3.2
5
  Tested up to: 5.0
6
- Stable tag: 1.16.4
7
  Author URI: https://updraftplus.com
8
  Donate link: https://david.dw-perspective.org.uk/donate
9
  License: GPLv3 or later
@@ -12,7 +12,7 @@ Backup and restoration made easy. Complete backups; manual or scheduled (backup
12
 
13
  == Description ==
14
 
15
- <a href="https://updraftplus.com">UpdraftPlus</a> simplifies backups and restoration. It is the world's highest ranking and most popular scheduled backup plugin, with over a million currently-active installs. Backup your files and database backups into the cloud and restore with a single click!
16
 
17
  Backup into the cloud directly to Dropbox, Google Drive, Amazon S3 (or compatible), UpdraftVault, Rackspace Cloud, FTP, DreamObjects, Openstack Swift, and email. The paid version also backs up to Microsoft OneDrive, Microsoft Azure, Google Cloud Storage, Backblaze B2, SFTP, SCP, and WebDAV.
18
 
@@ -168,6 +168,17 @@ The <a href="https://updraftplus.com/news/">UpdraftPlus backup blog</a> is the b
168
 
169
  N.B. Paid versions of UpdraftPlus Backup / Restore have a version number which is 1 higher in the first digit, and has an extra component on the end, but the changelog below still applies. i.e. changes listed for 1.16.4.x of the free version correspond to changes made in 2.16.4.x of the paid version.
170
 
 
 
 
 
 
 
 
 
 
 
 
171
  = 1.16.4 - 17/Jan/2019 =
172
 
173
  * FIX: Regression: Properly mark backups picked up via "Rescan remote storage" as non-native (preventing unwelcome side-effects such as being pruned by another site)
@@ -751,5 +762,4 @@ Furthermore, reliance upon any non-English translation is at your own risk. Updr
751
  We recognise and thank the following for code and/or libraries used and/or modified under the terms of their open source licences; see: https://updraftplus.com/acknowledgements/
752
 
753
  == Upgrade Notice ==
754
- * 1.16.4: Fix a regression whereby rescanning remote storage did not correctly mark backups' origins, plus various other small tweaks and enhancements. A recommended update for all.
755
-
3
  Tags: backup, restore, database backup, wordpress backup, cloud backup, s3, dropbox, google drive, onedrive, ftp, backups
4
  Requires at least: 3.2
5
  Tested up to: 5.0
6
+ Stable tag: 1.16.5
7
  Author URI: https://updraftplus.com
8
  Donate link: https://david.dw-perspective.org.uk/donate
9
  License: GPLv3 or later
12
 
13
  == Description ==
14
 
15
+ <a href="https://updraftplus.com">UpdraftPlus</a> simplifies backups and restoration. It is the world's highest ranking and most popular scheduled backup plugin, with over two million currently-active installs. Backup your files and database backups into the cloud and restore with a single click!
16
 
17
  Backup into the cloud directly to Dropbox, Google Drive, Amazon S3 (or compatible), UpdraftVault, Rackspace Cloud, FTP, DreamObjects, Openstack Swift, and email. The paid version also backs up to Microsoft OneDrive, Microsoft Azure, Google Cloud Storage, Backblaze B2, SFTP, SCP, and WebDAV.
18
 
168
 
169
  N.B. Paid versions of UpdraftPlus Backup / Restore have a version number which is 1 higher in the first digit, and has an extra component on the end, but the changelog below still applies. i.e. changes listed for 1.16.4.x of the free version correspond to changes made in 2.16.4.x of the paid version.
170
 
171
+ = 1.16.5 - 28/Jan/2019 =
172
+
173
+ * FEATURE: If a restoration is interrupted (e.g. PHP timeout), then the "Continue" feature can now resume not just at the most recent zip file, but within the zip file at the point it had reached (https://updraftplus.com/auto-resuming-interrupted-restores-part-2/)
174
+ * FEATURE: Added command in WP-CLI which gives a list of incremental backups restore points.
175
+ * FIX: Regression: When a Dropbox upload failed to complete, UpdraftPlus would log this but fail to retry
176
+ * FIX: Again update phpseclib to the latest version which should now fix the 'SSH2 Server Host Key Algorithm Mismatch' on all installs
177
+ * TWEAK: Fix a wrong variable reference in an error message
178
+ * TWEAK: Only add the JavaScript for the incremental schedule selection on the UD settings page
179
+ * TWEAK: Replace incidental use of ipinfo.io now that it requires a paid API key
180
+ * TWEAK: The print_delete_old_dirs_form method should have been public to allow painting if the user clicked through the previous message
181
+
182
  = 1.16.4 - 17/Jan/2019 =
183
 
184
  * FIX: Regression: Properly mark backups picked up via "Rescan remote storage" as non-native (preventing unwelcome side-effects such as being pruned by another site)
762
  We recognise and thank the following for code and/or libraries used and/or modified under the terms of their open source licences; see: https://updraftplus.com/acknowledgements/
763
 
764
  == Upgrade Notice ==
765
+ * 1.16.5: More granularity in resumed restores; fix regression whereby a failed Dropbox upload could fail to be noticed; plus various other small tweaks and enhancements. A recommended update for all.
 
restorer.php CHANGED
@@ -56,6 +56,8 @@ class Updraft_Restorer {
56
 
57
  private $import_table_prefix = null;
58
 
 
 
59
  // Constants for use with the move_backup_in method
60
  // These can't be arbitrarily changed; there is legacy code doing bitwise operations and numerical comparisons, and possibly legacy code still using the values directly.
61
  const MOVEIN_OVERWRITE_NO_BACKUP = 0;
@@ -72,16 +74,19 @@ class Updraft_Restorer {
72
  /**
73
  * Constructor
74
  *
75
- * @param WP_Upgrader_Skin|Null $skin - an upgrader skin
76
- * @param Array|Null $backup_set - the backup set to restore
77
- * @param Boolean $short_init - whether just to do a minimal initialisation
78
- * @param Array $restore_options - options to guide the restoration
 
79
  */
80
- public function __construct($skin = null, $backup_set = null, $short_init = false, $restore_options = array()) {
81
 
82
  global $wpdb, $updraftplus;
83
 
84
  $this->our_siteurl = untrailingslashit(site_url());
 
 
85
 
86
  // Line up a wpdb-like object
87
  if (!$this->use_wpdb()) {
@@ -259,19 +264,18 @@ class Updraft_Restorer {
259
  }
260
 
261
  /**
262
- * Ensure that needed files are present, and return data for the next step (plus do some internal configuration)
263
  *
264
  * @param Array $entities_to_restore - as returned by self::get_entities_to_restore()
265
  * @param Array $backupable_entities - list of entities that can be backed u
266
- * @param Array $continuation_data - continuation data
267
  * @param Array $services - list of services that the backup can be found at
268
  *
269
  * @uses self::pre_restore_backup() (and some other internal properties)
270
  * @uses UpdraftPlus::log()
271
  *
272
- * @return Boolean|Array|WP_Error, or false or a WP_Error if there was an error
273
  */
274
- private function ensure_restore_files_present($entities_to_restore, $backupable_entities, $continuation_data, $services) {
275
 
276
  global $updraftplus;
277
 
@@ -307,7 +311,7 @@ class Updraft_Restorer {
307
  $fullpath = $updraft_dir.'/'.$file;
308
  $updraftplus->log(sprintf(__("Looking for %s archive: file name: %s", 'updraftplus'), $type, $file), 'notice-restore');
309
 
310
- if (is_array($continuation_data) && isset($continuation_data['second_loop_entities'][$type]) && !in_array($file, $continuation_data['second_loop_entities'][$type])) {
311
  $updraftplus->log(__('Skipping: this archive was already restored.', 'updraftplus'), 'notice-restore');
312
  // Set the marker so that the existing directory isn't moved out of the way
313
  $this->been_restored[$type] = true;
@@ -349,7 +353,7 @@ class Updraft_Restorer {
349
 
350
  foreach ($types as $check_type) {
351
  $info = isset($backupable_entities[$check_type]) ? $backupable_entities[$check_type] : array();
352
- $val = $this->pre_restore_backup($files, $check_type, $info, $continuation_data);
353
  if (is_wp_error($val)) {
354
  $updraftplus->log_wp_error($val);
355
  foreach ($val->get_error_messages() as $msg) {
@@ -385,9 +389,9 @@ class Updraft_Restorer {
385
  uksort($second_loop, array('UpdraftPlus_Manipulation_Functions', 'sort_restoration_entities'));
386
 
387
  // If continuing, then prune those already done
388
- if (is_array($continuation_data)) {
389
  foreach ($second_loop as $type => $files) {
390
- if (isset($continuation_data['second_loop_entities'][$type])) $second_loop[$type] = $continuation_data['second_loop_entities'][$type];
391
  }
392
  }
393
 
@@ -397,15 +401,16 @@ class Updraft_Restorer {
397
  /**
398
  * Perform the restoration. No code here (or called) should assume anything about the method used to call it (e.g. wp-admin or WP-CLI); it should be independent of how it is being called.
399
  *
400
- * @param Array $entities_to_restore - entities to restore
401
- * @param Array $restore_options - restoration options
402
- * @param Array|null $continuation_data - continuation data
 
403
  *
404
  * @uses the WordPress action updraftplus_restoration_title, allowing the title to be printed
405
  *
406
  * @return Boolean
407
  */
408
- public function perform_restore($entities_to_restore, $restore_options, $continuation_data = null) {
409
 
410
  global $updraftplus;
411
 
@@ -440,7 +445,7 @@ class Updraft_Restorer {
440
 
441
  // Get an ordered list of things to restore
442
  // This requires the global $updraft_restorer to be set up
443
- $second_loop = $this->ensure_restore_files_present($entities_to_download, $backupable_entities, $continuation_data, $services);
444
 
445
  if (!is_array($second_loop)) return $second_loop;
446
 
@@ -646,16 +651,21 @@ class Updraft_Restorer {
646
  * This function is copied from class WP_Upgrader (WP 3.8 - no significant changes since 3.2 at least); we only had to fork it because it hard-codes using the basename of the zip file as its unpack directory; which can be long; and then combining that with long pathnames in the zip being unpacked can overflow a 256-character path limit (yes, they apparently still exist - amazing!)
647
  * Subsequently, we have also added the ability to unpack tarballs
648
  *
649
- * @param String $package specify package
 
 
 
 
650
  * @param Boolean $delete_package check to delete package
651
  * @param String|Boolean $type type of archive e.g. db.
652
  *
653
- * @return String|WP_Error If successful, then this indicates the working directory that the archive was unpacked in
654
  */
655
  private function unpack_package_archive($package, $delete_package = true, $type = false) {
656
 
657
  global $wp_filesystem, $updraftplus;
658
 
 
659
  if (!empty($this->ud_foreign) && !empty($this->ud_foreign_working_dir) && $package == $this->ud_foreign_package) {
660
  if (is_dir($this->ud_foreign_working_dir)) {
661
  return $this->ud_foreign_working_dir;
@@ -664,36 +674,60 @@ class Updraft_Restorer {
664
  }
665
  }
666
 
667
- $packsize = round(filesize($package)/1048576, 1).' Mb';
668
-
669
- $this->skin->feedback($this->strings['unpack_package'].' ('.basename($package).', '.$packsize.')');
670
 
671
- $upgrade_folder = $wp_filesystem->wp_content_dir() . 'upgrade/';
672
 
673
- // Clean up contents of upgrade directory beforehand.
674
- $upgrade_files = $wp_filesystem->dirlist($upgrade_folder);
675
- if (!empty($upgrade_files)) {
676
- foreach ($upgrade_files as $file)
677
- if (!$wp_filesystem->delete($upgrade_folder . $file['name'], true)) {
678
- $this->restore_log_permission_failure_message($upgrade_folder, 'Delete '.$upgrade_folder.$file['name']);
679
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
680
  }
681
 
682
- // We need a working directory
683
- // This is the only change from the WP core version - minimise path length
684
- // $working_dir = $upgrade_folder . basename($package, '.zip');
685
- $working_dir = $upgrade_folder . substr(md5($package), 0, 8);
 
 
 
 
 
 
686
 
687
- // Clean up working directory
688
- if ($wp_filesystem->is_dir($working_dir)) {
689
- if (!$wp_filesystem->delete($working_dir, true)) {
690
- $this->restore_log_permission_failure_message(dirname($working_dir), 'Delete '.$working_dir);
 
691
  }
692
  }
693
 
694
  // Unzip package to working directory
695
  if ('.zip' == strtolower(substr($package, -4, 4))) {
696
- $result = UpdraftPlus_Filesystem_Functions::unzip_file($package, $working_dir);
 
 
697
  } elseif ('.tar' == strtolower(substr($package, -4, 4)) || '.tar.gz' == strtolower(substr($package, -7, 7)) || '.tar.bz2' == strtolower(substr($package, -8, 8))) {
698
  if (!class_exists('UpdraftPlus_Archive_Tar')) {
699
  if (false === strpos(get_include_path(), UPDRAFTPLUS_DIR.'/includes/PEAR')) set_include_path(UPDRAFTPLUS_DIR.'/includes/PEAR'.PATH_SEPARATOR.get_include_path());
@@ -707,7 +741,7 @@ class Updraft_Restorer {
707
  $p_compress = 'bz2';
708
  }
709
 
710
- // It's not pretty. But it works.
711
  if (is_a($wp_filesystem, 'WP_Filesystem_Direct')) {
712
  $extract_dir = $working_dir;
713
  } else {
@@ -721,6 +755,7 @@ class Updraft_Restorer {
721
  $updraftplus->log("Using a temporary folder to extract before moving over WPFS: $extract_dir");
722
  }
723
  }
 
724
  // Slightly hackish - rather than re-write Archive_Tar to use wp_filesystem, we instead unpack into the location that we already require to be directly writable for other reasons, and then move from there.
725
 
726
  if (empty($result)) {
@@ -824,14 +859,33 @@ class Updraft_Restorer {
824
  */
825
  public function unpack_package($package, $delete_package = true, $type = false) {
826
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
827
  global $wp_filesystem, $updraftplus;
828
-
829
  $updraft_dir = $updraftplus->backups_dir_location();
830
-
831
- // If not database, then it is a zip - unpack in the usual way
832
- if (!preg_match('/-db(\.gz(\.crypt)?)?$/i', $package) && !preg_match('/\.sql(\.gz|\.bz2)?$/i', $package)) return $this->unpack_package_archive($updraft_dir.'/'.$package, $delete_package, $type);
833
-
834
- // Unpack a database. The general shape of the following is copied from class-wp-upgrader.php
835
 
836
  $backup_dir = $wp_filesystem->find_folder($updraft_dir);
837
 
@@ -847,16 +901,15 @@ class Updraft_Restorer {
847
  // Clean up contents of upgrade directory beforehand.
848
  $upgrade_files = $wp_filesystem->dirlist($upgrade_folder);
849
  if (!empty($upgrade_files)) {
850
- foreach ($upgrade_files as $file)
851
  if (!$wp_filesystem->delete($upgrade_folder.$file['name'], true)) {
852
  $this->restore_log_permission_failure_message($upgrade_folder, 'Delete '.$upgrade_folder.$file['name']);
853
  }
854
-
855
  }
856
 
857
  // We need a working directory
858
  $working_dir = $upgrade_folder . basename($package, '.crypt');
859
- // $working_dir_localpath = WP_CONTENT_DIR.'/upgrade/'. basename($package, '.crypt');
860
 
861
  // Clean up working directory
862
  if ($wp_filesystem->is_dir($working_dir)) {
@@ -919,7 +972,7 @@ class Updraft_Restorer {
919
  }
920
  }
921
 
922
- $updraftplus->log("Database successfully unpacked");
923
 
924
  return $working_dir;
925
  }
@@ -1157,19 +1210,19 @@ class Updraft_Restorer {
1157
  /**
1158
  * Pre-flight check: chance to complain and abort before anything at all is done
1159
  *
1160
- * @param array $backup_files An array of backup files
1161
- * @param string $type Type of file
1162
- * @param array $info Information about the backup
1163
- * @param array $continuation_data Information about continuing from an already-begun restore
1164
- * @return boolean|WP_Error
1165
  */
1166
- public function pre_restore_backup($backup_files, $type, $info, $continuation_data = null) {
1167
 
1168
  if (is_string($backup_files)) $backup_files = array($backup_files);
1169
 
1170
  if ('more' == $type) {
1171
  $this->skin->feedback($this->strings['not_possible']);
1172
- return;
1173
  }
1174
 
1175
  // Ensure access to the indicated directory - and to WP_CONTENT_DIR (in which we use upgrade/)
@@ -1209,7 +1262,7 @@ class Updraft_Restorer {
1209
  $ret_val = true;
1210
  $updraft_dir = $updraftplus->backups_dir_location();
1211
 
1212
- if (!is_array($continuation_data) && (('plugins' == $type || 'uploads' == $type || 'themes' == $type) && (!is_multisite() || 0 !== $this->ud_backup_is_multisite || ('uploads' != $type || empty($updraftplus_addons_migrator->new_blogid))))) {
1213
  if (file_exists($updraft_dir.'/'.basename($wp_filesystem_dir)."-old")) {
1214
  $ret_val = new WP_Error('already_exists', sprintf(__('Existing unremoved folders from a previous restore exist (please use the "Delete Old Directories" button to delete them before trying again): %s', 'updraftplus'), $wp_filesystem_dir.'-old'));
1215
  }
56
 
57
  private $import_table_prefix = null;
58
 
59
+ private $continuation_data;
60
+
61
  // Constants for use with the move_backup_in method
62
  // These can't be arbitrarily changed; there is legacy code doing bitwise operations and numerical comparisons, and possibly legacy code still using the values directly.
63
  const MOVEIN_OVERWRITE_NO_BACKUP = 0;
74
  /**
75
  * Constructor
76
  *
77
+ * @param WP_Upgrader_Skin|Null $skin - an upgrader skin
78
+ * @param Array|Null $backup_set - the backup set to restore
79
+ * @param Boolean $short_init - whether just to do a minimal initialisation
80
+ * @param Array $restore_options - options to guide the restoration
81
+ * @param Array|Null $continuation_data - continuation data; the jobdata of the job thus far (but only a few properties are used - including second_loop_entities; $restore_options will have come from there too if relevant, but that is passed in here separately); the 'last_index_*' entries also indicate unzipping progress
82
  */
83
+ public function __construct($skin = null, $backup_set = null, $short_init = false, $restore_options = array(), $continuation_data = null) {
84
 
85
  global $wpdb, $updraftplus;
86
 
87
  $this->our_siteurl = untrailingslashit(site_url());
88
+
89
+ $this->continuation_data = $continuation_data;
90
 
91
  // Line up a wpdb-like object
92
  if (!$this->use_wpdb()) {
264
  }
265
 
266
  /**
267
+ * Ensure that needed files are present locally, and return data for the next step (plus do some internal configuration)
268
  *
269
  * @param Array $entities_to_restore - as returned by self::get_entities_to_restore()
270
  * @param Array $backupable_entities - list of entities that can be backed u
 
271
  * @param Array $services - list of services that the backup can be found at
272
  *
273
  * @uses self::pre_restore_backup() (and some other internal properties)
274
  * @uses UpdraftPlus::log()
275
  *
276
+ * @return Boolean|Array|WP_Error - a sorted array (of entity types and files for each entity type) or false or a WP_Error if there was an error
277
  */
278
+ private function ensure_restore_files_present($entities_to_restore, $backupable_entities, $services) {
279
 
280
  global $updraftplus;
281
 
311
  $fullpath = $updraft_dir.'/'.$file;
312
  $updraftplus->log(sprintf(__("Looking for %s archive: file name: %s", 'updraftplus'), $type, $file), 'notice-restore');
313
 
314
+ if (is_array($this->continuation_data) && isset($this->continuation_data['second_loop_entities'][$type]) && !in_array($file, $this->continuation_data['second_loop_entities'][$type])) {
315
  $updraftplus->log(__('Skipping: this archive was already restored.', 'updraftplus'), 'notice-restore');
316
  // Set the marker so that the existing directory isn't moved out of the way
317
  $this->been_restored[$type] = true;
353
 
354
  foreach ($types as $check_type) {
355
  $info = isset($backupable_entities[$check_type]) ? $backupable_entities[$check_type] : array();
356
+ $val = $this->pre_restore_backup($files, $check_type, $info);
357
  if (is_wp_error($val)) {
358
  $updraftplus->log_wp_error($val);
359
  foreach ($val->get_error_messages() as $msg) {
389
  uksort($second_loop, array('UpdraftPlus_Manipulation_Functions', 'sort_restoration_entities'));
390
 
391
  // If continuing, then prune those already done
392
+ if (is_array($this->continuation_data)) {
393
  foreach ($second_loop as $type => $files) {
394
+ if (isset($this->continuation_data['second_loop_entities'][$type])) $second_loop[$type] = $this->continuation_data['second_loop_entities'][$type];
395
  }
396
  }
397
 
401
  /**
402
  * Perform the restoration. No code here (or called) should assume anything about the method used to call it (e.g. wp-admin or WP-CLI); it should be independent of how it is being called.
403
  *
404
+ * The path through this class is perform_restore() -> restore_backup() -> unpack_package() -> unpack_package_(archive|database) and then (for standard UD archives) UpdraftPlus_Filesystem_Functions::unzip_file()
405
+ *
406
+ * @param Array $entities_to_restore - entities to restore
407
+ * @param Array $restore_options - restoration options
408
  *
409
  * @uses the WordPress action updraftplus_restoration_title, allowing the title to be printed
410
  *
411
  * @return Boolean
412
  */
413
+ public function perform_restore($entities_to_restore, $restore_options) {
414
 
415
  global $updraftplus;
416
 
445
 
446
  // Get an ordered list of things to restore
447
  // This requires the global $updraft_restorer to be set up
448
+ $second_loop = $this->ensure_restore_files_present($entities_to_download, $backupable_entities, $services);
449
 
450
  if (!is_array($second_loop)) return $second_loop;
451
 
651
  * This function is copied from class WP_Upgrader (WP 3.8 - no significant changes since 3.2 at least); we only had to fork it because it hard-codes using the basename of the zip file as its unpack directory; which can be long; and then combining that with long pathnames in the zip being unpacked can overflow a 256-character path limit (yes, they apparently still exist - amazing!)
652
  * Subsequently, we have also added the ability to unpack tarballs
653
  *
654
+ * In the 'ordinary' case of unzipping a UD zip backup, this method basically does some preparation, and then calls UpdraftPlus_Filesystem_Functions::unzip_file() for the actual unzipping
655
+ *
656
+ * @used-by self::unpack_package()
657
+ *
658
+ * @param String $package specify package - full filepath
659
  * @param Boolean $delete_package check to delete package
660
  * @param String|Boolean $type type of archive e.g. db.
661
  *
662
+ * @return String|WP_Error If successful, then this indicates the working directory that the archive was unpacked in; a WP_Filesystem path
663
  */
664
  private function unpack_package_archive($package, $delete_package = true, $type = false) {
665
 
666
  global $wp_filesystem, $updraftplus;
667
 
668
+ // If it is a non-UD archive that is already unpacked, then don't re-run, but return the existing result
669
  if (!empty($this->ud_foreign) && !empty($this->ud_foreign_working_dir) && $package == $this->ud_foreign_package) {
670
  if (is_dir($this->ud_foreign_working_dir)) {
671
  return $this->ud_foreign_working_dir;
674
  }
675
  }
676
 
677
+ $this->skin->feedback($this->strings['unpack_package'].' ('.basename($package).', '.round(filesize($package)/1048576, 1).' MB)');
 
 
678
 
679
+ $upgrade_folder = $wp_filesystem->wp_content_dir().'upgrade/';
680
 
681
+ $zip_starting_index = 0;
682
+
683
+ // We need a working directory. This has a change from the WP core version - minimise path length
684
+ // N.B. It is deterministic; the same package file will get the same working directory
685
+ // $working_dir = $upgrade_folder . basename($package, '.zip');
686
+ $working_dir = $upgrade_folder.substr(md5($package), 0, 8);
687
+
688
+ if ('.zip' == strtolower(substr($package, -4, 4))) {
689
+
690
+ $last_index_key = UpdraftPlus_Filesystem_Functions::get_jobdata_progress_key($package);
691
+
692
+ // Turn off the feature with define('UPDRAFTPLUS_UNZIP_RESUME_ENABLED', false);
693
+ if ((!defined('UPDRAFTPLUS_UNZIP_RESUME_ENABLED') || UPDRAFTPLUS_UNZIP_RESUME_ENABLED) && !empty($this->continuation_data[$last_index_key]) && !empty($this->continuation_data[$last_index_key]['info']['name'])) {
694
+
695
+ $reached = $this->continuation_data[$last_index_key];
696
+
697
+ $last_exists = $wp_filesystem->exists($working_dir.'/'.$reached['info']['name']);
698
+ $last_size = $last_exists ? $wp_filesystem->size($working_dir.'/'.$reached['info']['name']) : 'n/a';
699
+
700
+ if ($last_exists && $last_size == $reached['info']['size'] && isset($reached['index'])) $zip_starting_index = $reached['index'];
701
+
702
+ $updraftplus->log("Unpack resumption may be possible: zip_starting_index=$zip_starting_index, last_exists=$last_exists, last_size=$last_size, last_status=".serialize($this->continuation_data[$last_index_key]));
703
+ }
704
+
705
  }
706
 
707
+ if (0 == $zip_starting_index) {
708
+ // Clean up contents of upgrade directory beforehand.
709
+ $upgrade_files = $wp_filesystem->dirlist($upgrade_folder);
710
+ if (!empty($upgrade_files)) {
711
+ foreach ($upgrade_files as $file) {
712
+ if (!$wp_filesystem->delete($upgrade_folder . $file['name'], true)) {
713
+ $this->restore_log_permission_failure_message($upgrade_folder, 'Delete '.$upgrade_folder.$file['name']);
714
+ }
715
+ }
716
+ }
717
 
718
+ // Clean up working directory - this is redundant, as we already cleared out the parent folder
719
+ if ($wp_filesystem->is_dir($working_dir)) {
720
+ if (!$wp_filesystem->delete($working_dir, true)) {
721
+ $this->restore_log_permission_failure_message(dirname($working_dir), 'Delete '.$working_dir);
722
+ }
723
  }
724
  }
725
 
726
  // Unzip package to working directory
727
  if ('.zip' == strtolower(substr($package, -4, 4))) {
728
+
729
+ $result = UpdraftPlus_Filesystem_Functions::unzip_file($package, $working_dir, $zip_starting_index);
730
+
731
  } elseif ('.tar' == strtolower(substr($package, -4, 4)) || '.tar.gz' == strtolower(substr($package, -7, 7)) || '.tar.bz2' == strtolower(substr($package, -8, 8))) {
732
  if (!class_exists('UpdraftPlus_Archive_Tar')) {
733
  if (false === strpos(get_include_path(), UPDRAFTPLUS_DIR.'/includes/PEAR')) set_include_path(UPDRAFTPLUS_DIR.'/includes/PEAR'.PATH_SEPARATOR.get_include_path());
741
  $p_compress = 'bz2';
742
  }
743
 
744
+ // It's not pretty, but it works.
745
  if (is_a($wp_filesystem, 'WP_Filesystem_Direct')) {
746
  $extract_dir = $working_dir;
747
  } else {
755
  $updraftplus->log("Using a temporary folder to extract before moving over WPFS: $extract_dir");
756
  }
757
  }
758
+
759
  // Slightly hackish - rather than re-write Archive_Tar to use wp_filesystem, we instead unpack into the location that we already require to be directly writable for other reasons, and then move from there.
760
 
761
  if (empty($result)) {
859
  */
860
  public function unpack_package($package, $delete_package = true, $type = false) {
861
 
862
+ if (preg_match('/-db(\.gz(\.crypt)?)?$/i', $package) || preg_match('/\.sql(\.gz|\.bz2)?$/i', $package)) {
863
+ return $this->unpack_package_database($package, $delete_package);
864
+ } else {
865
+ global $updraftplus;
866
+ // If not database, then it is a zip - unpack in the usual way
867
+ return $this->unpack_package_archive($updraftplus->backups_dir_location().'/'.$package, $delete_package, $type);
868
+ }
869
+
870
+ }
871
+
872
+ /**
873
+ * Unpack a database backup file
874
+ *
875
+ * @used-by self::unpack_package()
876
+ *
877
+ * @param String $package - file to unpack; relative filepath
878
+ * @param Boolean $delete_package - check to delete package
879
+ *
880
+ * @return String|WP_Error If successful, then this indicates the working directory that the archive was unpacked in (a WP_Filesystem path)
881
+ */
882
+ private function unpack_package_database($package, $delete_package = true) {
883
+
884
  global $wp_filesystem, $updraftplus;
885
+
886
  $updraft_dir = $updraftplus->backups_dir_location();
887
+
888
+ // The general shape of the following comes from class-wp-upgrader.php
 
 
 
889
 
890
  $backup_dir = $wp_filesystem->find_folder($updraft_dir);
891
 
901
  // Clean up contents of upgrade directory beforehand.
902
  $upgrade_files = $wp_filesystem->dirlist($upgrade_folder);
903
  if (!empty($upgrade_files)) {
904
+ foreach ($upgrade_files as $file) {
905
  if (!$wp_filesystem->delete($upgrade_folder.$file['name'], true)) {
906
  $this->restore_log_permission_failure_message($upgrade_folder, 'Delete '.$upgrade_folder.$file['name']);
907
  }
908
+ }
909
  }
910
 
911
  // We need a working directory
912
  $working_dir = $upgrade_folder . basename($package, '.crypt');
 
913
 
914
  // Clean up working directory
915
  if ($wp_filesystem->is_dir($working_dir)) {
972
  }
973
  }
974
 
975
+ $updraftplus->log('Database successfully unpacked');
976
 
977
  return $working_dir;
978
  }
1210
  /**
1211
  * Pre-flight check: chance to complain and abort before anything at all is done
1212
  *
1213
+ * @param Array $backup_files - An array of backup files
1214
+ * @param String $type - Type of file
1215
+ * @param Array $info - Information about the backup
1216
+ *
1217
+ * @return Boolean|WP_Error
1218
  */
1219
+ private function pre_restore_backup($backup_files, $type, $info) {
1220
 
1221
  if (is_string($backup_files)) $backup_files = array($backup_files);
1222
 
1223
  if ('more' == $type) {
1224
  $this->skin->feedback($this->strings['not_possible']);
1225
+ return new WP_Error('not_possible', $this->strings['not_possible']);
1226
  }
1227
 
1228
  // Ensure access to the indicated directory - and to WP_CONTENT_DIR (in which we use upgrade/)
1262
  $ret_val = true;
1263
  $updraft_dir = $updraftplus->backups_dir_location();
1264
 
1265
+ if (!is_array($this->continuation_data) && (('plugins' == $type || 'uploads' == $type || 'themes' == $type) && (!is_multisite() || 0 !== $this->ud_backup_is_multisite || ('uploads' != $type || empty($updraftplus_addons_migrator->new_blogid))))) {
1266
  if (file_exists($updraft_dir.'/'.basename($wp_filesystem_dir)."-old")) {
1267
  $ret_val = new WP_Error('already_exists', sprintf(__('Existing unremoved folders from a previous restore exist (please use the "Delete Old Directories" button to delete them before trying again): %s', 'updraftplus'), $wp_filesystem_dir.'-old'));
1268
  }
updraftplus.php CHANGED
@@ -5,7 +5,7 @@ Plugin Name: UpdraftPlus - Backup/Restore
5
  Plugin URI: https://updraftplus.com
6
  Description: Backup and restore: take backups locally, or backup to Amazon S3, Dropbox, Google Drive, Rackspace, (S)FTP, WebDAV & email, on automatic schedules.
7
  Author: UpdraftPlus.Com, DavidAnderson
8
- Version: 1.16.4
9
  Donate link: https://david.dw-perspective.org.uk/donate
10
  License: GPLv3 or later
11
  Text Domain: updraftplus
5
  Plugin URI: https://updraftplus.com
6
  Description: Backup and restore: take backups locally, or backup to Amazon S3, Dropbox, Google Drive, Rackspace, (S)FTP, WebDAV & email, on automatic schedules.
7
  Author: UpdraftPlus.Com, DavidAnderson
8
+ Version: 1.16.5
9
  Donate link: https://david.dw-perspective.org.uk/donate
10
  License: GPLv3 or later
11
  Text Domain: updraftplus
vendor/composer/installed.json CHANGED
@@ -379,17 +379,17 @@
379
  },
380
  {
381
  "name": "phpseclib/phpseclib",
382
- "version": "1.0.11",
383
- "version_normalized": "1.0.11.0",
384
  "source": {
385
  "type": "git",
386
  "url": "https://github.com/phpseclib/phpseclib.git",
387
- "reference": "fd33675e483b887fc59834ab69e33ef7f2706425"
388
  },
389
  "dist": {
390
  "type": "zip",
391
- "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/fd33675e483b887fc59834ab69e33ef7f2706425",
392
- "reference": "fd33675e483b887fc59834ab69e33ef7f2706425",
393
  "shasum": ""
394
  },
395
  "require": {
@@ -406,7 +406,7 @@
406
  "ext-mcrypt": "Install the Mcrypt extension in order to speed up a wide variety of cryptographic operations.",
407
  "pear-pear/PHP_Compat": "Install PHP_Compat to get phpseclib working on PHP < 5.0.0."
408
  },
409
- "time": "2018-04-15T16:51:35+00:00",
410
  "type": "library",
411
  "installation-source": "source",
412
  "autoload": {
379
  },
380
  {
381
  "name": "phpseclib/phpseclib",
382
+ "version": "1.0.14",
383
+ "version_normalized": "1.0.14.0",
384
  "source": {
385
  "type": "git",
386
  "url": "https://github.com/phpseclib/phpseclib.git",
387
+ "reference": "7432a6959afe98b9e93153d0034b0f62ad890d31"
388
  },
389
  "dist": {
390
  "type": "zip",
391
+ "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/7432a6959afe98b9e93153d0034b0f62ad890d31",
392
+ "reference": "7432a6959afe98b9e93153d0034b0f62ad890d31",
393
  "shasum": ""
394
  },
395
  "require": {
406
  "ext-mcrypt": "Install the Mcrypt extension in order to speed up a wide variety of cryptographic operations.",
407
  "pear-pear/PHP_Compat": "Install PHP_Compat to get phpseclib working on PHP < 5.0.0."
408
  },
409
+ "time": "2019-01-27T19:35:10+00:00",
410
  "type": "library",
411
  "installation-source": "source",
412
  "autoload": {
vendor/phpseclib/phpseclib/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
  # Changelog
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  ## 1.0.11 - 2018-04-15
4
 
5
  - X509: auto download intermediate certs
1
  # Changelog
2
 
3
+ ## 1.0.14 - 2019-01-27
4
+
5
+ - SSH2: ssh-rsa is sometimes incorrectly used instead of rsa-sha2-256 (#1331)
6
+ - SSH2: more strictly adhere to RFC8332 for rsa-sha2-256/512 (#1332)
7
+
8
+ ## 1.0.13 - 2018-12-16
9
+
10
+ - SSH2: fix order of user_error() / bitmap reset (#1314)
11
+ - SSH2: setTimeout(0) didn't work as intended (#1116)
12
+ - Agent: add support for rsa-sha2-256 / rsa-sha2-512 (#1319)
13
+ - Agent: add parameter to constructor (#1319)
14
+
15
+ ## 1.0.12 - 2018-11-04
16
+
17
+ - SSH2: fixes relating to delayed global requests (#1271)
18
+ - SSH2: setEngine -> setPreferredEngine (#1294)
19
+ - SSH2: reset $this->bitmap when the connection fails (#1298)
20
+ - SSH2: add ping() method (#1298)
21
+ - SSH2: add support for rsa-sha2-256 / rsa-sha2-512 (RFC8332)
22
+ - SFTP: make rawlist give same result regardless of stat cache (#1287)
23
+ - Hash: save hashed keys for re-use
24
+
25
  ## 1.0.11 - 2018-04-15
26
 
27
  - X509: auto download intermediate certs
vendor/phpseclib/phpseclib/README.md CHANGED
@@ -24,6 +24,7 @@ AES, Blowfish, Twofish, SSH-1, SSH-2, SFTP, and X.509
24
 
25
  ### 2.0
26
 
 
27
  * Modernized version of 1.0
28
  * Minimum PHP version: 5.3.3
29
  * PSR-4 autoloading with namespace rooted at `\phpseclib`
@@ -36,7 +37,7 @@ AES, Blowfish, Twofish, SSH-1, SSH-2, SFTP, and X.509
36
  * Composer compatible (PSR-0 autoloading)
37
  * Install using Composer: `composer require phpseclib/phpseclib ~1.0`
38
  * Install using PEAR: See [phpseclib PEAR Channel Documentation](http://phpseclib.sourceforge.net/pear.htm)
39
- * [Download 1.0.11 as ZIP](http://sourceforge.net/projects/phpseclib/files/phpseclib1.0.11.zip/download)
40
 
41
  ## Support
42
 
24
 
25
  ### 2.0
26
 
27
+ * Long term support (LTS) release
28
  * Modernized version of 1.0
29
  * Minimum PHP version: 5.3.3
30
  * PSR-4 autoloading with namespace rooted at `\phpseclib`
37
  * Composer compatible (PSR-0 autoloading)
38
  * Install using Composer: `composer require phpseclib/phpseclib ~1.0`
39
  * Install using PEAR: See [phpseclib PEAR Channel Documentation](http://phpseclib.sourceforge.net/pear.htm)
40
+ * [Download 1.0.14 as ZIP](http://sourceforge.net/projects/phpseclib/files/phpseclib1.0.14.zip/download)
41
 
42
  ## Support
43
 
vendor/phpseclib/phpseclib/appveyor.yml ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ build: false
2
+ shallow_clone: false
3
+ platform:
4
+ - x86
5
+ - x64
6
+ clone_folder: C:\projects\phpseclib
7
+
8
+ install:
9
+ - cinst -y OpenSSL.Light
10
+ - SET PATH=C:\Program Files\OpenSSL;%PATH%
11
+ - sc config wuauserv start= auto
12
+ - net start wuauserv
13
+ - cinst -y php --version 5.6.30
14
+ - cd c:\tools\php56
15
+ - copy php.ini-production php.ini
16
+ - echo date.timezone="UTC" >> php.ini
17
+ - echo extension_dir=ext >> php.ini
18
+ - echo extension=php_openssl.dll >> php.ini
19
+ - echo extension=php_gmp.dll >> php.ini
20
+ - cd C:\projects\phpseclib
21
+ - SET PATH=C:\tools\php56;%PATH%
22
+ - php.exe -r "readfile('http://getcomposer.org/installer');" | php.exe
23
+ - php.exe composer.phar install --prefer-source --no-interaction
24
+
25
+ test_script:
26
+ - cd C:\projects\phpseclib
27
+ - vendor\bin\phpunit.bat tests/Windows32Test.php
vendor/phpseclib/phpseclib/phpseclib/Crypt/Base.php CHANGED
@@ -661,7 +661,7 @@ class Crypt_Base
661
  $count = isset($func_args[4]) ? $func_args[4] : 1000;
662
 
663
  // Keylength
664
- if (isset($func_args[5])) {
665
  $dkLen = $func_args[5];
666
  } else {
667
  $dkLen = $method == 'pbkdf1' ? 2 * $this->key_length : $this->key_length;
@@ -696,10 +696,10 @@ class Crypt_Base
696
  include_once 'Crypt/Hash.php';
697
  }
698
  $i = 1;
 
 
 
699
  while (strlen($key) < $dkLen) {
700
- $hmac = new Crypt_Hash();
701
- $hmac->setHash($hash);
702
- $hmac->setKey($password);
703
  $f = $u = $hmac->hash($salt . pack('N', $i++));
704
  for ($j = 2; $j <= $count; ++$j) {
705
  $u = $hmac->hash($u);
661
  $count = isset($func_args[4]) ? $func_args[4] : 1000;
662
 
663
  // Keylength
664
+ if (isset($func_args[5]) && $func_args[5] > 0) {
665
  $dkLen = $func_args[5];
666
  } else {
667
  $dkLen = $method == 'pbkdf1' ? 2 * $this->key_length : $this->key_length;
696
  include_once 'Crypt/Hash.php';
697
  }
698
  $i = 1;
699
+ $hmac = new Crypt_Hash();
700
+ $hmac->setHash($hash);
701
+ $hmac->setKey($password);
702
  while (strlen($key) < $dkLen) {
 
 
 
703
  $f = $u = $hmac->hash($salt . pack('N', $i++));
704
  for ($j = 2; $j <= $count; ++$j) {
705
  $u = $hmac->hash($u);
vendor/phpseclib/phpseclib/phpseclib/Crypt/Hash.php CHANGED
@@ -126,6 +126,15 @@ class Crypt_Hash
126
  */
127
  var $key = false;
128
 
 
 
 
 
 
 
 
 
 
129
  /**
130
  * Outer XOR (Internal HMAC)
131
  *
@@ -192,6 +201,43 @@ class Crypt_Hash
192
  function setKey($key = false)
193
  {
194
  $this->key = $key;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
  }
196
 
197
  /**
@@ -241,6 +287,25 @@ class Crypt_Hash
241
  $this->l = 64;
242
  }
243
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
244
  switch ($hash) {
245
  case 'md2':
246
  $mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_HASH && in_array('md2', hash_algos()) ?
@@ -267,6 +332,7 @@ class Crypt_Hash
267
  default:
268
  $this->hash = MHASH_SHA1;
269
  }
 
270
  return;
271
  case CRYPT_HASH_MODE_HASH:
272
  switch ($hash) {
@@ -283,35 +349,33 @@ class Crypt_Hash
283
  default:
284
  $this->hash = 'sha1';
285
  }
 
286
  return;
287
  }
288
 
289
  switch ($hash) {
290
  case 'md2':
291
- $this->b = 16;
292
  $this->hash = array($this, '_md2');
293
  break;
294
  case 'md5':
295
- $this->b = 64;
296
  $this->hash = array($this, '_md5');
297
  break;
298
  case 'sha256':
299
- $this->b = 64;
300
  $this->hash = array($this, '_sha256');
301
  break;
302
  case 'sha384':
303
  case 'sha512':
304
- $this->b = 128;
305
  $this->hash = array($this, '_sha512');
306
  break;
307
  case 'sha1':
308
  default:
309
- $this->b = 64;
310
  $this->hash = array($this, '_sha1');
311
  }
312
 
313
  $this->ipad = str_repeat(chr(0x36), $this->b);
314
  $this->opad = str_repeat(chr(0x5C), $this->b);
 
 
315
  }
316
 
317
  /**
@@ -328,25 +392,19 @@ class Crypt_Hash
328
  if (!empty($this->key) || is_string($this->key)) {
329
  switch ($mode) {
330
  case CRYPT_HASH_MODE_MHASH:
331
- $output = mhash($this->hash, $text, $this->key);
332
  break;
333
  case CRYPT_HASH_MODE_HASH:
334
- $output = hash_hmac($this->hash, $text, $this->key, true);
335
  break;
336
  case CRYPT_HASH_MODE_INTERNAL:
337
- /* "Applications that use keys longer than B bytes will first hash the key using H and then use the
338
- resultant L byte string as the actual key to HMAC."
339
-
340
- -- http://tools.ietf.org/html/rfc2104#section-2 */
341
- $key = strlen($this->key) > $this->b ? call_user_func($this->hash, $this->key) : $this->key;
342
-
343
- $key = str_pad($key, $this->b, chr(0)); // step 1
344
- $temp = $this->ipad ^ $key; // step 2
345
- $temp .= $text; // step 3
346
- $temp = call_user_func($this->hash, $temp); // step 4
347
- $output = $this->opad ^ $key; // step 5
348
- $output.= $temp; // step 6
349
- $output = call_user_func($this->hash, $output); // step 7
350
  }
351
  } else {
352
  switch ($mode) {
126
  */
127
  var $key = false;
128
 
129
+ /**
130
+ * Computed Key
131
+ *
132
+ * @see self::_computeKey()
133
+ * @var string
134
+ * @access private
135
+ */
136
+ var $computedKey = false;
137
+
138
  /**
139
  * Outer XOR (Internal HMAC)
140
  *
201
  function setKey($key = false)
202
  {
203
  $this->key = $key;
204
+ $this->_computeKey();
205
+ }
206
+
207
+ /**
208
+ * Pre-compute the key used by the HMAC
209
+ *
210
+ * Quoting http://tools.ietf.org/html/rfc2104#section-2, "Applications that use keys longer than B bytes
211
+ * will first hash the key using H and then use the resultant L byte string as the actual key to HMAC."
212
+ *
213
+ * As documented in https://www.reddit.com/r/PHP/comments/9nct2l/symfonypolyfill_hash_pbkdf2_correct_fix_for/
214
+ * when doing an HMAC multiple times it's faster to compute the hash once instead of computing it during
215
+ * every call
216
+ *
217
+ * @access private
218
+ */
219
+ function _computeKey()
220
+ {
221
+ if ($this->key === false) {
222
+ $this->computedKey = false;
223
+ return;
224
+ }
225
+
226
+ if (strlen($this->key) <= $this->b) {
227
+ $this->computedKey = $this->key;
228
+ return;
229
+ }
230
+
231
+ switch ($mode) {
232
+ case CRYPT_HASH_MODE_MHASH:
233
+ $this->computedKey = mhash($this->hash, $this->key);
234
+ break;
235
+ case CRYPT_HASH_MODE_HASH:
236
+ $this->computedKey = hash($this->hash, $this->key, true);
237
+ break;
238
+ case CRYPT_HASH_MODE_INTERNAL:
239
+ $this->computedKey = call_user_func($this->hash, $this->key);
240
+ }
241
  }
242
 
243
  /**
287
  $this->l = 64;
288
  }
289
 
290
+ switch ($hash) {
291
+ case 'md2-96':
292
+ case 'md2':
293
+ $this->b = 16;
294
+ case 'md5-96':
295
+ case 'sha1-96':
296
+ case 'sha224-96':
297
+ case 'sha256-96':
298
+ case 'md2':
299
+ case 'md5':
300
+ case 'sha1':
301
+ case 'sha224':
302
+ case 'sha256':
303
+ $this->b = 64;
304
+ break;
305
+ default:
306
+ $this->b = 128;
307
+ }
308
+
309
  switch ($hash) {
310
  case 'md2':
311
  $mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_HASH && in_array('md2', hash_algos()) ?
332
  default:
333
  $this->hash = MHASH_SHA1;
334
  }
335
+ $this->_computeKey();
336
  return;
337
  case CRYPT_HASH_MODE_HASH:
338
  switch ($hash) {
349
  default:
350
  $this->hash = 'sha1';
351
  }
352
+ $this->_computeKey();
353
  return;
354
  }
355
 
356
  switch ($hash) {
357
  case 'md2':
 
358
  $this->hash = array($this, '_md2');
359
  break;
360
  case 'md5':
 
361
  $this->hash = array($this, '_md5');
362
  break;
363
  case 'sha256':
 
364
  $this->hash = array($this, '_sha256');
365
  break;
366
  case 'sha384':
367
  case 'sha512':
 
368
  $this->hash = array($this, '_sha512');
369
  break;
370
  case 'sha1':
371
  default:
 
372
  $this->hash = array($this, '_sha1');
373
  }
374
 
375
  $this->ipad = str_repeat(chr(0x36), $this->b);
376
  $this->opad = str_repeat(chr(0x5C), $this->b);
377
+
378
+ $this->_computeKey();
379
  }
380
 
381
  /**
392
  if (!empty($this->key) || is_string($this->key)) {
393
  switch ($mode) {
394
  case CRYPT_HASH_MODE_MHASH:
395
+ $output = mhash($this->hash, $text, $this->computedKey);
396
  break;
397
  case CRYPT_HASH_MODE_HASH:
398
+ $output = hash_hmac($this->hash, $text, $this->computedKey, true);
399
  break;
400
  case CRYPT_HASH_MODE_INTERNAL:
401
+ $key = str_pad($this->computedKey, $this->b, chr(0)); // step 1
402
+ $temp = $this->ipad ^ $key; // step 2
403
+ $temp .= $text; // step 3
404
+ $temp = call_user_func($this->hash, $temp); // step 4
405
+ $output = $this->opad ^ $key; // step 5
406
+ $output.= $temp; // step 6
407
+ $output = call_user_func($this->hash, $output); // step 7
 
 
 
 
 
 
408
  }
409
  } else {
410
  switch ($mode) {
vendor/phpseclib/phpseclib/phpseclib/File/ASN1.php CHANGED
@@ -390,6 +390,9 @@ class File_ASN1
390
  $remainingLength = $length;
391
  while ($remainingLength > 0) {
392
  $temp = $this->_decode_ber($content, $start, $content_pos);
 
 
 
393
  $length = $temp['length'];
394
  // end-of-content octets - see paragraph 8.1.5
395
  if (substr($content, $content_pos + $length, 2) == "\0\0") {
@@ -441,6 +444,9 @@ class File_ASN1
441
  $current['content'] = substr($content, $content_pos);
442
  } else {
443
  $temp = $this->_decode_ber($content, $start, $content_pos);
 
 
 
444
  $length-= (strlen($content) - $content_pos);
445
  $last = count($temp) - 1;
446
  for ($i = 0; $i < $last; $i++) {
@@ -465,6 +471,9 @@ class File_ASN1
465
  $length = 0;
466
  while (substr($content, $content_pos, 2) != "\0\0") {
467
  $temp = $this->_decode_ber($content, $length + $start, $content_pos);
 
 
 
468
  $content_pos += $temp['length'];
469
  // all subtags should be octet strings
470
  //if ($temp['type'] != FILE_ASN1_TYPE_OCTET_STRING) {
@@ -497,6 +506,9 @@ class File_ASN1
497
  break 2;
498
  }
499
  $temp = $this->_decode_ber($content, $start + $offset, $content_pos);
 
 
 
500
  $content_pos += $temp['length'];
501
  $current['content'][] = $temp;
502
  $offset+= $temp['length'];
390
  $remainingLength = $length;
391
  while ($remainingLength > 0) {
392
  $temp = $this->_decode_ber($content, $start, $content_pos);
393
+ if ($temp === false) {
394
+ break;
395
+ }
396
  $length = $temp['length'];
397
  // end-of-content octets - see paragraph 8.1.5
398
  if (substr($content, $content_pos + $length, 2) == "\0\0") {
444
  $current['content'] = substr($content, $content_pos);
445
  } else {
446
  $temp = $this->_decode_ber($content, $start, $content_pos);
447
+ if ($temp === false) {
448
+ return false;
449
+ }
450
  $length-= (strlen($content) - $content_pos);
451
  $last = count($temp) - 1;
452
  for ($i = 0; $i < $last; $i++) {
471
  $length = 0;
472
  while (substr($content, $content_pos, 2) != "\0\0") {
473
  $temp = $this->_decode_ber($content, $length + $start, $content_pos);
474
+ if ($temp === false) {
475
+ return false;
476
+ }
477
  $content_pos += $temp['length'];
478
  // all subtags should be octet strings
479
  //if ($temp['type'] != FILE_ASN1_TYPE_OCTET_STRING) {
506
  break 2;
507
  }
508
  $temp = $this->_decode_ber($content, $start + $offset, $content_pos);
509
+ if ($temp === false) {
510
+ return false;
511
+ }
512
  $content_pos += $temp['length'];
513
  $current['content'][] = $temp;
514
  $offset+= $temp['length'];
vendor/phpseclib/phpseclib/phpseclib/File/X509.php CHANGED
@@ -2122,7 +2122,7 @@ class File_X509
2122
  *
2123
  * If $date isn't defined it is assumed to be the current date.
2124
  *
2125
- * @param int $date optional
2126
  * @access public
2127
  */
2128
  function validateDate($date = null)
@@ -2133,7 +2133,7 @@ class File_X509
2133
 
2134
  if (!isset($date)) {
2135
  $date = class_exists('DateTime') ?
2136
- new DateTime($date, new DateTimeZone(@date_default_timezone_get())) :
2137
  time();
2138
  }
2139
 
@@ -2143,12 +2143,18 @@ class File_X509
2143
  $notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter'];
2144
  $notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime'];
2145
 
2146
- if (class_exists('DateTime')) {
2147
- $notBefore = new DateTime($notBefore, new DateTimeZone(@date_default_timezone_get()));
2148
- $notAfter = new DateTime($notAfter, new DateTimeZone(@date_default_timezone_get()));
2149
- } else {
2150
- $notBefore = @strtotime($notBefore);
2151
- $notAfter = @strtotime($notAfter);
 
 
 
 
 
 
2152
  }
2153
 
2154
  switch (true) {
2122
  *
2123
  * If $date isn't defined it is assumed to be the current date.
2124
  *
2125
+ * @param \DateTime|int|string $date optional
2126
  * @access public
2127
  */
2128
  function validateDate($date = null)
2133
 
2134
  if (!isset($date)) {
2135
  $date = class_exists('DateTime') ?
2136
+ new DateTime(null, new DateTimeZone(@date_default_timezone_get())) :
2137
  time();
2138
  }
2139
 
2143
  $notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter'];
2144
  $notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime'];
2145
 
2146
+ switch (true) {
2147
+ case is_string($date) && class_exists('DateTime'):
2148
+ $date = new DateTime($date, new DateTimeZone(@date_default_timezone_get()));
2149
+ case is_object($date) && strtolower(get_class($date)) == 'datetime':
2150
+ $notBefore = new DateTime($notBefore, new DateTimeZone(@date_default_timezone_get()));
2151
+ $notAfter = new DateTime($notAfter, new DateTimeZone(@date_default_timezone_get()));
2152
+ break;
2153
+ case is_string($date):
2154
+ $date = @strtotime($date);
2155
+ default:
2156
+ $notBefore = @strtotime($notBefore);
2157
+ $notAfter = @strtotime($notAfter);
2158
  }
2159
 
2160
  switch (true) {
vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php CHANGED
@@ -65,7 +65,6 @@
65
  * @author Jim Wigginton <terrafrost@php.net>
66
  * @copyright 2006 Jim Wigginton
67
  * @license http://www.opensource.org/licenses/mit-license.html MIT License
68
- * @link http://pear.php.net/package/Math_BigInteger
69
  */
70
 
71
  /**#@+
65
  * @author Jim Wigginton <terrafrost@php.net>
66
  * @copyright 2006 Jim Wigginton
67
  * @license http://www.opensource.org/licenses/mit-license.html MIT License
 
68
  */
69
 
70
  /**#@+
vendor/phpseclib/phpseclib/phpseclib/Net/SFTP.php CHANGED
@@ -919,7 +919,17 @@ class Net_SFTP extends Net_SSH2
919
  unset($files[$key]);
920
  continue;
921
  }
922
- if ($key != '.' && $key != '..' && is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $key)))) {
 
 
 
 
 
 
 
 
 
 
923
  $depth++;
924
  $files[$key] = $this->rawlist($dir . '/' . $key, true);
925
  $depth--;
919
  unset($files[$key]);
920
  continue;
921
  }
922
+ $is_directory = false;
923
+ if ($key != '.' && $key != '..') {
924
+ if ($this->use_stat_cache) {
925
+ $is_directory = is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $key)));
926
+ } else {
927
+ $stat = $this->lstat($dir . '/' . $key);
928
+ $is_directory = $stat && $stat['type'] === NET_SFTP_TYPE_DIRECTORY;
929
+ }
930
+ }
931
+
932
+ if ($is_directory) {
933
  $depth++;
934
  $files[$key] = $this->rawlist($dir . '/' . $key, true);
935
  $depth--;
vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php CHANGED
@@ -96,10 +96,11 @@ define('NET_SSH2_MASK_WINDOW_ADJUST', 0x00000020);
96
  * @see self::_get_channel_packet()
97
  * @access private
98
  */
99
- define('NET_SSH2_CHANNEL_EXEC', 1); // PuTTy uses 0x100
100
- define('NET_SSH2_CHANNEL_SHELL', 2);
101
- define('NET_SSH2_CHANNEL_SUBSYSTEM', 3);
102
  define('NET_SSH2_CHANNEL_AGENT_FORWARD', 4);
 
103
  /**#@-*/
104
 
105
  /**#@+
@@ -923,6 +924,22 @@ class Net_SSH2
923
  */
924
  var $binary_packet_buffer = false;
925
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
926
  /**
927
  * Default Constructor.
928
  *
@@ -1159,11 +1176,12 @@ class Net_SSH2
1159
  }
1160
  $elapsed = strtok(microtime(), ' ') + strtok('') - $start;
1161
 
1162
- $this->curTimeout-= $elapsed;
1163
-
1164
- if ($this->curTimeout <= 0) {
1165
- $this->is_timeout = true;
1166
- return false;
 
1167
  }
1168
  }
1169
 
@@ -1212,6 +1230,7 @@ class Net_SSH2
1212
  }
1213
 
1214
  if (feof($this->fsock)) {
 
1215
  user_error('Connection closed by server');
1216
  return false;
1217
  }
@@ -1223,7 +1242,7 @@ class Net_SSH2
1223
 
1224
  $this->server_identifier = trim($temp, "\r\n");
1225
  if (strlen($extra)) {
1226
- $this->errors[] = utf8_decode($extra);
1227
  }
1228
 
1229
  if (version_compare($matches[1], '1.99', '<')) {
@@ -1238,6 +1257,7 @@ class Net_SSH2
1238
  if (!$this->send_kex_first) {
1239
  $response = $this->_get_binary_packet();
1240
  if ($response === false) {
 
1241
  user_error('Connection closed by server');
1242
  return false;
1243
  }
@@ -1309,6 +1329,8 @@ class Net_SSH2
1309
  );
1310
 
1311
  static $server_host_key_algorithms = array(
 
 
1312
  'ssh-rsa', // RECOMMENDED sign Raw RSA Key
1313
  'ssh-dss' // REQUIRED sign Raw DSS Key
1314
  );
@@ -1468,6 +1490,7 @@ class Net_SSH2
1468
 
1469
  $kexinit_payload_server = $this->_get_binary_packet();
1470
  if ($kexinit_payload_server === false) {
 
1471
  user_error('Connection closed by server');
1472
  return false;
1473
  }
@@ -1595,6 +1618,7 @@ class Net_SSH2
1595
 
1596
  $response = $this->_get_binary_packet();
1597
  if ($response === false) {
 
1598
  user_error('Connection closed by server');
1599
  return false;
1600
  }
@@ -1690,12 +1714,14 @@ class Net_SSH2
1690
  $data = pack('CNa*', $clientKexInitMessage, strlen($eBytes), $eBytes);
1691
 
1692
  if (!$this->_send_binary_packet($data)) {
 
1693
  user_error('Connection closed by server');
1694
  return false;
1695
  }
1696
 
1697
  $response = $this->_get_binary_packet();
1698
  if ($response === false) {
 
1699
  user_error('Connection closed by server');
1700
  return false;
1701
  }
@@ -1776,9 +1802,25 @@ class Net_SSH2
1776
  return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
1777
  }
1778
 
1779
- if ($public_key_format != $server_host_key_algorithm || $this->signature_format != $server_host_key_algorithm) {
1780
- user_error('Server Host Key Algorithm Mismatch');
1781
- return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1782
  }
1783
 
1784
  $packet = pack(
@@ -1793,6 +1835,7 @@ class Net_SSH2
1793
  $response = $this->_get_binary_packet();
1794
 
1795
  if ($response === false) {
 
1796
  user_error('Connection closed by server');
1797
  return false;
1798
  }
@@ -1967,7 +2010,7 @@ class Net_SSH2
1967
 
1968
  if ($this->encrypt) {
1969
  if ($this->crypto_engine) {
1970
- $this->encrypt->setEngine($this->crypto_engine);
1971
  }
1972
  $this->encrypt->enableContinuousBuffer();
1973
  $this->encrypt->disablePadding();
@@ -1987,7 +2030,7 @@ class Net_SSH2
1987
 
1988
  if ($this->decrypt) {
1989
  if ($this->crypto_engine) {
1990
- $this->decrypt->setEngine($this->crypto_engine);
1991
  }
1992
  $this->decrypt->enableContinuousBuffer();
1993
  $this->decrypt->disablePadding();
@@ -2191,6 +2234,7 @@ class Net_SSH2
2191
  function login($username)
2192
  {
2193
  $args = func_get_args();
 
2194
  return call_user_func_array(array(&$this, '_login'), $args);
2195
  }
2196
 
@@ -2262,6 +2306,7 @@ class Net_SSH2
2262
  }
2263
  return $this->_login_helper($username, $password);
2264
  }
 
2265
  user_error('Connection closed by server');
2266
  return false;
2267
  }
@@ -2318,6 +2363,7 @@ class Net_SSH2
2318
 
2319
  $response = $this->_get_binary_packet();
2320
  if ($response === false) {
 
2321
  user_error('Connection closed by server');
2322
  return false;
2323
  }
@@ -2376,6 +2422,7 @@ class Net_SSH2
2376
 
2377
  $response = $this->_get_binary_packet();
2378
  if ($response === false) {
 
2379
  user_error('Connection closed by server');
2380
  return false;
2381
  }
@@ -2394,7 +2441,7 @@ class Net_SSH2
2394
  return false;
2395
  }
2396
  extract(unpack('Nlength', $this->_string_shift($response, 4)));
2397
- $this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . utf8_decode($this->_string_shift($response, $length));
2398
  return $this->_disconnect(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER);
2399
  case NET_SSH2_MSG_USERAUTH_FAILURE:
2400
  // can we use keyboard-interactive authentication? if not then either the login is bad or the server employees
@@ -2476,6 +2523,7 @@ class Net_SSH2
2476
  } else {
2477
  $orig = $response = $this->_get_binary_packet();
2478
  if ($response === false) {
 
2479
  user_error('Connection closed by server');
2480
  return false;
2481
  }
@@ -2645,6 +2693,21 @@ class Net_SSH2
2645
  $publickey['n']
2646
  );
2647
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2648
  $part1 = pack(
2649
  'CNa*Na*Na*',
2650
  NET_SSH2_MSG_USERAUTH_REQUEST,
@@ -2655,7 +2718,7 @@ class Net_SSH2
2655
  strlen('publickey'),
2656
  'publickey'
2657
  );
2658
- $part2 = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publickey), $publickey);
2659
 
2660
  $packet = $part1 . chr(0) . $part2;
2661
  if (!$this->_send_binary_packet($packet)) {
@@ -2664,6 +2727,7 @@ class Net_SSH2
2664
 
2665
  $response = $this->_get_binary_packet();
2666
  if ($response === false) {
 
2667
  user_error('Connection closed by server');
2668
  return false;
2669
  }
@@ -2695,8 +2759,9 @@ class Net_SSH2
2695
 
2696
  $packet = $part1 . chr(1) . $part2;
2697
  $privatekey->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
 
2698
  $signature = $privatekey->sign(pack('Na*a*', strlen($this->session_id), $this->session_id, $packet));
2699
- $signature = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($signature), $signature);
2700
  $packet.= pack('Na*', strlen($signature), $signature);
2701
 
2702
  if (!$this->_send_binary_packet($packet)) {
@@ -2705,6 +2770,7 @@ class Net_SSH2
2705
 
2706
  $response = $this->_get_binary_packet();
2707
  if ($response === false) {
 
2708
  user_error('Connection closed by server');
2709
  return false;
2710
  }
@@ -2831,6 +2897,7 @@ class Net_SSH2
2831
 
2832
  $response = $this->_get_binary_packet();
2833
  if ($response === false) {
 
2834
  user_error('Connection closed by server');
2835
  return false;
2836
  }
@@ -2971,6 +3038,7 @@ class Net_SSH2
2971
 
2972
  $response = $this->_get_binary_packet();
2973
  if ($response === false) {
 
2974
  user_error('Connection closed by server');
2975
  return false;
2976
  }
@@ -3285,6 +3353,66 @@ class Net_SSH2
3285
  return (bool) ($this->bitmap & NET_SSH2_MASK_LOGIN);
3286
  }
3287
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3288
  /**
3289
  * Resets a connection for re-use
3290
  *
@@ -3315,8 +3443,8 @@ class Net_SSH2
3315
  function _get_binary_packet($skip_channel_filter = false)
3316
  {
3317
  if (!is_resource($this->fsock) || feof($this->fsock)) {
3318
- user_error('Connection closed prematurely');
3319
  $this->bitmap = 0;
 
3320
  return false;
3321
  }
3322
 
@@ -3359,8 +3487,8 @@ class Net_SSH2
3359
  while ($remaining_length > 0) {
3360
  $temp = fread($this->fsock, $remaining_length);
3361
  if ($temp === false || feof($this->fsock)) {
3362
- user_error('Error reading from socket');
3363
  $this->bitmap = 0;
 
3364
  return false;
3365
  }
3366
  $buffer.= $temp;
@@ -3378,8 +3506,8 @@ class Net_SSH2
3378
  if ($this->hmac_check !== false) {
3379
  $hmac = fread($this->fsock, $this->hmac_size);
3380
  if ($hmac === false || strlen($hmac) != $this->hmac_size) {
3381
- user_error('Error reading socket');
3382
  $this->bitmap = 0;
 
3383
  return false;
3384
  } elseif ($hmac != $this->hmac_check->hash(pack('NNCa*', $this->get_seq_no, $packet_length, $padding_length, $payload . $padding))) {
3385
  user_error('Invalid HMAC');
@@ -3423,7 +3551,7 @@ class Net_SSH2
3423
  return false;
3424
  }
3425
  extract(unpack('Nreason_code/Nlength', $this->_string_shift($payload, 8)));
3426
- $this->errors[] = 'SSH_MSG_DISCONNECT: ' . $this->disconnect_reasons[$reason_code] . "\r\n" . utf8_decode($this->_string_shift($payload, $length));
3427
  $this->bitmap = 0;
3428
  return false;
3429
  case NET_SSH2_MSG_IGNORE:
@@ -3435,7 +3563,7 @@ class Net_SSH2
3435
  return false;
3436
  }
3437
  extract(unpack('Nlength', $this->_string_shift($payload, 4)));
3438
- $this->errors[] = 'SSH_MSG_DEBUG: ' . utf8_decode($this->_string_shift($payload, $length));
3439
  $payload = $this->_get_binary_packet($skip_channel_filter);
3440
  break;
3441
  case NET_SSH2_MSG_UNIMPLEMENTED:
@@ -3458,7 +3586,7 @@ class Net_SSH2
3458
  return false;
3459
  }
3460
  extract(unpack('Nlength', $this->_string_shift($payload, 4)));
3461
- $this->banner_message = utf8_decode($this->_string_shift($payload, $length));
3462
  $payload = $this->_get_binary_packet();
3463
  }
3464
 
@@ -3664,7 +3792,12 @@ class Net_SSH2
3664
  $response = $this->binary_packet_buffer;
3665
  $this->binary_packet_buffer = false;
3666
  } else {
3667
- if ($this->curTimeout) {
 
 
 
 
 
3668
  if ($this->curTimeout < 0) {
3669
  $this->is_timeout = true;
3670
  return true;
@@ -3687,6 +3820,7 @@ class Net_SSH2
3687
 
3688
  $response = $this->_get_binary_packet(true);
3689
  if ($response === false) {
 
3690
  user_error('Connection closed by server');
3691
  return false;
3692
  }
@@ -3695,10 +3829,6 @@ class Net_SSH2
3695
  if ($client_channel == -1 && $response === true) {
3696
  return true;
3697
  }
3698
- if (!strlen($response)) {
3699
- return '';
3700
- }
3701
-
3702
  if (!strlen($response)) {
3703
  return false;
3704
  }
@@ -3921,8 +4051,8 @@ class Net_SSH2
3921
  function _send_binary_packet($data, $logged = null)
3922
  {
3923
  if (!is_resource($this->fsock) || feof($this->fsock)) {
3924
- user_error('Connection closed prematurely');
3925
  $this->bitmap = 0;
 
3926
  return false;
3927
  }
3928
 
@@ -4583,6 +4713,8 @@ class Net_SSH2
4583
 
4584
  break;
4585
  case 'ssh-rsa':
 
 
4586
  if (strlen($server_public_host_key) < 4) {
4587
  return false;
4588
  }
@@ -4609,6 +4741,18 @@ class Net_SSH2
4609
  }
4610
 
4611
  $rsa = new Crypt_RSA();
 
 
 
 
 
 
 
 
 
 
 
 
4612
  $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
4613
  $rsa->loadKey(array('e' => $e, 'n' => $n), CRYPT_RSA_PUBLIC_FORMAT_RAW);
4614
  if (!$rsa->verify($this->exchange_hash, $signature)) {
@@ -4637,7 +4781,30 @@ class Net_SSH2
4637
  $s = $s->modPow($e, $n);
4638
  $s = $s->toBytes();
4639
 
4640
- $h = pack('N4H*', 0x00302130, 0x0906052B, 0x0E03021A, 0x05000414, sha1($this->exchange_hash));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4641
  $h = chr(0x01) . str_repeat(chr(0xFF), $nLength - 2 - strlen($h)) . $h;
4642
 
4643
  if ($s != $h) {
96
  * @see self::_get_channel_packet()
97
  * @access private
98
  */
99
+ define('NET_SSH2_CHANNEL_EXEC', 1); // PuTTy uses 0x100
100
+ define('NET_SSH2_CHANNEL_SHELL', 2);
101
+ define('NET_SSH2_CHANNEL_SUBSYSTEM', 3);
102
  define('NET_SSH2_CHANNEL_AGENT_FORWARD', 4);
103
+ define('NET_SSH2_CHANNEL_KEEP_ALIVE', 5);
104
  /**#@-*/
105
 
106
  /**#@+
924
  */
925
  var $binary_packet_buffer = false;
926
 
927
+ /**
928
+ * Preferred Signature Format
929
+ *
930
+ * @var string|false
931
+ * @access private
932
+ */
933
+ var $preferred_signature_format = false;
934
+
935
+ /**
936
+ * Authentication Credentials
937
+ *
938
+ * @var array
939
+ * @access private
940
+ */
941
+ var $auth = array();
942
+
943
  /**
944
  * Default Constructor.
945
  *
1176
  }
1177
  $elapsed = strtok(microtime(), ' ') + strtok('') - $start;
1178
 
1179
+ if ($this->curTimeout) {
1180
+ $this->curTimeout-= $elapsed;
1181
+ if ($this->curTimeout < 0) {
1182
+ $this->is_timeout = true;
1183
+ return false;
1184
+ }
1185
  }
1186
  }
1187
 
1230
  }
1231
 
1232
  if (feof($this->fsock)) {
1233
+ $this->bitmap = 0;
1234
  user_error('Connection closed by server');
1235
  return false;
1236
  }
1242
 
1243
  $this->server_identifier = trim($temp, "\r\n");
1244
  if (strlen($extra)) {
1245
+ $this->errors[] = $extra;
1246
  }
1247
 
1248
  if (version_compare($matches[1], '1.99', '<')) {
1257
  if (!$this->send_kex_first) {
1258
  $response = $this->_get_binary_packet();
1259
  if ($response === false) {
1260
+ $this->bitmap = 0;
1261
  user_error('Connection closed by server');
1262
  return false;
1263
  }
1329
  );
1330
 
1331
  static $server_host_key_algorithms = array(
1332
+ 'rsa-sha2-256', // RFC 8332
1333
+ 'rsa-sha2-512', // RFC 8332
1334
  'ssh-rsa', // RECOMMENDED sign Raw RSA Key
1335
  'ssh-dss' // REQUIRED sign Raw DSS Key
1336
  );
1490
 
1491
  $kexinit_payload_server = $this->_get_binary_packet();
1492
  if ($kexinit_payload_server === false) {
1493
+ $this->bitmap = 0;
1494
  user_error('Connection closed by server');
1495
  return false;
1496
  }
1618
 
1619
  $response = $this->_get_binary_packet();
1620
  if ($response === false) {
1621
+ $this->bitmap = 0;
1622
  user_error('Connection closed by server');
1623
  return false;
1624
  }
1714
  $data = pack('CNa*', $clientKexInitMessage, strlen($eBytes), $eBytes);
1715
 
1716
  if (!$this->_send_binary_packet($data)) {
1717
+ $this->bitmap = 0;
1718
  user_error('Connection closed by server');
1719
  return false;
1720
  }
1721
 
1722
  $response = $this->_get_binary_packet();
1723
  if ($response === false) {
1724
+ $this->bitmap = 0;
1725
  user_error('Connection closed by server');
1726
  return false;
1727
  }
1802
  return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
1803
  }
1804
 
1805
+ switch ($server_host_key_algorithm) {
1806
+ case 'ssh-dss':
1807
+ $expected_key_format = 'ssh-dss';
1808
+ break;
1809
+ //case 'rsa-sha2-256':
1810
+ //case 'rsa-sha2-512':
1811
+ //case 'ssh-rsa':
1812
+ default:
1813
+ $expected_key_format = 'ssh-rsa';
1814
+ }
1815
+
1816
+ if ($public_key_format != $expected_key_format || $this->signature_format != $server_host_key_algorithm) {
1817
+ switch (true) {
1818
+ case $this->signature_format == $server_host_key_algorithm:
1819
+ case $server_host_key_algorithm != 'rsa-sha2-256' && $server_host_key_algorithm != 'rsa-sha2-512':
1820
+ case $this->signature_format != 'ssh-rsa':
1821
+ user_error('Server Host Key Algorithm Mismatch');
1822
+ return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
1823
+ }
1824
  }
1825
 
1826
  $packet = pack(
1835
  $response = $this->_get_binary_packet();
1836
 
1837
  if ($response === false) {
1838
+ $this->bitmap = 0;
1839
  user_error('Connection closed by server');
1840
  return false;
1841
  }
2010
 
2011
  if ($this->encrypt) {
2012
  if ($this->crypto_engine) {
2013
+ $this->encrypt->setPreferredEngine($this->crypto_engine);
2014
  }
2015
  $this->encrypt->enableContinuousBuffer();
2016
  $this->encrypt->disablePadding();
2030
 
2031
  if ($this->decrypt) {
2032
  if ($this->crypto_engine) {
2033
+ $this->decrypt->setPreferredEngine($this->crypto_engine);
2034
  }
2035
  $this->decrypt->enableContinuousBuffer();
2036
  $this->decrypt->disablePadding();
2234
  function login($username)
2235
  {
2236
  $args = func_get_args();
2237
+ $this->auth[] = $args;
2238
  return call_user_func_array(array(&$this, '_login'), $args);
2239
  }
2240
 
2306
  }
2307
  return $this->_login_helper($username, $password);
2308
  }
2309
+ $this->bitmap = 0;
2310
  user_error('Connection closed by server');
2311
  return false;
2312
  }
2363
 
2364
  $response = $this->_get_binary_packet();
2365
  if ($response === false) {
2366
+ $this->bitmap = 0;
2367
  user_error('Connection closed by server');
2368
  return false;
2369
  }
2422
 
2423
  $response = $this->_get_binary_packet();
2424
  if ($response === false) {
2425
+ $this->bitmap = 0;
2426
  user_error('Connection closed by server');
2427
  return false;
2428
  }
2441
  return false;
2442
  }
2443
  extract(unpack('Nlength', $this->_string_shift($response, 4)));
2444
+ $this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . $this->_string_shift($response, $length);
2445
  return $this->_disconnect(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER);
2446
  case NET_SSH2_MSG_USERAUTH_FAILURE:
2447
  // can we use keyboard-interactive authentication? if not then either the login is bad or the server employees
2523
  } else {
2524
  $orig = $response = $this->_get_binary_packet();
2525
  if ($response === false) {
2526
+ $this->bitmap = 0;
2527
  user_error('Connection closed by server');
2528
  return false;
2529
  }
2693
  $publickey['n']
2694
  );
2695
 
2696
+ switch ($this->signature_format) {
2697
+ case 'rsa-sha2-512':
2698
+ $hash = 'sha512';
2699
+ $signatureType = 'rsa-sha2-512';
2700
+ break;
2701
+ case 'rsa-sha2-256':
2702
+ $hash = 'sha256';
2703
+ $signatureType = 'rsa-sha2-256';
2704
+ break;
2705
+ //case 'ssh-rsa':
2706
+ default:
2707
+ $hash = 'sha1';
2708
+ $signatureType = 'ssh-rsa';
2709
+ }
2710
+
2711
  $part1 = pack(
2712
  'CNa*Na*Na*',
2713
  NET_SSH2_MSG_USERAUTH_REQUEST,
2718
  strlen('publickey'),
2719
  'publickey'
2720
  );
2721
+ $part2 = pack('Na*Na*', strlen($signatureType), $signatureType, strlen($publickey), $publickey);
2722
 
2723
  $packet = $part1 . chr(0) . $part2;
2724
  if (!$this->_send_binary_packet($packet)) {
2727
 
2728
  $response = $this->_get_binary_packet();
2729
  if ($response === false) {
2730
+ $this->bitmap = 0;
2731
  user_error('Connection closed by server');
2732
  return false;
2733
  }
2759
 
2760
  $packet = $part1 . chr(1) . $part2;
2761
  $privatekey->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
2762
+ $privatekey->setHash($hash);
2763
  $signature = $privatekey->sign(pack('Na*a*', strlen($this->session_id), $this->session_id, $packet));
2764
+ $signature = pack('Na*Na*', strlen($signatureType), $signatureType, strlen($signature), $signature);
2765
  $packet.= pack('Na*', strlen($signature), $signature);
2766
 
2767
  if (!$this->_send_binary_packet($packet)) {
2770
 
2771
  $response = $this->_get_binary_packet();
2772
  if ($response === false) {
2773
+ $this->bitmap = 0;
2774
  user_error('Connection closed by server');
2775
  return false;
2776
  }
2897
 
2898
  $response = $this->_get_binary_packet();
2899
  if ($response === false) {
2900
+ $this->bitmap = 0;
2901
  user_error('Connection closed by server');
2902
  return false;
2903
  }
3038
 
3039
  $response = $this->_get_binary_packet();
3040
  if ($response === false) {
3041
+ $this->bitmap = 0;
3042
  user_error('Connection closed by server');
3043
  return false;
3044
  }
3353
  return (bool) ($this->bitmap & NET_SSH2_MASK_LOGIN);
3354
  }
3355
 
3356
+ /**
3357
+ * Pings a server connection, or tries to reconnect if the connection has gone down
3358
+ *
3359
+ * Inspired by http://php.net/manual/en/mysqli.ping.php
3360
+ *
3361
+ * @return bool
3362
+ * @access public
3363
+ */
3364
+ function ping()
3365
+ {
3366
+ if (!$this->isAuthenticated()) {
3367
+ return false;
3368
+ }
3369
+
3370
+ $this->window_size_server_to_client[NET_SSH2_CHANNEL_KEEP_ALIVE] = $this->window_size;
3371
+ $packet_size = 0x4000;
3372
+ $packet = pack(
3373
+ 'CNa*N3',
3374
+ NET_SSH2_MSG_CHANNEL_OPEN,
3375
+ strlen('session'),
3376
+ 'session',
3377
+ NET_SSH2_CHANNEL_KEEP_ALIVE,
3378
+ $this->window_size_server_to_client[NET_SSH2_CHANNEL_KEEP_ALIVE],
3379
+ $packet_size
3380
+ );
3381
+
3382
+ if (!@$this->_send_binary_packet($packet)) {
3383
+ return $this->_reconnect();
3384
+ }
3385
+
3386
+ $this->channel_status[NET_SSH2_CHANNEL_KEEP_ALIVE] = NET_SSH2_MSG_CHANNEL_OPEN;
3387
+
3388
+ $response = @$this->_get_channel_packet(NET_SSH2_CHANNEL_KEEP_ALIVE);
3389
+ if ($response !== false) {
3390
+ $this->_close_channel(NET_SSH2_CHANNEL_KEEP_ALIVE);
3391
+ return true;
3392
+ }
3393
+
3394
+ return $this->_reconnect();
3395
+ }
3396
+
3397
+ /**
3398
+ * In situ reconnect method
3399
+ *
3400
+ * @return boolean
3401
+ * @access private
3402
+ */
3403
+ function _reconnect()
3404
+ {
3405
+ $this->_reset_connection(NET_SSH2_DISCONNECT_CONNECTION_LOST);
3406
+ $this->retry_connect = true;
3407
+ if (!$this->_connect()) {
3408
+ return false;
3409
+ }
3410
+ foreach ($this->auth as $auth) {
3411
+ $result = call_user_func_array(array(&$this, 'parent::login'), $auth);
3412
+ }
3413
+ return $result;
3414
+ }
3415
+
3416
  /**
3417
  * Resets a connection for re-use
3418
  *
3443
  function _get_binary_packet($skip_channel_filter = false)
3444
  {
3445
  if (!is_resource($this->fsock) || feof($this->fsock)) {
 
3446
  $this->bitmap = 0;
3447
+ user_error('Connection closed prematurely');
3448
  return false;
3449
  }
3450
 
3487
  while ($remaining_length > 0) {
3488
  $temp = fread($this->fsock, $remaining_length);
3489
  if ($temp === false || feof($this->fsock)) {
 
3490
  $this->bitmap = 0;
3491
+ user_error('Error reading from socket');
3492
  return false;
3493
  }
3494
  $buffer.= $temp;
3506
  if ($this->hmac_check !== false) {
3507
  $hmac = fread($this->fsock, $this->hmac_size);
3508
  if ($hmac === false || strlen($hmac) != $this->hmac_size) {
 
3509
  $this->bitmap = 0;
3510
+ user_error('Error reading socket');
3511
  return false;
3512
  } elseif ($hmac != $this->hmac_check->hash(pack('NNCa*', $this->get_seq_no, $packet_length, $padding_length, $payload . $padding))) {
3513
  user_error('Invalid HMAC');
3551
  return false;
3552
  }
3553
  extract(unpack('Nreason_code/Nlength', $this->_string_shift($payload, 8)));
3554
+ $this->errors[] = 'SSH_MSG_DISCONNECT: ' . $this->disconnect_reasons[$reason_code] . "\r\n" . $this->_string_shift($payload, $length);
3555
  $this->bitmap = 0;
3556
  return false;
3557
  case NET_SSH2_MSG_IGNORE:
3563
  return false;
3564
  }
3565
  extract(unpack('Nlength', $this->_string_shift($payload, 4)));
3566
+ $this->errors[] = 'SSH_MSG_DEBUG: ' . $this->_string_shift($payload, $length);
3567
  $payload = $this->_get_binary_packet($skip_channel_filter);
3568
  break;
3569
  case NET_SSH2_MSG_UNIMPLEMENTED:
3586
  return false;
3587
  }
3588
  extract(unpack('Nlength', $this->_string_shift($payload, 4)));
3589
+ $this->banner_message = $this->_string_shift($payload, $length);
3590
  $payload = $this->_get_binary_packet();
3591
  }
3592
 
3792
  $response = $this->binary_packet_buffer;
3793
  $this->binary_packet_buffer = false;
3794
  } else {
3795
+ $read = array($this->fsock);
3796
+ $write = $except = null;
3797
+
3798
+ if (!$this->curTimeout) {
3799
+ @stream_select($read, $write, $except, null);
3800
+ } else {
3801
  if ($this->curTimeout < 0) {
3802
  $this->is_timeout = true;
3803
  return true;
3820
 
3821
  $response = $this->_get_binary_packet(true);
3822
  if ($response === false) {
3823
+ $this->bitmap = 0;
3824
  user_error('Connection closed by server');
3825
  return false;
3826
  }
3829
  if ($client_channel == -1 && $response === true) {
3830
  return true;
3831
  }
 
 
 
 
3832
  if (!strlen($response)) {
3833
  return false;
3834
  }
4051
  function _send_binary_packet($data, $logged = null)
4052
  {
4053
  if (!is_resource($this->fsock) || feof($this->fsock)) {
 
4054
  $this->bitmap = 0;
4055
+ user_error('Connection closed prematurely');
4056
  return false;
4057
  }
4058
 
4713
 
4714
  break;
4715
  case 'ssh-rsa':
4716
+ case 'rsa-sha2-256':
4717
+ case 'rsa-sha2-512':
4718
  if (strlen($server_public_host_key) < 4) {
4719
  return false;
4720
  }
4741
  }
4742
 
4743
  $rsa = new Crypt_RSA();
4744
+ switch ($this->signature_format) {
4745
+ case 'rsa-sha2-512':
4746
+ $hash = 'sha512';
4747
+ break;
4748
+ case 'rsa-sha2-256':
4749
+ $hash = 'sha256';
4750
+ break;
4751
+ //case 'ssh-rsa':
4752
+ default:
4753
+ $hash = 'sha1';
4754
+ }
4755
+ $rsa->setHash($hash);
4756
  $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
4757
  $rsa->loadKey(array('e' => $e, 'n' => $n), CRYPT_RSA_PUBLIC_FORMAT_RAW);
4758
  if (!$rsa->verify($this->exchange_hash, $signature)) {
4781
  $s = $s->modPow($e, $n);
4782
  $s = $s->toBytes();
4783
 
4784
+ switch ($this->signature_format) {
4785
+ case 'rsa-sha2-512':
4786
+ $hash = 'sha512';
4787
+ break;
4788
+ case 'rsa-sha2-256':
4789
+ $hash = 'sha256';
4790
+ break;
4791
+ //case 'ssh-rsa':
4792
+ default:
4793
+ $hash = 'sha1';
4794
+ }
4795
+ $hashObj = new Crypt_Hash($hash);
4796
+ switch ($this->signature_format) {
4797
+ case 'rsa-sha2-512':
4798
+ $h = pack('N5a*', 0x00305130, 0x0D060960, 0x86480165, 0x03040203, 0x05000440, $hashObj->hash($this->exchange_hash));
4799
+ break;
4800
+ case 'rsa-sha2-256':
4801
+ $h = pack('N5a*', 0x00303130, 0x0D060960, 0x86480165, 0x03040201, 0x05000420, $hashObj->hash($this->exchange_hash));
4802
+ break;
4803
+ //case 'ssh-rsa':
4804
+ default:
4805
+ $hash = 'sha1';
4806
+ $h = pack('N4a*', 0x00302130, 0x0906052B, 0x0E03021A, 0x05000414, $hashObj->hash($this->exchange_hash));
4807
+ }
4808
  $h = chr(0x01) . str_repeat(chr(0xFF), $nLength - 2 - strlen($h)) . $h;
4809
 
4810
  if ($s != $h) {
vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php CHANGED
@@ -64,7 +64,7 @@ define('SYSTEM_SSH_AGENT_FAILURE', 5);
64
  define('SYSTEM_SSH_AGENTC_SIGN_REQUEST', 13);
65
  // the SSH1 response is SSH_AGENT_RSA_RESPONSE (4)
66
  define('SYSTEM_SSH_AGENT_SIGN_RESPONSE', 14);
67
-
68
 
69
  /**@+
70
  * Agent forwarding status
@@ -77,7 +77,17 @@ define('SYSTEM_SSH_AGENT_FORWARD_NONE', 0);
77
  define('SYSTEM_SSH_AGENT_FORWARD_REQUEST', 1);
78
  // forwarding has been request and is active
79
  define('SYSTEM_SSH_AGENT_FORWARD_ACTIVE', 2);
 
80
 
 
 
 
 
 
 
 
 
 
81
  /**#@-*/
82
 
83
  /**
@@ -123,6 +133,16 @@ class System_SSH_Agent_Identity
123
  */
124
  var $fsock;
125
 
 
 
 
 
 
 
 
 
 
 
126
  /**
127
  * Default Constructor.
128
  *
@@ -202,6 +222,31 @@ class System_SSH_Agent_Identity
202
  {
203
  }
204
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
205
  /**
206
  * Create a signature
207
  *
@@ -214,7 +259,7 @@ class System_SSH_Agent_Identity
214
  function sign($message)
215
  {
216
  // the last parameter (currently 0) is for flags and ssh-agent only defines one flag (for ssh-dss): SSH_AGENT_OLD_SIGNATURE
217
- $packet = pack('CNa*Na*N', SYSTEM_SSH_AGENTC_SIGN_REQUEST, strlen($this->key_blob), $this->key_blob, strlen($message), $message, 0);
218
  $packet = pack('Na*', strlen($packet), $packet);
219
  if (strlen($packet) != fputs($this->fsock, $packet)) {
220
  user_error('Connection closed during signing');
@@ -227,9 +272,35 @@ class System_SSH_Agent_Identity
227
  }
228
 
229
  $signature_blob = fread($this->fsock, $length - 1);
230
- // the only other signature format defined - ssh-dss - is the same length as ssh-rsa
231
- // the + 12 is for the other various SSH added length fields
232
- return substr($signature_blob, strlen('ssh-rsa') + 12);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
233
  }
234
  }
235
 
@@ -240,7 +311,7 @@ class System_SSH_Agent_Identity
240
  *
241
  * @package System_SSH_Agent
242
  * @author Jim Wigginton <terrafrost@php.net>
243
- * @access internal
244
  */
245
  class System_SSH_Agent
246
  {
@@ -281,18 +352,20 @@ class System_SSH_Agent
281
  * @return System_SSH_Agent
282
  * @access public
283
  */
284
- function __construct()
285
  {
286
- switch (true) {
287
- case isset($_SERVER['SSH_AUTH_SOCK']):
288
- $address = $_SERVER['SSH_AUTH_SOCK'];
289
- break;
290
- case isset($_ENV['SSH_AUTH_SOCK']):
291
- $address = $_ENV['SSH_AUTH_SOCK'];
292
- break;
293
- default:
294
- user_error('SSH_AUTH_SOCK not found');
295
- return false;
 
 
296
  }
297
 
298
  $this->fsock = fsockopen('unix://' . $address, 0, $errno, $errstr);
@@ -307,9 +380,9 @@ class System_SSH_Agent
307
  * @see self::__construct()
308
  * @access public
309
  */
310
- function System_SSH_Agent()
311
  {
312
- $this->__construct();
313
  }
314
 
315
  /**
@@ -330,12 +403,14 @@ class System_SSH_Agent
330
  $packet = pack('NC', 1, SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES);
331
  if (strlen($packet) != fputs($this->fsock, $packet)) {
332
  user_error('Connection closed while requesting identities');
 
333
  }
334
 
335
  $length = current(unpack('N', fread($this->fsock, 4)));
336
  $type = ord(fread($this->fsock, 1));
337
  if ($type != SYSTEM_SSH_AGENT_IDENTITIES_ANSWER) {
338
  user_error('Unable to request identities');
 
339
  }
340
 
341
  $identities = array();
64
  define('SYSTEM_SSH_AGENTC_SIGN_REQUEST', 13);
65
  // the SSH1 response is SSH_AGENT_RSA_RESPONSE (4)
66
  define('SYSTEM_SSH_AGENT_SIGN_RESPONSE', 14);
67
+ /**#@-*/
68
 
69
  /**@+
70
  * Agent forwarding status
77
  define('SYSTEM_SSH_AGENT_FORWARD_REQUEST', 1);
78
  // forwarding has been request and is active
79
  define('SYSTEM_SSH_AGENT_FORWARD_ACTIVE', 2);
80
+ /**#@-*/
81
 
82
+ /**@+
83
+ * Signature Flags
84
+ *
85
+ * See https://tools.ietf.org/html/draft-miller-ssh-agent-00#section-5.3
86
+ *
87
+ * @access private
88
+ */
89
+ define('SYSTEM_SSH_AGENT_RSA2_256', 2);
90
+ define('SYSTEM_SSH_AGENT_RSA2_512', 4);
91
  /**#@-*/
92
 
93
  /**
133
  */
134
  var $fsock;
135
 
136
+ /**
137
+ * Signature flags
138
+ *
139
+ * @var int
140
+ * @access private
141
+ * @see self::sign()
142
+ * @see self::setHash()
143
+ */
144
+ var $flags = 0;
145
+
146
  /**
147
  * Default Constructor.
148
  *
222
  {
223
  }
224
 
225
+ /**
226
+ * Set Hash
227
+ *
228
+ * ssh-agent doesn't support using hashes for RSA other than SHA1
229
+ *
230
+ * @param string $hash
231
+ * @access public
232
+ */
233
+ function setHash($hash)
234
+ {
235
+ $this->flags = 0;
236
+ switch ($hash) {
237
+ case 'sha1':
238
+ break;
239
+ case 'sha256':
240
+ $this->flags = SYSTEM_SSH_AGENT_RSA2_256;
241
+ break;
242
+ case 'sha512':
243
+ $this->flags = SYSTEM_SSH_AGENT_RSA2_512;
244
+ break;
245
+ default:
246
+ user_error('The only supported hashes for RSA are sha1, sha256 and sha512');
247
+ }
248
+ }
249
+
250
  /**
251
  * Create a signature
252
  *
259
  function sign($message)
260
  {
261
  // the last parameter (currently 0) is for flags and ssh-agent only defines one flag (for ssh-dss): SSH_AGENT_OLD_SIGNATURE
262
+ $packet = pack('CNa*Na*N', SYSTEM_SSH_AGENTC_SIGN_REQUEST, strlen($this->key_blob), $this->key_blob, strlen($message), $message, $this->flags);
263
  $packet = pack('Na*', strlen($packet), $packet);
264
  if (strlen($packet) != fputs($this->fsock, $packet)) {
265
  user_error('Connection closed during signing');
272
  }
273
 
274
  $signature_blob = fread($this->fsock, $length - 1);
275
+ $length = current(unpack('N', $this->_string_shift($signature_blob, 4)));
276
+ if ($length != strlen($signature_blob)) {
277
+ user_error('Malformed signature blob');
278
+ }
279
+ $length = current(unpack('N', $this->_string_shift($signature_blob, 4)));
280
+ if ($length > strlen($signature_blob) + 4) {
281
+ user_error('Malformed signature blob');
282
+ }
283
+ $type = $this->_string_shift($signature_blob, $length);
284
+ $this->_string_shift($signature_blob, 4);
285
+
286
+ return $signature_blob;
287
+ }
288
+
289
+ /**
290
+ * String Shift
291
+ *
292
+ * Inspired by array_shift
293
+ *
294
+ * @param string $string
295
+ * @param int $index
296
+ * @return string
297
+ * @access private
298
+ */
299
+ function _string_shift(&$string, $index = 1)
300
+ {
301
+ $substr = substr($string, 0, $index);
302
+ $string = substr($string, $index);
303
+ return $substr;
304
  }
305
  }
306
 
311
  *
312
  * @package System_SSH_Agent
313
  * @author Jim Wigginton <terrafrost@php.net>
314
+ * @access public
315
  */
316
  class System_SSH_Agent
317
  {
352
  * @return System_SSH_Agent
353
  * @access public
354
  */
355
+ function __construct($address = null)
356
  {
357
+ if (!$address) {
358
+ switch (true) {
359
+ case isset($_SERVER['SSH_AUTH_SOCK']):
360
+ $address = $_SERVER['SSH_AUTH_SOCK'];
361
+ break;
362
+ case isset($_ENV['SSH_AUTH_SOCK']):
363
+ $address = $_ENV['SSH_AUTH_SOCK'];
364
+ break;
365
+ default:
366
+ user_error('SSH_AUTH_SOCK not found');
367
+ return false;
368
+ }
369
  }
370
 
371
  $this->fsock = fsockopen('unix://' . $address, 0, $errno, $errstr);
380
  * @see self::__construct()
381
  * @access public
382
  */
383
+ function System_SSH_Agent($address = null)
384
  {
385
+ $this->__construct($address);
386
  }
387
 
388
  /**
403
  $packet = pack('NC', 1, SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES);
404
  if (strlen($packet) != fputs($this->fsock, $packet)) {
405
  user_error('Connection closed while requesting identities');
406
+ return array();
407
  }
408
 
409
  $length = current(unpack('N', fread($this->fsock, 4)));
410
  $type = ord(fread($this->fsock, 1));
411
  if ($type != SYSTEM_SSH_AGENT_IDENTITIES_ANSWER) {
412
  user_error('Unable to request identities');
413
+ return array();
414
  }
415
 
416
  $identities = array();
vendor/phpseclib/phpseclib/tests/Functional/Net/SFTPUserStoryTest.php CHANGED
@@ -722,5 +722,31 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
722
  $sftp->exec('ping google.com -c 5');
723
  sleep(5);
724
  $sftp->nlist();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
725
  }
726
  }
722
  $sftp->exec('ping google.com -c 5');
723
  sleep(5);
724
  $sftp->nlist();
725
+
726
+ return $sftp;
727
+ }
728
+
729
+ /**
730
+ * @depends testExecNlist
731
+ */
732
+ public function testRawlistDisabledStatCache($sftp)
733
+ {
734
+ $this->assertTrue($sftp->mkdir(self::$scratchDir));
735
+ $this->assertTrue($sftp->chdir(self::$scratchDir));
736
+ $this->assertTrue($sftp->put('text.txt', 'zzzzz'));
737
+ $this->assertTrue($sftp->mkdir('subdir'));
738
+ $this->assertTrue($sftp->chdir('subdir'));
739
+ $this->assertTrue($sftp->put('leaf.txt', 'yyyyy'));
740
+ $this->assertTrue($sftp->chdir('../../'));
741
+
742
+ $list_cache_enabled = $sftp->rawlist('.', true);
743
+
744
+ $sftp->clearStatCache();
745
+
746
+ $sftp->disableStatCache();
747
+
748
+ $list_cache_disabled = $sftp->rawlist('.', true);
749
+
750
+ $this->assertEquals($list_cache_enabled, $list_cache_disabled, 'The files should be the same regardless of stat cache', 0.0, 10, true);
751
  }
752
  }
vendor/phpseclib/phpseclib/tests/Unit/File/ASN1Test.php CHANGED
@@ -331,4 +331,14 @@ class Unit_File_ASN1Test extends PhpseclibTestCase
331
 
332
  $this->assertSame($data, $arr);
333
  }
 
 
 
 
 
 
 
 
 
 
334
  }
331
 
332
  $this->assertSame($data, $arr);
333
  }
334
+
335
+ /**
336
+ * @group github1296
337
+ */
338
+ public function testInvalidCertificate()
339
+ {
340
+ $data = 'a' . base64_decode('MD6gJQYKKwYBBAGCNxQCA6AXDBVvZmZpY2VAY2VydGRpZ2l0YWwucm+BFW9mZmljZUBjZXJ0ZGlnaXRhbC5ybw==');
341
+ $asn1 = new File_ASN1();
342
+ $asn1->decodeBER($data);
343
+ }
344
  }
vendor/phpseclib/phpseclib/tests/Unit/File/X509/X509Test.php CHANGED
@@ -645,4 +645,31 @@ M0qaEPsM2o3CSTfxSJQQIyEe+izV3UQqYSyWkNqCCFPN
645
  $x509->setRecurLimit(5);
646
  $this->assertTrue($x509->validateSignature());
647
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
648
  }
645
  $x509->setRecurLimit(5);
646
  $this->assertTrue($x509->validateSignature());
647
  }
648
+
649
+ public function testValidateDate()
650
+ {
651
+ $x509 = new File_X509();
652
+ $x509->loadX509('-----BEGIN CERTIFICATE-----
653
+ MIIDITCCAoqgAwIBAgIQT52W2WawmStUwpV8tBV9TTANBgkqhkiG9w0BAQUFADBM
654
+ MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg
655
+ THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0xMTEwMjYwMDAwMDBaFw0x
656
+ MzA5MzAyMzU5NTlaMGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh
657
+ MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRcw
658
+ FQYDVQQDFA53d3cuZ29vZ2xlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
659
+ gYEA3rcmQ6aZhc04pxUJuc8PycNVjIjujI0oJyRLKl6g2Bb6YRhLz21ggNM1QDJy
660
+ wI8S2OVOj7my9tkVXlqGMaO6hqpryNlxjMzNJxMenUJdOPanrO/6YvMYgdQkRn8B
661
+ d3zGKokUmbuYOR2oGfs5AER9G5RqeC1prcB6LPrQ2iASmNMCAwEAAaOB5zCB5DAM
662
+ BgNVHRMBAf8EAjAAMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwudGhhd3Rl
663
+ LmNvbS9UaGF3dGVTR0NDQS5jcmwwKAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUF
664
+ BwMCBglghkgBhvhCBAEwcgYIKwYBBQUHAQEEZjBkMCIGCCsGAQUFBzABhhZodHRw
665
+ Oi8vb2NzcC50aGF3dGUuY29tMD4GCCsGAQUFBzAChjJodHRwOi8vd3d3LnRoYXd0
666
+ ZS5jb20vcmVwb3NpdG9yeS9UaGF3dGVfU0dDX0NBLmNydDANBgkqhkiG9w0BAQUF
667
+ AAOBgQAhrNWuyjSJWsKrUtKyNGadeqvu5nzVfsJcKLt0AMkQH0IT/GmKHiSgAgDp
668
+ ulvKGQSy068Bsn5fFNum21K5mvMSf3yinDtvmX3qUA12IxL/92ZzKbeVCq3Yi7Le
669
+ IOkKcGQRCMha8X2e7GmlpdWC1ycenlbN0nbVeSv3JUMcafC4+Q==
670
+ -----END CERTIFICATE-----');
671
+
672
+ $this->assertFalse($x509->validateDate('Nov 22, 2018'));
673
+ $this->assertTrue($x509->validateDate('Nov 22, 2012'));
674
+ }
675
  }