license.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. <?php
  2. /**
  3. * License class.
  4. *
  5. * Helper for licenses.
  6. *
  7. * @since 7.0.0
  8. *
  9. * @package MonsterInsights
  10. * @subpackage License
  11. * @author Chris Christoff
  12. */
  13. // Exit if accessed directly
  14. if ( ! defined( 'ABSPATH' ) ) {
  15. exit;
  16. }
  17. final class MonsterInsights_License {
  18. private $site = array();
  19. private $network = array();
  20. private $licensed = false;
  21. private $using_nl = false;
  22. /**
  23. * Primary class constructor.
  24. *
  25. * @access public
  26. * @since 7.0.0
  27. */
  28. public function __construct() {
  29. $this->site = $this->get_site_license();
  30. $this->network = $this->get_network_license();
  31. $this->license_to_use();
  32. }
  33. private function license_to_use() {
  34. if ( is_network_admin() ) {
  35. $license = $this->get_network_license_key();
  36. if ( ! empty( $license ) ) {
  37. $this->licensed = true;
  38. $this->using_nl = true;
  39. }
  40. } else {
  41. $license = $this->get_site_license_key();
  42. if ( ! empty( $license ) ) {
  43. $this->licensed = true;
  44. $this->using_nl = false;
  45. } else {
  46. $license = $this->get_network_license_key();
  47. if ( ! empty( $license ) ) {
  48. $this->licensed = true;
  49. $this->using_nl = true;
  50. }
  51. }
  52. }
  53. }
  54. public function using_network_license() {
  55. return $this->using_nl;
  56. }
  57. public function get_site_license( $force = false ) {
  58. if ( ! empty( $this->site ) && ! $force ) {
  59. return $this->site;
  60. } else {
  61. $site = get_option( 'monsterinsights_license', array() );
  62. $this->site = $site;
  63. return $site;
  64. }
  65. }
  66. public function get_network_license( $force = false ) {
  67. if ( ! empty( $this->network ) && ! $force ) {
  68. return $this->network;
  69. } else {
  70. $network = get_site_option( 'monsterinsights_network_license', array() );
  71. $this->network = $network;
  72. return $network;
  73. }
  74. }
  75. public function get_license_key() {
  76. $license_key = MonsterInsights()->license->get_site_license_key();
  77. $license_key = ! empty( $license_key ) ? $license_key : MonsterInsights()->license->get_network_license_key();
  78. $license_key = ! empty( $license_key ) ? $license_key : MonsterInsights()->license->get_default_license_key();
  79. return $license_key;
  80. }
  81. public function get_site_license_key(){
  82. return ( ! empty( $this->site['key'] ) && is_string( $this->site['key'] ) && strlen( $this->site['key'] ) > 10 ) ? $this->site['key'] : '';
  83. }
  84. public function get_network_license_key(){
  85. return ( ! empty( $this->network['key'] ) && is_string( $this->network['key'] ) && strlen( $this->network['key'] ) > 10 ) ? $this->network['key'] : '';
  86. }
  87. public function has_license() {
  88. return $this->licensed;
  89. }
  90. public function is_site_licensed(){
  91. return ! empty( $this->site['key'] ) // has key
  92. && $this->get_site_license_type() // has type
  93. && ! $this->site_license_expired() // isn't expired
  94. && ! $this->site_license_disabled() // isn't disabled
  95. && ! $this->site_license_invalid() // isn't invalid
  96. ;
  97. }
  98. public function is_network_licensed() {
  99. return ! empty( $this->network['key'] ) // has key
  100. && $this->get_network_license_type() // has type
  101. && ! $this->network_license_expired() // isn't expired
  102. && ! $this->network_license_disabled() // isn't disabled
  103. && ! $this->network_license_invalid() // isn't invalid
  104. ;
  105. }
  106. public function get_site_license_updates(){
  107. return get_option( 'monsterinsights_license_updates', '' );
  108. }
  109. public function get_network_license_updates(){
  110. return get_site_option( 'monsterinsights_network_license_updates', '' );
  111. }
  112. public function set_site_license_updates(){
  113. update_option( 'monsterinsights_license_updates', strtotime( '+8 hours' ) );
  114. }
  115. public function set_network_license_updates() {
  116. update_site_option( 'monsterinsights_network_license_updates', strtotime( '+8 hours' ) );
  117. }
  118. public function delete_site_license_updates(){
  119. delete_option( 'monsterinsights_license_updates' );
  120. }
  121. public function delete_network_license_updates(){
  122. delete_site_option( 'monsterinsights_license_updates' );
  123. }
  124. public function time_to_check_site_license(){
  125. $timestamp = get_option( 'monsterinsights_license_updates' );
  126. if ( ! $timestamp ) {
  127. return true;
  128. } else {
  129. $current_timestamp = time();
  130. if ( $current_timestamp < $timestamp ) {
  131. return false;
  132. } else {
  133. return true;
  134. }
  135. }
  136. }
  137. public function time_to_check_network_license(){
  138. $timestamp = get_site_option( 'monsterinsights_network_license_updates' );
  139. if ( ! $timestamp ) {
  140. return true;
  141. } else {
  142. $current_timestamp = time();
  143. if ( $current_timestamp < $timestamp ) {
  144. return false;
  145. } else {
  146. return true;
  147. }
  148. }
  149. }
  150. public function set_site_license( $data = array() ){
  151. update_option( 'monsterinsights_license', $data );
  152. $this->set_site_license_updates();
  153. $this->site = $data;
  154. }
  155. public function set_network_license( $data = array() ){
  156. update_site_option( 'monsterinsights_network_license', $data );
  157. $this->set_network_license_updates();
  158. $this->network = $data;
  159. }
  160. public function delete_site_license() {
  161. delete_option( 'monsterinsights_license' );
  162. $this->delete_site_license_updates();
  163. $this->site = array();
  164. }
  165. public function delete_network_license() {
  166. delete_site_option( 'monsterinsights_network_license' );
  167. $this->delete_network_license_updates();
  168. $this->network = array();
  169. }
  170. public function get_license_type(){
  171. if ( ! $this->has_license() ) {
  172. return false;
  173. }
  174. return $this->using_network_license() ? $this->get_network_license_type() : $this->get_site_license_type();
  175. }
  176. public function get_site_license_type(){
  177. return ( $this->get_site_license_key() && ! empty( $this->site['type'] ) && $this->is_valid_license_type( $this->site['type'] ) ) ? $this->site['type'] : '';
  178. }
  179. public function get_network_license_type(){
  180. return ( $this->get_network_license_key() && ! empty( $this->network['type'] ) && $this->is_valid_license_type( $this->network['type'] ) ) ? $this->network['type'] : '';
  181. }
  182. public function license_has_error(){
  183. if ( ! $this->has_license() ) {
  184. return false;
  185. }
  186. return $this->using_network_license() ? $this->network_license_has_error() : $this->site_license_has_error();
  187. }
  188. public function site_license_has_error() {
  189. return
  190. $this->site_license_expired() // is expired
  191. || $this->site_license_disabled() // is disabled
  192. || $this->site_license_invalid() // is invalid
  193. ;
  194. }
  195. public function network_license_has_error(){
  196. return
  197. $this->network_license_expired() // is expired
  198. || $this->network_license_disabled() // is disabled
  199. || $this->network_license_invalid() // is invalid
  200. ;
  201. }
  202. public function license_expired(){
  203. if ( ! $this->has_license() ) {
  204. return false;
  205. }
  206. return $this->using_network_license() ? $this->network_license_expired() : $this->site_license_expired();
  207. }
  208. public function site_license_expired(){
  209. return ! empty( $this->site['is_expired'] );
  210. }
  211. public function network_license_expired(){
  212. return ! empty( $this->network['is_expired'] );
  213. }
  214. public function license_disabled(){
  215. if ( ! $this->has_license() ) {
  216. return false;
  217. }
  218. return $this->using_network_license() ? $this->network_license_disabled() : $this->site_license_disabled();
  219. }
  220. public function site_license_disabled() {
  221. return ! empty( $this->site['is_disabled'] );
  222. }
  223. public function network_license_disabled(){
  224. return ! empty( $this->network['is_disabled'] );
  225. }
  226. public function license_invalid(){
  227. if ( ! $this->has_license() ) {
  228. return false;
  229. }
  230. return $this->using_network_license() ? $this->network_license_invalid() : $this->site_license_invalid();
  231. }
  232. public function site_license_invalid() {
  233. return ! empty( $this->site['is_invalid'] );
  234. }
  235. public function network_license_invalid(){
  236. return ! empty( $this->network['is_invalid'] );
  237. }
  238. public function get_license_error(){
  239. if ( ! $this->has_license() ) {
  240. return false;
  241. }
  242. return $this->using_network_license() ? $this->get_network_license_error() : $this->get_site_license_error();
  243. }
  244. public function get_site_license_error(){
  245. if ( $this->site_license_expired() ) {
  246. return sprintf( esc_html__( 'Your license key for MonsterInsights has expired. %1$sPlease click here to renew your license key.%2$s', 'google-analytics-for-wordpress' ), '<a href="'. monsterinsights_get_url( 'license-error', 'expired-license', 'https://www.monsterinsights.com/login/' ) .'" target="_blank" rel="noopener noreferrer" referrer="no-referrer">', '</a>' );
  247. } else if ( $this->site_license_disabled() ) {
  248. return esc_html__( 'Your license key for MonsterInsights has been disabled. Please use a different key.', 'google-analytics-for-wordpress' );
  249. } else if ( $this->site_license_invalid() ) {
  250. return esc_html__( 'Your license key for MonsterInsights is invalid. The key no longer exists or the user associated with the key has been deleted. Please use a different key.', 'google-analytics-for-wordpress' );
  251. }
  252. return '';
  253. }
  254. public function get_network_license_error(){
  255. if ( $this->site_license_expired() ) {
  256. return sprintf( esc_html__( 'Your license key for MonsterInsights has expired. %1$sPlease click here to renew your license key.%2$s', 'google-analytics-for-wordpress' ), '<a href="'. monsterinsights_get_url( 'license-error', 'expired-license', 'https://www.monsterinsights.com/login/' ) .'" target="_blank" rel="noopener noreferrer" referrer="no-referrer">', '</a>' );
  257. } else if ( $this->site_license_disabled() ) {
  258. return esc_html__( 'Your license key for MonsterInsights has been disabled. Please use a different key.', 'google-analytics-for-wordpress' );
  259. } else if ( $this->site_license_invalid() ) {
  260. return esc_html__( 'Your license key for MonsterInsights is invalid. The key no longer exists or the user associated with the key has been deleted. Please use a different key.', 'google-analytics-for-wordpress' );
  261. }
  262. return '';
  263. }
  264. public function license_can( $requires = 'lite' ) {
  265. if ( ! monsterinsights_is_pro_version() || ! $this->has_license() ) {
  266. return $requires === 'lite';
  267. }
  268. return $this->using_network_license() ? $this->network_license_can( $requires ) : $this->site_license_can( $requires );
  269. }
  270. public function site_license_can( $requires = 'lite' ) {
  271. $level = $this->get_site_license_type();
  272. $level = $level ? $level : 'lite';
  273. $can_access = false;
  274. switch ( $requires ) {
  275. case 'master':
  276. $can_access = ( $level === 'master' ) ? true : false;
  277. break;
  278. case 'pro':
  279. $can_access = ( $level === 'master' || $level === 'pro' ) ? true : false;
  280. break;
  281. case 'plus':
  282. $can_access = ( $level === 'master' || $level === 'pro' || $level === 'plus' ) ? true : false;
  283. break;
  284. case 'basic':
  285. $can_access = ( $level === 'master' || $level === 'pro' || $level === 'plus' || $level === 'basic' ) ? true : false;
  286. break;
  287. case 'lite':
  288. default:
  289. $can_access = true;
  290. break;
  291. }
  292. return $can_access;
  293. }
  294. public function network_license_can( $requires = 'lite' ) {
  295. $level = $this->get_network_license_type();
  296. $level = $level ? $level : 'lite';
  297. $can_access = false;
  298. switch ( $requires ) {
  299. case 'master':
  300. $can_access = ( $level === 'master' ) ? true : false;
  301. break;
  302. case 'pro':
  303. $can_access = ( $level === 'master' || $level === 'pro' ) ? true : false;
  304. break;
  305. case 'plus':
  306. $can_access = ( $level === 'master' || $level === 'pro' || $level === 'plus' ) ? true : false;
  307. break;
  308. case 'basic':
  309. $can_access = ( $level === 'master' || $level === 'pro' || $level === 'plus' || $level === 'basic' ) ? true : false;
  310. break;
  311. case 'lite':
  312. default:
  313. $can_access = true;
  314. break;
  315. }
  316. return $can_access;
  317. }
  318. public function get_default_license_key(){
  319. if ( defined( 'MONSTERINSIGHTS_LICENSE_KEY' ) && is_string( MONSTERINSIGHTS_LICENSE_KEY ) && strlen( MONSTERINSIGHTS_LICENSE_KEY ) > 10 ) {
  320. return MONSTERINSIGHTS_LICENSE_KEY;
  321. }
  322. return '';
  323. }
  324. public function get_valid_license_key() {
  325. if ( $this->is_site_licensed() ) {
  326. return $this->get_site_license_key();
  327. } else if ( $this->is_network_licensed() ) {
  328. return $this->get_network_license_key();
  329. } else if ( $this->get_default_license_key() ) {
  330. return $this->get_default_license_key();
  331. } else {
  332. return '';
  333. }
  334. }
  335. public function is_network_admin() {
  336. return is_multisite() && is_network_admin();
  337. }
  338. public function is_valid_license_type( $type = '' ) {
  339. return ! empty( $type ) && is_string( $type ) && in_array( $type, $this->valid_license_types() );
  340. }
  341. public function valid_license_types() {
  342. return array(
  343. 'basic',
  344. 'plus',
  345. 'pro',
  346. 'master'
  347. );
  348. }
  349. }