patcher = $patcher; // If the product is bundled, early exit. $is_bundled = $this->patcher->is_bundled(); if ( $is_bundled ) { return; } // Get the patches when we're in the patcher page. $args = $this->patcher->get_args(); if ( isset( $args['is_patcher_page'] ) && true === $args['is_patcher_page'] ) { $this->patches = Fusion_Patcher_Client::get_patches( $this->patcher->get_args() ); } // Add menu page. add_action( 'admin_menu', array( $this, 'admin_menu' ) ); // Call register settings function. add_action( 'admin_init', array( $this, 'settings' ) ); add_action( 'admin_init', array( $this, 'init' ), 999 ); add_filter( 'whitelist_options', array( $this, 'whitelist_options' ) ); add_filter( 'custom_menu_order', array( $this, 'reorder_submenus' ) ); } /** * Additional actions. * * @access public * @since 1.0.0 */ public function init() { $is_patcher_page = $this->patcher->get_args( 'is_patcher_page' ); if ( null === $is_patcher_page || false === $is_patcher_page ) { return; } // Set the $patches property. $bundles = $this->patcher->get_args( 'bundled' ); if ( ! $bundles ) { $bundles = array(); } foreach ( $bundles as $bundle ) { $instance = $this->patcher->get_instance( $bundle ); if ( is_object( $instance ) ) { $bundle_patches = Fusion_Patcher_Client::get_patches( $instance->get_args() ); foreach ( $bundle_patches as $key => $value ) { if ( ! isset( $this->patches[ $key ] ) ) { $this->patches[ $key ] = $value; } } } } // Add the patcher to the support screen. add_action( 'fusion_admin_pages_patcher', array( $this, 'form' ) ); } /** * Adds a submenu page. * * @access public * @since 1.0.0 */ public function admin_menu() { if ( isset( self::$menu_added[ $this->patcher->get_args( 'context' ) ] ) && self::$menu_added[ $this->patcher->get_args( 'context' ) ] ) { return; } add_submenu_page( $this->patcher->get_args( 'parent_slug' ), $this->patcher->get_args( 'page_title' ), $this->patcher->get_args( 'menu_title' ), 'manage_options', $this->patcher->get_args( 'context' ) . '-fusion-patcher', array( $this, 'admin_page' ) ); self::$menu_added[ $this->patcher->get_args( 'context' ) ] = true; } /** * Reorders the Avada/FB submenu page. * * @access public * @since 1.0.0 */ public function reorder_submenus() { global $submenu; if ( isset( $submenu['avada'] ) && isset( $submenu['avada'][8] ) ) { $theme_options_entry = $submenu['avada'][7]; $patcher_entry = $submenu['avada'][8]; $submenu['avada'][7] = $patcher_entry; $submenu['avada'][8] = $theme_options_entry; } } /** * The admin-page contents. * * @access public * @since 1.0.0 */ public function admin_page() { ?>
manually_applied_patches(); ?> footer_content(); ?>
patches ) ) { return; } // Register settings for the patch contents. foreach ( $this->patches as $key => $value ) { register_setting( 'fusion_patcher_' . $key, 'fusion_patch_contents_' . $key ); } } /** * The page contents. * * @access public * @return void */ public function form() { if ( isset( self::$printed_forms[ $this->patcher->get_args( 'context' ) ] ) ) { return; } // Determine if there are available patches, and build an array of them. $available_patches = array(); foreach ( $this->patches as $patch_id => $patch_args ) { if ( ! isset( $patch_args['patch'] ) ) { continue; } foreach ( $patch_args['patch'] as $key => $unique_patch_args ) { // Make sure the context is right. if ( $this->patcher->get_args( 'context' ) === $unique_patch_args['context'] ) { // Make sure the version is right. if ( $this->patcher->get_args( 'version' ) === $unique_patch_args['version'] ) { $available_patches[] = $patch_id; $context[ $this->patcher->get_args( 'context' ) ] = true; } } // Check for bundled products. $bundles = $this->patcher->get_args( 'bundled' ); if ( ! $bundles ) { $bundles = array(); } foreach ( $bundles as $bundle ) { $instance = $this->patcher->get_instance( $bundle ); if ( is_object( $instance ) ) { // Make sure the context is right. if ( $instance->get_args( 'context' ) === $unique_patch_args['context'] ) { // Make sure the version is right. if ( $instance->get_args( 'version' ) === $unique_patch_args['version'] ) { $available_patches[] = $patch_id; $context[ $instance->get_args( 'context' ) ] = true; } } } } } } // Make sure we have a unique array. $available_patches = array_unique( $available_patches ); // Sort the array by value and re-index the keys. sort( $available_patches ); // Get an array of the already applied patches. $applied_patches = get_site_option( 'fusion_applied_patches', array() ); // Get an array of patches that failed to be applied. $failed_patches = get_site_option( 'fusion_failed_patches', array() ); // Get the array of messages to display. $messages = Fusion_Patcher_Admin_Notices::get_messages(); ?>

patcher->get_args( 'name' ) ), esc_attr( $this->patcher->get_args( 'version' ) ) ); ?> patcher->get_args( 'name' ) ), esc_attr( $this->patcher->get_args( 'version' ) ) ); ?>

$message ) : ?>

$patch_id ) : ?> patches ) ) { continue; } // Get the patch arguments. $patch_args = $this->patches[ $patch_id ]; // Has the patch been applied? $patch_applied = ( in_array( $patch_id, $applied_patches, true ) ); // Has the patch failed? $patch_failed = ( in_array( $patch_id, $failed_patches, true ) ); // If there is no previous patch, we can apply it. if ( ! isset( $available_patches[ $key - 1 ] ) ) { $can_apply = true; } // If the previous patch exists and has already been applied, // then we can apply this one. if ( isset( $available_patches[ $key - 1 ] ) ) { if ( in_array( $available_patches[ $key - 1 ], $applied_patches, true ) ) { $can_apply = true; } } ?>
#
patcher->get_args( 'context' ) . '-fusion-patcher&manually-applied-patch=' . $patch_id; ?>
patcher->get_args( 'context' ) ] = true; // Delete some messages. Fusion_Patcher_Admin_Notices::remove_messages_option(); } /** * Format the patch. * We're encoding everything here for security reasons. * We're also going to check the current versions of Avada & Fusion-Core, * and then build the hash for this patch using the files that are needed. * * @since 4.0.0 * @access private * @param array $patch The patch array. * @return string */ private function format_patch( $patch ) { $patches = array(); if ( ! isset( $patch['patch'] ) ) { return; } foreach ( $patch['patch'] as $key => $args ) { if ( ! isset( $args['context'] ) || ! isset( $args['path'] ) || ! isset( $args['reference'] ) ) { continue; } $valid_contexts = array(); $valid_contexts[] = $this->patcher->get_args( 'context' ); $bundled = $this->patcher->get_args( 'bundled' ); if ( ! empty( $bundled ) ) { foreach ( $bundled as $product ) { $valid_contexts[] = $product; } } foreach ( $valid_contexts as $context ) { if ( $context === $args['context'] ) { $patcher_instance = $this->patcher->get_instance( $context ); if ( null === $patcher_instance ) { continue; } $v1 = Fusion_Helper::normalize_version( $patcher_instance->get_args( 'version' ) ); $v2 = Fusion_Helper::normalize_version( $args['version'] ); if ( version_compare( $v1, $v2, '==' ) ) { $patches[ $context ][ $args['path'] ] = $args['reference']; } } } } return base64_encode( wp_json_encode( $patches ) ); } /** * Make sure manually applied patches show as successful. * * @access private * @since 5.0.3 */ private function manually_applied_patches() { $manual_patches_found = ''; if ( isset( $_GET['manually-applied-patch'] ) ) { $manual_patches_found = sanitize_text_field( wp_unslash( $_GET['manually-applied-patch'] ) ); } if ( defined( 'FUSION_MANUALLY_APPLIED_PATCHES' ) ) { $manual_patches_found = FUSION_MANUALLY_APPLIED_PATCHES . ',' . $manual_patches_found; } if ( empty( $manual_patches_found ) ) { return; } $messages_option = get_site_option( Fusion_Patcher_Admin_Notices::$option_name ); $manual_patches = explode( ',', $manual_patches_found ); $applied_patches = get_site_option( 'fusion_applied_patches', array() ); $failed_patches = get_site_option( 'fusion_failed_patches', array() ); foreach ( $manual_patches as $patch ) { $patch = (int) trim( $patch ); // Update the applied-patches option. if ( ! in_array( $patch, $applied_patches, true ) ) { $applied_patches[] = $patch; update_site_option( 'fusion_applied_patches', $applied_patches ); } // If the patch is in the array of failed patches, remove it. if ( in_array( $patch, $failed_patches, true ) ) { $failed_key = array_search( $patch, $failed_patches, true ); unset( $failed_patches[ $failed_key ] ); update_site_option( 'fusion_failed_patches', $failed_patches ); } // Remove messages if they exist. if ( isset( $this->patches[ $patch ] ) ) { foreach ( $this->patches[ $patch ]['patch'] as $args ) { $message_id = 'write-permissions-' . $patch; if ( isset( $messages_option[ $message_id ] ) ) { unset( $messages_option[ $message_id ] ); update_site_option( Fusion_Patcher_Admin_Notices::$option_name, $messages_option ); } } } } } /** * Footer content. * * @access protected * @since 1.0.0 */ protected function footer_content() { } /** * Whitelist options. * * @access public * @since 1.0.0 * @param array $options The whitelisted options. * @return array */ public function whitelist_options( $options ) { $added = array(); // Register settings for the patch contents. foreach ( $this->patches as $key => $value ) { $added[ 'fusion_patcher_' . $key ] = array( 'fusion_patch_contents_' . $key, ); } $options = add_option_whitelist( $added, $options ); return $options; } }