PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Util / License / Features / CapabilitiesManager.php
mailpoet / lib / Util / License / Features Last commit date
Data 2 years ago CapabilitiesManager.php 2 months ago Subscribers.php 2 months ago index.php 3 years ago
CapabilitiesManager.php
172 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Util\License\Features;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Config\ServicesChecker;
9 use MailPoet\Settings\SettingsController;
10 use MailPoet\Util\License\Features\Data\Capability;
11
12 class CapabilitiesManager {
13 // Settings mapping
14 const MSS_TIER_SETTING_KEY = 'mta.mailpoet_api_key_state.data.tier';
15 const MSS_MAILPOET_LOGO_IN_EMAILS_SETTING_KEY = 'mta.mailpoet_api_key_state.data.mailpoet_logo_in_emails';
16 const MSS_DETAILED_ANALYTICS_SETTING_KEY = 'mta.mailpoet_api_key_state.data.detailed_analytics';
17 const MSS_AUTOMATION_STEPS_SETTING_KEY = 'mta.mailpoet_api_key_state.data.automation_steps';
18 const MSS_SEGMENT_FILTERS_SETTING_KEY = 'mta.mailpoet_api_key_state.data.segment_filters';
19 const MSS_SEND_BY_TIMEZONE_SETTING_KEY = 'mta.mailpoet_api_key_state.data.send_by_timezone';
20 // Product capabilities mapping
21 const MIN_TIER_LOGO_NOT_REQUIRED = 1;
22 const MIN_TIER_ANALYTICS_ENABLED = 1;
23 const MIN_TIER_NO_UPGRADE_PAGE = 2;
24 const MIN_TIER_UNLIMITED_AUTOMATION_STEPS = 2;
25 const MIN_TIER_UNLIMITED_SEGMENT_FILTERS = 2;
26 const MIN_TIER_SEND_BY_TIMEZONE_ENABLED = 1;
27
28 private SettingsController $settings;
29 private ServicesChecker $servicesChecker;
30 private Subscribers $subscribersFeature;
31 private ?int $tier;
32 private bool $isKeyValid = false;
33
34 /** @var array<string,Capability>|null */
35 private ?array $capabilities = null;
36
37 public function __construct(
38 SettingsController $settings,
39 ServicesChecker $servicesChecker,
40 Subscribers $subscribersFeature
41 ) {
42 $this->settings = $settings;
43 $this->servicesChecker = $servicesChecker;
44 $this->subscribersFeature = $subscribersFeature;
45 }
46
47 public function getTier(): ?int {
48 $tier = $this->settings->get(self::MSS_TIER_SETTING_KEY);
49 return isset($tier) ? (int)$tier : null;
50 }
51
52 private function isMailpoetLogoInEmailsRequired(): bool {
53 $mailpoetLogoInEmails = $this->settings->get(self::MSS_MAILPOET_LOGO_IN_EMAILS_SETTING_KEY);
54
55 if (!isset($this->tier) && !isset($mailpoetLogoInEmails)) {
56 return !$this->servicesChecker->isUserActivelyPaying(); // Backward compatibility
57 }
58
59 if (!$this->isKeyValid) {
60 return true;
61 }
62
63 // Allow for less restrictive individual capability to take precedence over tier
64 if (isset($mailpoetLogoInEmails) && (bool)$mailpoetLogoInEmails === false) {
65 return false;
66 }
67
68 return !isset($this->tier) || $this->tier < self::MIN_TIER_LOGO_NOT_REQUIRED;
69 }
70
71 private function isDetailedAnalyticsEnabled(): bool {
72 // Preconditions
73 if (!$this->subscribersFeature->hasValidPremiumKey() || $this->subscribersFeature->check() || !$this->servicesChecker->isPremiumPluginActive()) {
74 return false;
75 }
76
77 $detailedAnalytics = $this->settings->get(self::MSS_DETAILED_ANALYTICS_SETTING_KEY);
78
79 if (!isset($this->tier) && !isset($detailedAnalytics)) {
80 return true; // Backward compatibility is true when preconditions have been met
81 }
82
83 // Allow for less restrictive individual capability to take precedence
84 if (isset($detailedAnalytics) && (bool)$detailedAnalytics === true) {
85 return true;
86 }
87
88 return (isset($this->tier) && $this->tier >= self::MIN_TIER_ANALYTICS_ENABLED);
89 }
90
91 private function isSendByTimezoneEnabled(): bool {
92 if (!$this->subscribersFeature->hasValidPremiumKey() || $this->subscribersFeature->check() || !$this->servicesChecker->isPremiumPluginActive()) {
93 return false;
94 }
95
96 $sendByTimezone = $this->settings->get(self::MSS_SEND_BY_TIMEZONE_SETTING_KEY);
97
98 if (!isset($this->tier) && !isset($sendByTimezone)) {
99 return true;
100 }
101
102 if (isset($sendByTimezone) && (bool)$sendByTimezone === true) {
103 return true;
104 }
105
106 return (isset($this->tier) && $this->tier >= self::MIN_TIER_SEND_BY_TIMEZONE_ENABLED);
107 }
108
109 private function getLimit(string $settingKey, int $minTierForUnlimited): int {
110 $capabilityValue = $this->settings->get($settingKey);
111
112 if (!isset($this->tier) && !isset($capabilityValue)) {
113 return 0; // Backward compatibility
114 }
115
116 $limitFromTier = isset($this->tier) && $this->tier >= $minTierForUnlimited ? 0 : 1; // 0 is unlimited
117
118 if ($limitFromTier === 0) {
119 return 0;
120 }
121
122 // Allow for less restrictive individual capability to take precedence
123 return (isset($capabilityValue) && ((int)$capabilityValue === 0 || (int)$capabilityValue > $limitFromTier)) ? (int)$capabilityValue : $limitFromTier;
124 }
125
126 private function getAutomationStepsLimit(): int {
127 return $this->getLimit(self::MSS_AUTOMATION_STEPS_SETTING_KEY, self::MIN_TIER_UNLIMITED_AUTOMATION_STEPS);
128 }
129
130 private function getSegmentFiltersLimit(): int {
131 return $this->getLimit(self::MSS_SEGMENT_FILTERS_SETTING_KEY, self::MIN_TIER_UNLIMITED_SEGMENT_FILTERS);
132 }
133
134 public function initCapabilities(): void {
135 $this->tier = $this->getTier();
136 $isPremiumKeyValid = $this->servicesChecker->isPremiumKeyValid(false);
137 $this->isKeyValid = $isPremiumKeyValid || $this->servicesChecker->isMailPoetAPIKeyValid(false);
138 $automationSteps = $this->getAutomationStepsLimit();
139 $segmentFilters = $this->getSegmentFiltersLimit();
140 $this->capabilities = [
141 'mailpoetLogoInEmails' => new Capability('mailpoetLogoInEmails', Capability::TYPE_BOOLEAN, $this->isMailpoetLogoInEmailsRequired()),
142 'detailedAnalytics' => new Capability('detailedAnalytics', Capability::TYPE_BOOLEAN, !$this->isDetailedAnalyticsEnabled()),
143 'sendByTimezone' => new Capability('sendByTimezone', Capability::TYPE_BOOLEAN, !$this->isSendByTimezoneEnabled()),
144 'automationSteps' => new Capability('automationSteps', Capability::TYPE_NUMBER, $automationSteps > 0, $automationSteps),
145 'segmentFilters' => new Capability('segmentFilters', Capability::TYPE_NUMBER, $segmentFilters > 0, $segmentFilters),
146 ];
147 }
148
149 /** @return array<string,Capability> */
150 public function getCapabilities(): array {
151 if ($this->capabilities === null) {
152 $this->initCapabilities();
153 }
154 return $this->capabilities ?? [];
155 }
156
157 public function getCapability(string $name): ?Capability {
158 return $this->getCapabilities()[$name] ?? null;
159 }
160
161 /**
162 * Returns true if there is no valid premium key or the product tier can be upgraded
163 */
164 public function showUpgradePage(): bool {
165 $tier = $this->getTier();
166 if (!$this->subscribersFeature->hasValidPremiumKey() || (isset($tier) && $tier < self::MIN_TIER_NO_UPGRADE_PAGE)) {
167 return true;
168 }
169 return false;
170 }
171 }
172