PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 14.8.1
Jetpack – WP Security, Backup, Speed, & Growth v14.8.1
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / scan / class-admin-sidebar-link.php
jetpack / modules / scan Last commit date
admin-bar-notice.js 1 year ago class-admin-bar-notice.php 2 years ago class-admin-sidebar-link.php 1 year ago scan.php 2 years ago
class-admin-sidebar-link.php
260 lines
1 <?php
2 /**
3 * A class that adds a scan and backup link to the admin sidebar.
4 *
5 * @package automattic/jetpack
6 */
7
8 namespace Automattic\Jetpack\Scan;
9
10 use Automattic\Jetpack\Admin_UI\Admin_Menu;
11 use Automattic\Jetpack\My_Jetpack\Products\Backup;
12 use Automattic\Jetpack\Redirect;
13 use Automattic\Jetpack\Status\Host;
14 use Jetpack_Core_Json_Api_Endpoints;
15
16 /**
17 * Class Main
18 *
19 * Responsible for showing the link if available.
20 *
21 * @package Automattic\Jetpack\Scan
22 */
23 class Admin_Sidebar_Link {
24
25 const SCHEDULE_ACTION_HOOK = 'jetpack_scan_refresh_states_event';
26
27 /**
28 * The singleton instance of this class.
29 *
30 * @var Admin_Sidebar_Link
31 */
32 protected static $instance;
33
34 /**
35 * Used to check if we need to schedule the refresh or we need to do it.
36 *
37 * @var boolean | null
38 */
39 private $schedule_refresh_checked;
40
41 /**
42 * Get the singleton instance of the class.
43 *
44 * @return Admin_Sidebar_Link
45 */
46 public static function instance() {
47 if ( ! isset( self::$instance ) ) {
48 self::$instance = new Admin_Sidebar_Link();
49 self::$instance->init_hooks();
50 }
51
52 return self::$instance;
53 }
54
55 /**
56 * Adds action hooks.
57 */
58 public function init_hooks() {
59 add_action( 'jetpack_admin_menu', array( $this, 'maybe_add_admin_link' ), 99 );
60 add_action( self::SCHEDULE_ACTION_HOOK, array( $this, 'refresh_state_cache' ) );
61 }
62
63 /**
64 * Adds a link to the Scan and Backup page.
65 */
66 public function maybe_add_admin_link() {
67 if ( ! $this->should_show_link() ) {
68 return;
69 }
70
71 if ( $this->should_show_scan() ) {
72 Admin_Menu::add_menu(
73 __( 'Scan', 'jetpack' ),
74 __( 'Scan', 'jetpack' ) . ' <span class="dashicons dashicons-external"></span>',
75 'manage_options',
76 esc_url( Redirect::get_url( 'cloud-scan-history-wp-menu' ) ),
77 null,
78 $this->get_link_offset()
79 );
80 }
81
82 // Add scan item which shows history page only. This is mutally exclusive from the scan item above and is only shown for Atomic sitse.
83 if ( $this->should_show_scan_history_only() ) {
84 Admin_Menu::add_menu(
85 __( 'Scan', 'jetpack' ),
86 __( 'Scan', 'jetpack' ) . ' <span class="dashicons dashicons-external"></span>',
87 'manage_options',
88 esc_url( Redirect::get_url( 'cloud-scan-history-wp-menu' ) ),
89 null,
90 $this->get_link_offset()
91 );
92 }
93
94 if ( $this->should_show_backup() ) {
95 Admin_Menu::add_menu(
96 __( 'VaultPress Backup', 'jetpack' ),
97 __( 'VaultPress Backup', 'jetpack' ) . ' <span class="dashicons dashicons-external"></span>',
98 'manage_options',
99 esc_url( Redirect::get_url( 'calypso-backups' ) ),
100 null,
101 $this->get_link_offset()
102 );
103 }
104 }
105
106 /**
107 * We create a menu offset by counting all the pages that have a jetpack_admin_page set as the capability.
108 *
109 * This makes it so that the highlight of the pages works as expected. When you click on the Setting or Dashboard.
110 *
111 * @return int Menu offset.
112 */
113 private function get_link_offset() {
114 global $submenu;
115 $offset = 9;
116
117 if ( ! array_key_exists( 'jetpack', $submenu ) ) {
118 return $offset;
119 }
120
121 foreach ( $submenu['jetpack'] as $link ) {
122 if ( 'jetpack_admin_page' !== $link[1] ) {
123 break;
124 }
125 ++$offset;
126 }
127
128 return $offset;
129 }
130
131 /**
132 * Refreshes the state cache via API call. Called via cron.
133 */
134 public function refresh_state_cache() {
135 Jetpack_Core_Json_Api_Endpoints::get_scan_state();
136 Jetpack_Core_Json_Api_Endpoints::get_rewind_data();
137 }
138
139 /**
140 * Returns true if the link should appear.
141 *
142 * @return boolean
143 */
144 private function should_show_link() {
145 // Jetpack Scan/Backup is currently not supported on multisite.
146 if ( is_multisite() ) {
147 return false;
148 }
149
150 // Check if VaultPress is active, the assumption there is that VaultPress is working.
151 // It has its link the adminbar.
152 if ( class_exists( 'VaultPress' ) ) {
153 return false;
154 }
155
156 return $this->should_show_scan() || $this->should_show_backup() || $this->should_show_scan_history_only();
157 }
158
159 /**
160 * Check if we should display the Scan menu item.
161 *
162 * It will only be displayed if site has Scan enabled, is not an Atomic site, and the stand-alone Protect plugin is not active, because it will have a menu item of its own.
163 *
164 * @return boolean
165 */
166 private function should_show_scan() {
167 return $this->has_scan() && ! $this->has_protect_plugin() && ! ( new Host() )->is_woa_site();
168 }
169
170 /**
171 * Check if we should display the Scan menu item history.
172 *
173 * It will only be displayed if site has Scan enabled, is an Atomic site.
174 *
175 * @return boolean
176 */
177 private function should_show_scan_history_only() {
178 return $this->has_scan() && ( new Host() )->is_woa_site() && get_option( 'wpcom_admin_interface' ) === 'wp-admin';
179 }
180
181 /**
182 * Check if we should display the Backup menu item.
183 *
184 * It will only be displayed if site has Backup enabled and the stand-alone Backup plugin is not active, because it will have a menu item of its own.
185 *
186 * @return boolean
187 */
188 private function should_show_backup() {
189 return $this->has_backup() && ! $this->has_backup_plugin();
190 }
191
192 /**
193 * Detects if Scan is enabled.
194 *
195 * @return boolean
196 */
197 private function has_scan() {
198 $this->maybe_refresh_transient_cache();
199 $scan_state = get_transient( 'jetpack_scan_state' );
200 if ( ! $scan_state ) {
201 return false;
202 }
203
204 return isset( $scan_state->state ) && 'unavailable' !== $scan_state->state;
205 }
206
207 /**
208 * Detects if Protect plugin is active.
209 *
210 * @return boolean
211 */
212 private function has_protect_plugin() {
213 return class_exists( 'Jetpack_Protect' );
214 }
215
216 /**
217 * Detects if Backup is enabled.
218 *
219 * @return boolean
220 */
221 private function has_backup() {
222 $this->maybe_refresh_transient_cache();
223 $rewind_state = get_transient( 'jetpack_rewind_state' );
224 if ( ! $rewind_state ) {
225 return false;
226 }
227
228 return isset( $rewind_state->state ) && 'unavailable' !== $rewind_state->state;
229 }
230
231 /**
232 * Detects if Backup plugin is active.
233 *
234 * @return boolean
235 */
236 private function has_backup_plugin() {
237 return Backup::is_standalone_plugin_active();
238 }
239
240 /**
241 * Triggers a cron job to refresh the Scan and Rewind state cache.
242 */
243 private function maybe_refresh_transient_cache() {
244 if ( $this->schedule_refresh_checked ) {
245 return;
246 }
247
248 // Do we have a jetpack_scan and jetpack_rewind state set?
249 if ( get_transient( 'jetpack_scan_state' ) && get_transient( 'jetpack_rewind_state' ) ) {
250 return;
251 }
252
253 if ( false === wp_next_scheduled( self::SCHEDULE_ACTION_HOOK ) ) {
254 wp_schedule_single_event( time(), self::SCHEDULE_ACTION_HOOK );
255 }
256
257 $this->schedule_refresh_checked = true;
258 }
259 }
260