Below is a differential between the unpatched vulnerable code and the patched update, for reference.
--- a/fullscreen-background/freemius/includes/class-freemius.php
+++ b/fullscreen-background/freemius/includes/class-freemius.php
@@ -1661,9 +1661,9 @@
if (
$this->is_user_in_admin() &&
$this->is_parallel_activation() &&
- $this->_premium_plugin_basename !== $this->premium_plugin_basename_from_parallel_activation
+ $this->_premium_plugin_basename !== $this->_premium_plugin_basename_from_parallel_activation
) {
- $this->_premium_plugin_basename = $this->premium_plugin_basename_from_parallel_activation;
+ $this->_premium_plugin_basename = $this->_premium_plugin_basename_from_parallel_activation;
register_activation_hook(
dirname( $this->_plugin_dir_path ) . '/' . $this->_premium_plugin_basename,
@@ -1681,7 +1681,7 @@
* @return bool
*/
private function is_parallel_activation() {
- return ! empty( $this->premium_plugin_basename_from_parallel_activation );
+ return ! empty( $this->_premium_plugin_basename_from_parallel_activation );
}
/**
@@ -5205,7 +5205,7 @@
throw new Exception('You need to specify the premium version basename to enable parallel version activation.');
}
- $this->premium_plugin_basename_from_parallel_activation = $premium_basename;
+ $this->_premium_plugin_basename_from_parallel_activation = $premium_basename;
if ( is_plugin_active( $premium_basename ) ) {
$is_premium = true;
@@ -24000,13 +24000,15 @@
// Start trial button.
$button = ' ' . sprintf(
- '<a style="margin-left: 10px; vertical-align: super;" href="%s"><button class="button button-primary">%s ➜</button></a>',
+ '<div><a class="button button-primary" href="%s">%s ➜</a></div>',
$trial_url,
$this->get_text_x_inline( 'Start free trial', 'call to action', 'start-free-trial' )
);
+ $message_text = $this->apply_filters( 'trial_promotion_message', "{$message} {$cc_string}" );
+
$this->_admin_notices->add_sticky(
- $this->apply_filters( 'trial_promotion_message', "{$message} {$cc_string} {$button}" ),
+ "<div class="fs-trial-message-container"><div>{$message_text}</div> {$button}</div>",
'trial_promotion',
'',
'promotion'
@@ -25476,7 +25478,7 @@
$img_dir = WP_FS__DIR_IMG;
// Locate the main assets folder.
- if ( 1 < count( $fs_active_plugins->plugins ) ) {
+ if ( ! empty( $fs_active_plugins->plugins ) ) {
$plugin_or_theme_img_dir = ( $this->is_plugin() ? WP_PLUGIN_DIR : get_theme_root( get_stylesheet() ) );
foreach ( $fs_active_plugins->plugins as $sdk_path => &$data ) {
--- a/fullscreen-background/freemius/includes/class-fs-plugin-updater.php
+++ b/fullscreen-background/freemius/includes/class-fs-plugin-updater.php
@@ -542,24 +542,8 @@
global $wp_current_filter;
- $current_plugin_version = $this->_fs->get_plugin_version();
-
- if ( ! empty( $wp_current_filter ) && 'upgrader_process_complete' === $wp_current_filter[0] ) {
- if (
- is_null( $this->_update_details ) ||
- ( is_object( $this->_update_details ) && $this->_update_details->new_version !== $current_plugin_version )
- ) {
- /**
- * After an update, clear the stored update details and reparse the plugin's main file in order to get
- * the updated version's information and prevent the previous update information from showing up on the
- * updates page.
- *
- * @author Leo Fajardo (@leorw)
- * @since 2.3.1
- */
- $this->_update_details = null;
- $current_plugin_version = $this->_fs->get_plugin_version( true );
- }
+ if ( ! empty( $wp_current_filter ) && in_array( 'upgrader_process_complete', $wp_current_filter ) ) {
+ return $transient_data;
}
if ( ! isset( $this->_update_details ) ) {
@@ -568,7 +552,7 @@
false,
fs_request_get_bool( 'force-check' ),
FS_Plugin_Updater::UPDATES_CHECK_CACHE_EXPIRATION,
- $current_plugin_version
+ $this->_fs->get_plugin_version()
);
$this->_update_details = false;
--- a/fullscreen-background/freemius/includes/entities/class-fs-plugin-plan.php
+++ b/fullscreen-background/freemius/includes/entities/class-fs-plugin-plan.php
@@ -13,7 +13,6 @@
/**
* Class FS_Plugin_Plan
*
- * @property FS_Pricing[] $pricing
*/
class FS_Plugin_Plan extends FS_Entity {
--- a/fullscreen-background/freemius/includes/entities/class-fs-site.php
+++ b/fullscreen-background/freemius/includes/entities/class-fs-site.php
@@ -10,16 +10,16 @@
exit;
}
- /**
- * @property int $blog_id
- */
- #[AllowDynamicProperties]
class FS_Site extends FS_Scope_Entity {
/**
* @var number
*/
public $site_id;
/**
+ * @var int
+ */
+ public $blog_id;
+ /**
* @var number
*/
public $plugin_id;
@@ -231,6 +231,7 @@
foreach ( $sandbox_wp_environment_domains as $domain) {
if (
+ ( $host === $domain ) ||
fs_ends_with( $host, '.' . $domain ) ||
fs_ends_with( $host, '-' . $domain )
) {
--- a/fullscreen-background/freemius/includes/entities/class-fs-user.php
+++ b/fullscreen-background/freemius/includes/entities/class-fs-user.php
@@ -48,6 +48,19 @@
parent::__construct( $user );
}
+ /**
+ * This method removes the deprecated 'is_beta' property from the serialized data.
+ * Should clean up the serialized data to avoid PHP 8.2 warning on next execution.
+ *
+ * @return void
+ */
+ function __wakeup() {
+ if ( property_exists( $this, 'is_beta' ) ) {
+ // If we enter here, and we are running PHP 8.2, we already had the warning. But we sanitize data for next execution.
+ unset( $this->is_beta );
+ }
+ }
+
function get_name() {
return trim( ucfirst( trim( is_string( $this->first ) ? $this->first : '' ) ) . ' ' . ucfirst( trim( is_string( $this->last ) ? $this->last : '' ) ) );
}
--- a/fullscreen-background/freemius/includes/managers/class-fs-admin-menu-manager.php
+++ b/fullscreen-background/freemius/includes/managers/class-fs-admin-menu-manager.php
@@ -699,16 +699,36 @@
$menu = $this->find_main_submenu();
}
+ $menu_slug = $menu['menu'][2];
$parent_slug = isset( $menu['parent_slug'] ) ?
- $menu['parent_slug'] :
- 'admin.php';
+ $menu['parent_slug'] :
+ 'admin.php';
- return admin_url(
- $parent_slug .
- ( false === strpos( $parent_slug, '?' ) ? '?' : '&' ) .
- 'page=' .
- $menu['menu'][2]
- );
+ if ( fs_apply_filter( $this->_module_unique_affix, 'enable_cpt_advanced_menu_logic', false ) ) {
+ $parent_slug = 'admin.php';
+
+ /**
+ * This line and the `if` block below it are based on the `menu_page_url()` function of WordPress.
+ *
+ * @author Leo Fajardo (@leorw)
+ * @since 2.10.2
+ */
+ global $_parent_pages;
+
+ if ( ! empty( $_parent_pages[ $menu_slug ] ) ) {
+ $_parent_slug = $_parent_pages[ $menu_slug ];
+ $parent_slug = isset( $_parent_pages[ $_parent_slug ] ) ?
+ $parent_slug :
+ $menu['parent_slug'];
+ }
+ }
+
+ return admin_url(
+ $parent_slug .
+ ( false === strpos( $parent_slug, '?' ) ? '?' : '&' ) .
+ 'page=' .
+ $menu_slug
+ );
}
/**
--- a/fullscreen-background/freemius/includes/managers/class-fs-admin-notice-manager.php
+++ b/fullscreen-background/freemius/includes/managers/class-fs-admin-notice-manager.php
@@ -194,8 +194,14 @@
* @since 1.0.7
*/
static function _add_sticky_dismiss_javascript() {
+ $sticky_admin_notice_js_template_name = 'sticky-admin-notice-js.php';
+
+ if ( ! file_exists( fs_get_template_path( $sticky_admin_notice_js_template_name ) ) ) {
+ return;
+ }
+
$params = array();
- fs_require_once_template( 'sticky-admin-notice-js.php', $params );
+ fs_require_once_template( $sticky_admin_notice_js_template_name, $params );
}
private static $_added_sticky_javascript = false;
--- a/fullscreen-background/freemius/start.php
+++ b/fullscreen-background/freemius/start.php
@@ -15,7 +15,7 @@
*
* @var string
*/
- $this_sdk_version = '2.10.0';
+ $this_sdk_version = '2.11.0';
#region SDK Selection Logic --------------------------------------------------------------------
@@ -108,15 +108,33 @@
$is_current_sdk_from_parent_theme = $file_path == $themes_directory . '/' . get_template() . '/' . $theme_candidate_sdk_basename . '/' . basename( $file_path );
}
+ $theme_name = null;
if ( $is_current_sdk_from_active_theme ) {
- $this_sdk_relative_path = '../' . $themes_directory_name . '/' . get_stylesheet() . '/' . $theme_candidate_sdk_basename;
+ $theme_name = get_stylesheet();
+ $this_sdk_relative_path = '../' . $themes_directory_name . '/' . $theme_name . '/' . $theme_candidate_sdk_basename;
$is_theme = true;
} else if ( $is_current_sdk_from_parent_theme ) {
- $this_sdk_relative_path = '../' . $themes_directory_name . '/' . get_template() . '/' . $theme_candidate_sdk_basename;
+ $theme_name = get_template();
+ $this_sdk_relative_path = '../' . $themes_directory_name . '/' . $theme_name . '/' . $theme_candidate_sdk_basename;
$is_theme = true;
} else {
$this_sdk_relative_path = plugin_basename( $fs_root_path );
$is_theme = false;
+
+ /**
+ * If this file was included from another plugin with lower SDK version, and if this plugin is symlinked, then we need to get the actual plugin path,
+ * as the value right now will be wrong, it will only remove the directory separator from the file_path.
+ *
+ * The check of `fs_find_direct_caller_plugin_file` determines that this file was indeed included by a different plugin than the main plugin.
+ */
+ if ( DIRECTORY_SEPARATOR . $this_sdk_relative_path === $fs_root_path && function_exists( 'fs_find_direct_caller_plugin_file' ) ) {
+ $original_plugin_dir_name = dirname( fs_find_direct_caller_plugin_file( $file_path ) );
+
+ // Remove everything before the original plugin directory name.
+ $this_sdk_relative_path = substr( $this_sdk_relative_path, strpos( $this_sdk_relative_path, $original_plugin_dir_name ) );
+
+ unset( $original_plugin_dir_name );
+ }
}
if ( ! isset( $fs_active_plugins ) ) {
@@ -202,7 +220,7 @@
) {
if ( $is_theme ) {
// Saving relative path and not only directory name as it could be a subfolder
- $plugin_path = $this_sdk_relative_path;
+ $plugin_path = $theme_name;
} else {
$plugin_path = plugin_basename( fs_find_direct_caller_plugin_file( $file_path ) );
}
@@ -357,7 +375,7 @@
return;
}
- if ( version_compare( $this_sdk_version, $fs_active_plugins->newest->version, '<' ) ) {
+ if ( isset( $fs_active_plugins->newest ) && version_compare( $this_sdk_version, $fs_active_plugins->newest->version, '<' ) ) {
$newest_sdk = $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ];
$plugins_or_theme_dir_path = ( ! isset( $newest_sdk->type ) || 'theme' !== $newest_sdk->type ) ?
--- a/fullscreen-background/fullscreen-background.php
+++ b/fullscreen-background/fullscreen-background.php
@@ -16,7 +16,7 @@
* Plugin Name: Fullscreen Background
* Plugin URI: https://www.enweby.com/product/fullscreen-background/
* Description: Lightweight plugin to add Fullscreen Background image or video on your WordPress site by Enweby.
- * Version: 2.0.2
+ * Version: 2.0.3
* Author: Enweby
* Author URI: https://www.enweby.com/
* License: GPL-2.0+
@@ -40,7 +40,6 @@
global $enwbfb_fs;
if ( !isset( $enwbfb_fs ) ) {
// Include Freemius SDK.
- // Manually include the Freemius SDK (not needed if using Composer).
require_once dirname( __FILE__ ) . '/freemius/start.php';
$enwbfb_fs = fs_dynamic_init( array(
'id' => '12796',
@@ -52,7 +51,8 @@
'has_addons' => false,
'has_paid_plans' => true,
'menu' => array(
- 'slug' => 'enweby-fullscreen-background-settings',
+ 'slug' => 'enweby-fullscreen-background-settings',
+ 'support' => false,
),
'anonymous_mode' => true,
'is_live' => true,
@@ -100,7 +100,7 @@
* Start at version 1.0.0 and use SemVer - https://semver.org
* Rename this for your plugin and update it as you release new versions.
*/
- define( 'FULLSCREEN_BACKGROUND_VERSION', '2.0.2' );
+ define( 'FULLSCREEN_BACKGROUND_VERSION', '2.0.3' );
/**
* Plugin base name.
* used to locate plugin resources primarily code files