PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.6.4
Jetpack – WP Security, Backup, Speed, & Growth v12.6.4
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 3 years ago class-admin-sidebar-link.php 3 years ago scan.php 4 years ago
class-admin-sidebar-link.php
226 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 if ( $this->should_show_backup() ) {
77 $menu_label = __( 'VaultPress', 'jetpack' );
78 $url = Redirect::get_url( 'calypso-backups' );
79 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() );
80 }
81 }
82
83 /**
84 * We create a menu offset by counting all the pages that have a jetpack_admin_page set as the capability.
85 *
86 * This makes it so that the highlight of the pages works as expected. When you click on the Setting or Dashboard.
87 *
88 * @return int Menu offset.
89 */
90 private function get_link_offset() {
91 global $submenu;
92 $offset = 0;
93
94 if ( ! array_key_exists( 'jetpack', $submenu ) ) {
95 return $offset;
96 }
97
98 foreach ( $submenu['jetpack'] as $link ) {
99 if ( 'jetpack_admin_page' !== $link[1] ) {
100 break;
101 }
102 ++$offset;
103 }
104
105 return $offset;
106 }
107
108 /**
109 * Refreshes the state cache via API call. Called via cron.
110 */
111 public function refresh_state_cache() {
112 Jetpack_Core_Json_Api_Endpoints::get_scan_state();
113 Jetpack_Core_Json_Api_Endpoints::get_rewind_data();
114 }
115
116 /**
117 * Returns true if the link should appear.
118 *
119 * @return boolean
120 */
121 private function should_show_link() {
122 // Jetpack Scan/Backup is currently not supported on multisite.
123 if ( is_multisite() ) {
124 return false;
125 }
126
127 // Check if VaultPress is active, the assumption there is that VaultPress is working.
128 // It has its link the adminbar.
129 if ( class_exists( 'VaultPress' ) ) {
130 return false;
131 }
132
133 return $this->should_show_scan() || $this->should_show_backup();
134 }
135
136 /**
137 * Check if we should display the Scan menu item.
138 *
139 * 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.
140 *
141 * @return boolean
142 */
143 private function should_show_scan() {
144 return $this->has_scan() && ! $this->has_protect_plugin() && ! ( new Host() )->is_woa_site();
145 }
146
147 /**
148 * Check if we should display the Backup menu item.
149 *
150 * 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.
151 *
152 * @return boolean
153 */
154 private function should_show_backup() {
155 return $this->has_backup() && ! $this->has_backup_plugin();
156 }
157
158 /**
159 * Detects if Scan is enabled.
160 *
161 * @return boolean
162 */
163 private function has_scan() {
164 $this->maybe_refresh_transient_cache();
165 $scan_state = get_transient( 'jetpack_scan_state' );
166 if ( ! $scan_state ) {
167 return false;
168 }
169
170 return isset( $scan_state->state ) && 'unavailable' !== $scan_state->state;
171 }
172
173 /**
174 * Detects if Protect plugin is active.
175 *
176 * @return boolean
177 */
178 private function has_protect_plugin() {
179 return class_exists( 'Jetpack_Protect' );
180 }
181
182 /**
183 * Detects if Backup is enabled.
184 *
185 * @return boolean
186 */
187 private function has_backup() {
188 $this->maybe_refresh_transient_cache();
189 $rewind_state = get_transient( 'jetpack_rewind_state' );
190 if ( ! $rewind_state ) {
191 return false;
192 }
193
194 return isset( $rewind_state->state ) && 'unavailable' !== $rewind_state->state;
195 }
196
197 /**
198 * Detects if Backup plugin is active.
199 *
200 * @return boolean
201 */
202 private function has_backup_plugin() {
203 return Backup::is_active();
204 }
205
206 /**
207 * Triggers a cron job to refresh the Scan and Rewind state cache.
208 */
209 private function maybe_refresh_transient_cache() {
210 if ( $this->schedule_refresh_checked ) {
211 return;
212 }
213
214 // Do we have a jetpack_scan and jetpack_rewind state set?
215 if ( get_transient( 'jetpack_scan_state' ) && get_transient( 'jetpack_rewind_state' ) ) {
216 return;
217 }
218
219 if ( false === wp_next_scheduled( self::SCHEDULE_ACTION_HOOK ) ) {
220 wp_schedule_single_event( time(), self::SCHEDULE_ACTION_HOOK );
221 }
222
223 $this->schedule_refresh_checked = true;
224 }
225 }
226