PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 4.10.0
WP STAGING – WordPress Backups, Restore, Migration & Clone v4.10.0
4.10.0 4.9.5 4.9.4 4.9.3 4.9.2 4.9.1 4.9.0 4.8.1 trunk 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.10.0 3.2.0 3.3.1 3.3.2 3.3.3 3.4.1 3.4.3 3.5.0 3.6.0 3.7.1 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.8.7 3.9.0 3.9.1 3.9.2 3.9.3 3.9.4 4.0.0 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.8.0
wp-staging / Framework / CommonServiceProvider.php
wp-staging / Framework Last commit date
Adapter 1 week ago Analytics 6 days ago Assets 6 days ago BackgroundProcessing 6 days ago CloningProcess 1 week ago Collection 3 years ago Command 5 years ago Component 10 months ago DI 6 days ago Database 6 days ago DependencyResolver 2 years ago Exceptions 2 years ago Experiments 6 days ago Facades 4 months ago Filesystem 6 days ago Interfaces 6 days ago Job 6 days ago Language 6 days ago Logger 2 months ago Mails 5 months ago Network 1 week ago Newsfeed 6 months ago Notices 6 days ago Onboarding 6 days ago Performance 4 months ago Permalinks 1 year ago Queue 6 months ago Rest 4 months ago Security 3 months ago Settings 3 months ago TemplateEngine 8 months ago ThirdParty 1 week ago Traits 6 days ago Upgrade 2 months ago Utils 6 days ago AnalyticsServiceProvider.php 1 month ago AssetServiceProvider.php 1 year ago CommonServiceProvider.php 6 days ago ErrorHandler.php 6 days ago NoticeServiceProvider.php 1 year ago SettingsServiceProvider.php 4 months ago SiteInfo.php 1 week ago Url.php 6 months ago
CommonServiceProvider.php
176 lines
1 <?php
2
3 namespace WPStaging\Framework;
4
5 use WPStaging\Backup\Task\Tasks\JobBackup\FinishBackupTask;
6 use WPStaging\Core\Cron\Cron;
7 use WPStaging\Core\Cron\CronIntegrity;
8 use WPStaging\Framework\Analytics\AnalyticsCleanup;
9 use WPStaging\Framework\BackgroundProcessing\Job\PrepareJob;
10 use WPStaging\Framework\DI\ServiceProvider;
11 use WPStaging\Framework\Filesystem\DebugLogReader;
12 use WPStaging\Framework\Filesystem\DiskWriteCheck;
13 use WPStaging\Framework\Filesystem\LogCleanup;
14 use WPStaging\Framework\Mails\MailSender;
15 use WPStaging\Framework\Notices\BackupPluginsNotice;
16 use WPStaging\Framework\Notices\CliIntegrationNotice;
17 use WPStaging\Framework\Notices\WpVersionCompatNotice;
18 use WPStaging\Framework\Onboarding\FreeOnboarding;
19 use WPStaging\Framework\Onboarding\OnboardingAjax;
20 use WPStaging\Framework\Onboarding\OnboardingJourney;
21 use WPStaging\Framework\Onboarding\QueuedBackup;
22 use WPStaging\Framework\Performance\MemoryExhaust;
23 use WPStaging\Framework\Security\Otp\Otp;
24 use WPStaging\Staging\Jobs\StagingSiteCreate;
25 use WPStaging\Framework\Settings\DarkMode;
26 use WPStaging\Framework\Traits\EventLoggerTrait;
27 use WPStaging\Framework\Utils\DBPermissions;
28 use WPStaging\Staging\Ajax\StagingSiteDataChecker;
29
30 /**
31 * Class CommonServiceProvider
32 *
33 * A Service Provider for binds common to both Free and Pro.
34 *
35 * @package WPStaging\Framework
36 */
37 class CommonServiceProvider extends ServiceProvider
38 {
39 use EventLoggerTrait;
40
41 protected function registerClasses()
42 {
43 $this->container->singleton(DiskWriteCheck::class);
44 $this->container->make(DebugLogReader::class)->listenDeleteLogRequest();
45
46 add_action(Cron::ACTION_DAILY_EVENT, [$this, 'cleanupLogs'], 25, 0);
47 add_action(Cron::ACTION_DAILY_EVENT, [$this, 'cleanupAnalytics'], 25, 0);
48 add_action(Cron::ACTION_DAILY_EVENT, [$this, 'cleanupExpiredOtps'], 25, 0);
49
50 // Per-request cron integrity check (throttled): re-creates missing cron events (e.g. for
51 // backup schedules) even when WP-Cron itself is broken so the daily event above never fires.
52 // Priority 20 so custom recurrences registered on `init` (default priority 10) are present
53 // when wp_next_scheduled / wp_get_schedules are queried.
54 // Wrapped in try/catch: when an outdated free version is active, the DI container may
55 // resolve BackupScheduler from the free autoloader (which prepends), hitting missing
56 // classes (e.g. BackupProcessLock renamed in newer versions) and causing a fatal error.
57 $container = $this->container;
58 add_action('init', function () use ($container) {
59 // Skip during WP install (DB schema may not yet exist) and inside the WP-Cron runner
60 // itself (re-entry from within a cron tick would just do a no-op transient read).
61 if (defined('WP_INSTALLING') && WP_INSTALLING) {
62 return;
63 }
64
65 if (defined('DOING_CRON') && DOING_CRON) {
66 return;
67 }
68
69 try {
70 $container->make(CronIntegrity::class)->checkAndRepair();
71 } catch (\Throwable $e) {
72 // Silently skip — dependency resolution failed (e.g. incompatible free version).
73 }
74 }, 20, 0);
75 add_action("wp_ajax_wpstg_is_writable_clone_destination_dir", $this->container->callback(StagingSiteDataChecker::class, "ajaxIsWritableCloneDestinationDir")); // phpcs:ignore WPStaging.Security.AuthorizationChecked
76 add_action("wp_ajax_wpstg_check_user_permissions", $this->container->callback(DBPermissions::class, 'ajaxCheckDBPermissions')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
77 add_action("wp_ajax_wpstg_check_user_is_authenticated", [$this, "ajaxIsUserAuthenticated"]);// phpcs:ignore WPStaging.Security.AuthorizationChecked
78 add_action("wp_ajax_nopriv_wpstg_check_user_is_authenticated", [$this, "ajaxIsUserAuthenticated"]);// phpcs:ignore WPStaging.Security.AuthorizationChecked
79 add_action('wp_ajax_wpstg_backup_plugin_notice_close', $this->container->callback(BackupPluginsNotice::class, 'ajaxBackupPluginNoticeClose')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
80 add_action('wp_ajax_wpstg_backup_plugin_notice_remind_me', $this->container->callback(BackupPluginsNotice::class, 'ajaxBackupPluginNoticeRemindMe')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
81 add_action('wp_ajax_wpstg_cli_notice_close', $this->container->callback(CliIntegrationNotice::class, 'ajaxCliNoticeClose')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
82 add_action('wp_ajax_wpstg_cli_notice_hide_forever', $this->container->callback(CliIntegrationNotice::class, 'ajaxCliNoticeHideForever')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
83 add_action('wp_ajax_wpstg_cli_get_backup_list', $this->container->callback(CliIntegrationNotice::class, 'ajaxGetCliBackupList')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
84 add_action('admin_init', $this->container->callback(DarkMode::class, 'mayBeShowDarkMode'), 10, 1);
85 add_action('wp_ajax_wpstg_set_dark_mode', $this->container->callback(DarkMode::class, 'ajaxEnableDefaultColorMode')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
86 add_action('wp_ajax_wpstg_set_default_os_color_mode', $this->container->callback(DarkMode::class, 'ajaxSetDefaultOsMode')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
87 add_action("wp_ajax_wpstg_log_event_failure", [$this, "ajaxLogEventFailure"]); // phpcs:ignore WPStaging.Security.AuthorizationChecked
88 add_action("wp_ajax_nopriv_wpstg_log_event_failure", [$this, "ajaxLogEventFailure"]); // phpcs:ignore WPStaging.Security.AuthorizationChecked
89 add_action('wp_ajax_wpstg--detect-memory-exhaust', $this->container->callback(MemoryExhaust::class, 'ajaxResponse')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
90 add_action("wp_ajax_wpstg_log_event_success", [$this, "ajaxLogEventSuccess"]); // phpcs:ignore WPStaging.Security.AuthorizationChecked
91 add_action("wp_ajax_nopriv_wpstg_log_event_success", [$this, "ajaxLogEventSuccess"]); // phpcs:ignore WPStaging.Security.AuthorizationChecked
92 add_action('wp_ajax_wpstg_send_mail_notification', $this->container->callback(MailSender::class, 'ajaxSendEmailNotification')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
93 add_action('wp_ajax_nopriv_wpstg_send_mail_notification', $this->container->callback(MailSender::class, 'ajaxSendEmailNotification')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
94 add_action('wp_ajax_wpstg_dismiss_compat_notice', $this->container->callback(WpVersionCompatNotice::class, 'ajaxDismissCompatNotice')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
95 add_action('wp_ajax_wpstg_onboarding_select_action', $this->container->callback(OnboardingAjax::class, 'ajaxSelectAction')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
96 add_filter('admin_body_class', [$this, 'addOnboardingBodyClass']);
97 add_action('wp_ajax_wpstg_onboarding_action_started', $this->container->callback(OnboardingAjax::class, 'ajaxActionStarted')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
98 add_action('wp_ajax_wpstg_onboarding_offer_shown', $this->container->callback(OnboardingAjax::class, 'ajaxOfferShown')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
99 add_action('wp_ajax_wpstg_onboarding_restart', $this->container->callback(OnboardingAjax::class, 'ajaxRestart')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
100 add_action('wp_ajax_wpstg_onboarding_next_step', $this->container->callback(OnboardingAjax::class, 'ajaxNextStep')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
101 add_action('wp_ajax_wpstg_onboarding_cancel_action', $this->container->callback(OnboardingAjax::class, 'ajaxCancelAction')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
102 add_action('wp_ajax_wpstg_onboarding_finish', $this->container->callback(OnboardingAjax::class, 'ajaxFinish')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
103 add_action('wp_ajax_wpstg_onboarding_queue_backup', $this->container->callback(OnboardingAjax::class, 'ajaxQueueBackup')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
104 add_action('wp_ajax_wpstg_onboarding_backup_status', $this->container->callback(OnboardingAjax::class, 'ajaxQueuedBackupStatus')); // phpcs:ignore WPStaging.Security.AuthorizationChecked
105
106 // Priority 5: a released backup must find the staging site already counted.
107 add_action(StagingSiteCreate::ACTION_STAGING_SITE_CREATED, $this->container->callback(OnboardingJourney::class, 'completeStaging'), 5);
108 add_action(StagingSiteCreate::ACTION_STAGING_SITE_CREATED, $this->container->callback(QueuedBackup::class, 'startAfterStagingCreated'));
109 add_action(FinishBackupTask::ACTION_BACKUP_CREATED, $this->container->callback(OnboardingJourney::class, 'completeBackup'), 5);
110 add_action(FinishBackupTask::ACTION_BACKUP_CREATED, $this->container->callback(QueuedBackup::class, 'markCompleted'));
111 // add_action, not registerInternalHook: that one holds one listener per
112 // hook name, and BackupScheduler already owns this one.
113 add_action(PrepareJob::ACTION_JOB_FAILURE, $this->container->callback(QueuedBackup::class, 'onBackgroundJobFailure'));
114
115 add_action('wp_ajax_wpstg_cancel_clone', $this->container->callback(QueuedBackup::class, 'discardOnStagingRequest'), 1); // phpcs:ignore WPStaging.Security.AuthorizationChecked -- Authorization checked in discardOnStagingRequest()
116
117 // A cancelled job leaves the first run holding the screen for something
118 // that is no longer running, so the capability goes back on offer.
119 add_action('wp_ajax_wpstg_cancel_clone', $this->container->callback(OnboardingJourney::class, 'abandonActionOnRequest'), 2); // phpcs:ignore WPStaging.Security.AuthorizationChecked -- Authorization checked in abandonActionOnRequest()
120 add_action('wp_ajax_wpstg--job--cancel', $this->container->callback(OnboardingJourney::class, 'abandonActionOnRequest'), 2); // phpcs:ignore WPStaging.Security.AuthorizationChecked -- Authorization checked in abandonActionOnRequest()
121 add_action('wp_ajax_wpstg_staging_job_error', $this->container->callback(QueuedBackup::class, 'discardOnStagingRequest'), 1); // phpcs:ignore WPStaging.Security.AuthorizationChecked -- Authorization checked in discardOnStagingRequest()
122 }
123
124 /**
125 * Resolved defensively, like the first-run surfaces themselves: this filter
126 * runs on every admin screen, so a first-run detail failing to build must
127 * not be able to take wp-admin down with it.
128 *
129 * @filter admin_body_class
130 * @param string $classes
131 * @return string
132 */
133 public function addOnboardingBodyClass($classes)
134 {
135 $onboarding = FreeOnboarding::resolve();
136
137 return $onboarding === null ? $classes : $onboarding->addFocusModeBodyClass($classes);
138 }
139
140 /**
141 * @return void
142 */
143 public function cleanupLogs()
144 {
145 $this->container->make(LogCleanup::class)->cleanOldLogs();
146 }
147
148 /**
149 * @return void
150 */
151 public function cleanupAnalytics()
152 {
153 $this->container->make(AnalyticsCleanup::class)->cleanupOldAnalytics();
154 }
155
156 /**
157 * @return void
158 */
159 public function cleanupExpiredOtps()
160 {
161 $this->container->make(Otp::class)->cleanupExpiredOtps();
162 }
163
164 /**
165 * @return void
166 */
167 public function ajaxIsUserAuthenticated()
168 {
169 if (!is_user_logged_in()) {
170 wp_send_json(['wpAuthCheck' => false, 'redirectUrl' => wp_login_url()]);
171 }
172
173 wp_send_json(['wpAuthCheck' => true]);
174 }
175 }
176