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( "§ion=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 on this page.', '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( __( 'Your Permalink Manager Pro license has expired.
Please renew your license key using this link 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 License info 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 %s. 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 License info 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.
To prolong it please go to this page 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( '