| [608] | 1 | <?php | 
|---|
|  | 2 | /* | 
|---|
|  | 3 | Plugin Name: XPressME Database Backup | 
|---|
|  | 4 | Plugin URI: http://ja.xpressme.info/ | 
|---|
|  | 5 | Description: On-demand backup of your WordPress database.  Navigate to <a href="edit.php?page=xpressme-backup">Tools → Backup</a> to get started. | 
|---|
|  | 6 | Author: toemon | 
|---|
|  | 7 | Author URI: http://ja.xpressme.info | 
|---|
| [673] | 8 | Version: 1.2 | 
|---|
| [608] | 9 |  | 
|---|
|  | 10 | Originally modified from Austin Matzko's WordPress Database Backup(http://www.ilfilosofo.com/blog/wp-db-backup) plugin. | 
|---|
|  | 11 |  | 
|---|
|  | 12 | Copyright 2008  toemon | 
|---|
|  | 13 |  | 
|---|
|  | 14 | This program is free software; you can redistribute it and/or modify | 
|---|
|  | 15 | it under the terms of the GNU General Public License as published by | 
|---|
|  | 16 | the Free Software Foundation; either version 2 of the License, or | 
|---|
|  | 17 | (at your option) any later version. | 
|---|
|  | 18 |  | 
|---|
|  | 19 | This program is distributed in the hope that it will be useful, | 
|---|
|  | 20 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
|  | 21 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
|  | 22 | GNU General Public License for more details. | 
|---|
|  | 23 |  | 
|---|
|  | 24 | You should have received a copy of the GNU General Public License | 
|---|
|  | 25 | along with this program; if not, write to the Free Software | 
|---|
|  | 26 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA | 
|---|
|  | 27 | */ | 
|---|
|  | 28 |  | 
|---|
|  | 29 | /** | 
|---|
|  | 30 | * Change WP_BACKUP_DIR if you want to | 
|---|
|  | 31 | * use a different backup location | 
|---|
|  | 32 | */ | 
|---|
|  | 33 |  | 
|---|
|  | 34 | $rand = substr( md5( md5( DB_PASSWORD ) ), -5 ); | 
|---|
|  | 35 | global $wpdbb_content_dir, $wpdbb_content_url, $wpdbb_plugin_dir; | 
|---|
|  | 36 | $wpdbb_content_dir = ( defined('WP_CONTENT_DIR') ) ? WP_CONTENT_DIR : ABSPATH . 'wp-content'; | 
|---|
|  | 37 | $wpdbb_content_url = ( defined('WP_CONTENT_URL') ) ? WP_CONTENT_URL : get_option('siteurl') . '/wp-content'; | 
|---|
|  | 38 | $wpdbb_plugin_dir = ( defined('WP_PLUGIN_DIR') ) ? WP_PLUGIN_DIR : $wpdbb_content_dir . '/plugins'; | 
|---|
|  | 39 |  | 
|---|
|  | 40 | if ( ! defined('WP_BACKUP_DIR') ) { | 
|---|
|  | 41 | define('WP_BACKUP_DIR', $wpdbb_content_dir . '/backup-' . $rand . '/'); | 
|---|
|  | 42 | } | 
|---|
|  | 43 |  | 
|---|
|  | 44 | if ( ! defined('WP_BACKUP_URL') ) { | 
|---|
|  | 45 | define('WP_BACKUP_URL', $wpdbb_content_url . '/backup-' . $rand . '/'); | 
|---|
|  | 46 | } | 
|---|
|  | 47 |  | 
|---|
|  | 48 | if ( ! defined('ROWS_PER_SEGMENT') ) { | 
|---|
|  | 49 | define('ROWS_PER_SEGMENT', 100); | 
|---|
|  | 50 | } | 
|---|
|  | 51 |  | 
|---|
|  | 52 | /** | 
|---|
|  | 53 | * Set MOD_EVASIVE_OVERRIDE to true | 
|---|
|  | 54 | * and increase MOD_EVASIVE_DELAY | 
|---|
|  | 55 | * if the backup stops prematurely. | 
|---|
|  | 56 | */ | 
|---|
|  | 57 | // define('MOD_EVASIVE_OVERRIDE', false); | 
|---|
|  | 58 | if ( ! defined('MOD_EVASIVE_DELAY') ) { | 
|---|
|  | 59 | define('MOD_EVASIVE_DELAY', '500'); | 
|---|
|  | 60 | } | 
|---|
|  | 61 | load_plugin_textdomain('xpressme-backup', 'wp-content/plugins/xpressme-backup'); | 
|---|
|  | 62 |  | 
|---|
|  | 63 | class wpdbBackup { | 
|---|
|  | 64 |  | 
|---|
|  | 65 | var $backup_complete = false; | 
|---|
|  | 66 | var $backup_file = ''; | 
|---|
|  | 67 | var $backup_filename; | 
|---|
|  | 68 | var $core_table_names = array(); | 
|---|
|  | 69 | var $errors = array(); | 
|---|
|  | 70 | var $basename; | 
|---|
|  | 71 | var $page_url; | 
|---|
|  | 72 | var $referer_check_key; | 
|---|
|  | 73 | var $version = '2.1.5-alpha'; | 
|---|
|  | 74 |  | 
|---|
|  | 75 | function gzip() { | 
|---|
|  | 76 | return function_exists('gzopen'); | 
|---|
|  | 77 | } | 
|---|
|  | 78 |  | 
|---|
|  | 79 | function module_check() { | 
|---|
|  | 80 | $mod_evasive = false; | 
|---|
|  | 81 | if ( true === MOD_EVASIVE_OVERRIDE ) return true; | 
|---|
|  | 82 | if ( false === MOD_EVASIVE_OVERRIDE ) return false; | 
|---|
|  | 83 | if ( function_exists('apache_get_modules') ) | 
|---|
|  | 84 | foreach( (array) apache_get_modules() as $mod ) | 
|---|
|  | 85 | if ( false !== strpos($mod,'mod_evasive') || false !== strpos($mod,'mod_dosevasive') ) | 
|---|
|  | 86 | return true; | 
|---|
|  | 87 | return false; | 
|---|
|  | 88 | } | 
|---|
|  | 89 |  | 
|---|
|  | 90 | function wpdbBackup() { | 
|---|
|  | 91 | global $table_prefix, $wpdb; | 
|---|
|  | 92 | add_action('wp_ajax_save_backup_time', array(&$this, 'save_backup_time')); | 
|---|
|  | 93 | add_action('init', array(&$this, 'init_textdomain')); | 
|---|
|  | 94 | add_action('load-update-core.php', array(&$this, 'update_notice_action')); | 
|---|
|  | 95 | add_action('wp_db_backup_cron', array(&$this, 'cron_backup')); | 
|---|
|  | 96 | add_action('xpressme_cron_daily', array(&$this, 'xpressme_cron_daily')); | 
|---|
|  | 97 | add_filter('cron_schedules', array(&$this, 'add_sched_options')); | 
|---|
|  | 98 | add_filter('wp_db_b_schedule_choices', array(&$this, 'schedule_choices')); | 
|---|
|  | 99 |  | 
|---|
|  | 100 | $table_prefix = ( isset( $table_prefix ) ) ? $table_prefix : $wpdb->prefix; | 
|---|
|  | 101 | $datum = date("Ymd_B"); | 
|---|
|  | 102 | $this->backup_filename = DB_NAME . "_$table_prefix$datum.sql"; | 
|---|
|  | 103 | if ($this->gzip()) $this->backup_filename .= '.gz'; | 
|---|
|  | 104 |  | 
|---|
|  | 105 | $possible_names = array( | 
|---|
|  | 106 | 'categories', | 
|---|
|  | 107 | 'comments', | 
|---|
|  | 108 | 'link2cat', | 
|---|
|  | 109 | 'linkcategories', | 
|---|
|  | 110 | 'links', | 
|---|
|  | 111 | 'options', | 
|---|
|  | 112 | 'post2cat', | 
|---|
|  | 113 | 'postmeta', | 
|---|
|  | 114 | 'posts', | 
|---|
|  | 115 | 'terms', | 
|---|
|  | 116 | 'term_taxonomy', | 
|---|
|  | 117 | 'term_relationships', | 
|---|
|  | 118 | 'users', | 
|---|
|  | 119 | ); | 
|---|
|  | 120 | $xpress_possible_names = array( | 
|---|
|  | 121 | 'usermeta', | 
|---|
|  | 122 | 'd3forum_link', | 
|---|
|  | 123 | 'group_role', | 
|---|
|  | 124 | 'views', | 
|---|
|  | 125 | 'notify_reserve', | 
|---|
|  | 126 | ); | 
|---|
|  | 127 |  | 
|---|
|  | 128 | foreach( $possible_names as $name ) { | 
|---|
|  | 129 | if ( isset( $wpdb->{$name} ) ) { | 
|---|
|  | 130 | $this->core_table_names[] = $wpdb->{$name}; | 
|---|
|  | 131 | } | 
|---|
|  | 132 | } | 
|---|
|  | 133 | foreach( $xpress_possible_names as $name ) { | 
|---|
|  | 134 | $this->core_table_names[] = $table_prefix . $name; | 
|---|
|  | 135 | } | 
|---|
|  | 136 |  | 
|---|
|  | 137 | $this->backup_dir = trailingslashit(apply_filters('wp_db_b_backup_dir', WP_BACKUP_DIR)); | 
|---|
|  | 138 | $this->basename = 'xpressme-backup'; | 
|---|
|  | 139 |  | 
|---|
|  | 140 | $this->referer_check_key = $this->basename . '-download_' . DB_NAME; | 
|---|
|  | 141 | $query_args = array( 'page' => $this->basename ); | 
|---|
|  | 142 | if ( function_exists('wp_create_nonce') ) | 
|---|
|  | 143 | $query_args = array_merge( $query_args, array('_wpnonce' => wp_create_nonce($this->referer_check_key)) ); | 
|---|
|  | 144 | $base = ( function_exists('site_url') ) ? site_url('', 'admin') : get_option('siteurl'); | 
|---|
|  | 145 | $this->page_url = add_query_arg( $query_args, $base . '/wp-admin/edit.php'); | 
|---|
|  | 146 | if (isset($_POST['do_backup'])) { | 
|---|
|  | 147 | $this->wp_secure('fatal'); | 
|---|
|  | 148 | check_admin_referer($this->referer_check_key); | 
|---|
|  | 149 | $this->can_user_backup('main'); | 
|---|
|  | 150 | // save exclude prefs | 
|---|
|  | 151 |  | 
|---|
|  | 152 | $exc_revisions = (array) $_POST['exclude-revisions']; | 
|---|
|  | 153 | $exc_spam = (array) $_POST['exclude-spam']; | 
|---|
|  | 154 | update_option('xpressme_backup_excs', array('revisions' => $exc_revisions, 'spam' => $exc_spam)); | 
|---|
|  | 155 |  | 
|---|
| [677] | 156 | $do_euc_to_utf8 = $_POST['do_euc_to_utf8']; | 
|---|
| [608] | 157 | $do_rename_prefix = $_POST['do_rename_prefix']; | 
|---|
|  | 158 | $before_prefix = $_POST['before_prefix']; | 
|---|
|  | 159 | $after_prefix = $_POST['after_prefix']; | 
|---|
| [610] | 160 | $do_change_uri = $_POST['do_change_uri']; | 
|---|
|  | 161 | $before_uri = $_POST['before_uri']; | 
|---|
|  | 162 | $after_uri = $_POST['after_uri']; | 
|---|
| [673] | 163 | $del_active_plugin = $_POST['del_active_plugin']; | 
|---|
| [677] | 164 | $set_default_role = $_POST['set_default_role']; | 
|---|
| [673] | 165 |  | 
|---|
| [610] | 166 | update_option('xpressme_backup_extras_option', | 
|---|
|  | 167 | array('do_euc_to_utf8' => $do_euc_to_utf8, | 
|---|
|  | 168 | 'do_rename_prefix' => $do_rename_prefix, | 
|---|
|  | 169 | 'before_prefix' => $before_prefix, | 
|---|
|  | 170 | 'after_prefix' => $after_prefix, | 
|---|
|  | 171 | 'do_change_uri' => $do_change_uri, | 
|---|
|  | 172 | 'before_uri' => $before_uri, | 
|---|
| [673] | 173 | 'after_uri' => $after_uri, | 
|---|
| [677] | 174 | 'del_active_plugin' => $del_active_plugin, | 
|---|
|  | 175 | 'set_default_role' => $set_default_role | 
|---|
| [610] | 176 | ) | 
|---|
|  | 177 | ); | 
|---|
| [608] | 178 |  | 
|---|
|  | 179 | switch($_POST['do_backup']) { | 
|---|
|  | 180 | case 'backup': | 
|---|
|  | 181 | add_action('init', array(&$this, 'perform_backup')); | 
|---|
|  | 182 | break; | 
|---|
|  | 183 | case 'fragments': | 
|---|
|  | 184 | add_action('admin_menu', array(&$this, 'fragment_menu')); | 
|---|
|  | 185 | break; | 
|---|
|  | 186 | } | 
|---|
|  | 187 | } elseif (isset($_GET['fragment'] )) { | 
|---|
|  | 188 | $this->can_user_backup('frame'); | 
|---|
|  | 189 | add_action('init', array(&$this, 'init')); | 
|---|
|  | 190 | } elseif (isset($_GET['backup'] )) { | 
|---|
|  | 191 | $this->can_user_backup(); | 
|---|
|  | 192 | add_action('init', array(&$this, 'init')); | 
|---|
|  | 193 | } else { | 
|---|
|  | 194 | add_action('admin_menu', array(&$this, 'admin_menu')); | 
|---|
|  | 195 | } | 
|---|
|  | 196 | } | 
|---|
|  | 197 |  | 
|---|
|  | 198 | function init() { | 
|---|
|  | 199 | $this->can_user_backup(); | 
|---|
|  | 200 | if (isset($_GET['backup'])) { | 
|---|
|  | 201 | $via = isset($_GET['via']) ? $_GET['via'] : 'http'; | 
|---|
|  | 202 |  | 
|---|
|  | 203 | $this->backup_file = $_GET['backup']; | 
|---|
|  | 204 | $this->validate_file($this->backup_file); | 
|---|
|  | 205 |  | 
|---|
|  | 206 | switch($via) { | 
|---|
|  | 207 | case 'smtp': | 
|---|
|  | 208 | case 'email': | 
|---|
|  | 209 | $success = $this->deliver_backup($this->backup_file, 'smtp', $_GET['recipient'], 'frame'); | 
|---|
|  | 210 | $this->error_display( 'frame' ); | 
|---|
|  | 211 | if ( $success ) { | 
|---|
|  | 212 | echo ' | 
|---|
|  | 213 | <!-- ' . $via . ' --> | 
|---|
|  | 214 | <script type="text/javascript"><!--\\ | 
|---|
|  | 215 | '; | 
|---|
|  | 216 | echo ' | 
|---|
|  | 217 | alert("' . __('Backup Complete!','xpressme-backup') . '"); | 
|---|
|  | 218 | window.onbeforeunload = null; | 
|---|
|  | 219 | </script> | 
|---|
|  | 220 | '; | 
|---|
|  | 221 | } | 
|---|
|  | 222 | break; | 
|---|
|  | 223 | default: | 
|---|
|  | 224 | $this->deliver_backup($this->backup_file, $via); | 
|---|
|  | 225 | $this->error_display( 'frame' ); | 
|---|
|  | 226 | } | 
|---|
|  | 227 | die(); | 
|---|
|  | 228 | } | 
|---|
|  | 229 | if (isset($_GET['fragment'] )) { | 
|---|
|  | 230 | list($table, $segment, $filename) = explode(':', $_GET['fragment']); | 
|---|
|  | 231 | $this->validate_file($filename); | 
|---|
|  | 232 | $this->backup_fragment($table, $segment, $filename); | 
|---|
|  | 233 | } | 
|---|
|  | 234 |  | 
|---|
|  | 235 | die(); | 
|---|
|  | 236 | } | 
|---|
|  | 237 |  | 
|---|
|  | 238 | function init_textdomain() { | 
|---|
|  | 239 | load_plugin_textdomain('xpressme-backup', str_replace(ABSPATH, '', dirname(__FILE__)), dirname(plugin_basename(__FILE__))); | 
|---|
|  | 240 | } | 
|---|
|  | 241 |  | 
|---|
|  | 242 | /* | 
|---|
|  | 243 | * Add a link to back up your database when doing a core upgrade | 
|---|
|  | 244 | */ | 
|---|
|  | 245 | function update_notice_action() { | 
|---|
|  | 246 | if ( 'upgrade-core' == $_REQUEST['action'] ) : | 
|---|
|  | 247 | ob_start(array(&$this, 'update_notice')); | 
|---|
|  | 248 | add_action('admin_footer', create_function('', 'ob_end_flush();')); | 
|---|
|  | 249 | endif; | 
|---|
|  | 250 | } | 
|---|
|  | 251 | function update_notice($text = '') { | 
|---|
|  | 252 | $pattern = '#(<a href\="' . __('http://codex.wordpress.org/WordPress_Backups') . '">.*?</p>)#'; | 
|---|
|  | 253 | $replace = '$1' . "\n<p>" . sprintf(__('Click <a href="%s" target="_blank">here</a> to back up your database using the WordPress Database Backup plugin. <strong>Note:</strong> WordPress Database Backup does <em>not</em> back up your files, just your database.', 'xpressme-backup'), 'tools.php?page=xpressme-backup') . "</p>\n"; | 
|---|
|  | 254 | $text = preg_replace($pattern, $replace, $text); | 
|---|
|  | 255 | return $text; | 
|---|
|  | 256 | } | 
|---|
|  | 257 |  | 
|---|
|  | 258 | function build_backup_script() { | 
|---|
|  | 259 | global $table_prefix, $wpdb; | 
|---|
|  | 260 |  | 
|---|
|  | 261 | echo "<div class='wrap'>"; | 
|---|
|  | 262 | echo    '<fieldset class="options"><legend>' . __('Progress','xpressme-backup') . '</legend> | 
|---|
|  | 263 | <p><strong>' . | 
|---|
|  | 264 | __('DO NOT DO THE FOLLOWING AS IT WILL CAUSE YOUR BACKUP TO FAIL:','xpressme-backup'). | 
|---|
|  | 265 | '</strong></p> | 
|---|
|  | 266 | <ol> | 
|---|
|  | 267 | <li>'.__('Close this browser','xpressme-backup').'</li> | 
|---|
|  | 268 | <li>'.__('Reload this page','xpressme-backup').'</li> | 
|---|
|  | 269 | <li>'.__('Click the Stop or Back buttons in your browser','xpressme-backup').'</li> | 
|---|
|  | 270 | </ol> | 
|---|
|  | 271 | <p><strong>' . __('Progress:','xpressme-backup') . '</strong></p> | 
|---|
|  | 272 | <div id="meterbox" style="height:11px;width:80%;padding:3px;border:1px solid #659fff;"><div id="meter" style="height:11px;background-color:#659fff;width:0%;text-align:center;font-size:6pt;"> </div></div> | 
|---|
|  | 273 | <div id="progress_message"></div> | 
|---|
|  | 274 | <div id="errors"></div> | 
|---|
|  | 275 | </fieldset> | 
|---|
|  | 276 | <iframe id="backuploader" src="about:blank" style="visibility:hidden;border:none;height:1em;width:1px;"></iframe> | 
|---|
|  | 277 | <script type="text/javascript"> | 
|---|
|  | 278 | //<![CDATA[ | 
|---|
|  | 279 | window.onbeforeunload = function() { | 
|---|
|  | 280 | return "' . __('Navigating away from this page will cause your backup to fail.', 'xpressme-backup') . '"; | 
|---|
|  | 281 | } | 
|---|
|  | 282 | function setMeter(pct) { | 
|---|
|  | 283 | var meter = document.getElementById("meter"); | 
|---|
|  | 284 | meter.style.width = pct + "%"; | 
|---|
|  | 285 | meter.innerHTML = Math.floor(pct) + "%"; | 
|---|
|  | 286 | } | 
|---|
|  | 287 | function setProgress(str) { | 
|---|
|  | 288 | var progress = document.getElementById("progress_message"); | 
|---|
|  | 289 | progress.innerHTML = str; | 
|---|
|  | 290 | } | 
|---|
|  | 291 | function addError(str) { | 
|---|
|  | 292 | var errors = document.getElementById("errors"); | 
|---|
|  | 293 | errors.innerHTML = errors.innerHTML + str + "<br />"; | 
|---|
|  | 294 | } | 
|---|
|  | 295 |  | 
|---|
|  | 296 | function backup(table, segment) { | 
|---|
|  | 297 | var fram = document.getElementById("backuploader"); | 
|---|
|  | 298 | fram.src = "' . $this->page_url . '&fragment=" + table + ":" + segment + ":' . $this->backup_filename . ':"; | 
|---|
|  | 299 | } | 
|---|
|  | 300 |  | 
|---|
|  | 301 | var curStep = 0; | 
|---|
|  | 302 |  | 
|---|
|  | 303 | function nextStep() { | 
|---|
|  | 304 | backupStep(curStep); | 
|---|
|  | 305 | curStep++; | 
|---|
|  | 306 | } | 
|---|
|  | 307 |  | 
|---|
|  | 308 | function finishBackup() { | 
|---|
|  | 309 | var fram = document.getElementById("backuploader"); | 
|---|
|  | 310 | setMeter(100); | 
|---|
|  | 311 | '; | 
|---|
|  | 312 |  | 
|---|
|  | 313 | $download_uri = add_query_arg('backup', $this->backup_filename, $this->page_url); | 
|---|
|  | 314 | switch($_POST['deliver']) { | 
|---|
|  | 315 | case 'http': | 
|---|
|  | 316 | echo ' | 
|---|
|  | 317 | setProgress("' . sprintf(__("Backup complete, preparing <a href=\\\"%s\\\">backup</a> for download...",'xpressme-backup'), $download_uri) . '"); | 
|---|
|  | 318 | window.onbeforeunload = null; | 
|---|
|  | 319 | fram.src = "' . $download_uri . '"; | 
|---|
|  | 320 | '; | 
|---|
|  | 321 | break; | 
|---|
|  | 322 | case 'smtp': | 
|---|
|  | 323 | echo ' | 
|---|
|  | 324 | setProgress("' . sprintf(__("Backup complete, sending <a href=\\\"%s\\\">backup</a> via email...",'xpressme-backup'), $download_uri) . '"); | 
|---|
|  | 325 | window.onbeforeunload = null; | 
|---|
|  | 326 | fram.src = "' . $download_uri . '&via=email&recipient=' . $_POST['backup_recipient'] . '"; | 
|---|
|  | 327 | '; | 
|---|
|  | 328 | break; | 
|---|
|  | 329 | default: | 
|---|
|  | 330 | echo ' | 
|---|
|  | 331 | setProgress("' . sprintf(__("Backup complete, download <a href=\\\"%s\\\">here</a>.",'xpressme-backup'), $download_uri) . '"); | 
|---|
|  | 332 | window.onbeforeunload = null; | 
|---|
|  | 333 | '; | 
|---|
|  | 334 | } | 
|---|
|  | 335 |  | 
|---|
|  | 336 | echo ' | 
|---|
|  | 337 | } | 
|---|
|  | 338 |  | 
|---|
|  | 339 | function backupStep(step) { | 
|---|
|  | 340 | switch(step) { | 
|---|
|  | 341 | case 0: backup("", 0); break; | 
|---|
|  | 342 | '; | 
|---|
|  | 343 |  | 
|---|
|  | 344 | $also_backup = array(); | 
|---|
|  | 345 | if (isset($_POST['other_tables'])) { | 
|---|
|  | 346 | $also_backup = $_POST['other_tables']; | 
|---|
|  | 347 | } else { | 
|---|
|  | 348 | $also_backup = array(); | 
|---|
|  | 349 | } | 
|---|
|  | 350 | $core_tables = $_POST['core_tables']; | 
|---|
|  | 351 | $tables = array_merge($core_tables, $also_backup); | 
|---|
|  | 352 | $step_count = 1; | 
|---|
|  | 353 | foreach ($tables as $table) { | 
|---|
|  | 354 | $rec_count = $wpdb->get_var("SELECT count(*) FROM {$table}"); | 
|---|
|  | 355 | $rec_segments = ceil($rec_count / ROWS_PER_SEGMENT); | 
|---|
|  | 356 | $table_count = 0; | 
|---|
|  | 357 | if ( $this->module_check() ) { | 
|---|
|  | 358 | $delay = "setTimeout('"; | 
|---|
|  | 359 | $delay_time = "', " . (int) MOD_EVASIVE_DELAY . ")"; | 
|---|
|  | 360 | } | 
|---|
|  | 361 | else { $delay = $delay_time = ''; } | 
|---|
|  | 362 | do { | 
|---|
|  | 363 | echo "case {$step_count}: {$delay}backup(\"{$table}\", {$table_count}){$delay_time}; break;\n"; | 
|---|
|  | 364 | $step_count++; | 
|---|
|  | 365 | $table_count++; | 
|---|
|  | 366 | } while($table_count < $rec_segments); | 
|---|
|  | 367 | echo "case {$step_count}: {$delay}backup(\"{$table}\", -1){$delay_time}; break;\n"; | 
|---|
|  | 368 | $step_count++; | 
|---|
|  | 369 | } | 
|---|
|  | 370 | echo "case {$step_count}: finishBackup(); break;"; | 
|---|
|  | 371 |  | 
|---|
|  | 372 | echo ' | 
|---|
|  | 373 | } | 
|---|
|  | 374 | if(step != 0) setMeter(100 * step / ' . $step_count . '); | 
|---|
|  | 375 | } | 
|---|
|  | 376 |  | 
|---|
|  | 377 | nextStep(); | 
|---|
|  | 378 | // ]]> | 
|---|
|  | 379 | </script> | 
|---|
|  | 380 | </div> | 
|---|
|  | 381 | '; | 
|---|
|  | 382 | $this->backup_menu(); | 
|---|
|  | 383 | } | 
|---|
|  | 384 |  | 
|---|
|  | 385 | function backup_fragment($table, $segment, $filename) { | 
|---|
|  | 386 | global $table_prefix, $wpdb; | 
|---|
|  | 387 |  | 
|---|
|  | 388 | echo "$table:$segment:$filename"; | 
|---|
|  | 389 |  | 
|---|
|  | 390 | if($table == '') { | 
|---|
|  | 391 | $msg = __('Creating backup file...','xpressme-backup'); | 
|---|
|  | 392 | } else { | 
|---|
|  | 393 | if($segment == -1) { | 
|---|
|  | 394 | $msg = sprintf(__('Finished backing up table \\"%s\\".','xpressme-backup'), $table); | 
|---|
|  | 395 | } else { | 
|---|
|  | 396 | $msg = sprintf(__('Backing up table \\"%s\\"...','xpressme-backup'), $table); | 
|---|
|  | 397 | } | 
|---|
|  | 398 | } | 
|---|
|  | 399 |  | 
|---|
|  | 400 | if (is_writable($this->backup_dir)) { | 
|---|
|  | 401 | $this->fp = $this->open($this->backup_dir . $filename, 'a'); | 
|---|
|  | 402 | if(!$this->fp) { | 
|---|
|  | 403 | $this->error(__('Could not open the backup file for writing!','xpressme-backup')); | 
|---|
|  | 404 | $this->error(array('loc' => 'frame', 'kind' => 'fatal', 'msg' =>  __('The backup file could not be saved.  Please check the permissions for writing to your backup directory and try again.','xpressme-backup'))); | 
|---|
|  | 405 | } | 
|---|
|  | 406 | else { | 
|---|
|  | 407 | if($table == '') { | 
|---|
|  | 408 | //Begin new backup of MySql | 
|---|
|  | 409 | $this->stow("# " . __('WordPress MySQL database backup','xpressme-backup') . "\n"); | 
|---|
|  | 410 | $this->stow("#\n"); | 
|---|
|  | 411 | $this->stow("# " . sprintf(__('Generated: %s','xpressme-backup'),date("l j. F Y H:i T")) . "\n"); | 
|---|
|  | 412 | $this->stow("# " . sprintf(__('Hostname: %s','xpressme-backup'),DB_HOST) . "\n"); | 
|---|
|  | 413 | $this->stow("# " . sprintf(__('Database: %s','xpressme-backup'),$this->backquote(DB_NAME)) . "\n"); | 
|---|
|  | 414 | $this->stow("# --------------------------------------------------------\n"); | 
|---|
|  | 415 | } else { | 
|---|
|  | 416 | if($segment == 0) { | 
|---|
|  | 417 | // Increase script execution time-limit to 15 min for every table. | 
|---|
|  | 418 | if ( !ini_get('safe_mode')) @set_time_limit(15*60); | 
|---|
|  | 419 | // Create the SQL statements | 
|---|
|  | 420 | $this->stow("# --------------------------------------------------------\n"); | 
|---|
|  | 421 | $this->stow("# " . sprintf(__('Table: %s','xpressme-backup'),$this->backquote($table)) . "\n"); | 
|---|
|  | 422 | $this->stow("# --------------------------------------------------------\n"); | 
|---|
|  | 423 | } | 
|---|
|  | 424 | $this->backup_table($table, $segment); | 
|---|
|  | 425 | } | 
|---|
|  | 426 | } | 
|---|
|  | 427 | } else { | 
|---|
|  | 428 | $this->error(array('kind' => 'fatal', 'loc' => 'frame', 'msg' => __('The backup directory is not writeable!  Please check the permissions for writing to your backup directory and try again.','xpressme-backup'))); | 
|---|
|  | 429 | } | 
|---|
|  | 430 |  | 
|---|
|  | 431 | if($this->fp) $this->close($this->fp); | 
|---|
|  | 432 |  | 
|---|
|  | 433 | $this->error_display('frame'); | 
|---|
|  | 434 |  | 
|---|
|  | 435 | echo '<script type="text/javascript"><!--// | 
|---|
|  | 436 | var msg = "' . $msg . '"; | 
|---|
|  | 437 | window.parent.setProgress(msg); | 
|---|
|  | 438 | window.parent.nextStep(); | 
|---|
|  | 439 | //--></script> | 
|---|
|  | 440 | '; | 
|---|
|  | 441 | die(); | 
|---|
|  | 442 | } | 
|---|
|  | 443 |  | 
|---|
|  | 444 | function perform_backup() { | 
|---|
|  | 445 | // are we backing up any other tables? | 
|---|
|  | 446 | $also_backup = array(); | 
|---|
|  | 447 | if (isset($_POST['other_tables'])) | 
|---|
|  | 448 | $also_backup = $_POST['other_tables']; | 
|---|
|  | 449 | $core_tables = $_POST['core_tables']; | 
|---|
|  | 450 | $this->backup_file = $this->db_backup($core_tables, $also_backup); | 
|---|
|  | 451 | if (false !== $this->backup_file) { | 
|---|
|  | 452 | if ('smtp' == $_POST['deliver']) { | 
|---|
|  | 453 | $this->deliver_backup($this->backup_file, $_POST['deliver'], $_POST['backup_recipient'], 'main'); | 
|---|
|  | 454 | wp_redirect($this->page_url); | 
|---|
|  | 455 | } elseif ('http' == $_POST['deliver']) { | 
|---|
|  | 456 | $download_uri = add_query_arg('backup',$this->backup_file,$this->page_url); | 
|---|
|  | 457 | wp_redirect($download_uri); | 
|---|
|  | 458 | exit; | 
|---|
|  | 459 | } | 
|---|
|  | 460 | // we do this to say we're done. | 
|---|
|  | 461 | $this->backup_complete = true; | 
|---|
|  | 462 | } | 
|---|
|  | 463 | } | 
|---|
|  | 464 |  | 
|---|
|  | 465 | function admin_header() { | 
|---|
|  | 466 | ?> | 
|---|
|  | 467 | <script type="text/javascript"> | 
|---|
|  | 468 | //<![CDATA[ | 
|---|
|  | 469 | if ( 'undefined' != typeof addLoadEvent ) { | 
|---|
|  | 470 | addLoadEvent(function() { | 
|---|
|  | 471 | var t = {'extra-tables-list':{name: 'other_tables[]'}, 'include-tables-list':{name: 'xpressme_cron_backup_tables[]'}}; | 
|---|
|  | 472 |  | 
|---|
|  | 473 | for ( var k in t ) { | 
|---|
|  | 474 | t[k].s = null; | 
|---|
|  | 475 | var d = document.getElementById(k); | 
|---|
|  | 476 | if ( ! d ) | 
|---|
|  | 477 | continue; | 
|---|
|  | 478 | var ul = d.getElementsByTagName('ul').item(0); | 
|---|
|  | 479 | if ( ul ) { | 
|---|
|  | 480 | var lis = ul.getElementsByTagName('li'); | 
|---|
|  | 481 | if ( 3 > lis.length ) | 
|---|
|  | 482 | return; | 
|---|
|  | 483 | var text = document.createElement('p'); | 
|---|
|  | 484 | text.className = 'instructions'; | 
|---|
|  | 485 | text.innerHTML = '<?php _e('Click and hold down <code>[SHIFT]</code> to toggle multiple checkboxes', 'xpressme-backup'); ?>'; | 
|---|
|  | 486 | ul.parentNode.insertBefore(text, ul); | 
|---|
|  | 487 | } | 
|---|
|  | 488 | t[k].p = d.getElementsByTagName("input"); | 
|---|
|  | 489 | for(var i=0; i < t[k].p.length; i++) | 
|---|
|  | 490 | if(t[k].name == t[k].p[i].getAttribute('name')) { | 
|---|
|  | 491 | t[k].p[i].id = k + '-table-' + i; | 
|---|
|  | 492 | t[k].p[i].onkeyup = t[k].p[i].onclick = function(e) { | 
|---|
|  | 493 | e = e ? e : event; | 
|---|
|  | 494 | if ( 16  == e.keyCode ) | 
|---|
|  | 495 | return; | 
|---|
|  | 496 | var match = /([\w-]*)-table-(\d*)/.exec(this.id); | 
|---|
|  | 497 | var listname = match[1]; | 
|---|
|  | 498 | var that = match[2]; | 
|---|
|  | 499 | if ( null === t[listname].s ) | 
|---|
|  | 500 | t[listname].s = that; | 
|---|
|  | 501 | else if ( e.shiftKey ) { | 
|---|
|  | 502 | var start = Math.min(that, t[listname].s) + 1; | 
|---|
|  | 503 | var end = Math.max(that, t[listname].s); | 
|---|
|  | 504 | for( var j=start; j < end; j++) | 
|---|
|  | 505 | t[listname].p[j].checked = t[listname].p[j].checked ? false : true; | 
|---|
|  | 506 | t[listname].s = null; | 
|---|
|  | 507 | } | 
|---|
|  | 508 | } | 
|---|
|  | 509 | } | 
|---|
|  | 510 | } | 
|---|
|  | 511 |  | 
|---|
|  | 512 | <?php if ( function_exists('wp_schedule_event') ) : // needs to be at least WP 2.1 for ajax ?> | 
|---|
|  | 513 | if ( 'undefined' == typeof XMLHttpRequest ) | 
|---|
|  | 514 | var xml = new ActiveXObject( navigator.userAgent.indexOf('MSIE 5') >= 0 ? 'Microsoft.XMLHTTP' : 'Msxml2.XMLHTTP' ); | 
|---|
|  | 515 | else | 
|---|
|  | 516 | var xml = new XMLHttpRequest(); | 
|---|
|  | 517 |  | 
|---|
|  | 518 | var initTimeChange = function() { | 
|---|
|  | 519 | var timeWrap = document.getElementById('backup-time-wrap'); | 
|---|
|  | 520 | var backupTime = document.getElementById('next-backup-time'); | 
|---|
|  | 521 | if ( !! timeWrap && !! backupTime ) { | 
|---|
|  | 522 | var span = document.createElement('span'); | 
|---|
|  | 523 | span.className = 'submit'; | 
|---|
|  | 524 | span.id = 'change-wrap'; | 
|---|
|  | 525 | span.innerHTML = '<input type="submit" id="change-backup-time" name="change-backup-time" value="<?php _e('Change','xpressme-backup'); ?>" />'; | 
|---|
|  | 526 | timeWrap.appendChild(span); | 
|---|
|  | 527 | backupTime.ondblclick = function(e) { span.parentNode.removeChild(span); clickTime(e, backupTime); }; | 
|---|
|  | 528 | span.onclick = function(e) { span.parentNode.removeChild(span); clickTime(e, backupTime); }; | 
|---|
|  | 529 | } | 
|---|
|  | 530 | } | 
|---|
|  | 531 |  | 
|---|
|  | 532 | var clickTime = function(e, backupTime) { | 
|---|
|  | 533 | var tText = backupTime.innerHTML; | 
|---|
|  | 534 | backupTime.innerHTML = '<input type="text" value="' + tText + '" name="backup-time-text" id="backup-time-text" /> <span class="submit"><input type="submit" name="save-backup-time" id="save-backup-time" value="<?php _e('Save', 'xpressme-backup'); ?>" /></span>'; | 
|---|
|  | 535 | backupTime.ondblclick = null; | 
|---|
|  | 536 | var mainText = document.getElementById('backup-time-text'); | 
|---|
|  | 537 | mainText.focus(); | 
|---|
|  | 538 | var saveTButton = document.getElementById('save-backup-time'); | 
|---|
|  | 539 | if ( !! saveTButton ) | 
|---|
|  | 540 | saveTButton.onclick = function(e) { saveTime(backupTime, mainText); return false; }; | 
|---|
|  | 541 | if ( !! mainText ) | 
|---|
|  | 542 | mainText.onkeydown = function(e) { | 
|---|
|  | 543 | e = e || window.event; | 
|---|
|  | 544 | if ( 13 == e.keyCode ) { | 
|---|
|  | 545 | saveTime(backupTime, mainText); | 
|---|
|  | 546 | return false; | 
|---|
|  | 547 | } | 
|---|
|  | 548 | } | 
|---|
|  | 549 | } | 
|---|
|  | 550 |  | 
|---|
|  | 551 | var saveTime = function(backupTime, mainText) { | 
|---|
|  | 552 | var tVal = mainText.value; | 
|---|
|  | 553 |  | 
|---|
|  | 554 | xml.open('POST', 'admin-ajax.php', true); | 
|---|
|  | 555 | xml.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); | 
|---|
|  | 556 | if ( xml.overrideMimeType ) | 
|---|
|  | 557 | xml.setRequestHeader('Connection', 'close'); | 
|---|
|  | 558 | xml.send('action=save_backup_time&_wpnonce=<?php echo wp_create_nonce($this->referer_check_key); ?>&backup-time='+tVal); | 
|---|
|  | 559 | xml.onreadystatechange = function() { | 
|---|
|  | 560 | if ( 4 == xml.readyState && '0' != xml.responseText ) { | 
|---|
|  | 561 | backupTime.innerHTML = xml.responseText; | 
|---|
|  | 562 | initTimeChange(); | 
|---|
|  | 563 | } | 
|---|
|  | 564 | } | 
|---|
|  | 565 | } | 
|---|
|  | 566 |  | 
|---|
|  | 567 | initTimeChange(); | 
|---|
|  | 568 | <?php endif; // wp_schedule_event exists ?> | 
|---|
|  | 569 | }); | 
|---|
|  | 570 | } | 
|---|
|  | 571 | //]]> | 
|---|
|  | 572 | </script> | 
|---|
|  | 573 | <style type="text/css"> | 
|---|
|  | 574 | .xpressme-backup-updated { | 
|---|
|  | 575 | margin-top: 1em; | 
|---|
|  | 576 | } | 
|---|
|  | 577 |  | 
|---|
|  | 578 | fieldset.options { | 
|---|
|  | 579 | border: 1px solid; | 
|---|
|  | 580 | margin-top: 1em; | 
|---|
|  | 581 | padding: 1em; | 
|---|
|  | 582 | } | 
|---|
|  | 583 | fieldset.options div.tables-list { | 
|---|
|  | 584 | float: left; | 
|---|
|  | 585 | padding: 1em; | 
|---|
|  | 586 | } | 
|---|
|  | 587 |  | 
|---|
|  | 588 | fieldset.options input { | 
|---|
|  | 589 | } | 
|---|
|  | 590 |  | 
|---|
|  | 591 | fieldset.options legend { | 
|---|
|  | 592 | font-size: larger; | 
|---|
|  | 593 | font-weight: bold; | 
|---|
|  | 594 | margin-bottom: .5em; | 
|---|
|  | 595 | padding: 1em; | 
|---|
|  | 596 | } | 
|---|
|  | 597 |  | 
|---|
|  | 598 | fieldset.options .instructions { | 
|---|
|  | 599 | font-size: smaller; | 
|---|
|  | 600 | } | 
|---|
|  | 601 |  | 
|---|
|  | 602 | fieldset.options ul { | 
|---|
|  | 603 | list-style-type: none; | 
|---|
|  | 604 | } | 
|---|
|  | 605 | fieldset.options li { | 
|---|
|  | 606 | text-align: left; | 
|---|
|  | 607 | } | 
|---|
|  | 608 |  | 
|---|
|  | 609 | fieldset.options .submit { | 
|---|
|  | 610 | border-top: none; | 
|---|
|  | 611 | } | 
|---|
|  | 612 | </style> | 
|---|
|  | 613 | <?php | 
|---|
|  | 614 | } | 
|---|
|  | 615 |  | 
|---|
|  | 616 | function admin_load() { | 
|---|
|  | 617 | add_action('admin_head', array(&$this, 'admin_header')); | 
|---|
|  | 618 | } | 
|---|
|  | 619 |  | 
|---|
|  | 620 | function admin_menu() { | 
|---|
|  | 621 | $_page_hook = add_management_page(__('XPressME Backup','xpressme-backup'), __('XPressME Backup','xpressme-backup'), 'import', $this->basename, array(&$this, 'backup_menu')); | 
|---|
|  | 622 | add_action('load-' . $_page_hook, array(&$this, 'admin_load')); | 
|---|
|  | 623 | if ( function_exists('add_contextual_help') ) { | 
|---|
|  | 624 | $text = $this->help_menu(); | 
|---|
|  | 625 | add_contextual_help($_page_hook, $text); | 
|---|
|  | 626 | } | 
|---|
|  | 627 | } | 
|---|
|  | 628 |  | 
|---|
|  | 629 | function fragment_menu() { | 
|---|
|  | 630 | $page_hook = add_management_page(__('XPressME Backup','xpressme-backup'), __('XPressME Backup','xpressme-backup'), 'import', $this->basename, array(&$this, 'build_backup_script')); | 
|---|
|  | 631 | add_action('load-' . $page_hook, array(&$this, 'admin_load')); | 
|---|
|  | 632 | } | 
|---|
|  | 633 |  | 
|---|
|  | 634 | /** | 
|---|
|  | 635 | * Add WP-DB-Backup-specific help options to the 2.7 =< WP contextual help menu | 
|---|
|  | 636 | * return string The text of the help menu. | 
|---|
|  | 637 | */ | 
|---|
|  | 638 | function help_menu() { | 
|---|
|  | 639 | $text = ''; | 
|---|
|  | 640 | //              $text = "\n<a href=\"http://wordpress.org/extend/plugins/xpressme-backup/faq/\" target=\"_blank\">" . __('FAQ', 'xpressme-backup') . '</a>'; | 
|---|
|  | 641 | //              $text .= "\n<br />\n<a href=\"http://www.ilfilosofo.com/forum/forum/2\" target=\"_blank\">" . __('WP-DB-Backup Support Forum', 'xpressme-backup') . '</a>'; | 
|---|
|  | 642 | return $text; | 
|---|
|  | 643 | } | 
|---|
|  | 644 |  | 
|---|
|  | 645 | function save_backup_time() { | 
|---|
|  | 646 | if ( $this->can_user_backup() ) { | 
|---|
|  | 647 | // try to get a time from the input string | 
|---|
|  | 648 | $time = strtotime(strval($_POST['backup-time'])); | 
|---|
|  | 649 | if ( ! empty( $time ) && time() < $time ) { | 
|---|
|  | 650 | wp_clear_scheduled_hook( 'wp_db_backup_cron' ); // unschedule previous | 
|---|
|  | 651 | $scheds = (array) wp_get_schedules(); | 
|---|
|  | 652 | $name = get_option('xpressme_cron_backup_schedule'); | 
|---|
|  | 653 | if ( 0 != $time ) { | 
|---|
|  | 654 | wp_schedule_event($time, $name, 'wp_db_backup_cron'); | 
|---|
|  | 655 | echo gmdate(get_option('date_format') . ' ' . get_option('time_format'), $time + (get_option('gmt_offset') * 3600)); | 
|---|
|  | 656 | exit; | 
|---|
|  | 657 | } | 
|---|
|  | 658 | } | 
|---|
|  | 659 | } else { | 
|---|
|  | 660 | die(0); | 
|---|
|  | 661 | } | 
|---|
|  | 662 | } | 
|---|
|  | 663 |  | 
|---|
|  | 664 | /** | 
|---|
|  | 665 | * Better addslashes for SQL queries. | 
|---|
|  | 666 | * Taken from phpMyAdmin. | 
|---|
|  | 667 | */ | 
|---|
|  | 668 | function sql_addslashes($a_string = '', $is_like = false) { | 
|---|
|  | 669 | if ($is_like) $a_string = str_replace('\\', '\\\\\\\\', $a_string); | 
|---|
|  | 670 | else $a_string = str_replace('\\', '\\\\', $a_string); | 
|---|
|  | 671 | return str_replace('\'', '\\\'', $a_string); | 
|---|
|  | 672 | } | 
|---|
|  | 673 |  | 
|---|
|  | 674 | /** | 
|---|
|  | 675 | * Add backquotes to tables and db-names in | 
|---|
|  | 676 | * SQL queries. Taken from phpMyAdmin. | 
|---|
|  | 677 | */ | 
|---|
|  | 678 | function backquote($a_name) { | 
|---|
|  | 679 | if (!empty($a_name) && $a_name != '*') { | 
|---|
|  | 680 | if (is_array($a_name)) { | 
|---|
|  | 681 | $result = array(); | 
|---|
|  | 682 | reset($a_name); | 
|---|
|  | 683 | while(list($key, $val) = each($a_name)) | 
|---|
|  | 684 | $result[$key] = '`' . $val . '`'; | 
|---|
|  | 685 | return $result; | 
|---|
|  | 686 | } else { | 
|---|
|  | 687 | return '`' . $a_name . '`'; | 
|---|
|  | 688 | } | 
|---|
|  | 689 | } else { | 
|---|
|  | 690 | return $a_name; | 
|---|
|  | 691 | } | 
|---|
|  | 692 | } | 
|---|
|  | 693 |  | 
|---|
|  | 694 | function open($filename = '', $mode = 'w') { | 
|---|
|  | 695 | if ('' == $filename) return false; | 
|---|
|  | 696 | if ($this->gzip()) | 
|---|
|  | 697 | $fp = @gzopen($filename, $mode); | 
|---|
|  | 698 | else | 
|---|
|  | 699 | $fp = @fopen($filename, $mode); | 
|---|
|  | 700 | return $fp; | 
|---|
|  | 701 | } | 
|---|
|  | 702 |  | 
|---|
|  | 703 | function close($fp) { | 
|---|
|  | 704 | if ($this->gzip()) gzclose($fp); | 
|---|
|  | 705 | else fclose($fp); | 
|---|
|  | 706 | } | 
|---|
|  | 707 |  | 
|---|
|  | 708 | /** | 
|---|
|  | 709 | * Write to the backup file | 
|---|
|  | 710 | * @param string $query_line the line to write | 
|---|
|  | 711 | * @return null | 
|---|
|  | 712 | */ | 
|---|
|  | 713 | function stow($query_line) { | 
|---|
|  | 714 | $query_line = $this->extras_filter($query_line); | 
|---|
|  | 715 | if ($this->gzip()) { | 
|---|
|  | 716 | if(! @gzwrite($this->fp, $query_line)) | 
|---|
|  | 717 | $this->error(__('There was an error writing a line to the backup script:','xpressme-backup') . '  ' . $query_line . '  ' . $php_errormsg); | 
|---|
|  | 718 | } else { | 
|---|
|  | 719 | if(false === @fwrite($this->fp, $query_line)) | 
|---|
|  | 720 | $this->error(__('There was an error writing a line to the backup script:','xpressme-backup') . '  ' . $query_line . '  ' . $php_errormsg); | 
|---|
|  | 721 | } | 
|---|
|  | 722 | } | 
|---|
|  | 723 |  | 
|---|
|  | 724 | /** | 
|---|
|  | 725 | * Logs any error messages | 
|---|
|  | 726 | * @param array $args | 
|---|
|  | 727 | * @return bool | 
|---|
|  | 728 | */ | 
|---|
|  | 729 | function error($args = array()) { | 
|---|
|  | 730 | if ( is_string( $args ) ) | 
|---|
|  | 731 | $args = array('msg' => $args); | 
|---|
|  | 732 | $args = array_merge( array('loc' => 'main', 'kind' => 'warn', 'msg' => ''), $args); | 
|---|
|  | 733 | $this->errors[$args['kind']][] = $args['msg']; | 
|---|
|  | 734 | if ( 'fatal' == $args['kind'] || 'frame' == $args['loc']) | 
|---|
|  | 735 | $this->error_display($args['loc']); | 
|---|
|  | 736 | return true; | 
|---|
|  | 737 | } | 
|---|
|  | 738 |  | 
|---|
|  | 739 | /** | 
|---|
|  | 740 | * Displays error messages | 
|---|
|  | 741 | * @param array $errs | 
|---|
|  | 742 | * @param string $loc | 
|---|
|  | 743 | * @return string | 
|---|
|  | 744 | */ | 
|---|
|  | 745 | function error_display($loc = 'main', $echo = true) { | 
|---|
|  | 746 | $errs = $this->errors; | 
|---|
|  | 747 | unset( $this->errors ); | 
|---|
|  | 748 | if ( ! count($errs) ) return; | 
|---|
|  | 749 | $msg = ''; | 
|---|
|  | 750 | $err_list = array_slice(array_merge( (array) $errs['fatal'], (array) $errs['warn']), 0, 10); | 
|---|
|  | 751 | if ( 10 == count( $err_list ) ) | 
|---|
|  | 752 | $err_list[9] = __('Subsequent errors have been omitted from this log.','xpressme-backup'); | 
|---|
|  | 753 | $wrap = ( 'frame' == $loc ) ? "<script type=\"text/javascript\">\n var msgList = ''; \n %1\$s \n if ( msgList ) alert(msgList); \n </script>" : '%1$s'; | 
|---|
|  | 754 | $line = ( 'frame' == $loc ) ? | 
|---|
|  | 755 | "try{ window.parent.addError('%1\$s'); } catch(e) { msgList += ' %1\$s';}\n" : | 
|---|
|  | 756 | "%1\$s<br />\n"; | 
|---|
|  | 757 | foreach( (array) $err_list as $err ) | 
|---|
|  | 758 | $msg .= sprintf($line,str_replace(array("\n","\r"), '', addslashes($err))); | 
|---|
|  | 759 | $msg = sprintf($wrap,$msg); | 
|---|
|  | 760 | if ( count($errs['fatal'] ) ) { | 
|---|
|  | 761 | if ( function_exists('wp_die') && 'frame' != $loc ) wp_die(stripslashes($msg)); | 
|---|
|  | 762 | else die($msg); | 
|---|
|  | 763 | } | 
|---|
|  | 764 | else { | 
|---|
|  | 765 | if ( $echo ) echo $msg; | 
|---|
|  | 766 | else return $msg; | 
|---|
|  | 767 | } | 
|---|
|  | 768 | } | 
|---|
|  | 769 |  | 
|---|
|  | 770 | /** | 
|---|
|  | 771 | * Taken partially from phpMyAdmin and partially from | 
|---|
|  | 772 | * Alain Wolf, Zurich - Switzerland | 
|---|
|  | 773 | * Website: http://restkultur.ch/personal/wolf/scripts/db_backup/ | 
|---|
|  | 774 |  | 
|---|
|  | 775 | * Modified by Scott Merrill (http://www.skippy.net/) | 
|---|
|  | 776 | * to use the WordPress $wpdb object | 
|---|
|  | 777 | * @param string $table | 
|---|
|  | 778 | * @param string $segment | 
|---|
|  | 779 | * @return void | 
|---|
|  | 780 | */ | 
|---|
|  | 781 | function backup_table($table, $segment = 'none') { | 
|---|
|  | 782 | global $wpdb; | 
|---|
|  | 783 |  | 
|---|
|  | 784 | $table_structure = $wpdb->get_results("DESCRIBE $table"); | 
|---|
|  | 785 | if (! $table_structure) { | 
|---|
|  | 786 | $this->error(__('Error getting table details','xpressme-backup') . ": $table"); | 
|---|
|  | 787 | return false; | 
|---|
|  | 788 | } | 
|---|
|  | 789 |  | 
|---|
|  | 790 | if(($segment == 'none') || ($segment == 0)) { | 
|---|
|  | 791 | // Add SQL statement to drop existing table | 
|---|
|  | 792 | $this->stow("\n\n"); | 
|---|
|  | 793 | $this->stow("#\n"); | 
|---|
|  | 794 | $this->stow("# " . sprintf(__('Delete any existing table %s','xpressme-backup'),$this->backquote($table)) . "\n"); | 
|---|
|  | 795 | $this->stow("#\n"); | 
|---|
|  | 796 | $this->stow("\n"); | 
|---|
|  | 797 | $this->stow("DROP TABLE IF EXISTS " . $this->backquote($table) . ";\n"); | 
|---|
|  | 798 |  | 
|---|
|  | 799 | // Table structure | 
|---|
|  | 800 | // Comment in SQL-file | 
|---|
|  | 801 | $this->stow("\n\n"); | 
|---|
|  | 802 | $this->stow("#\n"); | 
|---|
|  | 803 | $this->stow("# " . sprintf(__('Table structure of table %s','xpressme-backup'),$this->backquote($table)) . "\n"); | 
|---|
|  | 804 | $this->stow("#\n"); | 
|---|
|  | 805 | $this->stow("\n"); | 
|---|
|  | 806 |  | 
|---|
|  | 807 | $create_table = $wpdb->get_results("SHOW CREATE TABLE $table", ARRAY_N); | 
|---|
|  | 808 | if (false === $create_table) { | 
|---|
|  | 809 | $err_msg = sprintf(__('Error with SHOW CREATE TABLE for %s.','xpressme-backup'), $table); | 
|---|
|  | 810 | $this->error($err_msg); | 
|---|
|  | 811 | $this->stow("#\n# $err_msg\n#\n"); | 
|---|
|  | 812 | } | 
|---|
|  | 813 | $this->stow($create_table[0][1] . ' ;'); | 
|---|
|  | 814 |  | 
|---|
|  | 815 | if (false === $table_structure) { | 
|---|
|  | 816 | $err_msg = sprintf(__('Error getting table structure of %s','xpressme-backup'), $table); | 
|---|
|  | 817 | $this->error($err_msg); | 
|---|
|  | 818 | $this->stow("#\n# $err_msg\n#\n"); | 
|---|
|  | 819 | } | 
|---|
|  | 820 |  | 
|---|
|  | 821 | // Comment in SQL-file | 
|---|
|  | 822 | $this->stow("\n\n"); | 
|---|
|  | 823 | $this->stow("#\n"); | 
|---|
|  | 824 | $this->stow('# ' . sprintf(__('Data contents of table %s','xpressme-backup'),$this->backquote($table)) . "\n"); | 
|---|
|  | 825 | $this->stow("#\n"); | 
|---|
|  | 826 | } | 
|---|
|  | 827 |  | 
|---|
|  | 828 | if(($segment == 'none') || ($segment >= 0)) { | 
|---|
|  | 829 | $defs = array(); | 
|---|
|  | 830 | $ints = array(); | 
|---|
|  | 831 | foreach ($table_structure as $struct) { | 
|---|
|  | 832 | if ( (0 === strpos($struct->Type, 'tinyint')) || | 
|---|
|  | 833 | (0 === strpos(strtolower($struct->Type), 'smallint')) || | 
|---|
|  | 834 | (0 === strpos(strtolower($struct->Type), 'mediumint')) || | 
|---|
|  | 835 | (0 === strpos(strtolower($struct->Type), 'int')) || | 
|---|
|  | 836 | (0 === strpos(strtolower($struct->Type), 'bigint')) ) { | 
|---|
|  | 837 | $defs[strtolower($struct->Field)] = ( null === $struct->Default ) ? 'NULL' : $struct->Default; | 
|---|
|  | 838 | $ints[strtolower($struct->Field)] = "1"; | 
|---|
|  | 839 | } | 
|---|
|  | 840 | } | 
|---|
|  | 841 |  | 
|---|
|  | 842 |  | 
|---|
|  | 843 | // Batch by $row_inc | 
|---|
|  | 844 |  | 
|---|
|  | 845 | if($segment == 'none') { | 
|---|
|  | 846 | $row_start = 0; | 
|---|
|  | 847 | $row_inc = ROWS_PER_SEGMENT; | 
|---|
|  | 848 | } else { | 
|---|
|  | 849 | $row_start = $segment * ROWS_PER_SEGMENT; | 
|---|
|  | 850 | $row_inc = ROWS_PER_SEGMENT; | 
|---|
|  | 851 | } | 
|---|
|  | 852 |  | 
|---|
|  | 853 | do { | 
|---|
|  | 854 | // don't include extra stuff, if so requested | 
|---|
|  | 855 | $excs = (array) get_option('xpressme_backup_excs'); | 
|---|
|  | 856 |  | 
|---|
|  | 857 | $where = ''; | 
|---|
|  | 858 | if ( is_array($excs['spam'] ) && in_array($table, $excs['spam']) ) { | 
|---|
|  | 859 | $where = ' WHERE comment_approved != "spam"'; | 
|---|
|  | 860 | } elseif ( is_array($excs['revisions'] ) && in_array($table, $excs['revisions']) ) { | 
|---|
|  | 861 | $where = ' WHERE post_type != "revision"'; | 
|---|
|  | 862 | } | 
|---|
|  | 863 |  | 
|---|
|  | 864 | if ( !ini_get('safe_mode')) @set_time_limit(15*60); | 
|---|
|  | 865 | $table_data = $wpdb->get_results("SELECT * FROM $table $where LIMIT {$row_start}, {$row_inc}", ARRAY_A); | 
|---|
|  | 866 |  | 
|---|
|  | 867 | $entries = 'INSERT INTO ' . $this->backquote($table) . ' VALUES ('; | 
|---|
|  | 868 | //    \x08\\x09, not required | 
|---|
|  | 869 | $search = array("\x00", "\x0a", "\x0d", "\x1a"); | 
|---|
|  | 870 | $replace = array('\0', '\n', '\r', '\Z'); | 
|---|
|  | 871 | if($table_data) { | 
|---|
|  | 872 | foreach ($table_data as $row) { | 
|---|
|  | 873 | $values = array(); | 
|---|
|  | 874 | foreach ($row as $key => $value) { | 
|---|
|  | 875 | if ($ints[strtolower($key)]) { | 
|---|
|  | 876 | // make sure there are no blank spots in the insert syntax, | 
|---|
|  | 877 | // yet try to avoid quotation marks around integers | 
|---|
|  | 878 | $value = ( null === $value || '' === $value) ? $defs[strtolower($key)] : $value; | 
|---|
|  | 879 | $values[] = ( '' === $value ) ? "''" : $value; | 
|---|
|  | 880 | } else { | 
|---|
|  | 881 | $values[] = "'" . str_replace($search, $replace, $this->sql_addslashes($value)) . "'"; | 
|---|
|  | 882 | } | 
|---|
|  | 883 | } | 
|---|
|  | 884 | $this->stow(" \n" . $entries . implode(', ', $values) . ');'); | 
|---|
|  | 885 | } | 
|---|
|  | 886 | $row_start += $row_inc; | 
|---|
|  | 887 | } | 
|---|
|  | 888 | } while((count($table_data) > 0) and ($segment=='none')); | 
|---|
|  | 889 | } | 
|---|
|  | 890 |  | 
|---|
|  | 891 | if(($segment == 'none') || ($segment < 0)) { | 
|---|
|  | 892 | // Create footer/closing comment in SQL-file | 
|---|
|  | 893 | $this->stow("\n"); | 
|---|
|  | 894 | $this->stow("#\n"); | 
|---|
|  | 895 | $this->stow("# " . sprintf(__('End of data contents of table %s','xpressme-backup'),$this->backquote($table)) . "\n"); | 
|---|
|  | 896 | $this->stow("# --------------------------------------------------------\n"); | 
|---|
|  | 897 | $this->stow("\n"); | 
|---|
|  | 898 | } | 
|---|
|  | 899 | } // end backup_table() | 
|---|
|  | 900 |  | 
|---|
|  | 901 | function db_backup($core_tables, $other_tables) { | 
|---|
|  | 902 | global $table_prefix, $wpdb; | 
|---|
|  | 903 |  | 
|---|
|  | 904 | if (is_writable($this->backup_dir)) { | 
|---|
|  | 905 | $this->fp = $this->open($this->backup_dir . $this->backup_filename); | 
|---|
|  | 906 | if(!$this->fp) { | 
|---|
|  | 907 | $this->error(__('Could not open the backup file for writing!','xpressme-backup')); | 
|---|
|  | 908 | return false; | 
|---|
|  | 909 | } | 
|---|
|  | 910 | } else { | 
|---|
|  | 911 | $this->error(__('The backup directory is not writeable!','xpressme-backup')); | 
|---|
|  | 912 | return false; | 
|---|
|  | 913 | } | 
|---|
|  | 914 |  | 
|---|
|  | 915 | //Begin new backup of MySql | 
|---|
|  | 916 | $this->stow("# " . __('WordPress MySQL database backup','xpressme-backup') . "\n"); | 
|---|
|  | 917 | $this->stow("#\n"); | 
|---|
|  | 918 | $this->stow("# " . sprintf(__('Generated: %s','xpressme-backup'),date("l j. F Y H:i T")) . "\n"); | 
|---|
|  | 919 | $this->stow("# " . sprintf(__('Hostname: %s','xpressme-backup'),DB_HOST) . "\n"); | 
|---|
|  | 920 | $this->stow("# " . sprintf(__('Database: %s','xpressme-backup'),$this->backquote(DB_NAME)) . "\n"); | 
|---|
|  | 921 | $this->stow("# --------------------------------------------------------\n"); | 
|---|
|  | 922 |  | 
|---|
|  | 923 | if ( (is_array($other_tables)) && (count($other_tables) > 0) ) | 
|---|
|  | 924 | $tables = array_merge($core_tables, $other_tables); | 
|---|
|  | 925 | else | 
|---|
|  | 926 | $tables = $core_tables; | 
|---|
|  | 927 |  | 
|---|
|  | 928 | foreach ($tables as $table) { | 
|---|
|  | 929 | // Increase script execution time-limit to 15 min for every table. | 
|---|
|  | 930 | if ( !ini_get('safe_mode')) @set_time_limit(15*60); | 
|---|
|  | 931 | // Create the SQL statements | 
|---|
|  | 932 | $this->stow("# --------------------------------------------------------\n"); | 
|---|
|  | 933 | $this->stow("# " . sprintf(__('Table: %s','xpressme-backup'),$this->backquote($table)) . "\n"); | 
|---|
|  | 934 | $this->stow("# --------------------------------------------------------\n"); | 
|---|
|  | 935 | $this->backup_table($table); | 
|---|
|  | 936 | } | 
|---|
|  | 937 |  | 
|---|
|  | 938 | $this->close($this->fp); | 
|---|
|  | 939 |  | 
|---|
|  | 940 | if (count($this->errors)) { | 
|---|
|  | 941 | return false; | 
|---|
|  | 942 | } else { | 
|---|
|  | 943 | return $this->backup_filename; | 
|---|
|  | 944 | } | 
|---|
|  | 945 |  | 
|---|
|  | 946 | } //wp_db_backup | 
|---|
|  | 947 |  | 
|---|
|  | 948 | /** | 
|---|
|  | 949 | * Sends the backed-up file via email | 
|---|
|  | 950 | * @param string $to | 
|---|
|  | 951 | * @param string $subject | 
|---|
|  | 952 | * @param string $message | 
|---|
|  | 953 | * @return bool | 
|---|
|  | 954 | */ | 
|---|
|  | 955 | function send_mail( $to, $subject, $message, $diskfile) { | 
|---|
|  | 956 | global $phpmailer; | 
|---|
|  | 957 |  | 
|---|
|  | 958 | $filename = basename($diskfile); | 
|---|
|  | 959 |  | 
|---|
|  | 960 | extract( apply_filters( 'wp_mail', compact( 'to', 'subject', 'message' ) ) ); | 
|---|
|  | 961 |  | 
|---|
|  | 962 | if ( !is_object( $phpmailer ) || ( strtolower(get_class( $phpmailer )) != 'phpmailer' ) ) { | 
|---|
|  | 963 | if ( file_exists( ABSPATH . WPINC . '/class-phpmailer.php' ) ) | 
|---|
|  | 964 | require_once ABSPATH . WPINC . '/class-phpmailer.php'; | 
|---|
|  | 965 | if ( file_exists( ABSPATH . WPINC . '/class-smtp.php' ) ) | 
|---|
|  | 966 | require_once ABSPATH . WPINC . '/class-smtp.php'; | 
|---|
|  | 967 | if ( class_exists( 'PHPMailer') ) | 
|---|
|  | 968 | $phpmailer = new PHPMailer(); | 
|---|
|  | 969 | } | 
|---|
|  | 970 |  | 
|---|
|  | 971 | // try to use phpmailer directly (WP 2.2+) | 
|---|
|  | 972 | if ( is_object( $phpmailer ) && ( strtolower(get_class( $phpmailer )) == 'phpmailer' ) ) { | 
|---|
|  | 973 |  | 
|---|
|  | 974 | // Get the site domain and get rid of www. | 
|---|
|  | 975 | $sitename = strtolower( $_SERVER['SERVER_NAME'] ); | 
|---|
|  | 976 | if ( substr( $sitename, 0, 4 ) == 'www.' ) { | 
|---|
|  | 977 | $sitename = substr( $sitename, 4 ); | 
|---|
|  | 978 | } | 
|---|
|  | 979 | $from_email = 'wordpress@' . $sitename; | 
|---|
|  | 980 | $from_name = 'WordPress'; | 
|---|
|  | 981 |  | 
|---|
|  | 982 | // Empty out the values that may be set | 
|---|
|  | 983 | $phpmailer->ClearAddresses(); | 
|---|
|  | 984 | $phpmailer->ClearAllRecipients(); | 
|---|
|  | 985 | $phpmailer->ClearAttachments(); | 
|---|
|  | 986 | $phpmailer->ClearBCCs(); | 
|---|
|  | 987 | $phpmailer->ClearCCs(); | 
|---|
|  | 988 | $phpmailer->ClearCustomHeaders(); | 
|---|
|  | 989 | $phpmailer->ClearReplyTos(); | 
|---|
|  | 990 |  | 
|---|
|  | 991 | $phpmailer->AddAddress( $to ); | 
|---|
|  | 992 | $phpmailer->AddAttachment($diskfile, $filename); | 
|---|
|  | 993 | $phpmailer->Body = $message; | 
|---|
|  | 994 | $phpmailer->CharSet = apply_filters( 'wp_mail_charset', get_bloginfo('charset') ); | 
|---|
|  | 995 | $phpmailer->From = apply_filters( 'wp_mail_from', $from_email ); | 
|---|
|  | 996 | $phpmailer->FromName = apply_filters( 'wp_mail_from_name', $from_name ); | 
|---|
|  | 997 | $phpmailer->IsMail(); | 
|---|
|  | 998 | $phpmailer->Subject = $subject; | 
|---|
|  | 999 |  | 
|---|
|  | 1000 | do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) ); | 
|---|
|  | 1001 |  | 
|---|
|  | 1002 | $result = @$phpmailer->Send(); | 
|---|
|  | 1003 |  | 
|---|
|  | 1004 | // old-style: build the headers directly | 
|---|
|  | 1005 | } else { | 
|---|
|  | 1006 | $randomish = md5(time()); | 
|---|
|  | 1007 | $boundary = "==WPBACKUP-$randomish"; | 
|---|
|  | 1008 | $fp = fopen($diskfile,"rb"); | 
|---|
|  | 1009 | $file = fread($fp,filesize($diskfile)); | 
|---|
|  | 1010 | $this->close($fp); | 
|---|
|  | 1011 |  | 
|---|
|  | 1012 | $data = chunk_split(base64_encode($file)); | 
|---|
|  | 1013 |  | 
|---|
|  | 1014 | $headers .= "MIME-Version: 1.0\n"; | 
|---|
|  | 1015 | $headers = 'From: wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME'])) . "\n"; | 
|---|
|  | 1016 | $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\n"; | 
|---|
|  | 1017 |  | 
|---|
|  | 1018 | // Add a multipart boundary above the plain message | 
|---|
|  | 1019 | $message = "This is a multi-part message in MIME format.\n\n" . | 
|---|
|  | 1020 | "--{$boundary}\n" . | 
|---|
|  | 1021 | "Content-Type: text/plain; charset=\"" . get_bloginfo('charset') . "\"\n" . | 
|---|
|  | 1022 | "Content-Transfer-Encoding: 7bit\n\n" . | 
|---|
|  | 1023 | $message . "\n\n"; | 
|---|
|  | 1024 |  | 
|---|
|  | 1025 | // Add file attachment to the message | 
|---|
|  | 1026 | $message .= "--{$boundary}\n" . | 
|---|
|  | 1027 | "Content-Type: application/octet-stream;\n" . | 
|---|
|  | 1028 | " name=\"{$filename}\"\n" . | 
|---|
|  | 1029 | "Content-Disposition: attachment;\n" . | 
|---|
|  | 1030 | " filename=\"{$filename}\"\n" . | 
|---|
|  | 1031 | "Content-Transfer-Encoding: base64\n\n" . | 
|---|
|  | 1032 | $data . "\n\n" . | 
|---|
|  | 1033 | "--{$boundary}--\n"; | 
|---|
|  | 1034 |  | 
|---|
|  | 1035 | $result = @wp_mail($to, $subject, $message, $headers); | 
|---|
|  | 1036 | } | 
|---|
|  | 1037 | return $result; | 
|---|
|  | 1038 |  | 
|---|
|  | 1039 | } | 
|---|
|  | 1040 |  | 
|---|
|  | 1041 | function deliver_backup($filename = '', $delivery = 'http', $recipient = '', $location = 'main') { | 
|---|
|  | 1042 | if ('' == $filename) { return false; } | 
|---|
|  | 1043 |  | 
|---|
|  | 1044 | $diskfile = $this->backup_dir . $filename; | 
|---|
|  | 1045 | if ('http' == $delivery) { | 
|---|
|  | 1046 | if (! file_exists($diskfile)) | 
|---|
|  | 1047 | $this->error(array('kind' => 'fatal', 'msg' => sprintf(__('File not found:%s','xpressme-backup'), " <strong>$filename</strong><br />") . '<br /><a href="' . $this->page_url . '">' . __('Return to Backup','xpressme-backup') . '</a>')); | 
|---|
|  | 1048 | header('Content-Description: File Transfer'); | 
|---|
|  | 1049 | header('Content-Type: application/octet-stream'); | 
|---|
|  | 1050 | header('Content-Length: ' . filesize($diskfile)); | 
|---|
|  | 1051 | header("Content-Disposition: attachment; filename=$filename"); | 
|---|
|  | 1052 | $success = readfile($diskfile); | 
|---|
|  | 1053 | unlink($diskfile); | 
|---|
|  | 1054 | } elseif ('smtp' == $delivery) { | 
|---|
|  | 1055 | if (! file_exists($diskfile)) { | 
|---|
|  | 1056 | $msg = sprintf(__('File %s does not exist!','xpressme-backup'), $diskfile); | 
|---|
|  | 1057 | $this->error($msg); | 
|---|
|  | 1058 | return false; | 
|---|
|  | 1059 | } | 
|---|
|  | 1060 | if (! is_email($recipient)) { | 
|---|
|  | 1061 | $recipient = get_option('admin_email'); | 
|---|
|  | 1062 | } | 
|---|
|  | 1063 | $message = sprintf(__("Attached to this email is\n   %1s\n   Size:%2s kilobytes\n",'xpressme-backup'), $filename, round(filesize($diskfile)/1024)); | 
|---|
|  | 1064 | $success = $this->send_mail($recipient, get_bloginfo('name') . ' ' . __('Database Backup','xpressme-backup'), $message, $diskfile); | 
|---|
|  | 1065 |  | 
|---|
|  | 1066 | if ( false === $success ) { | 
|---|
|  | 1067 | $msg = __('The following errors were reported:','xpressme-backup') . "\n "; | 
|---|
|  | 1068 | if ( function_exists('error_get_last') ) { | 
|---|
|  | 1069 | $err = error_get_last(); | 
|---|
|  | 1070 | $msg .= $err['message']; | 
|---|
|  | 1071 | } else { | 
|---|
|  | 1072 | $msg .= __('ERROR: The mail application has failed to deliver the backup.','xpressme-backup'); | 
|---|
|  | 1073 | } | 
|---|
|  | 1074 | $this->error(array('kind' => 'fatal', 'loc' => $location, 'msg' => $msg)); | 
|---|
|  | 1075 | } else { | 
|---|
|  | 1076 | unlink($diskfile); | 
|---|
|  | 1077 | } | 
|---|
|  | 1078 | } | 
|---|
|  | 1079 | return $success; | 
|---|
|  | 1080 | } | 
|---|
|  | 1081 |  | 
|---|
|  | 1082 | function backup_menu() { | 
|---|
| [677] | 1083 | global $table_prefix, $wpdb,$wp_version; | 
|---|
| [608] | 1084 | $feedback = ''; | 
|---|
|  | 1085 | $whoops = false; | 
|---|
|  | 1086 |  | 
|---|
|  | 1087 | // did we just do a backup?  If so, let's report the status | 
|---|
|  | 1088 | if ( $this->backup_complete ) { | 
|---|
|  | 1089 | $feedback = '<div class="updated xpressme-backup-updated"><p>' . __('Backup Successful','xpressme-backup') . '!'; | 
|---|
|  | 1090 | $file = $this->backup_file; | 
|---|
|  | 1091 | switch($_POST['deliver']) { | 
|---|
|  | 1092 | case 'http': | 
|---|
|  | 1093 | $feedback .= '<br />' . sprintf(__('Your backup file: <a href="%1s">%2s</a> should begin downloading shortly.','xpressme-backup'), WP_BACKUP_URL . "{$this->backup_file}", $this->backup_file); | 
|---|
|  | 1094 | break; | 
|---|
|  | 1095 | case 'smtp': | 
|---|
|  | 1096 | if (! is_email($_POST['backup_recipient'])) { | 
|---|
|  | 1097 | $feedback .= get_option('admin_email'); | 
|---|
|  | 1098 | } else { | 
|---|
|  | 1099 | $feedback .= $_POST['backup_recipient']; | 
|---|
|  | 1100 | } | 
|---|
|  | 1101 | $feedback = '<br />' . sprintf(__('Your backup has been emailed to %s','xpressme-backup'), $feedback); | 
|---|
|  | 1102 | break; | 
|---|
|  | 1103 | case 'none': | 
|---|
|  | 1104 | $feedback .= '<br />' . __('Your backup file has been saved on the server. If you would like to download it now, right click and select "Save As"','xpressme-backup'); | 
|---|
|  | 1105 | $feedback .= ':<br /> <a href="' . WP_BACKUP_URL . "$file\">$file</a> : " . sprintf(__('%s bytes','xpressme-backup'), filesize($this->backup_dir . $file)); | 
|---|
|  | 1106 | } | 
|---|
|  | 1107 | $feedback .= '</p></div>'; | 
|---|
|  | 1108 | } | 
|---|
|  | 1109 |  | 
|---|
|  | 1110 | // security check | 
|---|
|  | 1111 | $this->wp_secure(); | 
|---|
|  | 1112 |  | 
|---|
|  | 1113 | if (count($this->errors)) { | 
|---|
|  | 1114 | $feedback .= '<div class="updated xpressme-backup-updated error"><p><strong>' . __('The following errors were reported:','xpressme-backup') . '</strong></p>'; | 
|---|
|  | 1115 | $feedback .= '<p>' . $this->error_display( 'main', false ) . '</p>'; | 
|---|
|  | 1116 | $feedback .= "</p></div>"; | 
|---|
|  | 1117 | } | 
|---|
|  | 1118 |  | 
|---|
|  | 1119 | // did we just save options for wp-cron? | 
|---|
|  | 1120 | if ( (function_exists('wp_schedule_event') || function_exists('xpressme_cron_init')) | 
|---|
|  | 1121 | && isset($_POST['xpressme_cron_backup_options']) ) : | 
|---|
|  | 1122 | do_action('wp_db_b_update_cron_options'); | 
|---|
|  | 1123 | if ( function_exists('wp_schedule_event') ) { | 
|---|
|  | 1124 | wp_clear_scheduled_hook( 'wp_db_backup_cron' ); // unschedule previous | 
|---|
|  | 1125 | $scheds = (array) wp_get_schedules(); | 
|---|
|  | 1126 | $name = strval($_POST['xpressme_cron_schedule']); | 
|---|
|  | 1127 | $interval = ( isset($scheds[$name]['interval']) ) ? | 
|---|
|  | 1128 | (int) $scheds[$name]['interval'] : 0; | 
|---|
|  | 1129 | update_option('xpressme_cron_backup_schedule', $name, false); | 
|---|
|  | 1130 | if ( 0 !== $interval ) { | 
|---|
|  | 1131 | wp_schedule_event(time() + $interval, $name, 'wp_db_backup_cron'); | 
|---|
|  | 1132 | } | 
|---|
|  | 1133 | } | 
|---|
|  | 1134 | else { | 
|---|
|  | 1135 | update_option('xpressme_cron_backup_schedule', intval($_POST['cron_schedule']), false); | 
|---|
|  | 1136 | } | 
|---|
|  | 1137 | update_option('xpressme_cron_backup_tables', $_POST['xpressme_cron_backup_tables']); | 
|---|
|  | 1138 | if (is_email($_POST['cron_backup_recipient'])) { | 
|---|
|  | 1139 | update_option('xpressme_cron_backup_recipient', $_POST['cron_backup_recipient'], false); | 
|---|
|  | 1140 | } | 
|---|
|  | 1141 | $feedback .= '<div class="updated xpressme-backup-updated"><p>' . __('Scheduled Backup Options Saved!','xpressme-backup') . '</p></div>'; | 
|---|
|  | 1142 | endif; | 
|---|
|  | 1143 |  | 
|---|
|  | 1144 | $other_tables = array(); | 
|---|
|  | 1145 | $also_backup = array(); | 
|---|
|  | 1146 |  | 
|---|
|  | 1147 | // Get complete db table list | 
|---|
|  | 1148 | $all_tables = $wpdb->get_results("SHOW TABLES", ARRAY_N); | 
|---|
|  | 1149 | $all_tables = array_map(create_function('$a', 'return $a[0];'), $all_tables); | 
|---|
|  | 1150 | // Get list of WP tables that actually exist in this DB (for 1.6 compat!) | 
|---|
|  | 1151 | $wp_backup_default_tables = array_intersect($all_tables, $this->core_table_names); | 
|---|
|  | 1152 | // Get list of non-WP tables | 
|---|
|  | 1153 | $other_tables = array_diff($all_tables, $wp_backup_default_tables); | 
|---|
|  | 1154 |  | 
|---|
|  | 1155 | if ('' != $feedback) | 
|---|
|  | 1156 | echo $feedback; | 
|---|
|  | 1157 |  | 
|---|
|  | 1158 | if ( ! $this->wp_secure() ) | 
|---|
|  | 1159 | return; | 
|---|
|  | 1160 |  | 
|---|
|  | 1161 | // Give the new dirs the same perms as wp-content. | 
|---|
|  | 1162 | //              $stat = stat( ABSPATH . 'wp-content' ); | 
|---|
|  | 1163 | //              $dir_perms = $stat['mode'] & 0000777; // Get the permission bits. | 
|---|
|  | 1164 | $dir_perms = '0777'; | 
|---|
|  | 1165 |  | 
|---|
|  | 1166 | // the file doesn't exist and can't create it | 
|---|
|  | 1167 | if ( ! file_exists($this->backup_dir) && ! @mkdir($this->backup_dir) ) { | 
|---|
|  | 1168 | ?><div class="updated xpressme-backup-updated error"><p><?php _e('WARNING: Your backup directory does <strong>NOT</strong> exist, and we cannot create it.','xpressme-backup'); ?></p> | 
|---|
|  | 1169 | <p><?php printf(__('Using your FTP client, try to create the backup directory yourself: %s', 'xpressme-backup'), '<code>' . $this->backup_dir . '</code>'); ?></p></div><?php | 
|---|
|  | 1170 | $whoops = true; | 
|---|
|  | 1171 | // not writable due to write permissions | 
|---|
|  | 1172 | } elseif ( !is_writable($this->backup_dir) && ! @chmod($this->backup_dir, $dir_perms) ) { | 
|---|
|  | 1173 | ?><div class="updated xpressme-backup-updated error"><p><?php _e('WARNING: Your backup directory is <strong>NOT</strong> writable! We cannot create the backup files.','xpressme-backup'); ?></p> | 
|---|
|  | 1174 | <p><?php printf(__('Using your FTP client, try to set the backup directory’s write permission to %1$s or %2$s: %3$s', 'xpressme-backup'), '<code>777</code>', '<code>a+w</code>', '<code>' . $this->backup_dir . '</code>'); ?> | 
|---|
|  | 1175 | </p></div><?php | 
|---|
|  | 1176 | $whoops = true; | 
|---|
|  | 1177 | } else { | 
|---|
|  | 1178 | $this->fp = $this->open($this->backup_dir . 'test' ); | 
|---|
|  | 1179 | if( $this->fp ) { | 
|---|
|  | 1180 | $this->close($this->fp); | 
|---|
|  | 1181 | @unlink($this->backup_dir . 'test' ); | 
|---|
|  | 1182 | // the directory is not writable probably due to safe mode | 
|---|
|  | 1183 | } else { | 
|---|
|  | 1184 | ?><div class="updated xpressme-backup-updated error"><p><?php _e('WARNING: Your backup directory is <strong>NOT</strong> writable! We cannot create the backup files.','xpressme-backup'); ?></p><?php | 
|---|
|  | 1185 | if( ini_get('safe_mode') ){ | 
|---|
|  | 1186 | ?><p><?php _e('This problem seems to be caused by your server’s <code>safe_mode</code> file ownership restrictions, which limit what files web applications like WordPress can create.', 'xpressme-backup'); ?></p><?php | 
|---|
|  | 1187 | } | 
|---|
|  | 1188 | ?><?php printf(__('You can try to correct this problem by using your FTP client to delete and then re-create the backup directory: %s', 'xpressme-backup'), '<code>' . $this->backup_dir . '</code>'); | 
|---|
|  | 1189 | ?></div><?php | 
|---|
|  | 1190 | $whoops = true; | 
|---|
|  | 1191 | } | 
|---|
|  | 1192 | } | 
|---|
|  | 1193 |  | 
|---|
|  | 1194 |  | 
|---|
|  | 1195 |  | 
|---|
|  | 1196 | if ( !file_exists($this->backup_dir . 'index.php') ) | 
|---|
|  | 1197 | @ touch($this->backup_dir . 'index.php'); | 
|---|
|  | 1198 | ?><div class='wrap'> | 
|---|
|  | 1199 | <h2><?php _e('Backup','xpressme-backup') ?></h2> | 
|---|
|  | 1200 | <form method="post" action=""> | 
|---|
|  | 1201 | <?php if ( function_exists('wp_nonce_field') ) wp_nonce_field($this->referer_check_key); ?> | 
|---|
|  | 1202 | <fieldset class="options"><legend><?php _e('Tables','xpressme-backup') ?></legend> | 
|---|
|  | 1203 | <table align="center" cellspacing="5" cellpadding="5"> | 
|---|
|  | 1204 | <tr><td width="50%" align="left" class="alternate" valign="top"> | 
|---|
|  | 1205 | <div class="tables-list core-tables alternate"> | 
|---|
|  | 1206 | <h4><?php _e('These core WordPress tables will always be backed up:','xpressme-backup') ?></h4><ul><?php | 
|---|
|  | 1207 | $excs = (array) get_option('xpressme_backup_excs'); | 
|---|
|  | 1208 |  | 
|---|
|  | 1209 | foreach ($wp_backup_default_tables as $table) { | 
|---|
|  | 1210 | if ( $table == $wpdb->comments ) { | 
|---|
|  | 1211 | $checked = ( isset($excs['spam']) && is_array($excs['spam'] ) && in_array($table, $excs['spam']) ) ? ' checked=\'checked\'' : ''; | 
|---|
|  | 1212 | echo "<li><input type='hidden' name='core_tables[]' value='$table' /><code>$table</code> <span class='instructions'> <input type='checkbox' name='exclude-spam[]' value='$table' $checked /> " . __('Exclude spam comments', 'xpressme-backup') . '</span></li>'; | 
|---|
|  | 1213 | } elseif ( function_exists('wp_get_post_revisions') && $table == $wpdb->posts ) { | 
|---|
|  | 1214 | $checked = ( isset($excs['revisions']) && is_array($excs['revisions'] ) && in_array($table, $excs['revisions']) ) ? ' checked=\'checked\'' : ''; | 
|---|
|  | 1215 | echo "<li><input type='hidden' name='core_tables[]' value='$table' /><code>$table</code> <span class='instructions'> <input type='checkbox' name='exclude-revisions[]' value='$table' $checked /> " . __('Exclude post revisions', 'xpressme-backup') . '</span></li>'; | 
|---|
|  | 1216 | } else { | 
|---|
|  | 1217 | echo "<li><input type='hidden' name='core_tables[]' value='$table' /><code>$table</code></li>"; | 
|---|
|  | 1218 | } | 
|---|
|  | 1219 | } | 
|---|
|  | 1220 | ?></ul> | 
|---|
|  | 1221 | </div> | 
|---|
|  | 1222 | </td><td width="50%" align="left" valign="top"> | 
|---|
|  | 1223 | <div class="tables-list extra-tables" id="extra-tables-list"> | 
|---|
|  | 1224 | <?php | 
|---|
|  | 1225 | if (count($other_tables) > 0) { | 
|---|
|  | 1226 | $select_all = __('Select all','xpressme-backup'); | 
|---|
|  | 1227 | $select_none = __('Select none','xpressme-backup'); | 
|---|
|  | 1228 | ?> | 
|---|
|  | 1229 | <h4><?php _e('You may choose to include any of the following tables:','xpressme-backup'); ?></h4> | 
|---|
|  | 1230 | <ul> | 
|---|
|  | 1231 | <script type="text/javascript"> | 
|---|
|  | 1232 | //<![CDATA[ | 
|---|
|  | 1233 | var wpdbBackup = function() {}; | 
|---|
|  | 1234 | (function(b){ | 
|---|
|  | 1235 | var n = function(c) { | 
|---|
|  | 1236 | var p = document.getElementsByTagName("input"); | 
|---|
|  | 1237 | for(var i=0;i<p.length;i++) | 
|---|
|  | 1238 | if('other_tables[]' == p[i].getAttribute('name')) | 
|---|
|  | 1239 | p[i].checked = c; | 
|---|
|  | 1240 | } | 
|---|
|  | 1241 | b.a = function() { n(true) } | 
|---|
|  | 1242 | b.n = function() { n(false) } | 
|---|
|  | 1243 |  | 
|---|
|  | 1244 | document.write('<p><a href="javascript:void(0)" onclick="wpdbBackup.a()"><?php echo $select_all ?></a> / <a href="javascript:void(0)" onclick="wpdbBackup.n()"><?php echo $select_none ?></a></p>'); | 
|---|
|  | 1245 | })(wpdbBackup) | 
|---|
|  | 1246 | //]]> | 
|---|
|  | 1247 | </script> | 
|---|
|  | 1248 |  | 
|---|
|  | 1249 | <?php | 
|---|
|  | 1250 | foreach ($other_tables as $table) { | 
|---|
|  | 1251 | ?> | 
|---|
|  | 1252 | <li><label><input type="checkbox" name="other_tables[]" value="<?php echo $table; ?>" /> <code><?php echo $table; ?></code></label> | 
|---|
|  | 1253 | <?php | 
|---|
|  | 1254 | } | 
|---|
|  | 1255 | ?></ul><?php | 
|---|
|  | 1256 | } | 
|---|
|  | 1257 | ?></div> | 
|---|
|  | 1258 | </td></tr></table> | 
|---|
|  | 1259 | </fieldset> | 
|---|
|  | 1260 |  | 
|---|
|  | 1261 | <fieldset class="options"> | 
|---|
|  | 1262 | <legend><?php _e('Backup Options','xpressme-backup'); ?></legend> | 
|---|
|  | 1263 | <p><?php  _e('What to do with the backup file:','xpressme-backup'); ?></p> | 
|---|
|  | 1264 | <ul> | 
|---|
|  | 1265 | <li><label for="do_save"> | 
|---|
|  | 1266 | <input type="radio" id="do_save" name="deliver" value="none" style="border:none;" /> | 
|---|
|  | 1267 | <?php _e('Save to server','xpressme-backup'); | 
|---|
|  | 1268 | echo " (<code>" . $this->backup_dir . "</code>)"; ?> | 
|---|
|  | 1269 | </label></li> | 
|---|
|  | 1270 | <li><label for="do_download"> | 
|---|
|  | 1271 | <input type="radio" checked="checked" id="do_download" name="deliver" value="http" style="border:none;" /> | 
|---|
|  | 1272 | <?php _e('Download to your computer','xpressme-backup'); ?> | 
|---|
|  | 1273 | </label></li> | 
|---|
|  | 1274 | <li><label for="do_email"> | 
|---|
|  | 1275 | <input type="radio" name="deliver" id="do_email" value="smtp" style="border:none;" /> | 
|---|
|  | 1276 | <?php _e('Email backup to:','xpressme-backup'); ?> | 
|---|
|  | 1277 | <input type="text" name="backup_recipient" size="20" value="<?php echo get_option('admin_email'); ?>" /> | 
|---|
|  | 1278 | </label></li> | 
|---|
|  | 1279 | </ul> | 
|---|
| [673] | 1280 | <p><?php  _e('Data conversion option.','xpressme-backup'); ?></p> | 
|---|
| [608] | 1281 | <ul> | 
|---|
|  | 1282 | <?php | 
|---|
| [677] | 1283 | $extras_option = (array) get_option('xpressme_backup_extras_option'); | 
|---|
| [608] | 1284 | if(WPLANG == 'ja_EUC'){ | 
|---|
|  | 1285 | echo '<li><label for="do_euc_to_utf8">'; | 
|---|
|  | 1286 | if($this->is_mbstring()){ | 
|---|
| [677] | 1287 | if ($extras_option['do_euc_to_utf8']) $checked = 'checked'; else $checked = ''; | 
|---|
|  | 1288 | echo    '<input type="checkbox" name="do_euc_to_utf8" id="do_euc_to_utf8" value="1" ' .$checked .' />'; | 
|---|
| [608] | 1289 | echo __('Converte EUC-JP to UTF-8','xpressme-backup'); | 
|---|
|  | 1290 | } else { | 
|---|
| [677] | 1291 | echo    '<input type="checkbox" name="do_euc_to_utf8" id="do_euc_to_utf8" value="0" disabled="1"/>'; | 
|---|
| [608] | 1292 | echo __('Converte EUC-JP to UTF-8','xpressme-backup'); | 
|---|
|  | 1293 | echo ' (<span style="color:#ff0000">' . __('The server used does not support the mb_convert_encoding() function.','xpressme-backup') . '</span>)'; | 
|---|
|  | 1294 | } | 
|---|
|  | 1295 | echo '</label></li>'; | 
|---|
|  | 1296 | } else { | 
|---|
| [677] | 1297 | echo '<input type="hidden" name="do_euc_to_utf8" id="do_euc_to_utf8" value="0" />'; | 
|---|
| [608] | 1298 | } | 
|---|
| [677] | 1299 | if($wp_version =='2.0.11-ME'){ | 
|---|
|  | 1300 | echo '<li><label for="set_default_role">'; | 
|---|
|  | 1301 | if ($extras_option['set_default_role']) $checked = 'checked'; else $checked = ''; | 
|---|
|  | 1302 | echo '<input type="checkbox" name="set_default_role" id="set_default_role" value="1" '.$checked . ' />'; | 
|---|
|  | 1303 | echo __('Changes from the user roles name of WordPressME to the user roles name of Wordpress.','xpressme-backup'); | 
|---|
|  | 1304 | echo '</label></li>'; | 
|---|
|  | 1305 | } else { | 
|---|
|  | 1306 | echo '<input type="hidden" name="set_default_role" id="set_default_role" value="0" />'; | 
|---|
|  | 1307 | } | 
|---|
|  | 1308 |  | 
|---|
|  | 1309 | echo '<li><label for="rename_prefix">'; | 
|---|
|  | 1310 | if ($extras_option['do_rename_prefix']) $checked = 'checked'; else $checked = ''; | 
|---|
|  | 1311 | echo '<input type="checkbox" name="do_rename_prefix" id="do_rename_prefix" value="1" '. $checked . ' />'; | 
|---|
|  | 1312 | echo __('Rename DB Prefix','xpressme-backup'); | 
|---|
|  | 1313 | echo '<input type="text" name="before_prefix" size="20" value="'.$table_prefix . '" readonly />'; | 
|---|
|  | 1314 | echo __('to','xpressme-backup'); | 
|---|
|  | 1315 | if (empty($extras_option['after_prefix'])){ | 
|---|
|  | 1316 | echo '<input type="text" name="after_prefix" size="20" value="'. $table_prefix . '" />'; | 
|---|
|  | 1317 | } else { | 
|---|
|  | 1318 | echo '<input type="text" name="after_prefix" size="20" value="'. $extras_option['after_prefix'] . '" />'; | 
|---|
|  | 1319 | } | 
|---|
|  | 1320 | echo '</label></li>'; | 
|---|
|  | 1321 | echo '<li><label for="change_uri">'; | 
|---|
|  | 1322 | if ($extras_option['do_change_uri']) $checked = 'checked'; else $checked = ''; | 
|---|
|  | 1323 | echo '<input type="checkbox" name="do_change_uri" id="do_change_uri" value="1" '. $checked . ' />'; | 
|---|
|  | 1324 | $site_uri = get_option('siteurl'); | 
|---|
|  | 1325 | echo __('Change URL','xpressme-backup'); | 
|---|
|  | 1326 | echo '<div style="padding-left: 20px;">'; | 
|---|
|  | 1327 | echo '<input type="text" name="before_uri" size="50" value="' . $site_uri . '" readonly /><br />'; | 
|---|
|  | 1328 | echo __('to','xpressme-backup') . '<br />'; | 
|---|
|  | 1329 | echo '<input type="text" name="after_uri" size="50" value="'. $extras_option['after_uri'] . '" />'; | 
|---|
|  | 1330 | echo '</div>'; | 
|---|
|  | 1331 | echo '</label></li>'; | 
|---|
|  | 1332 | echo '<li><label for="del_active_plugin">'; | 
|---|
|  | 1333 | if ($extras_option['del_active_plugin']) $checked = 'checked'; else $checked = ''; | 
|---|
|  | 1334 |  | 
|---|
|  | 1335 | echo '<input type="checkbox" name="del_active_plugin" id="del_active_plugin" value="1" '. $checked . ' />'; | 
|---|
|  | 1336 | echo __('In the backup data,all plug-ins are Deactivate state.','xpressme-backup'); | 
|---|
|  | 1337 | echo '</label></li>'; | 
|---|
| [608] | 1338 | ?> | 
|---|
|  | 1339 | </ul> | 
|---|
| [673] | 1340 |  | 
|---|
| [608] | 1341 | <?php if ( ! $whoops ) : ?> | 
|---|
|  | 1342 | <input type="hidden" name="do_backup" id="do_backup" value="backup" /> | 
|---|
|  | 1343 | <p class="submit"> | 
|---|
|  | 1344 | <input type="submit" name="submit" onclick="document.getElementById('do_backup').value='fragments';" value="<?php _e('Backup now!','xpressme-backup'); ?>" /> | 
|---|
|  | 1345 | </p> | 
|---|
|  | 1346 | <?php else : ?> | 
|---|
|  | 1347 | <div class="updated xpressme-backup-updated error"><p><?php _e('WARNING: Your backup directory is <strong>NOT</strong> writable!','xpressme-backup'); ?></p></div> | 
|---|
|  | 1348 | <?php endif; // ! whoops ?> | 
|---|
|  | 1349 | </fieldset> | 
|---|
|  | 1350 | <?php do_action('wp_db_b_backup_opts'); ?> | 
|---|
|  | 1351 | </form> | 
|---|
|  | 1352 |  | 
|---|
|  | 1353 | <?php | 
|---|
|  | 1354 | // this stuff only displays if some sort of wp-cron is available | 
|---|
|  | 1355 | $cron = ( function_exists('wp_schedule_event') ) ? true : false; // wp-cron in WP 2.1+ | 
|---|
|  | 1356 | $cron_old = ( function_exists('xpressme_cron_init') && ! $cron ) ? true : false; // wp-cron plugin by Skippy | 
|---|
|  | 1357 | if ( $cron_old || $cron ) : | 
|---|
|  | 1358 | echo '<fieldset class="options"><legend>' . __('Scheduled Backup','xpressme-backup') . '</legend>'; | 
|---|
|  | 1359 | $datetime = get_option('date_format') . ' ' . get_option('time_format'); | 
|---|
|  | 1360 | if ( $cron ) : | 
|---|
|  | 1361 | $next_cron = wp_next_scheduled('wp_db_backup_cron'); | 
|---|
|  | 1362 | if ( ! empty( $next_cron ) ) : | 
|---|
|  | 1363 | ?> | 
|---|
|  | 1364 | <p id="backup-time-wrap"> | 
|---|
|  | 1365 | <?php printf(__('Next Backup: %s','xpressme-backup'), '<span id="next-backup-time">' . gmdate($datetime, $next_cron + (get_option('gmt_offset') * 3600)) . '</span>'); ?> | 
|---|
|  | 1366 | </p> | 
|---|
|  | 1367 | <?php | 
|---|
|  | 1368 | endif; | 
|---|
|  | 1369 | elseif ( $cron_old ) : | 
|---|
|  | 1370 | ?><p><?php printf(__('Last WP-Cron Daily Execution: %s','xpressme-backup'), gmdate($datetime, get_option('xpressme_cron_daily_lastrun') + (get_option('gmt_offset') * 3600))); ?><br /><?php | 
|---|
|  | 1371 | printf(__('Next WP-Cron Daily Execution: %s','xpressme-backup'), gmdate($datetime, (get_option('xpressme_cron_daily_lastrun') + (get_option('gmt_offset') * 3600) + 86400))); ?></p><?php | 
|---|
|  | 1372 | endif; | 
|---|
|  | 1373 | ?><form method="post" action=""> | 
|---|
|  | 1374 | <?php if ( function_exists('wp_nonce_field') ) wp_nonce_field($this->referer_check_key); ?> | 
|---|
|  | 1375 | <div class="tables-list"> | 
|---|
|  | 1376 | <h4><?php _e('Schedule: ','xpressme-backup'); ?></h4> | 
|---|
|  | 1377 | <?php | 
|---|
|  | 1378 | if ( $cron_old ) : | 
|---|
|  | 1379 | $xpressme_cron_backup_schedule = get_option('xpressme_cron_backup_schedule'); | 
|---|
|  | 1380 | $schedule = array(0 => __('None','xpressme-backup'), 1 => __('Daily','xpressme-backup')); | 
|---|
|  | 1381 | foreach ($schedule as $value => $name) { | 
|---|
|  | 1382 | echo ' <input type="radio" style="border:none;" name="cron_schedule"'; | 
|---|
|  | 1383 | if ($xpressme_cron_backup_schedule == $value) { | 
|---|
|  | 1384 | echo ' checked="checked" '; | 
|---|
|  | 1385 | } | 
|---|
|  | 1386 | echo 'value="' . $value . '" /> ' . $name; | 
|---|
|  | 1387 | } | 
|---|
|  | 1388 | elseif ( $cron ) : | 
|---|
|  | 1389 | echo apply_filters('wp_db_b_schedule_choices', wp_get_schedules() ); | 
|---|
|  | 1390 | endif; | 
|---|
|  | 1391 | $cron_recipient = get_option('xpressme_cron_backup_recipient'); | 
|---|
|  | 1392 | if (! is_email($cron_recipient)) { | 
|---|
|  | 1393 | $cron_recipient = get_option('admin_email'); | 
|---|
|  | 1394 | } | 
|---|
|  | 1395 | $cron_recipient_input = '<p><label for="cron_backup_recipient">' . __('Email backup to:','xpressme-backup') . ' <input type="text" name="cron_backup_recipient" id="cron_backup_recipient" size="20" value="' . $cron_recipient . '" /></label></p>'; | 
|---|
|  | 1396 | echo apply_filters('wp_db_b_cron_recipient_input', $cron_recipient_input); | 
|---|
|  | 1397 | echo '<p class="submit"><input type="submit" name="submit" value="' . __('Schedule backup','xpressme-backup') . '" /></p>'; | 
|---|
|  | 1398 | echo '</div>'; | 
|---|
|  | 1399 | $cron_tables = get_option('xpressme_cron_backup_tables'); | 
|---|
|  | 1400 | if (! is_array($cron_tables)) { | 
|---|
|  | 1401 | $cron_tables = array(); | 
|---|
|  | 1402 | } | 
|---|
|  | 1403 | if (count($other_tables) > 0) { | 
|---|
|  | 1404 | echo '<div class="tables-list alternate" id="include-tables-list">'; | 
|---|
|  | 1405 | echo '<h4>' . __('Tables to include in the scheduled backup:','xpressme-backup') . '</h4><ul>'; | 
|---|
|  | 1406 | foreach ($other_tables as $table) { | 
|---|
|  | 1407 | echo '<li><input type="checkbox" '; | 
|---|
|  | 1408 | if (in_array($table, $cron_tables)) { | 
|---|
|  | 1409 | echo 'checked="checked" '; | 
|---|
|  | 1410 | } | 
|---|
|  | 1411 | echo "name='xpressme_cron_backup_tables[]' value='{$table}' /> <code>{$table}</code></li>"; | 
|---|
|  | 1412 | } | 
|---|
|  | 1413 | echo '</ul></div>'; | 
|---|
|  | 1414 | } | 
|---|
|  | 1415 | echo '<input type="hidden" name="xpressme_cron_backup_options" value="SET" /></form>'; | 
|---|
|  | 1416 | echo '</fieldset>'; | 
|---|
|  | 1417 | endif; // end of wp_cron (legacy) section | 
|---|
|  | 1418 |  | 
|---|
|  | 1419 | echo '</div><!-- .wrap -->'; | 
|---|
|  | 1420 |  | 
|---|
|  | 1421 | } // end wp_backup_menu() | 
|---|
|  | 1422 |  | 
|---|
|  | 1423 | function get_sched() { | 
|---|
|  | 1424 | $options = array_keys( (array) wp_get_schedules() ); | 
|---|
|  | 1425 | $freq = get_option('xpressme_cron_backup_schedule'); | 
|---|
|  | 1426 | $freq = ( in_array( $freq , $options ) ) ? $freq : 'never'; | 
|---|
|  | 1427 | return $freq; | 
|---|
|  | 1428 | } | 
|---|
|  | 1429 |  | 
|---|
|  | 1430 | function schedule_choices($schedule) { // create the cron menu based on the schedule | 
|---|
|  | 1431 | $xpressme_cron_backup_schedule = $this->get_sched(); | 
|---|
|  | 1432 | $next_cron = wp_next_scheduled('wp_db_backup_cron'); | 
|---|
|  | 1433 | $xpressme_cron_backup_schedule = ( empty( $next_cron ) ) ? 'never' : $xpressme_cron_backup_schedule; | 
|---|
|  | 1434 | $sort = array(); | 
|---|
|  | 1435 | foreach ( (array) $schedule as $key => $value ) $sort[$key] = $value['interval']; | 
|---|
|  | 1436 | asort( $sort ); | 
|---|
|  | 1437 | $schedule_sorted = array(); | 
|---|
|  | 1438 | foreach ( (array) $sort as $key => $value ) $schedule_sorted[$key] = $schedule[$key]; | 
|---|
|  | 1439 | $menu = '<ul>'; | 
|---|
|  | 1440 | $schedule = array_merge( array( 'never' => array( 'interval' => 0, 'display' => __('Never','xpressme-backup') ) ), | 
|---|
|  | 1441 | (array) $schedule_sorted ); | 
|---|
|  | 1442 | foreach ( $schedule as $name => $settings) { | 
|---|
|  | 1443 | $interval = (int) $settings['interval']; | 
|---|
|  | 1444 | if ( 0 == $interval && ! 'never' == $name ) continue; | 
|---|
|  | 1445 | $display = ( ! '' == $settings['display'] ) ? $settings['display'] : sprintf(__('%s seconds','xpressme-backup'),$interval); | 
|---|
|  | 1446 | $menu .= "<li><input type='radio' name='xpressme_cron_schedule' style='border:none;' "; | 
|---|
|  | 1447 | if ($xpressme_cron_backup_schedule == $name) { | 
|---|
|  | 1448 | $menu .= " checked='checked' "; | 
|---|
|  | 1449 | } | 
|---|
|  | 1450 | $menu .= "value='$name' /> $display</li>"; | 
|---|
|  | 1451 | } | 
|---|
|  | 1452 | $menu .= '</ul>'; | 
|---|
|  | 1453 | return $menu; | 
|---|
|  | 1454 | } // end schedule_choices() | 
|---|
|  | 1455 |  | 
|---|
|  | 1456 | function wp_cron_daily() { // for legacy cron plugin | 
|---|
|  | 1457 | $schedule = intval(get_option('xpressme_cron_backup_schedule')); | 
|---|
|  | 1458 | // If scheduled backup is disabled | 
|---|
|  | 1459 | if (0 == $schedule) | 
|---|
|  | 1460 | return; | 
|---|
|  | 1461 | else return $this->cron_backup(); | 
|---|
|  | 1462 | } | 
|---|
|  | 1463 |  | 
|---|
|  | 1464 | function cron_backup() { | 
|---|
|  | 1465 | global $table_prefix, $wpdb; | 
|---|
|  | 1466 | $all_tables = $wpdb->get_results("SHOW TABLES", ARRAY_N); | 
|---|
|  | 1467 | $all_tables = array_map(create_function('$a', 'return $a[0];'), $all_tables); | 
|---|
|  | 1468 | $core_tables = array_intersect($all_tables, $this->core_table_names); | 
|---|
|  | 1469 | $other_tables = get_option('xpressme_cron_backup_tables'); | 
|---|
|  | 1470 | $recipient = get_option('xpressme_cron_backup_recipient'); | 
|---|
|  | 1471 | $backup_file = $this->db_backup($core_tables, $other_tables); | 
|---|
|  | 1472 | if (false !== $backup_file) | 
|---|
|  | 1473 | return $this->deliver_backup($backup_file, 'smtp', $recipient, 'main'); | 
|---|
|  | 1474 | else return false; | 
|---|
|  | 1475 | } | 
|---|
|  | 1476 |  | 
|---|
|  | 1477 | function add_sched_options($sched) { | 
|---|
|  | 1478 | $sched['weekly'] = array('interval' => 604800, 'display' => __('Once Weekly','xpressme-backup')); | 
|---|
|  | 1479 | return $sched; | 
|---|
|  | 1480 | } | 
|---|
|  | 1481 |  | 
|---|
|  | 1482 | /** | 
|---|
|  | 1483 | * Checks that WordPress has sufficient security measures | 
|---|
|  | 1484 | * @param string $kind | 
|---|
|  | 1485 | * @return bool | 
|---|
|  | 1486 | */ | 
|---|
|  | 1487 | function wp_secure($kind = 'warn', $loc = 'main') { | 
|---|
|  | 1488 | global $wp_version; | 
|---|
|  | 1489 |  | 
|---|
|  | 1490 | if ( function_exists('wp_verify_nonce') ) return true; | 
|---|
|  | 1491 | else { | 
|---|
|  | 1492 | $this->error(array('kind' => $kind, 'loc' => $loc, 'msg' => sprintf(__('Your WordPress version, %1s, lacks important security features without which it is unsafe to use the WP-DB-Backup plugin.  Hence, this plugin is automatically disabled.  Please consider <a href="%2s">upgrading WordPress</a> to a more recent version.','xpressme-backup'),$wp_version,'http://wordpress.org/download/'))); | 
|---|
|  | 1493 | return false; | 
|---|
|  | 1494 | } | 
|---|
|  | 1495 |  | 
|---|
|  | 1496 | } | 
|---|
|  | 1497 |  | 
|---|
|  | 1498 | /** | 
|---|
|  | 1499 | * Checks that the user has sufficient permission to backup | 
|---|
|  | 1500 | * @param string $loc | 
|---|
|  | 1501 | * @return bool | 
|---|
|  | 1502 | */ | 
|---|
|  | 1503 | function can_user_backup($loc = 'main') { | 
|---|
|  | 1504 | $can = false; | 
|---|
|  | 1505 | // make sure WPMU users are site admins, not ordinary admins | 
|---|
|  | 1506 | if ( function_exists('is_site_admin') && ! is_site_admin() ) | 
|---|
|  | 1507 | return false; | 
|---|
|  | 1508 | if ( ( $this->wp_secure('fatal', $loc) ) && current_user_can('import') ) | 
|---|
|  | 1509 | $can = $this->verify_nonce($_REQUEST['_wpnonce'], $this->referer_check_key, $loc); | 
|---|
|  | 1510 | if ( false == $can ) | 
|---|
|  | 1511 | $this->error(array('loc' => $loc, 'kind' => 'fatal', 'msg' => __('You are not allowed to perform backups.','xpressme-backup'))); | 
|---|
|  | 1512 | return $can; | 
|---|
|  | 1513 | } | 
|---|
|  | 1514 |  | 
|---|
|  | 1515 | /** | 
|---|
|  | 1516 | * Verify that the nonce is legitimate | 
|---|
|  | 1517 | * @param string $rec   the nonce received | 
|---|
|  | 1518 | * @param string $nonce what the nonce should be | 
|---|
|  | 1519 | * @param string $loc   the location of the check | 
|---|
|  | 1520 | * @return bool | 
|---|
|  | 1521 | */ | 
|---|
|  | 1522 | function verify_nonce($rec = '', $nonce = 'X', $loc = 'main') { | 
|---|
|  | 1523 | if ( wp_verify_nonce($rec, $nonce) ) | 
|---|
|  | 1524 | return true; | 
|---|
|  | 1525 | else | 
|---|
|  | 1526 | $this->error(array('loc' => $loc, 'kind' => 'fatal', 'msg' => sprintf(__('There appears to be an unauthorized attempt from this site to access your database located at %1s.  The attempt has been halted.','xpressme-backup'),get_option('home')))); | 
|---|
|  | 1527 | } | 
|---|
|  | 1528 |  | 
|---|
|  | 1529 | /** | 
|---|
|  | 1530 | * Check whether a file to be downloaded is | 
|---|
|  | 1531 | * surreptitiously trying to download a non-backup file | 
|---|
|  | 1532 | * @param string $file | 
|---|
|  | 1533 | * @return null | 
|---|
|  | 1534 | */ | 
|---|
|  | 1535 | function validate_file($file) { | 
|---|
|  | 1536 | if ( (false !== strpos($file, '..')) || (false !== strpos($file, './')) || (':' == substr($file, 1, 1)) ) | 
|---|
|  | 1537 | $this->error(array('kind' => 'fatal', 'loc' => 'frame', 'msg' => __("Cheatin' uh ?",'xpressme-backup'))); | 
|---|
|  | 1538 | } | 
|---|
|  | 1539 |  | 
|---|
|  | 1540 | function extras_filter($query_line){ | 
|---|
|  | 1541 | $extras_option = get_option('xpressme_backup_extras_option'); | 
|---|
| [677] | 1542 |  | 
|---|
|  | 1543 | // Change EUC to UTF-8 | 
|---|
| [608] | 1544 | if ($extras_option['do_euc_to_utf8'] && $this->is_mbstring()){ | 
|---|
|  | 1545 | $query_line = mb_convert_encoding(mb_convert_encoding($query_line,"sjis-win","EUC-JP"),"UTF-8","sjis-win"); | 
|---|
| [610] | 1546 | $tmp = preg_replace('/DEFAULT\s*CHARSET\s*=\s*ujis/','DEFAULT CHARSET=utf8',$query_line); | 
|---|
| [608] | 1547 | if (empty($buf)) $query_line = $tmp; | 
|---|
|  | 1548 | if (preg_match_all('/s:([0-9]+):"(.*?)";/',$query_line,$matchs)){ | 
|---|
|  | 1549 | $i_count = count($matchs[0]); | 
|---|
|  | 1550 | for($i=0; $i < $i_count ;$i++){ | 
|---|
|  | 1551 | $org = $matchs[0][$i]; | 
|---|
|  | 1552 | $num = $matchs[1][$i]; | 
|---|
|  | 1553 | $str = $matchs[2][$i]; | 
|---|
|  | 1554 | $str =  str_replace('\r\n','\n',$str); | 
|---|
|  | 1555 |  | 
|---|
|  | 1556 | $volm = strlen(bin2hex($str)) / 2; | 
|---|
|  | 1557 |  | 
|---|
|  | 1558 | if ($num != $volm){ | 
|---|
|  | 1559 | $org =  str_replace('\\','\\\\',$org); | 
|---|
|  | 1560 | $org =  str_replace('/','\\/',$org); | 
|---|
|  | 1561 | $org =  str_replace('(','\\(',$org); | 
|---|
|  | 1562 | $org =  str_replace(')','\\)',$org); | 
|---|
|  | 1563 | $org =  str_replace('?','\\?',$org); | 
|---|
|  | 1564 | $org =  str_replace('+','\\+',$org); | 
|---|
|  | 1565 | $org =  str_replace('*','\\*',$org); | 
|---|
|  | 1566 | $org =  str_replace('[','\\[',$org); | 
|---|
|  | 1567 | $org =  str_replace(']','\\]',$org); | 
|---|
|  | 1568 | $org =  str_replace('$','\\$',$org); | 
|---|
|  | 1569 | $org =  str_replace('{','\\{',$org); | 
|---|
|  | 1570 | $org =  str_replace('}','\\}',$org); | 
|---|
|  | 1571 | $org =  str_replace('^','\\^',$org); | 
|---|
|  | 1572 | $org =  str_replace('.','\\.',$org); | 
|---|
|  | 1573 |  | 
|---|
|  | 1574 | $src = '/' . $org . '/'; | 
|---|
| [675] | 1575 | $dist = 's:'. $volm . ':"' . $str . '";'; | 
|---|
| [608] | 1576 | if(preg_match($src,$query_line)){ | 
|---|
|  | 1577 | $query_line = preg_replace($src,$dist,$query_line); | 
|---|
|  | 1578 | } | 
|---|
|  | 1579 | } | 
|---|
|  | 1580 | } | 
|---|
|  | 1581 | } | 
|---|
| [673] | 1582 | $seach = "/'blog_charset'.*'EUC-JP'/"; | 
|---|
|  | 1583 | $src = "/'EUC-JP'/"; | 
|---|
|  | 1584 | $dist = "'UTF-8'"; | 
|---|
|  | 1585 | if(preg_match($seach,$query_line)){ | 
|---|
|  | 1586 | $query_line = preg_replace($src,$dist,$query_line); | 
|---|
|  | 1587 | } | 
|---|
| [608] | 1588 | } | 
|---|
| [677] | 1589 |  | 
|---|
|  | 1590 | // Change Data Prefix | 
|---|
| [608] | 1591 | if ($extras_option['do_rename_prefix']){ | 
|---|
|  | 1592 | if (!empty($extras_option['before_prefix']) && !empty($extras_option['after_prefix'])){ | 
|---|
|  | 1593 | $src = '/' . $extras_option['before_prefix'] . '/'; | 
|---|
|  | 1594 | $dist = $extras_option['after_prefix']; | 
|---|
|  | 1595 | if(preg_match($src,$query_line)){ | 
|---|
|  | 1596 | $query_line = preg_replace($src,$dist,$query_line); | 
|---|
|  | 1597 | } | 
|---|
|  | 1598 | } | 
|---|
|  | 1599 | } | 
|---|
| [677] | 1600 |  | 
|---|
|  | 1601 | // Change User_Role_Name(WordPressME to Wordpress) | 
|---|
|  | 1602 | if ($extras_option['set_default_role']){ | 
|---|
|  | 1603 | $src = '/' . "(INSERT INTO `.+_options` VALUES \([0-9]+, [0-9]+, '.+_user_roles', 'Y', [0-9]+, ')(a:.+}}})('.+\);)" . '/'; | 
|---|
|  | 1604 | if(preg_match($src,$query_line)){ | 
|---|
|  | 1605 | $patterns = array(); | 
|---|
|  | 1606 | $patterns[0] = '/s:[0-9]+:"[^"]+ - \(Administrator\)"/'; | 
|---|
|  | 1607 | $patterns[1] = '/s:[0-9]+:"[^"]+ - \(Editor\)"/'; | 
|---|
|  | 1608 | $patterns[2] = '/s:[0-9]+:"[^"]+ - \(Author\)"/'; | 
|---|
|  | 1609 | $patterns[3] = '/s:[0-9]+:"[^"]+ - \(Contributor\)"/'; | 
|---|
|  | 1610 | $patterns[4] = '/s:[0-9]+:"[^"]+ - \(Subscriber\)"/'; | 
|---|
|  | 1611 | $replacements = array(); | 
|---|
|  | 1612 | $replacements[0] = 's:13:"Administrator"'; | 
|---|
|  | 1613 | $replacements[1] = 's:6:"Editor"'; | 
|---|
|  | 1614 | $replacements[2] = 's:6:"Author"'; | 
|---|
|  | 1615 | $replacements[3] = 's:11:"Contributor"'; | 
|---|
|  | 1616 | $replacements[4] = 's:10:"Subscriber"'; | 
|---|
|  | 1617 | $ans = preg_replace($patterns,$replacements,$query_line); | 
|---|
|  | 1618 | if (!empty($ans)) $query_line = $ans; | 
|---|
|  | 1619 | } | 
|---|
|  | 1620 | } | 
|---|
|  | 1621 |  | 
|---|
|  | 1622 | // Change URI Clear | 
|---|
| [610] | 1623 | if ($extras_option['do_change_uri']){ | 
|---|
|  | 1624 | if (!empty($extras_option['before_uri']) && !empty($extras_option['after_uri'])){ | 
|---|
|  | 1625 | $org =  $extras_option['before_uri']; | 
|---|
|  | 1626 | $org =  str_replace('/','\\/',$org); | 
|---|
|  | 1627 | $src = '/' . $org . '/'; | 
|---|
|  | 1628 | $dist = $extras_option['after_uri']; | 
|---|
|  | 1629 | if(preg_match($src,$query_line)){ | 
|---|
|  | 1630 | $query_line = preg_replace($src,$dist,$query_line); | 
|---|
| [677] | 1631 |  | 
|---|
| [610] | 1632 | } | 
|---|
|  | 1633 | } | 
|---|
|  | 1634 | } | 
|---|
| [675] | 1635 |  | 
|---|
| [677] | 1636 | // Active Plugin Clear | 
|---|
| [673] | 1637 | if ($extras_option['del_active_plugin']){ | 
|---|
|  | 1638 | $src = '/' . "(INSERT INTO `.+_options` VALUES \([0-9]+, [0-9]+, 'active_plugins', 'Y', [0-9]+, ')(a:.+})('.+\);)" . '/'; | 
|---|
|  | 1639 | if(preg_match($src,$query_line,$matches)){ | 
|---|
|  | 1640 | if(preg_match('/xpressme\/xpressme.php/',$matches[2])){ | 
|---|
|  | 1641 | $query_line = "\n" . $matches[1] . 'a:1:{i:0;s:21:"xpressme/xpressme.php";}' . $matches[3]; | 
|---|
|  | 1642 | } else { | 
|---|
|  | 1643 | $query_line = "\n" . $matches[1] . 'a:0:{}' . $matches[3]; | 
|---|
|  | 1644 | } | 
|---|
|  | 1645 | } | 
|---|
|  | 1646 | } | 
|---|
| [677] | 1647 |  | 
|---|
|  | 1648 | // XPressME Buckup Option Data Clear | 
|---|
|  | 1649 | $src = '/' . "INSERT INTO `.+_options` VALUES \([0-9]+, [0-9]+, 'xpressme_backup_excs'" . '/'; | 
|---|
|  | 1650 | if(preg_match($src,$query_line)){ | 
|---|
|  | 1651 | $query_line = "\n# Skip XPressME Buckup 'xpressme_backup_excs' Option Data\n"; | 
|---|
|  | 1652 | } | 
|---|
|  | 1653 | $src = '/' . "INSERT INTO `.+_options` VALUES \([0-9]+, [0-9]+, 'xpressme_backup_extras_option'" . '/'; | 
|---|
|  | 1654 | if(preg_match($src,$query_line)){ | 
|---|
|  | 1655 | $query_line = "\n# Skip XPressME Buckup 'xpressme_backup_extras_option' Option Data\n"; | 
|---|
|  | 1656 | } | 
|---|
|  | 1657 |  | 
|---|
| [608] | 1658 | return $query_line; | 
|---|
| [673] | 1659 |  | 
|---|
| [608] | 1660 | } | 
|---|
|  | 1661 | function is_mbstring(){ | 
|---|
|  | 1662 | return function_exists('mb_convert_encoding'); | 
|---|
|  | 1663 | } | 
|---|
|  | 1664 | } | 
|---|
|  | 1665 |  | 
|---|
|  | 1666 | function wpdbBackup_init() { | 
|---|
|  | 1667 | global $mywpdbbackup; | 
|---|
|  | 1668 | $mywpdbbackup = new wpdbBackup(); | 
|---|
|  | 1669 | } | 
|---|
|  | 1670 |  | 
|---|
|  | 1671 | add_action('plugins_loaded', 'wpdbBackup_init'); | 
|---|
|  | 1672 | ?> | 
|---|