PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 9.3.3
Jetpack – WP Security, Backup, Speed, & Growth v9.3.3
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 / class.jetpack-admin.php
jetpack Last commit date
3rd-party 5 years ago _inc 5 years ago bin 5 years ago css 5 years ago extensions 5 years ago images 5 years ago json-endpoints 5 years ago modules 5 years ago sal 5 years ago src 6 years ago vendor 5 years ago views 6 years ago .svnignore 12 years ago CODE-OF-CONDUCT.md 9 years ago SECURITY.md 5 years ago changelog.txt 5 years ago class-jetpack-wizard-banner.php 6 years ago class.frame-nonce-preview.php 6 years ago class.jetpack-admin.php 5 years ago class.jetpack-affiliate.php 6 years ago class.jetpack-autoupdate.php 5 years ago class.jetpack-bbpress-json-api.compat.php 6 years ago class.jetpack-cli.php 5 years ago class.jetpack-client-server.php 5 years ago class.jetpack-connection-banner.php 5 years ago class.jetpack-data.php 6 years ago class.jetpack-debugger.php 7 years ago class.jetpack-error.php 5 years ago class.jetpack-gutenberg.php 5 years ago class.jetpack-heartbeat.php 5 years ago class.jetpack-idc.php 6 years ago class.jetpack-ixr-client.php 6 years ago class.jetpack-modules-list-table.php 5 years ago class.jetpack-network-sites-list-table.php 6 years ago class.jetpack-network.php 5 years ago class.jetpack-plan.php 5 years ago class.jetpack-post-images.php 5 years ago class.jetpack-twitter-cards.php 5 years ago class.jetpack-user-agent.php 5 years ago class.jetpack-xmlrpc-server.php 6 years ago class.jetpack.php 5 years ago class.json-api-endpoints.php 5 years ago class.json-api.php 5 years ago class.photon.php 5 years ago composer.json 5 years ago functions.compat.php 5 years ago functions.cookies.php 6 years ago functions.gallery.php 6 years ago functions.global.php 5 years ago functions.opengraph.php 5 years ago functions.photon.php 5 years ago jest.config.js 5 years ago jetpack.php 5 years ago json-api-config.php 10 years ago json-endpoints.php 7 years ago load-jetpack.php 5 years ago locales.php 7 years ago readme.txt 5 years ago require-lib.php 6 years ago uninstall.php 6 years ago wpml-config.xml 10 years ago
class.jetpack-admin.php
334 lines
1 <?php
2
3 use Automattic\Jetpack\Status;
4 use Automattic\Jetpack\Assets\Logo as Jetpack_Logo;
5
6 // Build the Jetpack admin menu as a whole
7 class Jetpack_Admin {
8
9 /**
10 * @var Jetpack_Admin
11 **/
12 private static $instance = null;
13
14 static function init() {
15 if ( isset( $_GET['page'] ) && $_GET['page'] === 'jetpack' ) {
16 add_filter( 'nocache_headers', array( 'Jetpack_Admin', 'add_no_store_header' ), 100 );
17 }
18
19 if ( is_null( self::$instance ) ) {
20 self::$instance = new Jetpack_Admin();
21 }
22 return self::$instance;
23 }
24
25 static function add_no_store_header( $headers ) {
26 $headers['Cache-Control'] .= ', no-store';
27 return $headers;
28 }
29
30 private function __construct() {
31 jetpack_require_lib( 'admin-pages/class.jetpack-react-page' );
32 $this->jetpack_react = new Jetpack_React_Page();
33
34 jetpack_require_lib( 'admin-pages/class.jetpack-settings-page' );
35 $this->fallback_page = new Jetpack_Settings_Page();
36
37 jetpack_require_lib( 'admin-pages/class-jetpack-about-page' );
38 $this->jetpack_about = new Jetpack_About_Page();
39
40 add_action( 'admin_menu', array( $this->jetpack_react, 'add_actions' ), 998 );
41 add_action( 'admin_menu', array( $this->jetpack_react, 'add_actions' ), 998 );
42 add_action( 'jetpack_admin_menu', array( $this->jetpack_react, 'jetpack_add_dashboard_sub_nav_item' ) );
43 add_action( 'jetpack_admin_menu', array( $this->jetpack_react, 'jetpack_add_set_up_sub_nav_item' ) );
44 add_action( 'jetpack_admin_menu', array( $this->jetpack_react, 'jetpack_add_settings_sub_nav_item' ) );
45 add_action( 'jetpack_admin_menu', array( $this, 'admin_menu_debugger' ) );
46 add_action( 'jetpack_admin_menu', array( $this->fallback_page, 'add_actions' ) );
47 add_action( 'jetpack_admin_menu', array( $this->jetpack_about, 'add_actions' ) );
48
49 // Add redirect to current page for activation/deactivation of modules
50 add_action( 'jetpack_pre_activate_module', array( $this, 'fix_redirect' ), 10, 2 );
51 add_action( 'jetpack_pre_deactivate_module', array( $this, 'fix_redirect' ) );
52
53 // Add module bulk actions handler
54 add_action( 'jetpack_unrecognized_action', array( $this, 'handle_unrecognized_action' ) );
55
56 if ( class_exists( 'Akismet_Admin' ) ) {
57 // If the site has Jetpack Anti-Spam, change the Akismet menu label accordingly.
58 $site_products = Jetpack_Plan::get_products();
59 $anti_spam_products = array( 'jetpack_anti_spam_monthly', 'jetpack_anti_spam' );
60 if ( ! empty( array_intersect( $anti_spam_products, array_column( $site_products, 'product_slug' ) ) ) ) {
61 // Prevent Akismet from adding a menu item.
62 add_action(
63 'admin_menu',
64 function () {
65 remove_action( 'admin_menu', array( 'Akismet_Admin', 'admin_menu' ), 5 );
66 },
67 4
68 );
69
70 // Add an Anti-spam menu item for Jetpack.
71 add_action(
72 'jetpack_admin_menu',
73 function () {
74 add_submenu_page( 'jetpack', __( 'Anti-Spam', 'jetpack' ), __( 'Anti-Spam', 'jetpack' ), 'manage_options', 'akismet-key-config', array( 'Akismet_Admin', 'display_page' ) );
75 }
76 );
77 add_action( 'admin_enqueue_scripts', array( $this, 'akismet_logo_replacement_styles' ) );
78 }
79 }
80 }
81
82 /**
83 * Generate styles to replace Akismet logo for the Jetpack logo. It's a workaround until we create a proper settings page for
84 * Jetpack Anti-Spam. Without this, we would have to change the logo from Akismet codebase and we want to avoid that.
85 */
86 public function akismet_logo_replacement_styles() {
87 $logo = new Jetpack_Logo();
88 $logo_base64 = base64_encode( $logo->get_jp_emblem_larger() );
89 $logo_base64_url = "data:image/svg+xml;base64,{$logo_base64}";
90 $style = ".akismet-masthead__logo-container { background: url({$logo_base64_url}) no-repeat .25rem; height: 1.8125rem; } .akismet-masthead__logo { display: none; }";
91 wp_add_inline_style( 'admin-bar', $style );
92 }
93
94 static function sort_requires_connection_last( $module1, $module2 ) {
95 if ( $module1['requires_connection'] == $module2['requires_connection'] ) {
96 return 0;
97 } elseif ( $module1['requires_connection'] ) {
98 return 1;
99 } elseif ( $module2['requires_connection'] ) {
100 return -1;
101 }
102
103 return 0;
104 }
105
106 // Produce JS understandable objects of modules containing information for
107 // presentation like description, name, configuration url, etc.
108 function get_modules() {
109 include_once JETPACK__PLUGIN_DIR . 'modules/module-info.php';
110 $available_modules = Jetpack::get_available_modules();
111 $active_modules = Jetpack::get_active_modules();
112 $modules = array();
113 $jetpack_active = Jetpack::is_active() || ( new Status() )->is_offline_mode();
114 $overrides = Jetpack_Modules_Overrides::instance();
115 foreach ( $available_modules as $module ) {
116 if ( $module_array = Jetpack::get_module( $module ) ) {
117 /**
118 * Filters each module's short description.
119 *
120 * @since 3.0.0
121 *
122 * @param string $module_array['description'] Module description.
123 * @param string $module Module slug.
124 */
125 $short_desc = apply_filters( 'jetpack_short_module_description', $module_array['description'], $module );
126 // Fix: correct multibyte strings truncate with checking for mbstring extension
127 $short_desc_trunc = ( function_exists( 'mb_strlen' ) )
128 ? ( ( mb_strlen( $short_desc ) > 143 )
129 ? mb_substr( $short_desc, 0, 140 ) . '...'
130 : $short_desc )
131 : ( ( strlen( $short_desc ) > 143 )
132 ? substr( $short_desc, 0, 140 ) . '...'
133 : $short_desc );
134
135 $module_array['module'] = $module;
136 $module_array['activated'] = ( $jetpack_active ? in_array( $module, $active_modules ) : false );
137 $module_array['deactivate_nonce'] = wp_create_nonce( 'jetpack_deactivate-' . $module );
138 $module_array['activate_nonce'] = wp_create_nonce( 'jetpack_activate-' . $module );
139 $module_array['available'] = self::is_module_available( $module_array );
140 $module_array['short_description'] = $short_desc_trunc;
141 $module_array['configure_url'] = Jetpack::module_configuration_url( $module );
142 $module_array['override'] = $overrides->get_module_override( $module );
143
144 ob_start();
145 /**
146 * Allow the display of a "Learn More" button.
147 * The dynamic part of the action, $module, is the module slug.
148 *
149 * @since 3.0.0
150 */
151 do_action( 'jetpack_learn_more_button_' . $module );
152 $module_array['learn_more_button'] = ob_get_clean();
153
154 ob_start();
155 /**
156 * Allow the display of information text when Jetpack is connected to WordPress.com.
157 * The dynamic part of the action, $module, is the module slug.
158 *
159 * @since 3.0.0
160 */
161 do_action( 'jetpack_module_more_info_' . $module );
162
163 /**
164 * Filter the long description of a module.
165 *
166 * @since 3.5.0
167 *
168 * @param string ob_get_clean() The module long description.
169 * @param string $module The module name.
170 */
171 $module_array['long_description'] = apply_filters( 'jetpack_long_module_description', ob_get_clean(), $module );
172
173 ob_start();
174 /**
175 * Filter the search terms for a module
176 *
177 * Search terms are typically added to the module headers, under "Additional Search Queries".
178 *
179 * Use syntax:
180 * function jetpack_$module_search_terms( $terms ) {
181 * $terms = _x( 'term 1, term 2', 'search terms', 'jetpack' );
182 * return $terms;
183 * }
184 * add_filter( 'jetpack_search_terms_$module', 'jetpack_$module_search_terms' );
185 *
186 * @since 3.5.0
187 *
188 * @param string The search terms (comma separated).
189 */
190 echo apply_filters( 'jetpack_search_terms_' . $module, $module_array['additional_search_queries'] );
191 $module_array['search_terms'] = ob_get_clean();
192
193 $module_array['configurable'] = false;
194 if (
195 current_user_can( 'manage_options' ) &&
196 /**
197 * Allow the display of a configuration link in the Jetpack Settings screen.
198 *
199 * @since 3.0.0
200 *
201 * @param string $module Module name.
202 * @param bool false Should the Configure module link be displayed? Default to false.
203 */
204 apply_filters( 'jetpack_module_configurable_' . $module, false )
205 ) {
206 $module_array['configurable'] = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $module_array['configure_url'] ), __( 'Configure', 'jetpack' ) );
207 }
208
209 $modules[ $module ] = $module_array;
210 }
211 }
212
213 uasort( $modules, array( 'Jetpack', 'sort_modules' ) );
214
215 if ( ! Jetpack::is_active() ) {
216 uasort( $modules, array( __CLASS__, 'sort_requires_connection_last' ) );
217 }
218
219 return $modules;
220 }
221
222 static function is_module_available( $module ) {
223 if ( ! is_array( $module ) || empty( $module ) ) {
224 return false;
225 }
226
227 /**
228 * We never want to show VaultPress as activatable through Jetpack.
229 */
230 if ( 'vaultpress' === $module['module'] ) {
231 return false;
232 }
233
234 /*
235 * WooCommerce Analytics should only be available
236 * when running WooCommerce 3+
237 */
238 if (
239 'woocommerce-analytics' === $module['module']
240 && (
241 ! class_exists( 'WooCommerce' )
242 || version_compare( WC_VERSION, '3.0', '<' )
243 )
244 ) {
245 return false;
246 }
247
248 if ( ( new Status() )->is_offline_mode() ) {
249 return ! ( $module['requires_connection'] );
250 } else {
251 if ( ! Jetpack::is_active() ) {
252 return false;
253 }
254
255 return Jetpack_Plan::supports( $module['module'] );
256 }
257 }
258
259 function handle_unrecognized_action( $action ) {
260 switch ( $action ) {
261 case 'bulk-activate':
262 if ( ! current_user_can( 'jetpack_activate_modules' ) ) {
263 break;
264 }
265
266 $modules = (array) $_GET['modules'];
267 $modules = array_map( 'sanitize_key', $modules );
268 check_admin_referer( 'bulk-jetpack_page_jetpack_modules' );
269 foreach ( $modules as $module ) {
270 Jetpack::log( 'activate', $module );
271 Jetpack::activate_module( $module, false );
272 }
273 // The following two lines will rarely happen, as Jetpack::activate_module normally exits at the end.
274 wp_safe_redirect( wp_get_referer() );
275 exit;
276 case 'bulk-deactivate':
277 if ( ! current_user_can( 'jetpack_deactivate_modules' ) ) {
278 break;
279 }
280
281 $modules = (array) $_GET['modules'];
282 $modules = array_map( 'sanitize_key', $modules );
283 check_admin_referer( 'bulk-jetpack_page_jetpack_modules' );
284 foreach ( $modules as $module ) {
285 Jetpack::log( 'deactivate', $module );
286 Jetpack::deactivate_module( $module );
287 Jetpack::state( 'message', 'module_deactivated' );
288 }
289 Jetpack::state( 'module', $modules );
290 wp_safe_redirect( wp_get_referer() );
291 exit;
292 default:
293 return;
294 }
295 }
296
297 function fix_redirect( $module, $redirect = true ) {
298 if ( ! $redirect ) {
299 return;
300 }
301 if ( wp_get_referer() ) {
302 add_filter( 'wp_redirect', 'wp_get_referer' );
303 }
304 }
305
306 function admin_menu_debugger() {
307 jetpack_require_lib( 'debugger' );
308 Jetpack_Debugger::disconnect_and_redirect();
309 $debugger_hook = add_submenu_page(
310 null,
311 __( 'Debugging Center', 'jetpack' ),
312 '',
313 'manage_options',
314 'jetpack-debugger',
315 array( $this, 'wrap_debugger_page' )
316 );
317 add_action( "admin_head-$debugger_hook", array( 'Jetpack_Debugger', 'jetpack_debug_admin_head' ) );
318 }
319
320 function wrap_debugger_page() {
321 nocache_headers();
322 if ( ! current_user_can( 'manage_options' ) ) {
323 die( '-1' );
324 }
325 Jetpack_Admin_Page::wrap_ui( array( $this, 'debugger_page' ) );
326 }
327
328 function debugger_page() {
329 jetpack_require_lib( 'debugger' );
330 Jetpack_Debugger::jetpack_debug_display_handler();
331 }
332 }
333 Jetpack_Admin::init();
334