summaryrefslogtreecommitdiff
path: root/Postman/Extensions/License/PostmanLicenseHandler.php
diff options
context:
space:
mode:
authoryehudah <yehudah@b8457f37-d9ea-0310-8a92-e5e31aec5664>2019-11-25 09:25:43 +0000
committeryehudah <yehudah@b8457f37-d9ea-0310-8a92-e5e31aec5664>2019-11-25 09:25:43 +0000
commitb5fd728e37aa2a9c7a5f37e8dead0a95117d541b (patch)
treea7158edc5e4e576e0377f078dabc87c699315c62 /Postman/Extensions/License/PostmanLicenseHandler.php
parentc61784411988d36d9bbd93cd3a97e773990af342 (diff)
downloadPost-SMTP-b5fd728e37aa2a9c7a5f37e8dead0a95117d541b.zip
phpmailer delivery improvments
bug fixes add option to disable notifications fix Invalid “Reply-To” e-mail address
Diffstat (limited to 'Postman/Extensions/License/PostmanLicenseHandler.php')
-rw-r--r--Postman/Extensions/License/PostmanLicenseHandler.php422
1 files changed, 422 insertions, 0 deletions
diff --git a/Postman/Extensions/License/PostmanLicenseHandler.php b/Postman/Extensions/License/PostmanLicenseHandler.php
new file mode 100644
index 0000000..b24aa14
--- /dev/null
+++ b/Postman/Extensions/License/PostmanLicenseHandler.php
@@ -0,0 +1,422 @@
+<?php
+
+// Exit if accessed directly
+if ( ! defined( 'ABSPATH' ) ) exit;
+
+if ( ! class_exists( 'PostmanLicenseHandler' ) ) :
+
+
+class PostmanLicenseHandler {
+ private $file;
+ private $license;
+ private $license_data;
+ private $item_name;
+ private $item_id;
+ private $item_shortname;
+ private $version;
+ private $author;
+ private $api_url = 'http://localhost/psp/';
+
+
+ function __construct( $_file, $_item_name, $_version, $_author, $_optname = null, $_api_url = null, $_item_id = null ) {
+ $this->file = $_file;
+ $this->item_name = $_item_name;
+
+ if ( is_numeric( $_item_id ) ) {
+ $this->item_id = absint( $_item_id );
+ }
+
+ $this->item_shortname = $this->get_slug();
+ $this->version = $_version;
+ $this->license = trim( get_option( $this->item_shortname . '_license_key', '' ) );
+ $this->license_data = get_option( $this->item_shortname . '_license_active', '' );
+ $this->author = $_author;
+ $this->api_url = is_null( $_api_url ) ? $this->api_url : $_api_url;
+
+ /**
+ * Allows for backwards compatibility with old license options,
+ * i.e. if the plugins had license key fields previously, the license
+ * handler will automatically pick these up and use those in lieu of the
+ * user having to reactive their license.
+ */
+ if ( ! empty( $_optname ) ) {
+ $opt = get_option( $_optname, false );
+
+ if( isset( $opt ) && empty( $this->license ) ) {
+ $this->license = trim( $opt );
+ }
+ }
+
+ // Setup hooks
+ $this->includes();
+ $this->hooks();
+
+ }
+
+ /**
+ * Include the updater class
+ *
+ * @access private
+ * @return void
+ */
+ private function includes() {
+ if ( ! class_exists( 'EDD_SL_Plugin_Updater' ) ) {
+ require_once 'EDD_SL_Plugin_Updater.php';
+ }
+ }
+
+ /**
+ * Setup hooks
+ *
+ * @access private
+ * @return void
+ */
+ public function hooks() {
+
+ // Activate license key on settings save
+ add_action( 'admin_init', array( $this, 'activate_license' ) );
+
+ // Deactivate license key
+ add_action( 'admin_init', array( $this, 'deactivate_license' ) );
+
+ add_action( 'init', array( $this, 'cron' ), 20 );
+
+ // Check that license is valid once per week
+ add_action( 'admin_init', array( $this, 'validate_license' ) );
+
+ // Updater
+ add_action( 'admin_init', array( $this, 'auto_updater' ), 0 );
+
+ // Display notices to admins
+ add_action( 'admin_notices', array( $this, 'notices' ) );
+
+ add_action( 'in_plugin_update_message-' . plugin_basename( $this->file ), array( $this, 'plugin_row_license_missing' ), 10, 2 );
+ }
+
+ /**
+ * Auto updater
+ *
+ * @access private
+ * @return void
+ */
+ public function auto_updater() {
+
+ $args = array(
+ 'version' => $this->version,
+ 'license' => $this->license,
+ 'author' => $this->author,
+ 'beta' => function_exists( 'edd_extension_has_beta_support' ) && edd_extension_has_beta_support( $this->item_shortname ),
+ );
+
+ if( ! empty( $this->item_id ) ) {
+ $args['item_id'] = $this->item_id;
+ } else {
+ $args['item_name'] = $this->item_name;
+ }
+
+ // Setup the updater
+ $edd_updater = new EDD_SL_Plugin_Updater(
+ $this->api_url,
+ $this->file,
+ $args
+ );
+ }
+
+ public function cron() {
+ if ( ! wp_next_scheduled( $this->item_shortname . '_scheduled_events' ) ) {
+ wp_schedule_event( current_time( 'timestamp', true ), 'daily', $this->item_shortname . '_scheduled_events' );
+ }
+ }
+
+ public function get_slug() {
+ return preg_replace( '/[^a-zA-Z0-9_\s]/', '', str_replace( ' ', '_', strtolower( $this->item_name ) ) );
+ }
+
+ /**
+ * Display help text at the top of the Licenses tag
+ *
+ * @since 2.5
+ * @param string $active_tab
+ * @return void
+ */
+ public function license_help_text( $active_tab = '' ) {
+
+ static $has_ran;
+
+ if( 'licenses' !== $active_tab ) {
+ return;
+ }
+
+ if( ! empty( $has_ran ) ) {
+ return;
+ }
+
+ echo '<p>' . sprintf(
+ __( 'Enter your extension license keys here to receive updates for purchased extensions. If your license key has expired, please <a href="%s" target="_blank">renew your license</a>.', 'easy-digital-downloads' ),
+ 'http://docs.easydigitaldownloads.com/article/1000-license-renewal'
+ ) . '</p>';
+
+ $has_ran = true;
+
+ }
+
+
+ /**
+ * Activate the license key
+ *
+ * @return void
+ */
+ public function activate_license() {
+
+ if ( ! isset( $_POST['post_smtp_extension'][ $this->item_shortname . '_activate'] ) ) {
+ return;
+ }
+
+ if ( ! isset( $_REQUEST[ $this->item_shortname . '_license_key-nonce'] ) || ! wp_verify_nonce( $_REQUEST[ $this->item_shortname . '_license_key-nonce'], $this->item_shortname . '_license_key-nonce' ) ) {
+
+ return;
+
+ }
+
+ if ( ! current_user_can( 'manage_options' ) ) {
+ return;
+ }
+
+ if ( empty( $_POST['post_smtp_extension'][ $this->item_shortname . '_license_key'] ) ) {
+
+ delete_option( $this->item_shortname . '_license_active' );
+ delete_option( $this->item_shortname . '_license_key' );
+
+ return;
+
+ }
+
+ foreach ( $_POST as $key => $value ) {
+ if( false !== strpos( $key, 'license_key_deactivate' ) ) {
+ // Don't activate a key when deactivating a different key
+ return;
+ }
+ }
+
+ $details = get_option( $this->item_shortname . '_license_active' );
+
+ if ( is_object( $details ) && 'valid' === $details->license ) {
+ return;
+ }
+
+ $license = sanitize_text_field( $_POST['post_smtp_extension'][ $this->item_shortname . '_license_key'] );
+
+ if( empty( $license ) ) {
+ return;
+ }
+
+ // Data to send to the API
+ $api_params = array(
+ 'edd_action' => 'activate_license',
+ 'license' => $license,
+ 'item_name' => urlencode( $this->item_name ),
+ 'url' => home_url()
+ );
+
+ if ( ! empty( $this->item_id ) ) {
+ $api_params['item_id'] = $this->item_id;
+ }
+
+ // Call the API
+ $response = wp_remote_post(
+ $this->api_url,
+ array(
+ 'timeout' => 15,
+ 'sslverify' => false,
+ 'body' => $api_params
+ )
+ );
+
+ // Make sure there are no errors
+ if ( is_wp_error( $response ) ) {
+ return;
+ }
+
+ // Tell WordPress to look for updates
+ set_site_transient( 'update_plugins', null );
+
+ // Decode license data
+ $license_data = json_decode( wp_remote_retrieve_body( $response ) );
+
+ update_option( $this->item_shortname . '_license_active', $license_data );
+ update_option( $this->item_shortname . '_license_key', $license );
+
+ $slug = plugin_basename($this->file);
+ PostmanLicenseManager::get_instance()->add_extension($slug);
+
+ }
+
+
+ /**
+ * Deactivate the license key
+ *
+ * @return void
+ */
+ public function deactivate_license() {
+
+ if ( ! isset( $_POST['post_smtp_extension'][ $this->item_shortname . '_deactivate'] ) ) {
+ return;
+ }
+
+ if ( ! isset( $_POST['post_smtp_extension'][ $this->item_shortname . '_license_key'] ) )
+ return;
+
+ if( ! wp_verify_nonce( $_REQUEST[ $this->item_shortname . '_license_key-nonce'], $this->item_shortname . '_license_key-nonce' ) ) {
+
+ wp_die( __( 'Nonce verification failed', 'easy-digital-downloads' ), __( 'Error', 'easy-digital-downloads' ), array( 'response' => 403 ) );
+
+ }
+
+ if( ! current_user_can( 'manage_options' ) ) {
+ return;
+ }
+
+ $license_key = sanitize_text_field( base64_decode( $_POST['post_smtp_extension'][ $this->item_shortname . '_license_key'] ) );
+
+ // Run on deactivate button press
+ // Data to send to the API
+ $api_params = array(
+ 'edd_action' => 'deactivate_license',
+ 'license' => $license_key,
+ 'item_name' => urlencode( $this->item_name ),
+ 'url' => home_url()
+ );
+
+ if ( ! empty( $this->item_id ) ) {
+ $api_params['item_id'] = $this->item_id;
+ }
+
+ // Call the API
+ $response = wp_remote_post(
+ $this->api_url,
+ array(
+ 'timeout' => 15,
+ 'sslverify' => false,
+ 'body' => $api_params
+ )
+ );
+
+ // Make sure there are no errors
+ if ( is_wp_error( $response ) ) {
+ return;
+ }
+
+ // Decode the license data
+ $license_data = json_decode( wp_remote_retrieve_body( $response ) );
+
+ delete_option( $this->item_shortname . '_license_active' );
+ delete_option( $this->item_shortname . '_license_key' );
+
+ $slug = plugin_basename($this->file);
+ PostmanLicenseManager::get_instance()->remove_extension($slug);
+
+ }
+
+ public function validate_license() {
+ if ( false === ( $cron_data = get_transient( $this->item_shortname . '_cron' ) ) ) {
+ $this->license_check();
+
+ set_transient( $this->item_shortname . '_cron', true, rand( 12, 48 ) * HOUR_IN_SECONDS );
+ }
+ }
+
+
+ /**
+ * Check if license key is valid once per week
+ *
+ * @since 2.5
+ * @return void
+ */
+ public function license_check() {
+
+ // data to send in our API request
+ $api_params = array(
+ 'edd_action'=> 'check_license',
+ 'license' => $this->license,
+ 'item_name' => urlencode( $this->item_name ),
+ 'url' => home_url()
+ );
+
+ // Call the API
+ $response = wp_remote_post(
+ $this->api_url,
+ array(
+ 'timeout' => 15,
+ 'sslverify' => false,
+ 'body' => $api_params
+ )
+ );
+
+ // make sure the response came back okay
+ if ( is_wp_error( $response ) ) {
+ return false;
+ }
+
+ $license_data = json_decode( wp_remote_retrieve_body( $response ) );
+
+ update_option( $this->item_shortname . '_license_active', $license_data );
+
+ }
+
+
+ /**
+ * Admin notices for errors
+ *
+ * @return void
+ */
+ public function notices() {
+
+ $showed_invalid_message = null;
+
+ if( empty( $this->license ) ) {
+ return;
+ }
+
+ if( ! current_user_can( 'manage_options' ) ) {
+ return;
+ }
+
+ $messages = array();
+
+ $license = get_option( $this->item_shortname . '_license_active' );
+
+ if( is_object( $license ) && 'valid' !== $license->license && empty( $showed_invalid_message ) ) {
+
+ if( isset( $_GET['page'] ) && 'post-smtp-extensions' === $_GET['page'] ) {
+
+ $messages[] = sprintf(
+ __( '%s has invalid or expired license key for Post SMTP.'),
+ '<strong>' . $this->item_name . '</strong>'
+ );
+
+ $showed_invalid_message = true;
+
+ }
+
+ }
+
+ if( ! empty( $messages ) ) {
+
+ foreach( $messages as $message ) {
+
+ echo '<div class="error">';
+ echo '<p>' . $message . '</p>';
+ echo '</div>';
+
+ }
+
+ }
+
+ }
+
+ public function is_licensed() {
+ return is_object($this->license_data) && 'valid' === $this->license_data->license;
+ }
+}
+
+endif; // end class_exists check