public function append_zip(ZipArchive $zip, $root, $local_prefix, FW_Backup_Interface_Feedback $feedback, $exclude = array())
 {
     /**
      * @var FW_Extension_Backup $backup
      */
     $feedback->set_task(__('Scanning file system...', 'fw'));
     $fs = new FW_Backup_Helper_File_System();
     $backup = fw()->extensions->get('backup');
     $exclude[] = $backup->get_backup_dir();
     $upload_dir = wp_upload_dir();
     $exclude[] = $upload_dir['basedir'] . '/fw-style.css';
     list($file_list, $file_size) = $fs->file_list_exclude($root, $exclude);
     $feedback->set_task(sprintf(__('%d file(s) found [%s]', 'fw'), count($file_list), $fs->format_bytes(array_sum($file_size))));
     $fs->append_zip($zip, $file_list, $root, $local_prefix, $feedback);
 }
 public function run_with_initialized_file_system()
 {
     $fs = new FW_Backup_Helper_File_System();
     $db = new FW_Backup_Helper_Database();
     $auto_install_dir = $this->backup()->get_auto_install_dir();
     $upload_dir = wp_upload_dir();
     $upload_dir = $upload_dir['basedir'];
     try {
         // Do Full Backup before Auto Install
         if (apply_filters('fw_ext_backup_do_backup_on_demo_content_install', true)) {
             $this->backup()->action()->do_backup_background_cron('cron_full');
         }
         // Replace uploads directory
         $t = $fs->replace($fs->map($upload_dir), $fs->map("{$auto_install_dir}/uploads"));
         // Move backup directory from trashed dir into new upload dir
         if ($t) {
             $fs->move_existing("{$t}/backup", $fs->map("{$upload_dir}/backup"));
             // Remove trashed dir because we made Full Backup of the site
             $fs->rmdir($t);
         }
         if (file_exists("{$auto_install_dir}/database.txt")) {
             $file_with_sql = "{$auto_install_dir}/database.txt";
         } else {
             $file_with_sql = "{$auto_install_dir}/database.sql";
         }
         $db->import($file_with_sql, true, true, true);
         do_action('fw_ext_backup_after_import_demo_content');
         return array('success' => true);
     } catch (FW_Backup_Exception $exception) {
         return array('success' => false, 'data' => array('message' => $exception->getMessage()));
     }
 }
 public function run()
 {
     $fs = new FW_Backup_Helper_File_System();
     $db = new FW_Backup_Helper_Database();
     $auto_install_dir = $this->backup()->get_auto_install_dir();
     $upload_dir = wp_upload_dir();
     $upload_dir = $upload_dir['basedir'];
     // This forces *Restore* page to be opened event if
     // request_filesystem_credentials is not required. In the
     // latter case JavaScript will submit the page automatically
     // which opens up a *Restore in Progress* popup.
     if ($_SERVER['REQUEST_METHOD'] != 'POST') {
         throw new FW_Backup_Exception_Method_Not_Allowed();
     }
     $restore = new FW_Backup_Process_Restore();
     $restore->request_filesystem_credentials();
     try {
         $fs->check_permissions();
         // Do Full Backup before Auto Install
         $this->backup()->action()->do_backup_background_cron('cron_full');
         // Replace uploads directory
         $t = $fs->replace($fs->map($upload_dir), $fs->map("{$auto_install_dir}/uploads"));
         // Move backup directory from trashed dir into new upload dir
         if ($t) {
             $fs->move_existing("{$t}/backup", $fs->map("{$upload_dir}/backup"));
             // Remove trashed dir because we made Full Backup of the site
             $fs->rmdir($t);
         }
         if (file_exists("{$auto_install_dir}/database.txt")) {
             $file_with_sql = "{$auto_install_dir}/database.txt";
         } else {
             $file_with_sql = "{$auto_install_dir}/database.sql";
         }
         $db->import($file_with_sql, true, true, true);
     } catch (FW_Backup_Exception $exception) {
         FW_Flash_Messages::add('auto-install', $exception->getMessage(), 'error');
         // otherwise flash messages wont show
         wp_redirect($this->backup()->action()->url_backup_auto_install_page());
         exit;
     }
     // get rid of update notifications
     wp_redirect(admin_url('update-core.php?force-check=1&auto-install-redirect=' . esc_url(admin_url())));
     exit;
 }
 public function run($post_id)
 {
     /**
      * @var WP_Filesystem_Base $wp_filesystem
      */
     global $wp_filesystem;
     set_time_limit(0);
     $fs = new FW_Backup_Helper_File_System();
     $db = new FW_Backup_Helper_Database();
     $backup_info = $this->backup()->get_backup_info($post_id);
     if (!$backup_info || !$backup_info->is_completed()) {
         throw new FW_Backup_Exception('Cannot restore from incomplete backup');
     }
     $storage = $this->backup()->get_storage($backup_info->get_storage(), $backup_info->get_cron_job());
     // Ensure that storage layer is workable (e.g. was configured properly)
     $storage->ping(new FW_Backup_Feedback_Void());
     if ($backup_info->has_fs()) {
         $this->request_filesystem_credentials();
     }
     // This forces *Restore* page to be opened event if
     // request_filesystem_credentials is not required. In the
     // latter case JavaScript will submit the page automatically
     // which opens up a *Restore in Progress* popup.
     if ($_SERVER['REQUEST_METHOD'] != 'POST') {
         throw new FW_Backup_Exception_Method_Not_Allowed();
     }
     if ($backup_info->has_fs()) {
         if ($wp_filesystem->abspath() == '/') {
             throw new FW_Backup_Exception('WordPress was located at root directory (/). Restoration for this scenario was not implemented.');
         }
         $fs->check_permissions();
     }
     if ($backup_info->has_db()) {
         $db->check_permissions();
     }
     // 2) Do restore
     try {
         $f = new FW_Backup_Feedback_Void();
         $zip_file = $storage->fetch($backup_info->get_storage_file(), $f);
         // Try to open it as .zip archive
         $zip = new ZipArchive();
         if ($zip->open($zip_file) !== true) {
             throw new FW_Backup_Exception('Cannot open .zip file');
         }
         // Restore files (should come before database: rename wordpress dir can fail)
         if ($backup_info->has_fs()) {
             $wp = rtrim($wp_filesystem->abspath(), '/');
             $wp_new = rtrim(dirname($wp), '/') . '/' . uniqid();
             $wp_backup = $wp . '-' . date('Y_m_d-H_i_s', current_time('timestamp'));
             $backup_rel = substr($this->backup()->get_backup_dir(), strlen(ABSPATH));
             // Extract archive into temporary location
             unzip_file($zip_file, $wp_new);
             // Get rid of database.txt file, if any
             if ($wp_filesystem->exists("{$wp_new}/database.txt")) {
                 $wp_filesystem->delete("{$wp_new}/database.txt");
             }
             // In imported backup files wp-config.php can contain database
             // credentials which cannot work on this host. Also, database prefix
             // can be different from the value in original wp-config.php
             if ($backup_info->is_imported()) {
                 $wp_filesystem->copy("{$wp}/wp-config.php", "{$wp_new}/wp-config.php", true);
             }
             // Replace WordPress dir by version from backup
             $move = true && $wp_filesystem->move($wp, $wp_backup) && $wp_filesystem->move($wp_new, $wp) && $wp_filesystem->move("{$wp_backup}/{$backup_rel}", "{$wp}/{$backup_rel}");
             if (!$move) {
                 throw new FW_Backup_Exception('Replacing wordpress dir by version from backup failed');
             }
         }
         // Restore database
         if ($backup_info->has_db()) {
             $fp_db = $zip->getStream('database.txt');
             $db->import_fp($fp_db, false, $backup_info->is_imported(), false);
             fclose($fp_db);
         }
     } catch (FW_Backup_Exception $exception) {
     }
     unset($zip);
     if (isset($zip_file)) {
         unlink($zip_file);
     }
     if (isset($exception)) {
         throw $exception;
     }
 }