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