233 lines
5.2 KiB
PHP
233 lines
5.2 KiB
PHP
<?php
|
|
/**
|
|
* License Manager
|
|
*
|
|
* Author: Bogdan Preda <bogdan.preda@themeisle.com>
|
|
* Created on: 10-10-{2022}
|
|
*
|
|
* @package templates-patterns-collection
|
|
*/
|
|
namespace TIOB;
|
|
|
|
/**
|
|
* Class License
|
|
*/
|
|
final class License {
|
|
const API_URL = 'https://api.themeisle.com/templates-cloud/';
|
|
const LICENSE_DATA_OPTIONS_KEY = 'templates_patterns_collection_license_data';
|
|
const LICENSE_KEY_OPTION_KEY = 'templates_patterns_collection_license';
|
|
const LICENSE_TRANSIENT_KEY = 'templates_patterns_collection_license_check';
|
|
|
|
const NEVE_CATEGORY_MAPPING = array(
|
|
1 => 1,
|
|
2 => 1,
|
|
3 => 2,
|
|
4 => 2,
|
|
5 => 3,
|
|
6 => 3,
|
|
7 => 1,
|
|
8 => 2,
|
|
9 => 3,
|
|
);
|
|
|
|
/**
|
|
* The main instance var.
|
|
*
|
|
* @var License|null
|
|
*/
|
|
protected static $instance = null;
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @return void
|
|
*/
|
|
private function __construct() {
|
|
add_action( 'admin_init', array( $this, 'inherit_license_from_neve' ) );
|
|
add_filter(
|
|
'tiob_license_key',
|
|
function () {
|
|
return get_option( self::LICENSE_KEY_OPTION_KEY );
|
|
}
|
|
);
|
|
add_filter(
|
|
'pre_update_option',
|
|
function ( $value, $option, $old_value ) {
|
|
if ( $option === self::LICENSE_KEY_OPTION_KEY ) {
|
|
if ( $value !== $old_value ) {
|
|
delete_transient( self::LICENSE_TRANSIENT_KEY );
|
|
}
|
|
}
|
|
return $value;
|
|
},
|
|
10,
|
|
3
|
|
);
|
|
|
|
register_setting(
|
|
'tpc_license_settings',
|
|
self::LICENSE_KEY_OPTION_KEY,
|
|
array(
|
|
'type' => 'string',
|
|
'show_in_rest' => true,
|
|
'default' => '',
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get Instance
|
|
*
|
|
* @return $this
|
|
*/
|
|
public static function get_instance() {
|
|
if ( is_null( self::$instance ) ) {
|
|
self::$instance = new self();
|
|
}
|
|
|
|
return self::$instance;
|
|
}
|
|
|
|
private function safe_get( $url, $args = array() ) {
|
|
return function_exists( 'vip_safe_wp_remote_get' )
|
|
? vip_safe_wp_remote_get( $url )
|
|
: wp_remote_get( //phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.wp_remote_get_wp_remote_get, Already used.
|
|
$url,
|
|
$args
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Inherit license from Neve
|
|
*/
|
|
public function inherit_license_from_neve() {
|
|
$should_inherit = ! get_option( 'tiob_inherited_autoactivate', false );
|
|
|
|
if ( $should_inherit && false === self::has_active_license() && 'valid' === apply_filters( 'product_neve_license_status', false ) ) {
|
|
$neve_license = apply_filters( 'product_neve_license_key', 'free' );
|
|
$this->check_license( $neve_license );
|
|
update_option( 'tiob_inherited_autoactivate', true );
|
|
return;
|
|
}
|
|
|
|
if ( ! get_transient( self::LICENSE_TRANSIENT_KEY ) ) {
|
|
$tiob_license = apply_filters( 'tiob_license_key', 'free' );
|
|
$this->check_license( $tiob_license );
|
|
}
|
|
|
|
}
|
|
|
|
private function set_license( $license, $license_data ) {
|
|
update_option( self::LICENSE_KEY_OPTION_KEY, $license );
|
|
update_option( self::LICENSE_DATA_OPTIONS_KEY, $license_data );
|
|
set_transient( self::LICENSE_TRANSIENT_KEY, true, 12 * HOUR_IN_SECONDS );
|
|
}
|
|
|
|
public function check_license( $license ) {
|
|
$license_url = sprintf( '%stemplates/?license_id=%s&site_url=%s&license_check=1', self::API_URL, $license, rawurlencode( home_url() ) );
|
|
$response = $this->safe_get( $license_url );
|
|
|
|
if ( is_wp_error( $response ) ) {
|
|
return false;
|
|
}
|
|
|
|
$license_data = json_decode( wp_remote_retrieve_body( $response ) );
|
|
$code = wp_remote_retrieve_response_code( $response );
|
|
|
|
if ( $code !== 200 ) {
|
|
return false;
|
|
}
|
|
|
|
if ( ! empty( $license_data ) && ( isset( $license_data->code ) || isset( $license_data->message ) ) ) {
|
|
$this->set_license(
|
|
$license,
|
|
(object) array(
|
|
'key' => 'free',
|
|
'valid' => 'invalid',
|
|
'expiration' => '',
|
|
'tier' => 0,
|
|
)
|
|
);
|
|
return false;
|
|
}
|
|
|
|
$this->set_license( $license, $license_data );
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Get active license.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public static function has_active_license() {
|
|
$status = self::get_license_data();
|
|
|
|
if ( ! $status ) {
|
|
return false;
|
|
}
|
|
|
|
if ( ! isset( $status->license ) ) {
|
|
return false;
|
|
}
|
|
|
|
if ( 'not_active' === $status->license || 'invalid' === $status->license ) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Get the license data.
|
|
*
|
|
* @return bool|\stdClass
|
|
*/
|
|
public static function get_license_data() {
|
|
return get_option( self::LICENSE_DATA_OPTIONS_KEY );
|
|
}
|
|
|
|
/**
|
|
* Get the license tier.
|
|
*
|
|
* @param int $default_tier The default tier.
|
|
* @return int
|
|
*/
|
|
public static function get_license_tier( $default_tier = 0 ) {
|
|
$license = self::get_license_data();
|
|
|
|
if ( isset( $license->tier ) && absint( $license->tier ) >= 0 ) {
|
|
$tier = $license->tier;
|
|
|
|
if ( $license->tier !== 3 ) {
|
|
$category_mapping = self::NEVE_CATEGORY_MAPPING;
|
|
$tier = isset( $category_mapping[ $license->tier ] ) ? $category_mapping[ $license->tier ] : $license->tier;
|
|
}
|
|
|
|
return (int) $tier;
|
|
}
|
|
|
|
return $default_tier;
|
|
}
|
|
|
|
/**
|
|
* Throw error on object clone
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __clone() {
|
|
// Cloning instances of the class is forbidden.
|
|
_doing_it_wrong( __FUNCTION__, '', '1.0.0' );
|
|
}
|
|
|
|
/**
|
|
* Disable un-serializing of the class
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __wakeup() {
|
|
// Un-serializing instances of the class is forbidden.
|
|
_doing_it_wrong( __FUNCTION__, '', '1.0.0' );
|
|
}
|
|
}
|