Files
hub-insurance/wp-content/plugins/permalink-manager-pro/includes/core/permalink-manager-pro-license.php
T
2026-07-02 15:54:39 -06:00

323 lines
15 KiB
PHP

<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Additional hooks for "Permalink Manager Pro"
*/
class Permalink_Manager_Pro_License {
public $update_checker;
public function __construct() {
define( 'PERMALINK_MANAGER_PRO', true );
$plugin_name = preg_replace( '/(.*)\/([^\/]+\/[^\/]+.php)$/', '$2', PERMALINK_MANAGER_FILE );
// Permalink Manager Pro Alerts
add_filter( 'permalink_manager_alerts', array( $this, 'pro_alerts' ), 9, 3 );
// Check for updates
add_action( 'plugins_loaded', array( $this, 'check_for_updates' ), 10 );
add_action( 'admin_init', array( $this, 'reload_license_key' ), 10 );
add_action( 'wp_ajax_pm_get_exp_date', array( $this, 'get_expiration_date' ), 9 );
// Display License info on "Plugins" page
add_action( "after_plugin_row_{$plugin_name}", array( $this, 'license_info_bar' ), 10, 2 );
}
/**
* Get the license key from the database, constant defined in wp-config.php file, or $_POST variable
*
* @param string $load_from_db If set to true, the function will load the license key from the database, even if it's defined in wp-config.php.
*
* @return string The license key.
*/
public static function get_license_key( $load_from_db = false ) {
$permalink_manager_options = get_option( 'permalink-manager', array() );
// phpcs:disable WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.MissingUnslash
// Key defined in wp-config.php
if ( ( defined( 'PMP_LICENCE_KEY' ) || defined( 'PMP_LICENSE_KEY' ) ) && empty( $load_from_db ) ) {
$license_key = defined( 'PMP_LICENCE_KEY' ) ? PMP_LICENCE_KEY : PMP_LICENSE_KEY;
} // Network licence key (multisite)
else if ( is_multisite() ) {
$site_licence_key = get_site_option( 'permalink-manager-licence-key' );
// A. Move the license key to site options
if ( ! empty( $site_licence_key ) && ! is_array( $site_licence_key ) ) {
$new_license_key = $site_licence_key;
} // B. Save the new license key in the plugin settings
else if ( ! empty( $_POST['licence']['licence_key'] ) ) {
$new_license_key = sanitize_text_field( $_POST['licence']['licence_key'] );
}
if ( ! empty( $new_license_key ) ) {
$site_licence_key = array(
'licence_key' => sanitize_text_field( $new_license_key )
);
update_site_option( 'permalink-manager-licence-key', $site_licence_key );
}
$license_key = ( ! empty( $site_licence_key['licence_key'] ) ) ? $site_licence_key['licence_key'] : '';
} // Single website license key
else if ( ! empty( $_POST['licence']['licence_key'] ) ) {
$license_key = sanitize_text_field( $_POST['licence']['licence_key'] );
} else {
$license_key = ( ! empty( $permalink_manager_options['licence']['licence_key'] ) ) ? $permalink_manager_options['licence']['licence_key'] : "";
}
// phpcs:enable WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.MissingUnslash
return preg_replace( "/[^a-zA-Z0-9-]/", "", $license_key );
}
/**
* Check if the saved license key matches the "developer" format
*
* @param $license_key
*
* @return bool
*/
public static function is_dev_license_key( $license_key ) {
return preg_match( '/^([A-G0-9]{4,8})-([A-G0-9]{4,8})$/', $license_key ) ? true : false;
}
/**
* Load the update checker class and create an instance of it
*/
public function check_for_updates() {
$license_key = self::get_license_key();
// Load Plugin Update Checker by YahnisElsts
require_once PERMALINK_MANAGER_DIR . '/includes/vendor/plugin-update-checker/plugin-update-checker.php';
$this->update_checker = Puc_v4_Factory::buildUpdateChecker( "https://updates.permalinkmanager.pro/?action=get_metadata&slug=permalink-manager-pro&licence_key={$license_key}", PERMALINK_MANAGER_FILE, "permalink-manager-pro" );
add_filter( 'puc_request_info_result-permalink-manager-pro', array( $this, 'update_pro_info' ), 99, 2 );
}
/**
* Check if the license key was changed and if so, delete the cached license data and get the new license data from the server
*/
public function reload_license_key() {
// phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.NonceVerification.Recommended
if ( ! empty( $_POST['licence']['licence_key'] ) || ( ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] == 'pm_get_exp_date' ) || ( ! empty( $_REQUEST['puc_slug'] ) && $_REQUEST['puc_slug'] == 'permalink-manager-pro' ) ) {
delete_site_transient( 'permalink_manager_active' );
$this->update_checker->requestInfo();
} // Sync the license data saved in DB after license key was set in wp-config.php file
else if ( defined( 'PMP_LICENCE_KEY' ) || defined( 'PMP_LICENSE_KEY' ) ) {
$db_license_key = self::get_license_key( true );
$license_key = self::get_license_key();
if ( ! empty( $db_license_key ) && ! empty( $license_key ) && $db_license_key !== $license_key ) {
delete_site_transient( 'permalink_manager_active' );
$this->update_checker->requestInfo();
}
}
}
/**
* Check if the cached license key needs to be changed
*
* @param stdClass $raw The raw response from the server.
* @param array $result The response object from the API call.
*
* @return stdClass The plugin info
*/
public function update_pro_info( $raw, $result ) {
$license_key = self::get_license_key();
$permalink_manager_active = ( empty( $_POST['licence']['licence_key'] ) ) ? get_site_transient( 'permalink_manager_active' ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.NonceVerification.Recommended
// A. Do not do anything - the license info was saved before
if ( ! empty( $license_key ) && ( $permalink_manager_active == $license_key ) ) {
return $raw;
} // B. The license info was not removed or not downloaded before
else if ( empty( $permalink_manager_active ) && is_array( $result ) && ! empty( $result['body'] ) && ! empty( $license_key ) ) {
$plugin_info = json_decode( $result['body'] );
if ( is_object( $plugin_info ) && isset( $plugin_info->version ) ) {
$exp_date = ( ! empty( $plugin_info->expiration_date ) && strlen( $plugin_info->expiration_date ) > 6 ) ? strtotime( $plugin_info->expiration_date ) : '-';
$websites = ( ! empty( $plugin_info->websites ) ) ? $plugin_info->websites : '';
$license_info = array(
'licence_key' => $license_key,
'expiration_date' => $exp_date,
'websites' => $websites
);
if ( is_multisite() ) {
update_site_option( 'permalink-manager-licence-key', $license_info );
} else {
Permalink_Manager_Actions::save_settings( 'licence', $license_info, false );
}
set_site_transient( 'permalink_manager_active', $license_key, 12 * HOUR_IN_SECONDS );
}
}
return $raw;
}
/**
* Get license expiration date
*
* @param bool $basic_check
* @param bool $empty_if_valid
* @param bool $update_available
*
* @return int|string
*/
public static function get_expiration_date( $basic_check = false, $empty_if_valid = false, $update_available = true ) {
global $permalink_manager_options;
// Get expiration info & the licence key
if ( is_multisite() ) {
$site_licence_key = get_site_option( 'permalink-manager-licence-key' );
$exp_date = ( ! empty( $site_licence_key['expiration_date'] ) ) ? $site_licence_key['expiration_date'] : false;
$license_key = ( ! empty( $site_licence_key['licence_key'] ) ) ? $site_licence_key['licence_key'] : "";
$websites = ( ! empty( $site_licence_key['websites'] ) ) ? $site_licence_key['websites'] : "";
} else {
$exp_date = ( ! empty( $permalink_manager_options['licence']['expiration_date'] ) ) ? $permalink_manager_options['licence']['expiration_date'] : false;
$license_key = ( ! empty( $permalink_manager_options['licence']['licence_key'] ) ) ? $permalink_manager_options['licence']['licence_key'] : "";
$websites = ( ! empty( $permalink_manager_options['licence']['websites'] ) ) ? $permalink_manager_options['licence']['websites'] : "";
}
$license_info_page = ( ! empty( $license_key ) ) ? self::get_license_info_link( $license_key ) : "#";
// There is no license key defined
if ( empty( $license_key ) ) {
$settings_page_url = Permalink_Manager_Admin_Functions::get_admin_url( "&section=settings" );
// translators: %s is the URL to the settings page where users can manage their license keys.
$expiration_info = sprintf( __( 'Please paste the license key to access all Permalink Manager Pro updates & features <a href="%s" target="_blank">on this page</a>.', 'permalink-manager' ), $settings_page_url );
$expired = 3;
} // License key is invalid
else if ( $exp_date == '-' || ! preg_match( '/^([A-Z0-9]{5,8}-){1}[A-Z0-9]{5,8}((-[A-Z0-9]{5,8}){2})?$/i', $license_key ) ) {
$expiration_info = __( 'Your Permalink Manager Pro license key is invalid!', 'permalink-manager' );
$expired = 3;
} else {
// Key expired
if ( ! empty( $exp_date ) && $exp_date < time() ) {
// translators: %s is the URL to the Permalink Manager page where users can manage their license keys.
$expiration_info = sprintf( __( '<strong>Your Permalink Manager Pro license has expired.</strong><br />Please renew your license key using <a href="%s" target="_blank">this link</a> to restore access to plugin updates.', 'permalink-manager' ), $license_info_page );
$expired = 2;
} // License key is abused
else if ( ! empty( $exp_date ) && ! empty( $websites ) && $update_available === false ) {
$expiration_info = sprintf( __( 'Your Permalink Manager Pro license is already in use on another website and cannot be used to request automatic update for this domain.', 'permalink-manager' ), $license_info_page ) . " ";
// translators: %s is the URL to the Permalink Manager page where users can manage their license keys.
$expiration_info .= sprintf( __( 'For further information, visit the <a href="%s" target="_blank"> License info</a> page.', 'permalink-manager' ), $license_info_page );
$expired = 3;
} // Valid lifetime license key
else if ( gmdate( "Y", intval( $exp_date ) ) > gmdate( 'Y', strtotime( "+10 years" ) ) ) {
$expiration_info = __( 'You own a lifetime license key.', 'permalink-manager' );
$expired = 0;
} // License key is valid
else if ( $exp_date ) {
// License key will expire in less than month & do not display the alert if the developer license key is used
if ( $exp_date - MONTH_IN_SECONDS < time() && ! preg_match( '/^([A-G0-9]{4,8})-([A-G0-9]{4,8})$/', $license_key ) ) {
// translators: %s is the Permalink Manager's license key expiry date.
$expiration_info = sprintf( __( 'Your Permalink Manager Pro license key will expire on <strong>%s</strong>. Please renew it to maintain access to plugin updates and technical support!', 'permalink-manager' ), wp_date( get_option( 'date_format' ), $exp_date ) ) . " ";
// translators: %s is the URL to the Permalink Manager page where users can manage their license keys.
$expiration_info .= sprintf( __( 'For further information, visit the <a href="%s" target="_blank"> License info</a> page.', 'permalink-manager' ), $license_info_page );
$expired = 1;
} // License key can be used
else {
// Translators: %1$s is the expiration date, %2$s is the URL to the license info page.
$expiration_info = sprintf( __( 'Your license key is valid until %1$s.<br />To prolong it please go to <a href="%2$s" target="_blank">this page</a> for more information.', 'permalink-manager' ), gmdate( get_option( 'date_format' ), $exp_date ), $license_info_page );
$expired = 0;
}
} // Expiration data could not be downloaded
else {
$expiration_info = __( 'Expiration date could not be downloaded at this moment. Please try again in a few minutes.', 'permalink-manager' );
$expired = 0;
}
}
// Do not return any text alert
if ( $basic_check || ( $empty_if_valid && $expired == 0 ) ) {
return $expired;
}
// phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.NonceVerification.Recommended
if ( ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] == 'pm_get_exp_date' ) {
echo wp_kses_post( $expiration_info );
die();
} else {
return $expiration_info;
}
}
/**
* Get the URL to the license info page on the plugin's website
*
* @param $license_key
*
* @return string
*/
static function get_license_info_link( $license_key ) {
$license_key = ( self::is_dev_license_key( $license_key ) ) ? '' : $license_key;
$license_link = ( ! empty( $license_key ) ) ? sprintf( "https://permalinkmanager.pro/license-info/%s/", trim( $license_key ) ) : "https://permalinkmanager.pro/license-info/";
return esc_url( $license_link );
}
/**
* Display license status in the "Plugins" table
*
* @param string $plugin_file
* @param array $plugin_data
*/
function license_info_bar( $plugin_file, $plugin_data ) {
global $wp_list_table;
$column_count = ( ! empty( $wp_list_table ) ) ? $wp_list_table->get_column_count() : 3;
// $update_available = (empty($plugin_data['package']) && !empty($plugin_data['update'])) ? false : true;
$exp_info_text = self::get_expiration_date( false, true, false );
$exp_info_code = self::get_expiration_date( true, true, false );
if ( ! empty( $exp_info_text ) && $exp_info_code >= 1 ) {
printf( '<tr class="plugin-update-tr permalink-manager-pro_license-info active" data-slug="%s" data-plugin="%s"><td colspan="%d" class="plugin-update colspanchange plugin_license_info_row">', esc_attr( $plugin_data['slug'] ), esc_attr( $plugin_file ), esc_attr( $column_count ) );
printf( '<div class="update-message notice inline notice-error notice-alt">%s</div>', wp_kses_post( wpautop( $exp_info_text ) ) );
printf( '</td></tr>' );
}
}
/**
* Display license nag inside the URI Editor
*
*/
public static function license_info_uri_editor() {
$exp_info_text = self::get_expiration_date( false, true, false );
$exp_info_code = self::get_expiration_date( true, true, false );
if ( ! empty( $exp_info_text ) && $exp_info_code == 2 ) {
return sprintf( '<div class="notice inline notice-error notice-alt">%s</div>', wp_kses_post( wpautop( $exp_info_text ) ) );
}
return '';
}
/**
* Hide "Buy Permalink Manager Pro" alert
*
* @param array $alerts
*
* @return array
*/
function pro_alerts( $alerts = array() ) {
// Check expiration date
$exp_info_text = self::get_expiration_date( false, true, false );
$exp_info_code = self::get_expiration_date( true, true, false );
if ( ! empty( $exp_info_text ) && $exp_info_code >= 2 ) {
$alerts['licence_key'] = array( 'txt' => $exp_info_text, 'type' => 'notice-error', 'plugin_only' => true, 'dismissed_time' => DAY_IN_SECONDS * 3 );
}
return $alerts;
}
}