575 lines
20 KiB
PHP
575 lines
20 KiB
PHP
<?php
|
|
|
|
namespace PixelYourSite;
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit; // Exit if accessed directly.
|
|
}
|
|
|
|
/**
|
|
* @param Plugin|Settings $plugin
|
|
*/
|
|
function renderLicenseControls( $plugin ) {
|
|
|
|
$slug = $plugin->getSlug();
|
|
$input_name = "pys[{$slug}][license_action]";
|
|
|
|
$license_status = $plugin->getOption( 'license_status' );
|
|
|
|
?>
|
|
|
|
<div class="row">
|
|
<?php if( $license_status == 'valid' || $license_status == 'expired') : ?>
|
|
<div class="col-3">
|
|
<?php $plugin->render_text_input( 'license_key', 'Enter your license key', true, true, false); ?>
|
|
<button class="btn btn-block btn-sm btn-primary" name="<?php esc_attr_e( $input_name ); ?>"
|
|
value="reactivate">Reactivate License</button>
|
|
</div>
|
|
<?php else : ?>
|
|
<div class="col-9">
|
|
<?php $plugin->render_text_input( 'license_key', 'Enter your license key', false, false, false ); ?>
|
|
</div>
|
|
|
|
<?php endif; ?>
|
|
|
|
<div class="col-3">
|
|
<?php if( $license_status == 'valid' || $license_status == 'expired') : ?>
|
|
<button class="btn btn-block btn-sm btn-danger" name="<?php esc_attr_e( $input_name ); ?>"
|
|
value="deactivate">Deactivate License</button>
|
|
<?php else : ?>
|
|
<button class="btn btn-block btn-sm btn-primary" name="<?php esc_attr_e( $input_name ); ?>"
|
|
value="activate">Activate License</button>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
<?php
|
|
|
|
$license_key = $plugin->getOption( 'license_key' );
|
|
$license_expires = $plugin->getOption( 'license_expires', null );
|
|
|
|
$license_expires_soon = false;
|
|
$license_expired = false;
|
|
|
|
if( $license_expires ) {
|
|
|
|
$now = time();
|
|
|
|
if( $now >= $license_expires ) {
|
|
$license_expired = true;
|
|
} elseif ( $now >= ( $license_expires - 30 * DAY_IN_SECONDS ) ) {
|
|
$license_expires_soon = true;
|
|
}
|
|
|
|
}
|
|
|
|
if ( $notice = get_transient( "pys_{$slug}_license_notice" ) ) :
|
|
?>
|
|
|
|
<div class="row mt-3">
|
|
<div class="col">
|
|
<div class="alert alert-<?php esc_attr_e( $notice['class'] ); ?> mb-0" role="alert">
|
|
<?php echo $notice['msg']; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<?php
|
|
|
|
delete_transient( "pys_{$slug}_license_notice" );
|
|
|
|
endif;
|
|
|
|
if ( $license_expires_soon ) :
|
|
?>
|
|
|
|
<div class="row mt-3">
|
|
<div class="col">
|
|
<div class="alert alert-warning mb-0">
|
|
<p>Your license key <strong>expires
|
|
on <?php echo date( get_option( 'date_format' ), $license_expires ); ?></strong>. Make sure
|
|
you keep everything updated and in order.</p>
|
|
<p>If you renewed your license but you still see this message, click on the "Reactivate License" button.</p>
|
|
<p class="mb-0"><a href="https://www.pixelyoursite.com/checkout/?edd_license_key=<?php esc_attr_e(
|
|
$license_key ); ?>&utm_campaign=admin&utm_source=licenses&utm_medium=renew" target="_blank"><strong>Click here to renew your license now for a 40% discount</strong></a></p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<?php
|
|
endif;
|
|
|
|
if ( $license_expired ) :
|
|
?>
|
|
|
|
<div class="row mt-3">
|
|
<div class="col">
|
|
<div class="alert alert-danger mb-0">
|
|
<p><strong>Your license key is expired</strong>, so you no longer get any updates. Don't miss our
|
|
latest improvements and make sure that everything works smoothly.</p>
|
|
<p>If you renewed your license but you still see this message, click on the "Reactivate License" button.</p>
|
|
<p class="mb-0"><a href="https://www.pixelyoursite.com/checkout/?edd_license_key=<?php esc_attr_e(
|
|
$license_key ); ?>&utm_campaign=admin&utm_source=licenses&utm_medium=renew" target="_blank"><strong>Click here to renew your license now</strong></a></p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<?php
|
|
endif;
|
|
|
|
}
|
|
|
|
function checkLicense()
|
|
{
|
|
$plugins = PYS()->getRegisteredPlugins();
|
|
if(!get_option(PYS()->getSlug().'_last_check_license') || get_option(PYS()->getSlug().'_last_check_license')['time'] == '' || get_option(PYS()->getSlug().'_last_check_license')['time'] < time() && PYS()->getOption('license_key') && !empty(PYS()->getOption('license_key')))
|
|
{
|
|
$license_data = singleCheckLicense(PYS()->getOption('license_key'), PYS());
|
|
update_option(PYS()->getSlug().'_last_check_license', array('name'=>PYS()->getPluginName(), 'time'=>time()));
|
|
if(!empty($license_data_single)) {
|
|
set_data_license(PYS(), $license_data);
|
|
}
|
|
}
|
|
|
|
|
|
foreach ($plugins as $plugin)
|
|
{
|
|
if ( $plugin->getSlug() == 'head_footer' ) { continue; }
|
|
if(!get_option($plugin->getSlug().'_last_check_license') || get_option($plugin->getSlug().'_last_check_license')['time'] == '' || get_option($plugin->getSlug().'_last_check_license')['time'] < time() && $plugin->getOption('license_key') && !empty($plugin->getOption('license_key')))
|
|
{
|
|
update_option($plugin->getSlug().'_last_check_license', array('name'=>$plugin->getPluginName(), 'time'=>time()));
|
|
$license_data_single = singleCheckLicense($plugin->getOption('license_key'), $plugin);
|
|
if(!empty($license_data_single)) {
|
|
set_data_license($plugin, $license_data_single);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
function set_data_license($plugin, $license_data)
|
|
{
|
|
$license_status = $plugin->getOption( 'license_status' );
|
|
$license_expires = $plugin->getOption( 'license_expires' );
|
|
$license_key = $plugin->getOption( 'license_key' );
|
|
$slug = $plugin->getSlug();
|
|
$admin_notice = array();
|
|
if ( is_wp_error( $license_data ) ) {
|
|
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'Something went wrong during license update request. [' . $license_data->get_error_message() . ']'
|
|
);
|
|
|
|
} else {
|
|
|
|
/**
|
|
* Overwrite empty license status only on successful activation.
|
|
* For existing status overwrite with any value except error.
|
|
*/
|
|
if ( empty( $license_status ) && $license_data->license == 'valid' ) {
|
|
$license_status = 'valid';
|
|
} elseif ( ! empty( $license_status ) ) {
|
|
$license_status = $license_data->license;
|
|
}
|
|
|
|
if ( $license_data->success ) {
|
|
|
|
switch ( $license_data->license ) {
|
|
case
|
|
'valid':
|
|
$admin_notice = array(
|
|
'class' => 'success',
|
|
'msg' => 'Your license is working fine. Good job!'
|
|
);
|
|
break;
|
|
|
|
case 'deactivated':
|
|
$admin_notice = array(
|
|
'class' => 'success',
|
|
'msg' => 'Your license was successfully deactivated for this site.'
|
|
);
|
|
break;
|
|
case 'expired': // license has expired
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'Your License has expired. <a href="http://www.pixelyoursite.com/checkout/?edd_license_key=' . urlencode( $license_key ) . '&utm_campaign=admin&utm_source=licenses&utm_medium=renew" target="_blank">Renew it now.</a>'
|
|
);
|
|
break;
|
|
|
|
case 'inactive': // license is not active
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'This license is not active. Activate it now.'
|
|
);
|
|
break;
|
|
|
|
case 'disabled': // license key disabled
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'License key disabled.'
|
|
);
|
|
break;
|
|
|
|
case 'license_not_activable': // trying to activate bundle license
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'If you have a bundle package, please use each individual license for your products.'
|
|
);
|
|
break;
|
|
|
|
case 'revoked': // license key revoked
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'This license was revoked.'
|
|
);
|
|
break;
|
|
}
|
|
|
|
$license_expires = strtotime( $license_data->expires );
|
|
|
|
} else {
|
|
|
|
switch ( $license_data->license ) {
|
|
case 'invalid': // key do not exist
|
|
case 'missing':
|
|
case 'key_mismatch':
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => "License keys don't match. Make sure you're using the correct license."
|
|
);
|
|
break;
|
|
|
|
case 'license_not_activable': // trying to activate bundle license
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'If you have a bundle package, please use each individual license for your products.'
|
|
);
|
|
break;
|
|
|
|
case 'revoked': // license key revoked
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'This license was revoked.'
|
|
);
|
|
break;
|
|
|
|
case 'no_activations_left': // no activations left
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'No activations left. Log in to your account to extent your license.'
|
|
);
|
|
break;
|
|
|
|
case 'invalid_item_id':
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'Invalid item ID.'
|
|
);
|
|
break;
|
|
|
|
case 'item_name_mismatch': // item names don't match
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => "Item names don't match."
|
|
);
|
|
break;
|
|
|
|
|
|
|
|
case 'site_inactive':
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'The license is not active for this site. Activate it now.'
|
|
);
|
|
break;
|
|
|
|
}
|
|
|
|
// add error code
|
|
$admin_notice['msg'] .= " [error: $license_data->license]";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( ! empty( $admin_notice ) ) {
|
|
set_transient( "pys_{$slug}_license_notice", $admin_notice, 60 * 5 );
|
|
}
|
|
|
|
$plugin->updateOptions(
|
|
array (
|
|
'license_key' => $license_key,
|
|
'license_status' => $license_status,
|
|
'license_expires' => $license_expires
|
|
)
|
|
);
|
|
}
|
|
function singleCheckLicense( $license_key, $plugin)
|
|
{
|
|
$api_params = array(
|
|
'edd_action' => 'check_license',
|
|
'license' => $license_key,
|
|
'item_name' => urlencode( $plugin->getPluginName() ),
|
|
'url' => home_url()
|
|
);
|
|
|
|
$response = wp_remote_post( 'https://www.pixelyoursite.com', array(
|
|
'timeout' => 120,
|
|
'sslverify' => false,
|
|
'body' => $api_params
|
|
) );
|
|
|
|
if ( is_wp_error( $response ) ) {
|
|
return $response;
|
|
}
|
|
|
|
// $license_data->license will be either "valid" or "invalid"
|
|
return json_decode( wp_remote_retrieve_body( $response ) );
|
|
}
|
|
|
|
|
|
/**
|
|
* @param Plugin|Settings $plugin
|
|
*/
|
|
function updateLicense( $plugin ) {
|
|
|
|
$slug = $plugin->getSlug();
|
|
$license_key_old = $plugin->getOption( 'license_key' );
|
|
// nothing to do...
|
|
if( ! isset( $_POST['pys'][ $slug ]['license_action'] ) ) {
|
|
return;
|
|
}
|
|
$last_check_license = time();
|
|
$license_action = $_POST['pys'][ $slug ]['license_action'];
|
|
if(isset( $_POST['pys'][ $slug ]['license_key'] )) {
|
|
$license_key = sanitize_text_field($_POST['pys'][ $slug ]['license_key']);
|
|
} else {
|
|
$license_key = '';
|
|
}
|
|
|
|
|
|
// activate/deactivate license
|
|
if ( $license_action == 'activate' ) {
|
|
$license_data = licenseActivate( $license_key, $plugin );
|
|
} else if ( $license_action == 'reactivate' ) {
|
|
if($license_key_old)
|
|
{
|
|
$license_key = $license_key_old;
|
|
}
|
|
$license_data = licenseActivate($license_key, $plugin);
|
|
}
|
|
else {
|
|
if($license_key_old)
|
|
{
|
|
$license_key = $license_key_old;
|
|
}
|
|
$license_data = licenseDeactivate( $license_key, $plugin );
|
|
}
|
|
if(!empty($license_data)) {
|
|
update_option($plugin->getSlug() . '_last_check_license', array('name' => $plugin->getPluginName(), 'time' => $last_check_license));
|
|
$license_status = $plugin->getOption('license_status');
|
|
$license_expires = $plugin->getOption('license_expires');
|
|
|
|
$admin_notice = array();
|
|
|
|
if (is_wp_error($license_data)) {
|
|
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'Something went wrong during license update request. [' . $license_data->get_error_message() . ']'
|
|
);
|
|
|
|
} else {
|
|
|
|
/**
|
|
* Overwrite empty license status only on successful activation.
|
|
* For existing status overwrite with any value except error.
|
|
*/
|
|
if (empty($license_status) && $license_data->license == 'valid') {
|
|
$license_status = 'valid';
|
|
} elseif (!empty($license_status)) {
|
|
$license_status = $license_data->license;
|
|
}
|
|
|
|
if ($license_data->success) {
|
|
|
|
switch ($license_data->license) {
|
|
case
|
|
'valid':
|
|
$admin_notice = array(
|
|
'class' => 'success',
|
|
'msg' => 'Your license is working fine. Good job!'
|
|
);
|
|
break;
|
|
|
|
case 'deactivated':
|
|
$admin_notice = array(
|
|
'class' => 'success',
|
|
'msg' => 'Your license was successfully deactivated for this site.'
|
|
);
|
|
break;
|
|
}
|
|
|
|
$license_expires = strtotime($license_data->expires);
|
|
|
|
} else {
|
|
|
|
switch ($license_data->license) {
|
|
case 'invalid': // key do not exist
|
|
case 'missing':
|
|
case 'key_mismatch':
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => "License keys don't match. Make sure you're using the correct license."
|
|
);
|
|
break;
|
|
|
|
case 'license_not_activable': // trying to activate bundle license
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'If you have a bundle package, please use each individual license for your products.'
|
|
);
|
|
break;
|
|
|
|
case 'revoked': // license key revoked
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'This license was revoked.'
|
|
);
|
|
break;
|
|
|
|
case 'no_activations_left': // no activations left
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'No activations left. Log in to your account to extent your license.'
|
|
);
|
|
break;
|
|
|
|
case 'invalid_item_id':
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'Invalid item ID.'
|
|
);
|
|
break;
|
|
|
|
case 'item_name_mismatch': // item names don't match
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => "Item names don't match."
|
|
);
|
|
break;
|
|
|
|
case 'expired': // license has expired
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'Your License has expired. <a href="http://www.pixelyoursite.com/checkout/?edd_license_key=' . urlencode($license_key) . '&utm_campaign=admin&utm_source=licenses&utm_medium=renew" target="_blank">Renew it now.</a>'
|
|
);
|
|
break;
|
|
|
|
case 'inactive': // license is not active
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'This license is not active. Activate it now.'
|
|
);
|
|
break;
|
|
|
|
case 'disabled': // license key disabled
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'License key disabled.'
|
|
);
|
|
break;
|
|
|
|
case 'site_inactive':
|
|
$admin_notice = array(
|
|
'class' => 'danger',
|
|
'msg' => 'The license is not active for this site. Activate it now.'
|
|
);
|
|
break;
|
|
|
|
}
|
|
|
|
// add error code
|
|
$admin_notice['msg'] .= " [error: $license_data->license]";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!empty($admin_notice)) {
|
|
set_transient("pys_{$slug}_license_notice", $admin_notice, 60 * 5);
|
|
}
|
|
|
|
$plugin->updateOptions(
|
|
array(
|
|
'license_key' => $license_key,
|
|
'license_status' => $license_status,
|
|
'license_expires' => $license_expires
|
|
)
|
|
);
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* @param string $license_key
|
|
* @param Plugin|Settings $plugin
|
|
*
|
|
* @return array|mixed|object|\WP_Error
|
|
*/
|
|
function licenseActivate( $license_key, $plugin ) {
|
|
|
|
$api_params = array(
|
|
'edd_action' => 'activate_license',
|
|
'license' => $license_key,
|
|
'item_name' => urlencode( $plugin->getPluginName() ),
|
|
'url' => home_url()
|
|
);
|
|
|
|
$response = wp_remote_post( 'https://www.pixelyoursite.com', array(
|
|
'timeout' => 120,
|
|
'sslverify' => false,
|
|
'body' => $api_params
|
|
) );
|
|
|
|
if ( is_wp_error( $response ) ) {
|
|
return $response;
|
|
}
|
|
|
|
// $license_data->license will be either "valid" or "invalid"
|
|
return json_decode( wp_remote_retrieve_body( $response ) );
|
|
|
|
}
|
|
|
|
/**
|
|
* @param string $license_key
|
|
* @param Plugin|Settings $plugin
|
|
*
|
|
* @return array|mixed|object|\WP_Error
|
|
*/
|
|
function licenseDeactivate( $license_key, $plugin ) {
|
|
|
|
$api_params = array(
|
|
'edd_action' => 'deactivate_license',
|
|
'license' => $license_key,
|
|
'item_name' => urlencode( $plugin->getPluginName() ),
|
|
'url' => home_url()
|
|
);
|
|
|
|
$response = wp_remote_post( 'https://www.pixelyoursite.com', array(
|
|
'timeout' => 120,
|
|
'sslverify' => false,
|
|
'body' => $api_params
|
|
) );
|
|
|
|
if ( is_wp_error( $response ) ) {
|
|
return $response;
|
|
}
|
|
|
|
// $license_data->license will be either "deactivated" or "failed"
|
|
return json_decode( wp_remote_retrieve_body( $response ) );
|
|
|
|
}
|