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 / Config / Activator.php
mailpoet / lib / Config Last commit date
PopulatorData 2 months ago AccessControl.php 2 years ago Activator.php 2 months ago AssetsLoader.php 2 weeks ago Capabilities.php 2 months ago Changelog.php 2 months ago DeactivationPoll.php 3 years ago DeferredAdminNotices.php 2 months ago Env.php 6 months ago Hooks.php 1 month ago HooksWooCommerce.php 1 month ago Initializer.php 1 month ago Installer.php 10 months ago Localizer.php 3 years ago Menu.php 1 month ago PersonalDataErasers.php 1 month ago PersonalDataExporters.php 1 month ago PluginActivatedHook.php 3 years ago Populator.php 2 weeks ago PrivacyPolicy.php 1 month ago Renderer.php 1 year ago RendererFactory.php 3 years ago RequirementsChecker.php 2 months ago Router.php 2 months ago ServicesChecker.php 3 years ago Shortcodes.php 1 month ago SilentUpgraderSkin.php 3 years ago SubscriberChangesNotifier.php 2 months ago TranslationUpdater.php 3 months ago TwigEnvironment.php 1 year ago TwigFileSystemCache.php 3 years ago Updater.php 4 days ago index.php 3 years ago
Activator.php
211 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\Config;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Cron\ActionScheduler\Actions\DaemonTrigger;
9 use MailPoet\Cron\ActionScheduler\ActionScheduler as CronActionScheduler;
10 use MailPoet\Cron\CronTrigger;
11 use MailPoet\Cron\DaemonActionSchedulerRunner;
12 use MailPoet\InvalidStateException;
13 use MailPoet\Migrator\Migrator;
14 use MailPoet\Settings\SettingsController;
15 use MailPoet\Util\Notices\DisabledMailFunctionNotice;
16 use MailPoet\WP\Functions as WPFunctions;
17 use MailPoetVendor\Doctrine\DBAL\Connection;
18
19 class Activator {
20 public const TRANSIENT_ACTIVATE_KEY = 'mailpoet_activator_activate';
21 private const TRANSIENT_EXPIRATION = 120; // seconds
22
23 /** @var Connection */
24 private $connection;
25
26 /** @var SettingsController */
27 private $settings;
28
29 /** @var Populator */
30 private $populator;
31
32 /** @var WPFunctions */
33 private $wp;
34
35 /** @var Migrator */
36 private $migrator;
37
38 /** @var CronActionScheduler */
39 private $cronActionSchedulerRunner;
40
41 /** @var DaemonActionSchedulerRunner */
42 private $daemonActionSchedulerRunner;
43
44 public function __construct(
45 Connection $connection,
46 SettingsController $settings,
47 Populator $populator,
48 WPFunctions $wp,
49 Migrator $migrator,
50 CronActionScheduler $cronActionSchedulerRunner,
51 DaemonActionSchedulerRunner $daemonActionSchedulerRunner
52 ) {
53 $this->connection = $connection;
54 $this->settings = $settings;
55 $this->populator = $populator;
56 $this->wp = $wp;
57 $this->migrator = $migrator;
58 $this->cronActionSchedulerRunner = $cronActionSchedulerRunner;
59 $this->daemonActionSchedulerRunner = $daemonActionSchedulerRunner;
60 }
61
62 public function activate() {
63 $isRunning = $this->wp->getTransient(self::TRANSIENT_ACTIVATE_KEY);
64 if ($isRunning === false) {
65 $this->lockActivation();
66 try {
67 $this->processActivate();
68 } finally {
69 $this->unlockActivation();
70 }
71 } else {
72 throw new InvalidStateException(__('MailPoet version update is in progress, please refresh the page in a minute.', 'mailpoet'));
73 }
74 }
75
76 private function lockActivation(): void {
77 $this->wp->setTransient(self::TRANSIENT_ACTIVATE_KEY, '1', self::TRANSIENT_EXPIRATION);
78 }
79
80 private function unlockActivation(): void {
81 $this->wp->deleteTransient(self::TRANSIENT_ACTIVATE_KEY);
82 }
83
84 private function processActivate(): void {
85 $this->migrator->run();
86 $this->refreshCronActions();
87 $this->populator->up();
88 $this->updateDbVersion();
89
90 $caps = new Capabilities();
91 $caps->setupWPCapabilities();
92
93 $localizer = new Localizer();
94 $localizer->forceInstallLanguagePacks($this->wp);
95
96 $this->checkForDisabledMailFunction();
97 }
98
99 /**
100 * Public because it can be deferred until Action Scheduler is initialized.
101 */
102 public function refreshCronActions(): void {
103 $currentMethod = $this->settings->get(CronTrigger::SETTING_NAME . '.method');
104 if ($currentMethod !== CronTrigger::METHOD_ACTION_SCHEDULER) {
105 $this->daemonActionSchedulerRunner->clearDeactivationFlag();
106 return;
107 }
108
109 if (!$this->cronActionSchedulerRunner->isInitialized()) {
110 $this->cronActionSchedulerRunner->runAfterInitialized([$this, 'refreshCronActions']);
111 return;
112 }
113
114 $this->deactivateCronActions();
115 $this->reactivateCronActions();
116 }
117
118 public function deactivate() {
119 $this->lockActivation();
120 $this->deleteAllMailPoetTablesAndData();
121
122 $caps = new Capabilities();
123 $caps->removeWPCapabilities();
124 $this->unlockActivation();
125 }
126
127 /**
128 * Deactivate action scheduler cron actions when the migration run.
129 * This should prevent processing actions during migrations.
130 * They are later re-activated in CronTrigger
131 *
132 * @return void
133 */
134 private function deactivateCronActions(): void {
135 $currentMethod = $this->settings->get(CronTrigger::SETTING_NAME . '.method');
136 if ($currentMethod !== CronTrigger::METHOD_ACTION_SCHEDULER) {
137 return;
138 }
139 $this->cronActionSchedulerRunner->unscheduleAllCronActions();
140 }
141
142 private function reactivateCronActions(): void {
143 $this->daemonActionSchedulerRunner->clearDeactivationFlag();
144 $currentMethod = $this->settings->get(CronTrigger::SETTING_NAME . '.method');
145 if ($currentMethod !== CronTrigger::METHOD_ACTION_SCHEDULER) {
146 return;
147 }
148 if (!$this->cronActionSchedulerRunner->hasScheduledAction(DaemonTrigger::NAME)) {
149 $this->cronActionSchedulerRunner->scheduleRecurringAction(
150 $this->wp->currentTime('timestamp', true),
151 DaemonTrigger::TRIGGER_RUN_INTERVAL,
152 DaemonTrigger::NAME
153 );
154 }
155 }
156
157 public function updateDbVersion() {
158 try {
159 $currentDbVersion = $this->settings->get('db_version');
160 } catch (\Exception $e) {
161 $currentDbVersion = null;
162 }
163
164 $this->settings->set('db_version', Env::$version);
165
166 // if current db version and plugin version differ, log an update
167 if (version_compare((string)$currentDbVersion, Env::$version) !== 0) {
168 $updatesLog = (array)$this->settings->get('updates_log', []);
169 $updatesLog[] = [
170 'previous_version' => $currentDbVersion,
171 'new_version' => Env::$version,
172 'date' => date('Y-m-d H:i:s'),
173 ];
174 $this->settings->set('updates_log', $updatesLog);
175 }
176 }
177
178 private function checkForDisabledMailFunction() {
179 $version = $this->settings->get('version');
180
181 if (!is_null($version)) return; // not a new user
182
183 // check for valid mail function on new installs
184 $this->settings->set(DisabledMailFunctionNotice::QUEUE_DISABLED_MAIL_FUNCTION_CHECK, true);
185 }
186
187 private function deleteAllMailPoetTablesAndData(): void {
188 $prefix = Env::$dbPrefix;
189 if (!$prefix) {
190 throw InvalidStateException::create()->withMessage('No database table prefix was set.');
191 }
192
193 // list all MailPoet tables by prefix
194 $prefixSql = $this->wp->escSql($prefix);
195 $tables = $this->connection->executeQuery("SHOW TABLES LIKE '$prefixSql%'")->fetchFirstColumn();
196
197 // drop all MailPoet tables in a single query
198 $tablesSql = implode(
199 ',',
200 array_map(function ($table): string {
201 /** @var string $table */
202 return $this->wp->escSql(strval($table));
203 }, $tables)
204 );
205
206 $this->connection->executeStatement('SET foreign_key_checks = 0');
207 $this->connection->executeStatement("DROP TABLE IF EXISTS $tablesSql");
208 $this->connection->executeStatement('SET foreign_key_checks = 1');
209 }
210 }
211