PluginProbe ʕ •ᴥ•ʔ
UpdraftPlus: WP Backup & Migration Plugin / 1.26.4
UpdraftPlus: WP Backup & Migration Plugin v1.26.4
1.26.4 1.26.3 1.9.19 1.9.25 1.9.26 1.9.30 1.9.31 1.9.32 1.9.4 1.9.40 1.9.41 1.9.42 1.9.43 1.9.44 1.9.45 1.9.46 1.9.5 1.9.50 1.9.51 1.9.60 1.9.62 1.9.63 1.9.64 1.11.12 1.4.8 1.11.15 1.4.9 1.11.17 1.5.16 1.11.18 1.5.20 1.11.2 1.5.21 1.11.20 1.5.22 1.11.23 1.5.5 1.11.24 1.5.6 1.11.25 1.5.7 1.11.26 1.5.8 1.11.27 1.5.9 1.11.28 1.6.1 1.11.3 1.6.17 1.11.4 1.6.2 1.11.5 1.6.46 1.11.8 1.7.0 1.11.9 1.7.1 1.12.0 1.7.18 1.12.1 1.7.20 1.12.12 1.7.3 1.12.13 1.7.34 1.12.15 1.7.35 1.12.17 1.7.39 1.12.2 1.7.40 1.12.20 1.7.41 1.12.23 1.8.1 1.12.24 1.8.11 1.12.25 1.8.12 1.12.28 1.8.13 1.12.29 1.8.2 1.12.30 1.8.5 1.12.32 1.8.8 1.12.34 1.9.0 1.12.35 1.9.13 1.12.37 1.9.15 1.12.39 1.9.17 1.12.4 1.12.40 1.12.6 1.13.1 1.13.11 1.13.12 1.13.15 1.13.16 1.13.2 1.13.3 1.13.4 1.13.5 1.13.6 1.13.7 1.13.8 1.13.9 1.14.10 1.14.11 1.14.12 1.14.13 1.14.2 1.14.3 1.14.4 1.14.5 1.14.7 1.14.9 1.15.0 1.15.2 1.15.3 1.15.5 1.15.6 1.15.7 1.16.0 1.16.10 1.16.11 1.16.12 1.16.13 1.16.14 1.16.15 1.16.16 1.16.17 1.16.20 1.16.21 1.16.22 1.16.23 1.16.24 1.16.25 1.16.26 1.16.28 1.16.29 1.16.32 1.16.34 1.16.35 1.16.36 1.16.37 1.16.4 1.16.40 1.16.41 1.16.42 1.16.43 1.16.44 1.16.45 1.16.46 1.16.47 1.16.48 1.16.49 1.16.5 1.16.50 1.16.51 1.16.53 1.16.55 1.16.56 1.16.59 1.16.6 1.16.60 1.16.61 1.16.62 1.16.63 1.16.64 1.16.65 1.16.66 1.16.67 1.16.68 1.16.69 1.16.7 1.16.8 1.16.9 1.2.0 1.2.1 1.2.10 1.2.11 1.2.12 1.2.14 1.2.15 1.2.16 1.2.17 1.2.19 1.2.2 1.2.20 1.2.24 1.2.25 1.2.26 1.2.27 1.2.28 1.2.29 1.2.3 1.2.30 1.2.31 1.2.33 1.2.35 1.2.36 1.2.38 1.2.39 1.2.4 1.2.40 1.2.41 1.2.42 1.2.43 1.2.44 1.2.45 1.2.46 1.2.5 1.2.7 1.2.8 1.2.9 1.22.1 1.22.10 1.22.11 1.22.12 1.22.14 1.22.15 1.22.16 1.22.17 1.22.18 1.22.19 1.22.20 1.22.21 1.22.22 1.22.23 1.22.24 1.22.3 1.22.4 1.22.5 1.22.6 1.22.7 1.22.8 1.22.9 1.23.1 1.23.10 1.23.11 1.23.12 1.23.13 1.23.15 1.23.16 1.23.2 1.23.3 1.23.4 1.23.5 1.23.6 1.23.7 1.23.8 1.23.9 1.24.1 1.24.10 1.24.11 1.24.12 1.24.2 trunk 1.24.3 0.7.4 1.24.4 0.7.7 1.24.5 0.8.28 1.24.6 0.8.29 1.24.7 0.8.30 1.24.8 0.8.31 1.24.9 0.8.32 1.25.1 0.8.33 1.25.2 0.8.36 1.25.3 0.8.37 1.25.5 0.8.50 1.25.6 0.8.51 1.25.7 0.9.1 1.25.8 0.9.10 1.25.9 0.9.11 1.26.1 0.9.12 1.26.2 0.9.2 1.3.10 0.9.20 1.3.12 0.9.21 1.3.14 0.9.22 1.3.15 1.0.10 1.3.17 1.0.11 1.3.18 1.0.12 1.3.19 1.0.15 1.3.2 1.0.16 1.3.20 1.0.18 1.3.22 1.0.20 1.3.23 1.0.3 1.3.24 1.0.4 1.3.25 1.0.5 1.3.3 1.0.6 1.3.4 1.0.7 1.3.6 1.0.8 1.3.7 1.0.9 1.3.8 1.1.0 1.3.9 1.1.10 1.4.0 1.1.11 1.4.10 1.1.12 1.4.11 1.1.13 1.4.12 1.1.14 1.4.13 1.1.15 1.4.14 1.1.16 1.4.15 1.1.17 1.4.2 1.1.2 1.4.27 1.1.3 1.4.28 1.1.5 1.4.29 1.1.6 1.4.30 1.1.8 1.4.4 1.1.9 1.4.48 1.10.1 1.4.5 1.10.3 1.4.6 1.11.1 1.4.7
updraftplus / updraftplus.php
updraftplus Last commit date
central 3 weeks ago css 3 weeks ago images 1 month ago includes 3 weeks ago js 3 weeks ago languages 3 weeks ago methods 3 weeks ago templates 1 month ago vendor 3 weeks ago SECURITY.md 1 year ago admin.php 3 weeks ago backup.php 3 weeks ago changelog-old.txt 2 years ago class-updraftplus.php 3 weeks ago example-decrypt.php 1 month ago index.html 4 years ago options.php 3 weeks ago readme.txt 3 weeks ago restorer.php 3 weeks ago updraftplus.php 3 weeks ago
updraftplus.php
311 lines
1 <?php
2 // @codingStandardsIgnoreStart
3
4 /*
5 Plugin Name: UpdraftPlus - Backup/Restore
6 Plugin URI: https://updraftplus.com
7 Description: Backup and restore: take backups locally, or backup to Amazon S3, Dropbox, Google Drive, Rackspace, (S)FTP, WebDAV & email, on automatic schedules.
8 Author: TeamUpdraft, DavidAnderson
9 Version: 1.26.4
10 Donate link: https://david.dw-perspective.org.uk/donate
11 License: GPLv3 or later
12 Text Domain: updraftplus
13 Domain Path: /languages
14 Author URI: https://updraftplus.com
15 */
16 // @codingStandardsIgnoreEnd
17
18 /*
19 Portions copyright 2011-25 David Anderson
20 Portions copyright 2010 Paul Kehrer
21 Other portions copyright as indicated by authors in the relevant files
22
23 This program is free software; you can redistribute it and/or modify
24 it under the terms of the GNU General Public License as published by
25 the Free Software Foundation; either version 3 of the License, or
26 (at your option) any later version.
27
28 This program is distributed in the hope that it will be useful,
29 but WITHOUT ANY WARRANTY; without even the implied warranty of
30 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
31 GNU General Public License for more details.
32
33 You should have received a copy of the GNU General Public License
34 along with this program; if not, write to the Free Software
35 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
36 */
37
38 if (!defined('ABSPATH')) die('No direct access allowed');
39
40 if ((isset($updraftplus) && is_object($updraftplus) && is_a($updraftplus, 'UpdraftPlus')) || function_exists('updraftplus_modify_cron_schedules')) return; // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable -- There is a possibility that the $updraftplus variable is already defined from previous process.
41
42 define('UPDRAFTPLUS_DIR', dirname(__FILE__));
43 define('UPDRAFTPLUS_URL', plugins_url('', __FILE__));
44 define('UPDRAFTPLUS_PLUGIN_SLUG', plugin_basename(__FILE__));
45 define('UPDRAFT_DEFAULT_OTHERS_EXCLUDE', 'upgrade,cache,updraft,backup*,*backups,mysql.sql,debug.log');
46 define('UPDRAFT_DEFAULT_UPLOADS_EXCLUDE', 'backup*,*backups,backwpup*,wp-clone,snapshots,wp-staging');
47
48 // The following can go in your wp-config.php
49 // Tables whose data can be skipped without significant loss, if (and only if) the attempt to back them up fails (e.g. bwps_log, from WordPress Better Security, is log data; but individual entries can be huge and cause out-of-memory fatal errors on low-resource environments). Comma-separate the table names (without the WordPress table prefix).
50 if (!defined('UPDRAFTPLUS_DATA_OPTIONAL_TABLES')) define('UPDRAFTPLUS_DATA_OPTIONAL_TABLES', 'bwps_log,statpress,slim_stats,redirection_logs,Counterize,Counterize_Referers,Counterize_UserAgents,wbz404_logs,wbz404_redirects,tts_trafficstats,tts_referrer_stats,wponlinebackup_generations,svisitor_stat,simple_feed_stats,itsec_log,relevanssi_log,blc_instances,wysija_email_user_stat,woocommerce_sessions,et_bloom_stats,redirection_404,lbakut_activity_log,stream_meta,wfFileMods,wffilemods,wfBlockedIPLog,wfblockediplog,page_visit_history,strack_st');
51 if (!defined('UPDRAFTPLUS_ZIP_EXECUTABLE')) define('UPDRAFTPLUS_ZIP_EXECUTABLE', "/usr/bin/zip,/bin/zip,/usr/local/bin/zip,/usr/sfw/bin/zip,/usr/xdg4/bin/zip,/opt/bin/zip");
52 if (!defined('UPDRAFTPLUS_MYSQLDUMP_EXECUTABLE')) define('UPDRAFTPLUS_MYSQLDUMP_EXECUTABLE', updraftplus_build_mysqldump_list());
53 // If any individual file size is greater than this, then a warning is given
54 if (!defined('UPDRAFTPLUS_WARN_FILE_SIZE')) define('UPDRAFTPLUS_WARN_FILE_SIZE', 1024*1024*250);
55 // On a test on a Pentium laptop, 100,000 rows needed ~ 1 minute to write out - so 150,000 is around the CPanel default of 90 seconds execution time.
56 if (!defined('UPDRAFTPLUS_WARN_DB_ROWS')) define('UPDRAFTPLUS_WARN_DB_ROWS', 150000);
57
58 // The smallest value (in megabytes) that the "split zip files at" setting is allowed to be set to
59 if (!defined('UPDRAFTPLUS_SPLIT_MIN')) define('UPDRAFTPLUS_SPLIT_MIN', 25);
60
61 // The maximum number of files to batch at one time when writing to the backup archive. You'd only be likely to want to raise (not lower) this.
62 if (!defined('UPDRAFTPLUS_MAXBATCHFILES')) define('UPDRAFTPLUS_MAXBATCHFILES', 1000);
63
64 // If any individual email attachment is greater than this, then a warning is given (and then removed if the email actually succeeds)
65 if (!defined('UPDRAFTPLUS_WARN_EMAIL_SIZE')) define('UPDRAFTPLUS_WARN_EMAIL_SIZE', 20*1048576);
66
67 // Filetypes that should be stored inside the zip without any attempt at further compression. By default, we mark several extensions that refer to filetypes that are already compressed as not needing further compression - which saves time/resources. This option only applies to zip engines that support varying the compression method. Specify in lower-case, and upper-case variants (and for some zip engines, all variants) will automatically be included.
68 if (!defined('UPDRAFTPLUS_ZIP_NOCOMPRESS')) define('UPDRAFTPLUS_ZIP_NOCOMPRESS', '.jpg,.jpeg,.png,.gif,.zip,.gz,.bz2,.xz,.rar,.mp3,.mp4,.mpeg,.avi,.mov');
69
70 // This is passed to set_time_limit() at various points, to try to maximise run-time. (UD resumes if it gets killed, but more in one stretch always helps). The effect of this varies according to the hosting setup - it can't necessarily always be controlled.
71 if (!defined('UPDRAFTPLUS_SET_TIME_LIMIT')) define('UPDRAFTPLUS_SET_TIME_LIMIT', 900);
72
73 // Options to pass to the zip binary (if that method happens to be used). By default, we mark the extensions specified in UPDRAFTPLUS_ZIP_NOCOMPRESS for non-compression via the -n flag
74 if (!defined('UPDRAFTPLUS_BINZIP_OPTS')) {
75 $zip_nocompress = array_map('trim', explode(',', UPDRAFTPLUS_ZIP_NOCOMPRESS));
76 $zip_binzip_opts = '';
77 foreach ($zip_nocompress as $ext) {
78 if (empty($zip_binzip_opts)) {
79 $zip_binzip_opts = "-n $ext:".strtoupper($ext);
80 } else {
81 $zip_binzip_opts .= ':'.$ext.':'.strtoupper($ext);
82 }
83 }
84 define('UPDRAFTPLUS_BINZIP_OPTS', $zip_binzip_opts);
85 }
86
87 /**
88 * A wrapper for (require|include)(_once)? that will first check for existence, and direct the user what to do (since the traditional PHP error messages aren't clear enough for all users)
89 *
90 * @param String $path the file path to check
91 * @param String $method the method to load the file
92 */
93 function updraft_try_include_file($path, $method = 'include') {
94
95 $file_to_include = UPDRAFTPLUS_DIR.'/'.$path;
96
97 if (!file_exists($file_to_include)) {
98 // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped,WordPress.PHP.DevelopmentFunctions.error_log_trigger_error -- Error message to be printed when it is caught.
99 trigger_error(
100 sprintf(
101 /* translators: %s: File along with full path. */
102 __('The expected file %s is missing from your UpdraftPlus installation.', 'updraftplus').' '.
103 __('Most likely, WordPress did not correctly unpack the plugin when installing it.', 'updraftplus').' '.__('You should de-install and then re-install the plugin (your settings and data will be retained).', 'updraftplus'),
104 $file_to_include
105 ),
106 E_USER_WARNING
107 );
108 // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped,WordPress.PHP.DevelopmentFunctions.error_log_trigger_error
109 }
110
111 if ('include' === $method) {
112 include($file_to_include);
113 } elseif ('include_once' === $method) {
114 include_once($file_to_include);
115 } elseif ('require' === $method) {
116 require($file_to_include); // phpcs:ignore PEAR.Files.IncludingFile.UseInclude -- File required intentionally.
117 } else {
118 require_once($file_to_include);
119 }
120
121 }
122
123 // Load add-ons and files that may or may not be present, depending on where the plugin was distributed
124 if (is_file(UPDRAFTPLUS_DIR.'/autoload.php')) updraft_try_include_file('autoload.php', 'require_once');
125
126 /**
127 * Get cron schedules list of our own
128 * DEVELOPER NOTES: Intervals should be presented in chronological order of time because we also use this list for ordering purpose especially when merging WP default intervals to ours
129 *
130 * @return Boolean The list of our own schedules
131 */
132 function updraftplus_list_cron_schedules() {
133 global $wp_current_filter;
134 // To prevent "_load_textdomain_just_in_time was called incorrectly" warning
135 if (((function_exists('doing_action') && !doing_action('after_setup_theme')) || !in_array('after_setup_theme', $wp_current_filter, true)) && !did_action('after_setup_theme')) {
136 $every_particular_hour_label = 'Every %s hours';
137 $every_hour = 'Every hour';
138 } else {
139 /* translators: %s: Number of Hours. */
140 $every_particular_hour_label = __('Every %s hours', 'updraftplus');
141 $every_hour = __('Every hour', 'updraftplus');
142 }
143
144 return array(
145 'everyhour' => array(
146 'interval' => 3600,
147 'display' => apply_filters('updraftplus_cron_schedule_description', $every_hour, 'everyhour'),
148 ),
149 'every2hours' => array(
150 'interval' => 7200,
151 'display' => apply_filters('updraftplus_cron_schedule_description', sprintf($every_particular_hour_label, '2'), 'every2hours'),
152 ),
153 'every4hours' => array(
154 'interval' => 14400,
155 'display' => apply_filters('updraftplus_cron_schedule_description', sprintf($every_particular_hour_label, '4'), 'every4hours'),
156 ),
157 'every8hours' => array(
158 'interval' => 28800,
159 'display' => apply_filters('updraftplus_cron_schedule_description', sprintf($every_particular_hour_label, '8'), 'every8hours'),
160 ),
161 'twicedaily' => array(
162 'interval' => 43200,
163 'display' => apply_filters('updraftplus_cron_schedule_description', sprintf($every_particular_hour_label, '12'), 'twicedaily'),
164 ),
165 // phpcs:disable WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core.
166 'daily' => array(
167 'interval' => 86400,
168 'display' => apply_filters('updraftplus_cron_schedule_description', __('Daily'), 'daily'),
169 ),
170 'weekly' => array(
171 'interval' => 604800,
172 'display' => apply_filters('updraftplus_cron_schedule_description', __('Weekly'), 'weekly'),
173 ),
174 'fortnightly' => array(
175 'interval' => 1209600,
176 'display' => apply_filters('updraftplus_cron_schedule_description', __('Fortnightly'), 'fortnightly'),
177 ),
178 'monthly' => array(
179 'interval' => 2592000,
180 'display' => apply_filters('updraftplus_cron_schedule_description', __('Monthly'), 'monthly'),
181 ),
182 // phpcs:enable
183 );
184 }
185
186 if (!function_exists('updraftplus_modify_cron_schedules')) :
187 /**
188 * wp-cron only has hourly, daily and twicedaily, so we need to add some of our own
189 *
190 * @param array $schedules an array of schedule types
191 * @return array cron schedules which contains schedules of our own
192 */
193 function updraftplus_modify_cron_schedules($schedules) {
194 return array_merge($schedules, updraftplus_list_cron_schedules());
195 }
196 endif;
197 // http://codex.wordpress.org/Plugin_API/Filter_Reference/cron_schedules. Raised priority because some plugins wrongly over-write all prior schedule changes (including BackupBuddy!)
198 add_filter('cron_schedules', 'updraftplus_modify_cron_schedules', 30);
199
200 // The checks here before loading are for performance only - unless one of those conditions is met, then none of the hooks will ever be used
201 if (!is_admin() && (!defined('DOING_CRON') || !DOING_CRON) && (!defined('XMLRPC_REQUEST') || !XMLRPC_REQUEST) && empty($_SERVER['SHELL']) && empty($_POST['udrpc_message']) && empty($_GET['udcentral_action']) && (defined('UPDRAFTPLUS_THIS_IS_CLONE') && '1' != UPDRAFTPLUS_THIS_IS_CLONE) && empty($_GET['uc_auto_login']) && (empty($_SERVER['REQUEST_METHOD']) || 'OPTIONS' != $_SERVER['REQUEST_METHOD']) && (!defined('WP_CLI') || !WP_CLI)) { // phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended -- False positive: nonce verification not required here.
202 // There is no good way to work out if the cron event is likely to be called under the ALTERNATE_WP_CRON system, other than re-running the calculation
203 // If ALTERNATE_WP_CRON is not active (and a few other things), then we are done
204 if (!defined('ALTERNATE_WP_CRON') || !ALTERNATE_WP_CRON || !empty($_POST) || defined('DOING_AJAX') || isset($_GET['doing_wp_cron'])) return; // phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended -- False positive: nonce verification not required here.
205
206 // The check below is the one used by spawn_cron() to decide whether cron events should be run
207 $gmt_time = microtime(true);
208 $lock = get_transient('doing_cron');
209 if ($lock > $gmt_time + 10 * 60) $lock = 0;
210 if ((defined('WP_CRON_LOCK_TIMEOUT') && $lock + WP_CRON_LOCK_TIMEOUT > $gmt_time) || (!defined('WP_CRON_LOCK_TIMEOUT') && $lock + 60 > $gmt_time)) return;
211 if (function_exists('_get_cron_array')) {
212 $crons = _get_cron_array();
213 } else {
214 $crons = get_option('cron');
215 }
216 if (!is_array($crons)) return;
217
218 $keys = array_keys($crons);
219 if (isset($keys[0]) && $keys[0] > $gmt_time) return;
220 // If we got this far, then cron is going to be fired, so we do want to load all our hooks
221 }
222
223 $updraftplus_have_addons = 0;
224 if (is_dir(UPDRAFTPLUS_DIR.'/addons') && $dir_handle = opendir(UPDRAFTPLUS_DIR.'/addons')) {
225 while (false !== ($e = readdir($dir_handle))) {
226 if (is_file(UPDRAFTPLUS_DIR.'/addons/'.$e) && preg_match('/\.php$/', $e)) {
227 // We used to have 1024 bytes here - but this meant that if someone's site was hacked and a lot of code added at the top, and if they were running a too-low PHP version, then they might just see the symptom rather than the cause - and raise the support request with us.
228 $header = file_get_contents(UPDRAFTPLUS_DIR.'/addons/'.$e, false, null, 0, 16384);
229 $phprequires = preg_match("/RequiresPHP: (\d[\d\.]+)/", $header, $matches) ? $matches[1] : false;
230 $phpinclude = preg_match("/IncludePHP: (\S+)/", $header, $matches) ? $matches[1] : false;
231 if (false === $phprequires || version_compare(PHP_VERSION, $phprequires, '>=')) {
232 $updraftplus_have_addons++;
233 if ($phpinclude) updraft_try_include_file(''.$phpinclude, 'include_once');
234 updraft_try_include_file('addons/'.$e, 'include_once');
235 }
236 unset($header);
237 }
238 }
239 @closedir($dir_handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function.
240 }
241
242 if (is_file(UPDRAFTPLUS_DIR.'/udaddons/updraftplus-addons.php')) updraft_try_include_file('udaddons/updraftplus-addons.php', 'require_once');
243
244 if (!file_exists(UPDRAFTPLUS_DIR.'/class-updraftplus.php') || !file_exists(UPDRAFTPLUS_DIR.'/options.php')) {
245 /**
246 * Warn if they've not got the whole plugin - can happen if WP crashes (e.g. out of disk space) when upgrading the plugin
247 */
248 function updraftplus_incomplete_install_warning() {
249 echo '<div class="updraftmessage error"><p><strong>'.esc_html(__('Error', 'updraftplus')).':</strong> '.esc_html(__('You do not have UpdraftPlus completely installed - please de-install and install it again.', 'updraftplus').' '.__('Most likely, WordPress malfunctioned when copying the plugin files.', 'updraftplus')).' <a href="https://updraftplus.com/faqs/wordpress-crashed-when-updating-updraftplus-what-can-i-do/">'.esc_html__('Go here for more information.', 'updraftplus').'</a></p></div>';
250 }
251 add_action('all_admin_notices', 'updraftplus_incomplete_install_warning');
252 } else {
253
254 updraft_try_include_file('class-updraftplus.php', 'include_once');
255 $updraftplus = new UpdraftPlus();
256 $GLOBALS['updraftplus'] = $updraftplus;
257 $updraftplus->have_addons = $updraftplus_have_addons;
258
259 if (!$updraftplus->memory_check(192)) {
260 // Experience appears to show that the memory limit is only likely to be hit (unless it is very low) by single files that are larger than available memory (when compressed)
261 // Add sanity checks - found someone who'd set WP_MAX_MEMORY_LIMIT to 256K !
262 if (!$updraftplus->memory_check($updraftplus->memory_check_current(WP_MAX_MEMORY_LIMIT))) {
263 $new = absint($updraftplus->memory_check_current(WP_MAX_MEMORY_LIMIT));
264 if ($new>32 && $new<100000) {
265 @ini_set('memory_limit', $new.'M');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged,Squiz.PHP.DiscouragedFunctions.Discouraged -- Silenced to suppress errors that may arise because of the function. Safely using discouraged function ini_set().
266 }
267 }
268 }
269
270 // Blocking updates during restore; placed here so that it still runs e.g. under WP-CLI
271 $updraftplus->block_updates_during_restore_progress();
272 }
273
274 // Ubuntu bug - https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1315888
275 if (!function_exists('gzopen') && function_exists('gzopen64')) {
276 function gzopen($filename, $mode, $use_include_path = 0) {
277 return gzopen64($filename, $mode, $use_include_path);
278 }
279 }
280
281 /**
282 * For finding mysqldump. Added to include Windows locations.
283 */
284 function updraftplus_build_mysqldump_list() {
285 if ('win' == strtolower(substr(PHP_OS, 0, 3)) && function_exists('glob')) {
286 $drives = array('C', 'D', 'E');
287
288 if (!empty($_SERVER['DOCUMENT_ROOT'])) {
289 // Get the drive that this is running on
290 $current_drive = strtoupper(substr($_SERVER['DOCUMENT_ROOT'], 0, 1)); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitization not needed as we are extracting only first letter and using it.
291 if (!in_array($current_drive, $drives)) array_unshift($drives, $current_drive);
292 }
293
294 $directories = array();
295
296 foreach ($drives as $drive_letter) {
297 $dir = glob("$drive_letter:\\{Program Files\\MySQL\\{,MySQL*,etc}{,\\bin,\\?},mysqldump}\\mysqldump*", GLOB_BRACE);
298 if (is_array($dir)) $directories = array_merge($directories, $dir);
299 }
300
301 $drive_string = implode(',', $directories);
302 return $drive_string;
303
304 } else {
305 return "/usr/bin/mysqldump,/bin/mysqldump,/usr/local/bin/mysqldump,/usr/sfw/bin/mysqldump,/usr/xdg4/bin/mysqldump,/opt/bin/mysqldump";
306 }
307 }
308
309 // Do this even if the missing files detection above fired, as the "missing files" detection above has a greater chance of showing the user useful info
310 if (!class_exists('UpdraftPlus_Options')) updraft_try_include_file('options.php', 'require_once');
311