PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.6.2
Jetpack – WP Security, Backup, Speed, & Growth v13.6.2
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 6 years ago class-admin-bar-notice.php 2 years ago class-admin-sidebar-link.php 2 years ago scan.php 2 years ago
class-admin-sidebar-link.php
244 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\My_Jetpack\Products\Backup;
11 use Automattic\Jetpack\Redirect;
12 use Automattic\Jetpack\Status\Host;
13 use Jetpack_Core_Json_Api_Endpoints;
14
15 /**
16 * Class Main
17 *
18 * Responsible for showing the link if available.
19 *
20 * @package Automattic\Jetpack\Scan
21 */
22 class Admin_Sidebar_Link {
23
24 const SCHEDULE_ACTION_HOOK = 'jetpack_scan_refresh_states_event';
25
26 /**
27 * The singleton instance of this class.
28 *
29 * @var Admin_Sidebar_Link
30 */
31 protected static $instance;
32
33 /**
34 * Used to check if we need to schedule the refresh or we need to do it.
35 *
36 * @var boolean | null
37 */
38 private $schedule_refresh_checked;
39
40 /**
41 * Get the singleton instance of the class.
42 *
43 * @return Admin_Sidebar_Link
44 */
45 public static function instance() {
46 if ( ! isset( self::$instance ) ) {
47 self::$instance = new Admin_Sidebar_Link();
48 self::$instance->init_hooks();
49 }
50
51 return self::$instance;
52 }
53
54 /**
55 * Adds action hooks.
56 */
57 public function init_hooks() {
58 add_action( 'jetpack_admin_menu', array( $this, 'maybe_add_admin_link' ), 99 );
59 add_action( self::SCHEDULE_ACTION_HOOK, array( $this, 'refresh_state_cache' ) );
60 }
61
62 /**
63 * Adds a link to the Scan and Backup page.
64 */
65 public function maybe_add_admin_link() {
66 if ( ! $this->should_show_link() ) {
67 return;
68 }
69
70 if ( $this->should_show_scan() ) {
71 $menu_label = __( 'Scan', 'jetpack' );
72 $url = Redirect::get_url( 'calypso-scanner' );
73 add_submenu_page( 'jetpack', $menu_label, esc_html( $menu_label ) . ' <span class="dashicons dashicons-external"></span>', 'manage_options', esc_url( $url ), null, $this->get_link_offset() );
74 }
75
76 // Add scan item which shows history page only. This is mutally exclusive from the scan item above and is only shown for Atomic sitse.
77 if ( $this->should_show_scan_history_only() ) {
78 $menu_label = __( 'Scan', 'jetpack' );
79 $url = Redirect::get_url( 'cloud-scan-history-wp-menu' );
80 add_submenu_page( 'jetpack', $menu_label, esc_html( $menu_label ) . ' <span class="dashicons dashicons-external"></span>', 'manage_options', esc_url( $url ), null, $this->get_link_offset() );
81 }
82
83 if ( $this->should_show_backup() ) {
84 $menu_label = __( 'VaultPress', 'jetpack' );
85 $url = Redirect::get_url( 'calypso-backups' );
86 add_submenu_page( 'jetpack', $menu_label, esc_html( $menu_label ) . ' <span class="dashicons dashicons-external"></span>', 'manage_options', esc_url( $url ), null, $this->get_link_offset() );
87 }
88 }
89
90 /**
91 * We create a menu offset by counting all the pages that have a jetpack_admin_page set as the capability.
92 *
93 * This makes it so that the highlight of the pages works as expected. When you click on the Setting or Dashboard.
94 *
95 * @return int Menu offset.
96 */
97 private function get_link_offset() {
98 global $submenu;
99 $offset = 0;
100
101 if ( ! array_key_exists( 'jetpack', $submenu ) ) {
102 return $offset;
103 }
104
105 foreach ( $submenu['jetpack'] as $link ) {
106 if ( 'jetpack_admin_page' !== $link[1] ) {
107 break;
108 }
109 ++$offset;
110 }
111
112 return $offset;
113 }
114
115 /**
116 * Refreshes the state cache via API call. Called via cron.
117 */
118 public function refresh_state_cache() {
119 Jetpack_Core_Json_Api_Endpoints::get_scan_state();
120 Jetpack_Core_Json_Api_Endpoints::get_rewind_data();
121 }
122
123 /**
124 * Returns true if the link should appear.
125 *
126 * @return boolean
127 */
128 private function should_show_link() {
129 // Jetpack Scan/Backup is currently not supported on multisite.
130 if ( is_multisite() ) {
131 return false;
132 }
133
134 // Check if VaultPress is active, the assumption there is that VaultPress is working.
135 // It has its link the adminbar.
136 if ( class_exists( 'VaultPress' ) ) {
137 return false;
138 }
139
140 return $this->should_show_scan() || $this->should_show_backup() || $this->should_show_scan_history_only();
141 }
142
143 /**
144 * Check if we should display the Scan menu item.
145 *
146 * 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.
147 *
148 * @return boolean
149 */
150 private function should_show_scan() {
151 return $this->has_scan() && ! $this->has_protect_plugin() && ! ( new Host() )->is_woa_site();
152 }
153
154 /**
155 * Check if we should display the Scan menu item history.
156 *
157 * It will only be displayed if site has Scan enabled, is an Atomic site.
158 *
159 * @return boolean
160 */
161 private function should_show_scan_history_only() {
162 return $this->has_scan() && ( new Host() )->is_woa_site() && get_option( 'wpcom_admin_interface' ) === 'wp-admin';
163 }
164
165 /**
166 * Check if we should display the Backup menu item.
167 *
168 * 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.
169 *
170 * @return boolean
171 */
172 private function should_show_backup() {
173 return $this->has_backup() && ! $this->has_backup_plugin();
174 }
175
176 /**
177 * Detects if Scan is enabled.
178 *
179 * @return boolean
180 */
181 private function has_scan() {
182 $this->maybe_refresh_transient_cache();
183 $scan_state = get_transient( 'jetpack_scan_state' );
184 if ( ! $scan_state ) {
185 return false;
186 }
187
188 return isset( $scan_state->state ) && 'unavailable' !== $scan_state->state;
189 }
190
191 /**
192 * Detects if Protect plugin is active.
193 *
194 * @return boolean
195 */
196 private function has_protect_plugin() {
197 return class_exists( 'Jetpack_Protect' );
198 }
199
200 /**
201 * Detects if Backup is enabled.
202 *
203 * @return boolean
204 */
205 private function has_backup() {
206 $this->maybe_refresh_transient_cache();
207 $rewind_state = get_transient( 'jetpack_rewind_state' );
208 if ( ! $rewind_state ) {
209 return false;
210 }
211
212 return isset( $rewind_state->state ) && 'unavailable' !== $rewind_state->state;
213 }
214
215 /**
216 * Detects if Backup plugin is active.
217 *
218 * @return boolean
219 */
220 private function has_backup_plugin() {
221 return Backup::is_standalone_plugin_active();
222 }
223
224 /**
225 * Triggers a cron job to refresh the Scan and Rewind state cache.
226 */
227 private function maybe_refresh_transient_cache() {
228 if ( $this->schedule_refresh_checked ) {
229 return;
230 }
231
232 // Do we have a jetpack_scan and jetpack_rewind state set?
233 if ( get_transient( 'jetpack_scan_state' ) && get_transient( 'jetpack_rewind_state' ) ) {
234 return;
235 }
236
237 if ( false === wp_next_scheduled( self::SCHEDULE_ACTION_HOOK ) ) {
238 wp_schedule_single_event( time(), self::SCHEDULE_ACTION_HOOK );
239 }
240
241 $this->schedule_refresh_checked = true;
242 }
243 }
244