private function display_delete_page() { $flash_id = 'fw_extensions_delete'; if (!$this->can_install()) { FW_Flash_Messages::add($flash_id, __('You are not allowed to delete extensions.', 'fw'), 'error'); $this->js_redirect(); return; } $extensions = array_fill_keys(array_map('trim', explode(',', FW_Request::GET('extension', ''))), array()); if (!class_exists('_FW_Extensions_Delete_Upgrader_Skin')) { fw_include_file_isolated(dirname(__FILE__) . '/includes/class--fw-extensions-delete-upgrader-skin.php'); } $skin = new _FW_Extensions_Delete_Upgrader_Skin(array('title' => _n('Delete Extension', 'Delete Extensions', count($extensions), 'fw'))); $skin->header(); do { $nonce = $this->get_nonce('delete'); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!isset($_POST[$nonce['name']]) || !wp_verify_nonce($_POST[$nonce['name']], $nonce['action'])) { $skin->error(__('Invalid nonce.', 'fw')); } if (!FW_WP_Filesystem::request_access(fw_get_framework_directory('/extensions'), fw_current_url(), array($nonce['name']))) { break; } $uninstall_result = $this->uninstall_extensions($extensions, array('verbose' => $skin)); if (is_wp_error($uninstall_result)) { $skin->error($uninstall_result); } elseif (is_array($uninstall_result)) { $error = array(); foreach ($uninstall_result as $extension_name => $extension_result) { if (is_wp_error($extension_result)) { $error[] = $extension_result->get_error_message(); } } $error = '<ul><li>' . implode('</li><li>', $error) . '</li></ul>'; $skin->error($error); } elseif ($uninstall_result === true) { $skin->set_result(true); } $skin->after(array('extensions_page_link' => $this->get_link())); } else { echo '<form method="post">'; wp_nonce_field($nonce['action'], $nonce['name']); fw_render_view(dirname(__FILE__) . '/views/delete-form.php', array('extension_names' => array_keys($extensions), 'installed_extensions' => $this->get_installed_extensions(), 'list_page_link' => $this->get_link()), false); echo '</form>'; } } while (false); $skin->footer(); }
/** * @internal */ public function _action_update_framework() { $nonce_name = '_nonce_fw_ext_update_framework'; if (!isset($_POST[$nonce_name]) || !wp_verify_nonce($_POST[$nonce_name])) { wp_die(__('Invalid nonce.', 'fw')); } if (!class_exists('_FW_Ext_Update_Framework_Upgrader_Skin')) { fw_include_file_isolated($this->get_declared_path('/includes/classes/class--fw-ext-update-framework-upgrader-skin.php')); } $skin = new _FW_Ext_Update_Framework_Upgrader_Skin(array('title' => __('Update Framework', 'fw'))); require_once ABSPATH . 'wp-admin/admin-header.php'; $skin->header(); $update = $this->get_framework_update(true); do { if ($update === false) { $skin->error(__('Failed to get framework latest version.', 'fw')); break; } elseif (is_wp_error($update)) { $skin->error($update); break; } $context = $this->context; if (!FW_WP_Filesystem::request_access($context, fw_current_url(), array($nonce_name))) { break; } $this->maintenance_mode(true); /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; $tmp_download_dir = FW_WP_Filesystem::real_path_to_filesystem_path(FW_CACHE_DIR . '/update'); // just in case it already exists, clear everything, it may contain broken/old files $wp_filesystem->rmdir($tmp_download_dir, true); if (!FW_WP_Filesystem::mkdir_recursive($tmp_download_dir)) { $skin->error(__('Cannot create directory: ' . $tmp_download_dir, 'fw')); break; } $skin->feedback(__('Downloading framework...', 'fw')); /** @var FW_Ext_Update_Service $service */ $service = $this->get_child($update['service']); $downloaded_files_dir = $service->_download_framework($update['latest_version'], $tmp_download_dir); if (!$downloaded_files_dir) { $skin->error(__('Failed to download framework.', 'fw')); break; } elseif (is_wp_error($downloaded_files_dir)) { $skin->error($downloaded_files_dir); break; } $skin->feedback(__('Installing framework...', 'fw')); $framework_dir = FW_WP_Filesystem::real_path_to_filesystem_path(FW_DIR); // remove entire framework directory $wp_filesystem->rmdir($framework_dir, true); // move downloaded directory as new framework directory $wp_filesystem->move($downloaded_files_dir, $framework_dir); $skin->feedback(__('Framework updated.', 'fw')); $wp_filesystem->delete($tmp_download_dir, true, 'd'); $skin->set_result(true); $skin->after(); } while (false); $this->maintenance_mode(false); $skin->footer(); require_once ABSPATH . 'wp-admin/admin-footer.php'; }
/** * @internal */ public function _render_page() { echo '<div class="wrap">'; $this->render_view('page', array('archives_html' => $this->render_view('archives', array('archives' => $this->get_archives(), 'is_busy' => (bool) $this->tasks()->get_active_task_collection()))), false); echo '</div>'; echo '<div id="fw-ext-backups-filesystem-form" style="display:none;">'; FW_WP_Filesystem::request_access(ABSPATH); echo '</div>'; }
/** * @internal */ public function _action_update_extensions() { $nonce_name = '_nonce_fw_ext_update_extensions'; if (!isset($_POST[$nonce_name]) || !wp_verify_nonce($_POST[$nonce_name])) { wp_die(__('Invalid nonce.', 'fw')); } $form_input_name = 'extensions'; $extensions_list = FW_Request::POST($form_input_name); if (empty($extensions_list)) { FW_Flash_Messages::add('fw_ext_update', __('Please check the extensions you want to update.', 'fw'), 'warning'); wp_redirect(self_admin_url('update-core.php')); exit; } if (is_string($extensions_list)) { $extensions_list = json_decode($extensions_list); } else { $extensions_list = array_keys($extensions_list); } if (!class_exists('_FW_Ext_Update_Extensions_Upgrader_Skin')) { fw_include_file_isolated($this->get_declared_path('/includes/classes/class--fw-ext-update-extensions-upgrader-skin.php')); } $skin = new _FW_Ext_Update_Extensions_Upgrader_Skin(array('title' => __('Extensions Update', 'fw'))); require_once ABSPATH . 'wp-admin/admin-header.php'; $skin->header(); do { $original_post_value = $_POST[$form_input_name]; $_POST[$form_input_name] = wp_slash(json_encode($extensions_list)); if (!FW_WP_Filesystem::request_access(fw_get_framework_directory('/extensions'), fw_current_url(), array($nonce_name, $form_input_name))) { // revert hack changes $_POST[$form_input_name] = $original_post_value; unset($original_post_value); break; } // revert hack changes $_POST[$form_input_name] = $original_post_value; unset($original_post_value); $updates = $this->get_extensions_with_updates(); if (empty($updates)) { $skin->error(__('No extensions updates found.', 'fw')); break; } foreach ($extensions_list as $extension_name) { if (!($extension = fw()->extensions->get($extension_name))) { $skin->error(sprintf(__('Extension "%s" does not exist or is disabled.', 'fw'), $extension_name)); continue; } if (!isset($updates[$extension_name])) { $skin->error(sprintf(__('No update found for the "%s" extension.', 'fw'), $extension->manifest->get_name())); continue; } $update = $updates[$extension_name]; if (is_wp_error($update)) { $skin->error($update); continue; } /** @var FW_Ext_Update_Service $service */ $service = $this->get_child($update['service']); $update_result = $this->update(array('wp_fs_destination_dir' => FW_WP_Filesystem::real_path_to_filesystem_path($extension->get_declared_path()), 'download_callback' => array($service, '_download_extension'), 'download_callback_args' => array($extension, $update['latest_version'], $this->get_wp_fs_tmp_dir()), 'skin' => $skin, 'title' => sprintf(__('%s extension', 'fw'), $extension->manifest->get_name())), true); if (is_wp_error($update_result)) { $skin->error($update_result); continue; } $skin->set_result(true); if (!$this->get_config('extensions_as_one_update')) { $skin->decrement_extension_update_count($extension_name); } } if ($this->get_config('extensions_as_one_update')) { $skin->decrement_extension_update_count($extension_name); } $skin->after(); } while (false); $skin->footer(); require_once ABSPATH . 'wp-admin/admin-footer.php'; }
private function display_delete_page() { $flash_id = 'fw_extensions_delete'; if (!$this->can_install()) { FW_Flash_Messages::add($flash_id, __('You are not allowed to delete extensions.', 'fw'), 'error'); $this->js_redirect(); return; } $installed_extensions = $this->get_installed_extensions(); $extensions = array_fill_keys(array_map('trim', explode(',', FW_Request::GET('extension', ''))), array()); $error = ''; do { foreach ($extensions as $extension_name => $x) { if (empty($extension_name)) { unset($extensions[$extension_name]); continue; } if (!isset($installed_extensions[$extension_name])) { $error = sprintf(__('Extension "%s" is not installed.', 'fw'), $this->get_extension_title($extension_name)); break 2; } } if (empty($extensions)) { $error = __('No extensions to delete.', 'fw'); break; } } while (false); if ($error) { FW_Flash_Messages::add($flash_id, $error, 'error'); $this->js_redirect(); return; } if (!class_exists('_FW_Extensions_Delete_Upgrader_Skin')) { fw_include_file_isolated(dirname(__FILE__) . '/includes/class--fw-extensions-delete-upgrader-skin.php'); } $skin = new _FW_Extensions_Delete_Upgrader_Skin(array('title' => _n('Delete Extension', 'Delete Extensions', count($extensions), 'fw'))); $skin->header(); do { $nonce = $this->get_nonce('delete'); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!isset($_POST[$nonce['name']]) || !wp_verify_nonce($_POST[$nonce['name']], $nonce['action'])) { $skin->error(__('Invalid nonce.', 'fw')); } if (!FW_WP_Filesystem::request_access(fw_get_framework_directory('/extensions'), fw_current_url(), array($nonce['name']))) { break; } // add sub-extensions for deletion foreach (array_keys($extensions) as $extension_name) { foreach ($this->collect_sub_extensions($extension_name, $installed_extensions) as $sub_extension_name => $sub_extension_data) { $extensions[$sub_extension_name] = array(); } } $not_used_extensions = array_fill_keys(array_keys(array_diff_key($installed_extensions, $this->get_used_extensions($extensions, array_keys($installed_extensions)))), array()); $extensions = array_merge($extensions, $not_used_extensions); /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; foreach ($extensions as $extension_name => $x) { if (!isset($installed_extensions[$extension_name])) { $skin->error(sprintf(__('Extension "%s" is not installed.', 'fw'), $this->get_extension_title($extension_name))); continue; } if (!isset($installed_extensions[$extension_name]['path']) || empty($installed_extensions[$extension_name]['path'])) { // this happens sometimes, but I don't know why fw_print($extension_name, $installed_extensions); die; } $extension_title = $this->get_extension_title($extension_name); $wp_fs_extension_path = FW_WP_Filesystem::real_path_to_filesystem_path($installed_extensions[$extension_name]['path']); if (!$wp_filesystem->exists($wp_fs_extension_path)) { // already deleted, maybe because it was a sub-extension of an deleted extension continue; } $skin->feedback(sprintf(__('Deleting the "%s" extension...', 'fw'), $extension_title)); if (!$wp_filesystem->delete($wp_fs_extension_path, true, 'd')) { $skin->error(sprintf(__('Cannot delete the "%s" extension.', 'fw'), $extension_title)); } else { $skin->feedback(sprintf(__('%s extension successfully delete.', 'fw'), $extension_title)); $skin->set_result(true); } } $db_active_extensions = fw()->extensions->_get_db_active_extensions(); $db_active_extensions = array_diff_key($db_active_extensions, $extensions); update_option(fw()->extensions->_get_active_extensions_db_option_name(), $db_active_extensions); unset($db_active_extensions); $skin->after(array('extensions_page_link' => $this->get_link())); } else { echo '<form method="post">'; wp_nonce_field($nonce['action'], $nonce['name']); fw_render_view(dirname(__FILE__) . '/views/delete-form.php', array('extension_names' => array_keys($extensions), 'installed_extensions' => $installed_extensions, 'list_page_link' => $this->get_link()), false); echo '</form>'; } } while (false); $skin->footer(); }