license_data = get_option( static::LICENSE_OPTION_NAME, array() ); $reflection = new ReflectionClass( $this ); $constants = $reflection->getConstants(); $this->accepted_tags = array(); foreach ( $constants as $name => $value ) { if ( strpos( $name, 'TAG' ) !== false ) { $this->accepted_tags [] = $value; } } } public static function getInstance() { if ( empty( static::$instance ) ) { static::$instance = new TVE_Dash_Product_LicenseManager(); } return static::$instance; } /** * whether or not $tag is a theme tag * used in backwards-compatible license check * * @param string $tag * * @return array */ public static function isThemeTag( $tag ) { return in_array( $tag, array( static::TAG_FOCUS, static::TAG_IGNITION, static::TAG_LUXE, static::TAG_MINUS, static::TAG_PERFORMAG, static::TAG_PRESSIVE, static::TAG_RISE, static::TAG_SQUARED, static::TAG_STORIED, static::TAG_VOICE, ) ); } /** * Checks license options * * @param string|TVE_Dash_Product_Abstract $item * * @return bool */ public function itemActivated( $item ) { if ( $item instanceof TVE_Dash_Product_Abstract ) { $item = $item->get_tag(); } if ( function_exists( 'thrive_product_manager' ) ) { return thrive_product_manager()->itemActivated( $item, $this ); } if ( $this->isThemeTag( $item ) ) { $licensed = get_option( 'thrive_license_status', false ) === 'ACTIVE'; } else { switch ( $item ) { case static::TCB_TAG: $licensed = get_option( 'tve_license_status', false ) === 'ACTIVE'; break; case static::TL_TAG: $licensed = get_option( 'tve_leads_license_status', false ) === 'ACTIVE'; break; case static::TCW_TAG: $licensed = get_option( 'tcw_license_status', false ) === 'ACTIVE'; break; default: $licensed = false; break; } } if ( $licensed === false ) { $licensed = $this->checkData( $item ); } return $licensed; } /** * @param $item TVE_Dash_Product_Abstract|string * * @return bool */ protected function checkData( $item = null ) { if ( empty( $this->license_data ) || null === $item ) { return false; } if ( in_array( static::ALL_TAG, $this->license_data ) ) { return true; } if ( $item instanceof TVE_Dash_Product_Abstract ) { $tag = $item->get_tag(); } elseif ( is_string( $item ) ) { $tag = $item; } return isset( $tag ) ? in_array( $tag, $this->license_data ) : false; } public function checkLicense( $email, $key, $tag = false ) { $service_api_url = defined( 'TD_SERVICE_API_URL' ) ? TD_SERVICE_API_URL : 'https://service-api.thrivethemes.com'; $api_url = rtrim($service_api_url, '/') . '/license'; $body = array( 'email' => $email, 'license' => $key, 'site_url' => get_site_url(), ); if ( $tag !== false ) { $body['tag'] = $tag; } $api_url = add_query_arg( array( 'p' => $this->calc_hash( $body ), ), $api_url ); $_args = array( 'sslverify' => false, 'timeout' => 120, 'headers' => array( 'User-Agent' => 'WordPress', ), 'body' => $body, ); $licenseValid = wp_remote_post( $api_url, $_args ); $response = array(); if ( is_wp_error( $licenseValid ) ) { /** @var WP_Error $licenseValid */ /** Couldn't connect to the API URL - possible because wp_remote_get failed for whatever reason. Maybe CURL not activated on server, for instance */ $response['success'] = 0; $response['reason'] = sprintf( __( "An error occurred while connecting to the license server. Error: %s. Please login to thrivethemes.com, report this error message on the forums and we'll get this sorted for you", 'thrive-dash' ), $licenseValid->get_error_message() ); return $response; } $response = @json_decode( $licenseValid['body'], true ); if ( empty( $response ) ) { $response = new stdClass(); $response['success'] = 0; $response['reason'] = sprintf( __( "An error occurred while receiving the license status. The response was: %s. Please login to thrivethemes.com, report this error message on the forums and we'll get this sorted for you.", 'thrive-dash' ), $licenseValid['body'] ); return $response; } return $response; } protected function calc_hash( $data ) { return md5( $this->secret_key . serialize( $data ) . $this->secret_key ); } public function activateProducts( &$response ) { //check success flag if ( empty( $response['success'] ) ) { $response['success'] = 0; $response['reason'] = __( 'Invalid response!', 'thrive-dash' ); return null; } //check if products is not empty and is array if ( empty( $response['products'] ) || ! is_array( $response['products'] ) ) { $response['success'] = 0; $response['reason'] = __( 'Invalid products returned from server!', 'thrive-dash' ); return null; } foreach ( $response['products'] as $product_tag ) { if ( ! in_array( $product_tag, $this->accepted_tags ) ) { $response['success'] = 0; $response['reason'] = __( 'Products returned from server are not accepted for licensing!', 'thrive-dash' ); return null; } } //do the logic and update the option in DB if ( in_array( static::ALL_TAG, $response['products'] ) ) { update_option( static::LICENSE_OPTION_NAME, array( static::ALL_TAG ) ); } else { $existing = get_option( static::LICENSE_OPTION_NAME, array() ); update_option( static::LICENSE_OPTION_NAME, array_unique( array_merge( $existing, $response['products'] ) ) ); } return $response; } /** * Based on $text_domain returns a tag associated * * @param string $text_domain * * @return string */ public static function get_product_tag( $text_domain ) { $mapping = array( 'thrive-cb' => static::TCB_TAG, 'thrive-leads' => static::TL_TAG, 'thrive-clever-widgets' => static::TCW_TAG, 'thrive-ult' => static::TU_TAG, 'thrive-headline' => static::THO_TAG, 'thrive-ovation' => static::TVO_TAG, 'thrive-quiz-builder' => static::TQB_TAG, 'thrive-comments' => static::TCM_TAG, 'thrive-apprentice' => static::TVA_TAG, 'thrive-optimize' => static::TAB_TAG, 'thrive-product-manager' => static::TPM_TAG, ); return $mapping[ $text_domain ] ?? ''; } }