<?php if ( ! defined( 'ABSPATH' ) ) { die( 'You are not allowed to call this page directly.' ); } class FrmProAddonsController extends FrmAddonsController { /** * Render a conditional action button for a specified plugin * * @since 4.09.01 * * @param string $plugin * @param array|string $upgrade_link_args * @return void */ public static function conditional_action_button( $plugin, $upgrade_link_args ) { if ( ! is_callable( 'self::get_addon' ) ) { // FrmAddonsController may not have this function depending on version. return; } $addon = self::get_addon( $plugin ); $atts = array( 'addon' => $addon, 'license_type' => self::get_license_type(), 'plan_required' => FrmFormsHelper::get_plan_required( $addon ), 'upgrade_link' => FrmAppHelper::admin_upgrade_link( $upgrade_link_args ), ); self::show_conditional_action_button( $atts ); } /** * Render a conditional action button for an add on * * @since 4.09 * * @param array $atts { * @type array $addon * @type string|false $license_type * @type string $plan_required * @type string $upgrade_link * } * @return void */ public static function show_conditional_action_button( $atts ) { $addon = $atts['addon']; $license_type = $atts['license_type']; $plan_required = $atts['plan_required']; $upgrade_link = $atts['upgrade_link']; if ( ! $addon ) { self::addon_upgrade_link( $addon, $upgrade_link ); } elseif ( $addon['status']['type'] === 'installed' ) { ?> <a href="#" rel="<?php echo esc_attr( $addon['plugin'] ); ?>" class="button button-primary frm-button-primary frm-activate-addon <?php echo esc_attr( empty( $addon['activate_url'] ) ? 'frm_hidden' : '' ); ?>"> <?php esc_html_e( 'Activate', 'formidable' ); ?> </a> <?php } elseif ( ! empty( $addon['url'] ) ) { ?> <a href="#" class="frm-install-addon button button-primary frm-button-primary" rel="<?php echo esc_attr( $addon['url'] ); ?>" aria-label="<?php esc_attr_e( 'Install', 'formidable' ); ?>"> <?php esc_html_e( 'Install', 'formidable' ); ?> </a> <?php } elseif ( $license_type && $license_type === strtolower( $plan_required ) ) { ?> <a class="install-now button button-secondary frm-button-secondary" href="<?php echo esc_url( FrmAppHelper::admin_upgrade_link( 'addons', 'account/downloads/' ) . '&utm_content=' . $addon['slug'] ); ?>" target="_blank" aria-label="<?php esc_attr_e( 'Upgrade Now', 'formidable' ); ?>"> <?php esc_html_e( 'Renew Now', 'formidable' ); ?> </a> <?php } else { self::addon_upgrade_link( $addon, $upgrade_link ); } } /** * @since 4.06 * @since 5.0.03 added $force_type parameter. * * @param bool $force_type return type instead of checking expiration or code so "expired" or "grandfathered" are never returned. * @return string */ public static function license_type( $force_type = false ) { $api = new FrmFormApi(); $addons = $api->get_api_info(); $type = 'free'; if ( isset( $addons['error'] ) ) { if ( ! $force_type && isset( $addons['error']['code'] ) && $addons['error']['code'] === 'expired' ) { return $addons['error']['code']; } $type = isset( $addons['error']['type'] ) ? $addons['error']['type'] : $type; } if ( ! is_callable( 'self::get_pro_from_addons' ) ) { $pro = isset( $addons['93790'] ) ? $addons['93790'] : array(); } else { $pro = self::get_pro_from_addons( $addons ); } if ( $type === 'free' ) { $type = isset( $pro['type'] ) ? $pro['type'] : $type; if ( $type === 'free' ) { return $type; } } if ( $force_type ) { return strtolower( $type ); } if ( isset( $pro['code'] ) && $pro['code'] === 'grandfathered' ) { return $pro['code']; } $expires = isset( $pro['expires'] ) ? $pro['expires'] : ''; $expired = $expires ? $expires < time() : false; return $expired ? 'expired' : strtolower( $type ); } /** * @since 5.0.03 * * @return string "Basic", "Plus", "Business" or "Elite" depending on license type. "Premium" by default if type can not be determined. */ public static function get_readable_license_type() { $license_type = self::license_type( true ); if ( 0 === strpos( $license_type, 'views-' ) ) { // Remove "views-" from license type if it exists. $license_type = substr( $license_type, 6 ); } if ( in_array( $license_type, array( 'personal', 'creator' ), true ) ) { $license_type = 'plus'; } elseif ( ! in_array( $license_type, array( 'basic', 'elite', 'business', 'plus' ), true ) ) { $license_type = 'premium'; } return ucfirst( $license_type ); } /** * @since 4.08 * * @return boolean|int false or the number of days until expiration. */ public static function is_license_expiring() { $version_info = self::get_primary_license_info(); if ( ! isset( $version_info['active_sub'] ) || $version_info['active_sub'] !== 'no' ) { // Check for a subscription first. return false; } if ( isset( $version_info['error'] ) || empty( $version_info['expires'] ) ) { // It's either invalid or already expired. return false; } $expiration = $version_info['expires']; $days_left = ( $expiration - time() ) / DAY_IN_SECONDS; if ( $days_left > 30 || $days_left < 0 ) { return false; } return $days_left; } /** * Get the timestamp for expiration. * * @since 5.4.2 */ private static function license_expiration() { $version_info = self::get_primary_license_info(); return empty( $version_info['expires'] ) ? '' : $version_info['expires']; } /** * Print out an renewal message for admin banner if applicable for expired, expiring, and grace period statuses. * * @since 5.4.2 * * @return bool True if a message is shown. */ public static function admin_banner() { $status = self::get_license_status(); if ( self::should_skip_renewal_message( $status ) ) { return false; } $show_close_icon = 'expiring' === $status && current_user_can( 'administrator' ); if ( 'expired' === $status ) { $wrapper_class = 'frm-upgrade-bar'; } else { // $status is 'expiring' or 'grace'. $wrapper_class = 'frm-banner-alert ' . ( 'expiring' === $status ? 'frm_warning_style' : 'frm_error_style' ); } $utc_medium = self::get_utc_medium_for_license_status( $status ); ?> <div class="<?php echo esc_attr( $wrapper_class ); ?>"> <?php FrmAppHelper::icon_by_class( 'frmfont frm_alert_icon' ); echo '&nbsp;'; ?> <span><?php self::message_text_for_license_status( true, $status ); ?></span> <a href="<?php echo esc_url( FrmAppHelper::admin_upgrade_link( $utc_medium, 'account/downloads/' ) ); ?>"> <?php esc_html_e( 'Renew Now', 'formidable-pro' ); ?> </a> <?php if ( $show_close_icon ) { ?> <a style="float: right; margin-right: 30px; --primary-color: var(--dark-grey);" href="<?php echo esc_url( self::get_dismiss_renewal_message_action_url() ); ?>"> <?php FrmAppHelper::icon_by_class( 'frmfont frm_close_icon', array( 'aria-label' => __( 'Close', 'formidable' ) ) ); ?> </a> <?php } ?> </div> <?php return true; } /** * Get the active license status. * * @since 5.4.2 * * @return string either 'grace', 'expired', 'expiring', or 'active'. */ public static function get_license_status() { if ( self::is_license_expired() ) { return self::check_grace_period() ? 'grace' : 'expired'; } return self::is_license_expiring() ? 'expiring' : 'active'; } /** * Get or echo the message text for active license status. * * @since 5.4.2 * * @param bool $echo * @param string|false $status * @return string|void */ public static function message_text_for_license_status( $echo = false, $status = false ) { if ( ! is_callable( 'FrmAppHelper::clip' ) ) { if ( $echo ) { return; } return ''; } if ( false === $status ) { $status = self::get_license_status(); } $echo_function = __CLASS__ . '::print_' . $status; if ( ! is_callable( $echo_function ) ) { $echo_function = function() {}; } return FrmAppHelper::clip( $echo_function, $echo ); } /** * Print grace period message * * @since 5.4.2 * * @return void */ public static function print_grace() { echo 'Your account license has expired. Access to pro features will be limited '; $grace_period = self::get_grace_period(); if ( 0 === $grace_period ) { echo 'soon.'; return; } $time_remaining = FrmAppHelper::human_time_diff( $grace_period ); echo 'in <strong>' . esc_html( $time_remaining ) . '</strong>.'; } /** * Print expired status message. * * @since 5.4.2 * * @return void */ public static function print_expired() { esc_html_e( 'Your account license has expired and is no longer qualified for important security updates.', 'formidable-pro' ); } /** * Print expiring status message. * * @since 5.4.2 * * @return void */ public static function print_expiring() { $expires = self::license_expiration(); $expiring = FrmAppHelper::human_time_diff( $expires ); printf( /* translators: %s: Duration until license expires (ie 5 days, 1 hour) */ esc_html__( 'Your account license expires in %s.', 'formidable-pro' ), '<strong>' . esc_html( $expiring ) . '</strong>' ); } /** * @since 5.4.2 * * @param string $status * @return bool */ private static function should_skip_renewal_message( $status ) { // No banner for active status. if ( 'active' === $status ) { return true; } // Exit early if the user has dismissed the expiring license warning within the last day. if ( 'expiring' === $status ) { $dismissed_renewal_message = get_option( 'frm_dismissed_renewal_message' ); if ( false !== $dismissed_renewal_message && time() - (int) $dismissed_renewal_message < DAY_IN_SECONDS ) { return true; } } return false; } /** * @since 5.4.2 * * @return string */ private static function get_dismiss_renewal_message_action_url() { return wp_nonce_url( admin_url( 'admin-ajax.php?action=frm_dismiss_renewal_message' ) ); } /** * Dismiss renewal message via AJAX request. * * @return void */ public static function dismiss_renewal_message() { FrmAppHelper::permission_check( 'administrator' ); if ( ! wp_verify_nonce( FrmAppHelper::simple_get( '_wpnonce', '', 'sanitize_text_field' ) ) ) { $frm_settings = FrmAppHelper::get_settings(); die( esc_html( $frm_settings->admin_permission ) ); } update_option( 'frm_dismissed_renewal_message', time(), 'no' ); wp_safe_redirect( self::get_after_dismiss_redirect_url() ); } /** * @since 5.4.2 * * @return string URL to redirect to after dismissing renewal message. */ private static function get_after_dismiss_redirect_url() { $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' ); if ( ! $referer ) { return self::get_default_dismiss_redirect_url(); } $parsed = parse_url( $referer ); if ( ! is_array( $parsed ) || empty( $parsed['query'] ) || empty( $parsed['path'] ) ) { return self::get_default_dismiss_redirect_url(); } $parts = explode( '/', $parsed['path'] ); $path = end( $parts ); if ( ! in_array( $path, array( 'edit.php', 'admin.php' ), true ) ) { return self::get_default_dismiss_redirect_url(); } $query = $parsed['query']; return admin_url( $path . '?' . $query ); } /** * @since 5.4.2 * * @return string */ private static function get_default_dismiss_redirect_url() { return admin_url( 'admin.php?page=formidable' ); } /** * @param string $status * @return string */ public static function get_utc_medium_for_license_status( $status ) { return 'expiring' === $status ? 'form-renew' : 'form-expired'; } /** * @since 5.4.2 * * @return bool True if within grace period. */ private static function check_grace_period() { $grace_period = self::get_grace_period(); return 0 === $grace_period || time() < $grace_period; } /** * @since 5.4.2 * * @return int */ private static function get_grace_period() { $info = self::get_primary_license_info(); foreach ( array( 'grace', 'expires' ) as $key ) { if ( ! isset( $info[ $key ] ) || ! is_numeric( $info[ $key ] ) ) { return 0; } } $grace = intval( $info['grace'] ); $expires = intval( $info['expires'] ); if ( $grace < $expires ) { return 0; } return $grace; } /** * @since 4.06.02 */ public static function ajax_multiple_addons() { self::install_addon_permissions(); // Set the current screen to avoid undefined notices. global $hook_suffix; set_current_screen(); $free_plugin_supports_current_plugin_var = is_callable( 'self::get_current_plugin' ); $download_urls = explode( ',', FrmAppHelper::get_param( 'plugin', '', 'post' ) ); FrmAppHelper::sanitize_value( 'esc_url_raw', $download_urls ); foreach ( $download_urls as $download_url ) { if ( $free_plugin_supports_current_plugin_var ) { self::$plugin = $download_url; } else { $_POST['plugin'] = $download_url; } if ( strpos( $download_url, 'http' ) !== false ) { // Installing. self::maybe_show_cred_form(); $installed = self::install_addon(); self::maybe_activate_addon( $installed ); } else { // Activating. self::maybe_activate_addon( $download_url ); } } echo json_encode( __( 'Your plugins have been installed and activated.', 'formidable' ) ); wp_die(); } /** * @since 5.4.2 * * @return bool */ public static function is_expired_outside_grace_period() { return self::is_license_expired() && ! self::check_grace_period(); } /** * @since 5.4.2 * * @return bool */ public static function pro_is_behind_latest_version() { $version = FrmProDb::$plug_version; $addons = self::get_primary_license_info(); if ( ! is_callable( 'self::get_pro_from_addons' ) ) { return false; } $pro = self::get_pro_from_addons( $addons ); if ( ! $pro ) { return false; } return version_compare( $version, $pro['version'], '<' ); } /** * @since 4.09.01 * @deprecated x.x * * @return void */ public static function show_expired_message() { _deprecated_function( __METHOD__, 'x.x' ); } /** * @since 4.08 * @deprecated x.x * * @return void */ public static function expiring_message() { _deprecated_function( __METHOD__, 'x.x', 'FrmProAddonsController::admin_banner' ); self::admin_banner(); } /** * @since 4.07 * @deprecated x.x * * @return void */ public static function renewal_message() { // This function gets called from lite for the frm_page_footer action. // This function does nothing rather than call admin_banner to avoid classes like "frm-banner-alert" and "frm-upgrade-bar" // from appearing in the footer. // _deprecated_function isn't called as this function gets called from old versions of lite. } }