PluginProbe ʕ •ᴥ•ʔ
UpdraftPlus: WP Backup & Migration Plugin / 1.16.22
UpdraftPlus: WP Backup & Migration Plugin v1.16.22
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 6 years ago css 6 years ago images 7 years ago includes 6 years ago js 6 years ago languages 6 years ago methods 6 years ago templates 6 years ago vendor 6 years ago admin.php 6 years ago backup.php 6 years ago changelog.txt 7 years ago class-updraftplus.php 6 years ago example-decrypt.php 8 years ago index.html 6 years ago options.php 7 years ago readme.txt 6 years ago restorer.php 6 years ago updraftplus.php 6 years ago
updraftplus.php
219 lines
1 <?php
2 // @codingStandardsIgnoreStart
3 /*
4 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.22
9 Donate link: https://david.dw-perspective.org.uk/donate
10 License: GPLv3 or later
11 Text Domain: updraftplus
12 Domain Path: /languages
13 Author URI: https://updraftplus.com
14 */
15 // @codingStandardsIgnoreEnd
16
17 /*
18 Portions copyright 2011-19 David Anderson
19 Portions copyright 2010 Paul Kehrer
20 Other portions copyright as indicated by authors in the relevant files
21
22 This program is free software; you can redistribute it and/or modify
23 it under the terms of the GNU General Public License as published by
24 the Free Software Foundation; either version 3 of the License, or
25 (at your option) any later version.
26
27 This program is distributed in the hope that it will be useful,
28 but WITHOUT ANY WARRANTY; without even the implied warranty of
29 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 GNU General Public License for more details.
31
32 You should have received a copy of the GNU General Public License
33 along with this program; if not, write to the Free Software
34 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
35 */
36
37 if (!defined('ABSPATH')) die('No direct access allowed');
38
39 if ((isset($updraftplus) && is_object($updraftplus) && is_a($updraftplus, 'UpdraftPlus')) || function_exists('updraftplus_modify_cron_schedules')) return; // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable
40
41 define('UPDRAFTPLUS_DIR', dirname(__FILE__));
42 define('UPDRAFTPLUS_URL', plugins_url('', __FILE__));
43 define('UPDRAFT_DEFAULT_OTHERS_EXCLUDE', 'upgrade,cache,updraft,backup*,*backups,mysql.sql,debug.log');
44 define('UPDRAFT_DEFAULT_UPLOADS_EXCLUDE', 'backup*,*backups,backwpup*,wp-clone,snapshots');
45
46 // The following can go in your wp-config.php
47 // 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).
48 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');
49 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");
50 if (!defined('UPDRAFTPLUS_MYSQLDUMP_EXECUTABLE')) define('UPDRAFTPLUS_MYSQLDUMP_EXECUTABLE', updraftplus_build_mysqldump_list());
51 // If any individual file size is greater than this, then a warning is given
52 if (!defined('UPDRAFTPLUS_WARN_FILE_SIZE')) define('UPDRAFTPLUS_WARN_FILE_SIZE', 1024*1024*250);
53 // 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.
54 if (!defined('UPDRAFTPLUS_WARN_DB_ROWS')) define('UPDRAFTPLUS_WARN_DB_ROWS', 150000);
55
56 // The smallest value (in megabytes) that the "split zip files at" setting is allowed to be set to
57 if (!defined('UPDRAFTPLUS_SPLIT_MIN')) define('UPDRAFTPLUS_SPLIT_MIN', 25);
58
59 // 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.
60 if (!defined('UPDRAFTPLUS_MAXBATCHFILES')) define('UPDRAFTPLUS_MAXBATCHFILES', 500);
61
62 // If any individual email attachment is greater than this, then a warning is given (and then removed if the email actually succeeds)
63 if (!defined('UPDRAFTPLUS_WARN_EMAIL_SIZE')) define('UPDRAFTPLUS_WARN_EMAIL_SIZE', 20*1048576);
64
65 // 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.
66 if (!defined('UPDRAFTPLUS_ZIP_NOCOMPRESS')) define('UPDRAFTPLUS_ZIP_NOCOMPRESS', '.jpg,.jpeg,.png,.gif,.zip,.gz,.bz2,.xz,.rar,.mp3,.mp4,.mpeg,.avi,.mov');
67
68 // 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.
69 if (!defined('UPDRAFTPLUS_SET_TIME_LIMIT')) define('UPDRAFTPLUS_SET_TIME_LIMIT', 900);
70
71 // 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
72 if (!defined('UPDRAFTPLUS_BINZIP_OPTS')) {
73 $zip_nocompress = array_map('trim', explode(',', UPDRAFTPLUS_ZIP_NOCOMPRESS));
74 $zip_binzip_opts = '';
75 foreach ($zip_nocompress as $ext) {
76 if (empty($zip_binzip_opts)) {
77 $zip_binzip_opts = "-n $ext:".strtoupper($ext);
78 } else {
79 $zip_binzip_opts .= ':'.$ext.':'.strtoupper($ext);
80 }
81 }
82 define('UPDRAFTPLUS_BINZIP_OPTS', $zip_binzip_opts);
83 }
84
85 // Load add-ons and files that may or may not be present, depending on where the plugin was distributed
86 if (is_file(UPDRAFTPLUS_DIR.'/autoload.php')) require_once(UPDRAFTPLUS_DIR.'/autoload.php');
87
88 if (!function_exists('updraftplus_modify_cron_schedules')) :
89 /**
90 * wp-cron only has hourly, daily and twicedaily, so we need to add some of our own
91 *
92 * @param array $schedules an array of schedule types
93 * @return array
94 */
95 function updraftplus_modify_cron_schedules($schedules) {
96 $schedules['weekly'] = array('interval' => 604800, 'display' => 'Once Weekly');
97 $schedules['fortnightly'] = array('interval' => 1209600, 'display' => 'Once Each Fortnight');
98 $schedules['monthly'] = array('interval' => 2592000, 'display' => 'Once Monthly');
99 $schedules['everyhour'] = array('interval' => 3600, 'display' => __('Every hour', 'updraftplus'));
100 $schedules['every2hours'] = array('interval' => 7200, 'display' => sprintf(__('Every %s hours', 'updraftplus'), 2));
101 $schedules['every4hours'] = array('interval' => 14400, 'display' => sprintf(__('Every %s hours', 'updraftplus'), 4));
102 $schedules['every8hours'] = array('interval' => 28800, 'display' => sprintf(__('Every %s hours', 'updraftplus'), 8));
103 return $schedules;
104 }
105 endif;
106 // http://codex.wordpress.org/Plugin_API/Filter_Reference/cron_schedules. Raised priority because some plugins wrongly over-write all prior schedule changes (including BackupBuddy!)
107 add_filter('cron_schedules', 'updraftplus_modify_cron_schedules', 30);
108
109 // 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
110 if (!is_admin() && (!defined('DOING_CRON') || !DOING_CRON) && (!defined('XMLRPC_REQUEST') || !XMLRPC_REQUEST) && empty($_SERVER['SHELL']) && empty($_SERVER['USER']) && 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)) {
111 // 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
112 // If ALTERNATE_WP_CRON is not active (and a few other things), then we are done
113 if (!defined('ALTERNATE_WP_CRON') || !ALTERNATE_WP_CRON || !empty($_POST) || defined('DOING_AJAX') || isset($_GET['doing_wp_cron'])) return;
114
115 // The check below is the one used by spawn_cron() to decide whether cron events should be run
116 $gmt_time = microtime(true);
117 $lock = get_transient('doing_cron');
118 if ($lock > $gmt_time + 10 * 60) $lock = 0;
119 if ((defined('WP_CRON_LOCK_TIMEOUT') && $lock + WP_CRON_LOCK_TIMEOUT > $gmt_time) || (!defined('WP_CRON_LOCK_TIMEOUT') && $lock + 60 > $gmt_time)) return;
120 if (function_exists('_get_cron_array')) {
121 $crons = _get_cron_array();
122 } else {
123 $crons = get_option('cron');
124 }
125 if (!is_array($crons)) return;
126
127 $keys = array_keys($crons);
128 if (isset($keys[0]) && $keys[0] > $gmt_time) return;
129 // If we got this far, then cron is going to be fired, so we do want to load all our hooks
130 }
131
132 $updraftplus_have_addons = 0;
133 if (is_dir(UPDRAFTPLUS_DIR.'/addons') && $dir_handle = opendir(UPDRAFTPLUS_DIR.'/addons')) {
134 while (false !== ($e = readdir($dir_handle))) {
135 if (is_file(UPDRAFTPLUS_DIR.'/addons/'.$e) && preg_match('/\.php$/', $e)) {
136 // 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.
137 $header = file_get_contents(UPDRAFTPLUS_DIR.'/addons/'.$e, false, null, 0, 16384);
138 $phprequires = preg_match("/RequiresPHP: (\d[\d\.]+)/", $header, $matches) ? $matches[1] : false;
139 $phpinclude = preg_match("/IncludePHP: (\S+)/", $header, $matches) ? $matches[1] : false;
140 if (false === $phprequires || version_compare(PHP_VERSION, $phprequires, '>=')) {
141 $updraftplus_have_addons++;
142 if ($phpinclude) include_once(UPDRAFTPLUS_DIR.'/'.$phpinclude);
143 include_once(UPDRAFTPLUS_DIR.'/addons/'.$e);
144 }
145 }
146 }
147 @closedir($dir_handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged
148 }
149
150 if (is_file(UPDRAFTPLUS_DIR.'/udaddons/updraftplus-addons.php')) require_once(UPDRAFTPLUS_DIR.'/udaddons/updraftplus-addons.php');
151
152 if (!file_exists(UPDRAFTPLUS_DIR.'/class-updraftplus.php') || !file_exists(UPDRAFTPLUS_DIR.'/options.php')) {
153 /**
154 * Warn if they've not got the whole plugin - can happen if WP crashes (e.g. out of disk space) when upgrading the plugin
155 */
156 function updraftplus_incomplete_install_warning() {
157 echo '<div class="updraftmessage error"><p><strong>'.__('Error', 'updraftplus').':</strong> '.__("You do not have UpdraftPlus completely installed - please de-install and install it again. 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/">'.__('Go here for more information.', 'updraftplus').'</a></p></div>';
158 }
159 add_action('all_admin_notices', 'updraftplus_incomplete_install_warning');
160 } else {
161
162 include_once(UPDRAFTPLUS_DIR.'/class-updraftplus.php');
163 $updraftplus = new UpdraftPlus();
164 $GLOBALS['updraftplus'] = $updraftplus;
165 $updraftplus->have_addons = $updraftplus_have_addons;
166
167 if (!$updraftplus->memory_check(192)) {
168 // 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)
169 // Add sanity checks - found someone who'd set WP_MAX_MEMORY_LIMIT to 256K !
170 if (!$updraftplus->memory_check($updraftplus->memory_check_current(WP_MAX_MEMORY_LIMIT))) {
171 $new = absint($updraftplus->memory_check_current(WP_MAX_MEMORY_LIMIT));
172 if ($new>32 && $new<100000) {
173 @ini_set('memory_limit', $new.'M');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged
174 }
175 }
176 }
177
178 // Blocking updates during restore; placed here so that it still runs e.g. under WP-CLI
179 $updraftplus->block_updates_during_restore_progress();
180 }
181
182 // Ubuntu bug - https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1315888
183 if (!function_exists('gzopen') && function_exists('gzopen64')) {
184 function gzopen($filename, $mode, $use_include_path = 0) {
185 return gzopen64($filename, $mode, $use_include_path);
186 }
187 }
188
189 /**
190 * For finding mysqldump. Added to include Windows locations
191 */
192 function updraftplus_build_mysqldump_list() {
193 if ('win' == strtolower(substr(PHP_OS, 0, 3)) && function_exists('glob')) {
194 $drives = array('C', 'D', 'E');
195
196 if (!empty($_SERVER['DOCUMENT_ROOT'])) {
197 // Get the drive that this is running on
198 $current_drive = strtoupper(substr($_SERVER['DOCUMENT_ROOT'], 0, 1));
199 if (!in_array($current_drive, $drives)) array_unshift($drives, $current_drive);
200 }
201
202 $directories = array();
203
204 foreach ($drives as $drive_letter) {
205 $dir = glob("$drive_letter:\\{Program Files\\MySQL\\{,MySQL*,etc}{,\\bin,\\?},mysqldump}\\mysqldump*", GLOB_BRACE);
206 if (is_array($dir)) $directories = array_merge($directories, $dir);
207 }
208
209 $drive_string = implode(',', $directories);
210 return $drive_string;
211
212 } else {
213 return "/usr/bin/mysqldump,/bin/mysqldump,/usr/local/bin/mysqldump,/usr/sfw/bin/mysqldump,/usr/xdg4/bin/mysqldump,/opt/bin/mysqldump";
214 }
215 }
216
217 // 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
218 if (!class_exists('UpdraftPlus_Options')) require_once(UPDRAFTPLUS_DIR.'/options.php');
219