/wp-content/plugins/backupbuddy/_repairbuddy.php
PHP | 541 lines | 330 code | 80 blank | 131 comment | 102 complexity | f3624d95f3db56cd3cb5cab60f085eff MD5 | raw file
Possible License(s): GPL-3.0, LGPL-2.1, AGPL-1.0, GPL-2.0
- <?php
- /**
- *
- * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- *
- * WARNING: THERE ARE ABSOLUTELY NO EDITABLE PORTIONS OF THIS SCRIPT.
- * ALL OPTIONS ARE CONFIGURABLE VIA THE WEB INTERFACE.
- * YOU CAN EXTEND THE FUNCTIONALITY BY WRITING A MODULE
- * SEE /repairbuddy/modules/ FOR EXAMPLES ON FUNCTIONAL MODULES
- *
- * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- *
- * Script Name: RepairBuddy.php for use with BackupBuddy backups.
- * Plugin URI: http://pluginbuddy.com/backupbuddy/
- * Description: Backup - Restore - Migrate. Backs up files, settings, and content for a complete snapshot of your site. Allows migration to a new host or URL.
- * Version: 0.0.1 - See repairbuddy/history.txt
- * Author: Dustin Bolton and Ronald Huereca
- * Author URI: http://pluginbuddy.com/
- *
- * Usage:
- *
- * 1. Upload this script to the server you would like to repair/troubleshoot.
- * 2. Upload your backup ZIP file created with BackupBuddy.
- * 3. Navigate to the web address of this script. Ex: http://yoursite.com/repairbuddy.php
- * 4. Follow the on screen instructions.
- *
- */
- //EXTRACT REPAIRBUDDY
- // Unpack files into directory.
- /**
- * mkdir_recursive()
- *
- * Recursively creates the directories needed to generate a full directory path.
- *
- * $path string Full absolute path to generate.
- * @return null
- *
- */
- function mkdir_recursive( $path ) {
- if ( empty( $path ) ) { // prevent infinite loop on bad path
- return;
- }
- is_dir( dirname( $path ) ) || mkdir_recursive( dirname( $path ) );
- return is_dir( $path ) || mkdir( $path );
- }
- /**
- * unpack_packbuddy()
- *
- * Unpacks required files encoded in importbuddy.php into stand-alone files.
- *
- * @return null
- */
- function unpack_repairbuddy( $pb_abspath = '' ) {
- if ( !is_writable( $pb_abspath ) ) {
- echo 'Error #224834. This directory is not write enabled. Please verify write permissions to continue.';
- die();
- } else {
- $unpack_file = '';
-
- $handle = @fopen( $pb_abspath . 'repairbuddy.php', 'r' );
- if ( $handle ) {
- while ( ( $buffer = fgets( $handle ) ) !== false ) {
- if ( substr( $buffer, 0, 11 ) == '###PACKDATA' ) {
- $packdata_commands = explode( ',', trim( $buffer ) );
- array_shift( $packdata_commands );
-
- if ( $packdata_commands[0] == 'BEGIN' ) {
- // Start packed data.
- } elseif ( $packdata_commands[0] == 'FILE_START' ) {
- $unpack_file = $packdata_commands[2];
- } elseif ( $packdata_commands[0] == 'FILE_END' ) {
- $unpack_file = '';
- } elseif ( $packdata_commands[0] == 'END' ) {
- return;
- }
- } else {
- if ( $unpack_file != '' ) {
- if ( !is_dir( dirname( $pb_abspath . $unpack_file ) ) ) {
- mkdir_recursive( dirname( $pb_abspath . $unpack_file ) );
- }
- file_put_contents( $pb_abspath . $unpack_file, trim( base64_decode( $buffer ) ) );
- }
- }
- }
- if ( !feof( $handle ) ) {
- echo "Error: unexpected fgets() fail\n";
- }
- fclose( $handle );
- }
- }
- } //end unpack_repairbuddy
- $pb_abspath = dirname( __FILE__ ) . '/';
- if ( !file_exists( $pb_abspath . 'repairbuddy' ) ) {
- unpack_repairbuddy( $pb_abspath );
- if ( !file_exists( $pb_abspath . 'repairbuddy' ) ) {
- die( 'Unable to unpack RepairBuddy. Error #24349489.' );
- }
- }
- require_once( 'repairbuddy/_load.php' );
- class pluginbuddy_repairbuddy {
- var $_version = '1.0.0';
- var $_bbversion = '2.2.25';
- var $_selfdestruct = '#SELFDESTRUCT#';
-
- var $debug = false;
- var $_timestamp = 'M j, Y, H:i:s'; // PHP timestamp format.
- var $_bootstrap_wordpress = false;
-
- var $_defaults = array(
- 'repair_password' => '#PASSWORD#', // MD5 hash of the import password. Prevents unauthorized access. Default: #PASSWORD#
- 'password' => '', // MD5 hash of password given.
- );
- var $_modules = array();
- var $_options = array();
- var $_database_connected = false;
- var $_wpconfig_loaded = false;
-
- /**
- * pluginbuddy_importbuddy()
- *
- * Default constructor.
- *
- */
- function __construct() {
- // SELF DESTRUCT IF APPLICABLE!
- if ( $this->_selfdestruct != ' #SELFDESTRUCT#' ) {
- if ( $this->_selfdestruct > time() ) {
- echo '<html><body><h3>RepairBuddy is self-destructing . . .</h3>This copy of RepairBuddy has been set to self destruct & expire and the expiration time has passed.</body></html>';
- $this->wipe_repairbuddy();
- }
- }
-
-
- // Prevent access to importbuddy.php if it is still in plugin directory.
- if ( file_exists( dirname( __FILE__ ) . '/backupbuddy.php' ) ) {
- echo 'This file can ONLY be accessed on the destination server that you wish to use the script on.<br>';
- echo 'Upload the importer in the root web directory on the destination server and try again.<br><br>';
- echo 'If you need assistance visit <a href="http://pluginbuddy.com">http://pluginbuddy.com</a>';
- die();
- }
-
-
- // Start logging time for steps that report how long they took.
- $this->time_start = microtime( true );
-
-
-
- // Set up PHP error levels.
- if ( ( $this->debug === true ) || ( isset( $this->_options[ 'show_php_warnings' ] ) &&$this->_options['show_php_warnings'] === true ) ) {
- error_reporting( E_ERROR | E_WARNING | E_PARSE | E_NOTICE ); // HIGH
- $this->log( 'PHP error reporting set HIGH.' );
- } else {
- error_reporting( E_ALL ^ E_NOTICE ); // LOW
- }
-
- // Detect max execution time for database steps so they can pause when needed for additional PHP processes.
- $this->detected_max_execution_time = str_ireplace( 's', '', ini_get( 'max_execution_time' ) );
- if ( is_numeric( $this->detected_max_execution_time ) === false ) {
- $detected_max_execution_time = 30;
- }
-
- // Handle authentication (if needed).
- $this->has_access = false; // default
- if ( $this->_defaults['repair_password'] == '#PASSWORD#' ) {
- //$this->has_access = true;
- die( 'Error #454545. A password is required for this script to function.' );
- } else {
- if ( md5( $this->_options['password'] ) == $this->_defaults['repair_password'] ) {
- $this->has_access = true;
- }
- if ( isset( $_POST['password'] ) || isset( $_GET['v'] ) ) {
- if ( md5( $_POST['password'] ) == $this->_defaults['repair_password'] ) {
- $this->_options['password'] = $_POST['password'];
- $this->has_access = true;
- }
- if ( isset( $_GET['v'] ) && ( $_GET['v'] == ( 'xv' . md5( $this->_defaults['repair_password'] . 'repairbuddy' . $_GET['page'] ) ) ) ) {
- $this->has_access = true;
- }
- } elseif ( isset( $_POST[ 'hash' ] ) && isset( $_POST[ 'page' ] ) ) {
- if ( $_POST[ 'hash' ] == ( 'xv' . md5( $this->_defaults[ 'repair_password' ] . 'repairbuddy' . $_POST[ 'page' ] ) ) ) {
- $this->has_access = true;
- }
- }
-
- }
-
- //Initialize The database
- if ( $this->_wpconfig_loaded = ( defined( 'PB_WP_CONFIG' ) ) ) {
- $this->_database_connected = defined( 'PB_DB_LOADED' );
- }
-
- pb_add_action( 'repairbuddy_init', array( &$this, 'init' ) );
-
-
-
-
- } //end constructor
-
- function has_db_access() {
- return $this->_database_connected;
- } //end has_db_access
-
- function has_access() {
- return $this->has_access;
- } //end has_db_access
-
- function ajax_url( ) {
- $path = 'repairbuddy/ajax.php';
- $plugin == __FILE__;
- $plugin_dir = rtrim( dirname( $plugin ), '/' );
- //die( $plugin_dir );
- $plugin_path = rtrim( str_replace( ABSPATH, '', $plugin_dir ), '/' );
- $root_path = 'http://' . $_SERVER[ 'HTTP_HOST' ] . str_replace( $plugin_path, '', $_SERVER[ 'REQUEST_URI' ] );
-
- $filename = basename( $_SERVER[ 'REQUEST_URI' ] );
- $full_url = "http://" . $_SERVER['HTTP_HOST'] .$_SERVER['REQUEST_URI'];
- $full_url = rtrim( str_replace( $filename, '', $full_url ), '/' ) . '/' . $plugin_path;
-
- if ( !empty( $path ) && is_string( $path) ) {
- $full_url .= ltrim( $path, '/' );
- }
-
- ?>
- <script type='text/javascript'>
- var pb_ajaxurl = '<?php echo $full_url; ?>';
- </script>
- <?php
- } //end ajax_url
-
- function init() {
- pb_do_action( 'init' );
- // LOAD PAGE TEMPLATE.
- if ( defined( "PB_DOING_AJAX" ) ) return;
- require_once( 'repairbuddy/_template.php' );
- }
-
- //Returns a Module title, false on failure
- function get_module_title( $slug = '' ) {
- $page_slug = isset( $_GET[ 'page' ] ) ? $_GET[ 'page' ] : false;
- if ( !empty( $slug ) ) $page_slug = $slug;
-
- foreach ( $this->_modules as $priority => $modules ) {
- foreach ( $modules as $module ) {
- if ( $module[ 'slug' ] == $page_slug ) {
- return $module[ 'title' ];
- }
- }
- }
- return false;
- } //end get_module_name
-
-
- /**
- * register_module()
- *
- * Registers a new module. Typically this is called from the module's init.php within the module directory.
- * Modules must be registered here to show on the main page.
- *
- * @param $module_slug string Module slug. Alphanumeric + underscores + dashes permitted.
- * @param $module_title string Informative short title. 1-3 words.
- * @param $module_description string Short descriptive sentence explaining the module.
- * @param $module_default_page string Base name of the default page to load when clicking the module. pagename.php in the pages directory within the module.
- * @param $bootstrap_wordpress boolean True: Load WordPress backend via wp-load.php.
- * @param $is_minimode string True: Display the module at the bottom of the page as a small button. False: Large button up top.
- * @param $is_subtle string True: Display the button as less prominent than other buttons. Currently only in use for minimode.
- * @return null
- */
- function register_module( $args = array() ) {
- $defaults = array(
- 'slug' => '',
- 'title' => '',
- 'description' => '',
- 'page' => '',
- 'bootstrap_wordpress' => false,
- 'mini_mode' => '',
- 'is_subtle' => '',
- 'priority' => 10,
- );
- $defaults = array_merge( $defaults, $args );
- $this->_modules[ intval( $defaults[ 'priority' ] ) ][] = $defaults;
- } //end register_module
-
-
- /**
- * alert()
- *
- * Displays a message to the user.
- *
- * $message string Message you want to display to the user.
- * $error boolean OPTIONAL! true indicates this alert is an error and displays as red. Default: false
- * $error_code int OPTIONAL! Error code number to use in linking in the wiki for easy reference.
- */
- function alert( $message_title, $message_details = '', $error_code = '' ) {
- ?>
- <div class="alert">
- <img src="repairbuddy/images/alert.png" style="float: left;" height="55">
- <div style="margin-left: 65px;">
- <b><?php echo $message_title; ?></b><br><br>
- <?php echo $message_details; ?>
- <?php
- if ( ( $error_code != '' ) && ( $error_code != '9021' ) ) {
- echo '<p><a href="http://ithemes.com/codex/page/BackupBuddy:_Error_Codes#' . $error_code . '" target="_new"><i>BackupBuddy Error Code ' . $error_code . ' - Click for more details.</i></a></p>';
- $this->log( 'Error #' . $error_code . ': ' . $message_title, 'error' );
- }
- ?>
- </div>
- </div>
- <?php
- }
-
- function output_status( $message, $is_error = false ) {
- $class = $is_error ? 'error' : 'updated';
- ?>
- <div class='<?php echo $class; ?>'><p><strong><?php echo $message; ?></strong></p></div>
- <?php
- } //end status
-
-
- /**
- * log()
- *
- * Logs to a text file depending on settings.
- * 0 = none, 1 = errors only, 2 = errors + warnings, 3 = debugging (all kinds of actions)
- *
- * $text string Text to log.
- * $log_type string Valid options: error, warning, all (default so may be omitted).
- *
- */
- function log( $text, $log_type = 'all' ) {
- $write = false;
-
- if ( $this->_options['log_level'] == 0 ) { // No logging.
- return;
- } elseif ( $this->_options['log_level'] == 1 ) { // Errors only.
- if ( $log_type == 'error' ) {
- $write = true;
- }
- } elseif ( $this->_options['log_level'] == 2 ) { // Errors and warnings only.
- if ( ( $log_type == 'error' ) || ( $log_type == 'warning' ) ) {
- $write = true;
- }
- } elseif ( $this->_options['log_level'] == 3 ) { // Log all; Errors, warnings, actions, notes, etc.
- $write = true;
- }
- if ( is_writable( ABSPATH ) ) {
- $fh = fopen( ABSPATH . 'importbuddy.txt', 'a');
- if ( $fh !== false ) {
- fwrite( $fh, '[' . date( $this->_timestamp, time() ) . '-' . $log_type . '] ' . $text . "\n" );
- fclose( $fh );
- } else {
- // Don't use alert here since it could recursively look writing to the log.
- echo 'Warning: Unable to write to log file. Verify write permissions to this directory.' ;
- }
- }
- }
-
-
- /**
- * tip()
- *
- * Displays a message to the user when they hover over the question mark. Gracefully falls back to normal tooltip.
- * HTML is supposed within tooltips.
- *
- * $message string Actual message to show to user.
- * $title string Title of message to show to user. This is displayed at top of tip in bigger letters. Default is blank. (optional)
- * $echo_tip boolean Whether to echo the tip (default; true), or return the tip (false). (optional)
- */
- function tip( $message, $title = '', $echo_tip = true ) {
- $tip = ' <a class="pluginbuddy_tip" title="' . $title . ' - ' . $message . '"><img src="repairbuddy/images/pluginbuddy_tip.png"></a>';
- if ( $echo_tip === true ) {
- echo $tip;
- } else {
- return $tip;
- }
- }
-
-
- function page_link( $module_slug, $page, $force_wordpress_bootstrap = 'false' ) {
- if ( $this->has_access != true ) {
- return '?';
- }
-
- if ( $this->_modules[$module_slug]['bootsrap_wordpress'] == 'true' ) {
- $bootstrap = 'true';
- } else {
- if ( $force_wordpress_bootstrap == true ) {
- $bootstrap = 'true';
- } else {
- $bootstrap = 'false';
- }
- }
- return '?module=' . $module_slug . '&page=' . $page . '&v=xv' . md5( $this->_defaults['repair_password'] . 'repairbuddy' . $page ) . '&bootstrap=' . $bootstrap;
- }
-
-
-
-
-
-
- /**
- * status_box()
- *
- * Displays a textarea for placing status text into.
- *
- * @param $default_text string First line of text to display.
- * @return string HTML for textarea.
- */
- function status_box( $default_text = '' ) {
- return '<textarea style="width: 100%; height: 120px;" id="importbuddy_status">' . $default_text . '</textarea>';
- }
-
-
- /**
- * status()
- *
- * Write a status line into an existing textarea created with the status_box() function.
- *
- * @param $type string message, details, error, or warning. Currently not in use.
- * @param $message string Message to append to the status box.
- * @return null
- */
- function status( $type, $message ) {
- $message = htmlentities( addslashes( $message ) );
- $status = date( $this->_timestamp, time() ) . ': ' . $message;
-
- echo '<script type="text/javascript">jQuery( "#importbuddy_status" ).append( "\n' . $status . '"); textareaelem = document.getElementById( "importbuddy_status" ); textareaelem.scrollTop = textareaelem.scrollHeight; </script>';
- flush();
-
- if ( $type == 'error' ) {
- $this->log( $message, 'error' );
- } elseif ( $type == 'warning' ) {
- $this->log( $message, 'warning' );
- } else {
- $this->log( '[' . $type . ']' . $message, 'all' );
- }
- }
-
-
- function format_size( $size ) {
- $sizes = array( ' Bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB');
- if ( $size == 0 ) {
- return( 'empty' );
- } else {
- return ( round( $size / pow( 1024, ( $i = floor( log( $size, 1024 ) ) ) ), $i > 1 ? 2 : 0) . $sizes[$i] );
- }
- }
-
-
- function wipe_repairbuddy() {
- $this->remove_file( ABSPATH . 'repairbuddy/', 'RepairBuddy Directory', true );
- $this->remove_file( ABSPATH . 'repairbuddy.txt', 'RepairBuddy Log File', true );
- $this->remove_file( ABSPATH . 'repairbuddy.php', 'RepairBuddy.php main file.', true );
- }
-
-
- function remove_file( $file, $description, $error_on_missing = false ) {
- $this->status( 'message', 'Deleting `' . $description . '`...' );
-
- @chmod( $file, 0755 ); // High permissions to delete.
-
- if ( is_dir( $file ) ) { // directory.
- $this->remove_dir( $file );
- if ( file_exists( $file ) ) {
- $this->status( 'error', 'Unable to delete directory: `' . $description . '`. You should manually delete it.' );
- } else {
- $this->status( 'message', 'Deleted.' );
- }
- } else { // file
- if ( file_exists( $file ) ) {
- if ( @unlink( $file ) != 1 ) {
- $this->status( 'error', 'Unable to delete file: `' . $description . '`. You should manually delete it.' );
- } else {
- $this->status( 'message', 'Deleted.' );
- }
- }
- }
- }
-
-
- /**
- * remove_dir()
- *
- * ?
- *
- * @return ?
- */
- function remove_dir( $dir ) {
- if ( !file_exists( $dir ) ) {
- return true;
- }
- if ( !is_dir( $dir ) || is_link( $dir ) ) {
- return unlink($dir);
- }
- foreach ( scandir( $dir ) as $item ) {
- if ( $item == '.' || $item == '..' ) {
- continue;
- }
- if ( !$this->remove_dir( $dir . "/" . $item ) ) {
- chmod( $dir . "/" . $item, 0777 );
- if ( !$this->remove_dir( $dir . "/" . $item ) ) {
- return false;
- }
- }
- }
- return rmdir($dir);
- }
-
-
- } // end class.
- define( 'pluginbuddy_importbuddy', true ); // Tell Server Info page to not load some sections.
- global $pluginbuddy_repairbuddy;
- $pluginbuddy_repairbuddy = new pluginbuddy_repairbuddy();
- pb_do_action( 'repairbuddy_init' );
- function pb_register_module( $args = array() ) {
- global $pluginbuddy_repairbuddy;
- $pluginbuddy_repairbuddy->register_module( $args );
- } //end pb_register_module
- function pb_has_db_access() {
- global $pluginbuddy_repairbuddy;
- return $pluginbuddy_repairbuddy->has_db_access();
- } //end pb_has_database_access
- function pb_has_access() {
- global $pluginbuddy_repairbuddy;
- return $pluginbuddy_repairbuddy->has_access();
- }
- ?>