/** * On completion of an automatic update, let's store the results. * * @param $results - Sent by WP_Automatic_Updater after it completes an autoupdate action. Results may be empty. */ public function automatic_updates_complete($results) { if (empty($this->expected)) { return; } $this->results = empty($results) ? self::get_possible_failures() : $results; add_action('shutdown', array($this, 'bump_stats')); Jetpack::init(); $items_to_log = array('plugin', 'theme'); foreach ($items_to_log as $items) { $this->log_items($items); } Jetpack::log('autoupdates', $this->get_log()); }
function jetpack_my_jetpack_change_user() { if (!isset($_POST['_my_jetpack_nonce']) || !wp_verify_nonce($_POST['_my_jetpack_nonce'], 'jetpack_change_primary_user')) { wp_die(__('Failed permissions, please try again.', 'jetpack')); exit; } if (isset($_POST['jetpack-new-master'])) { $old_master_user = Jetpack_Options::get_option('master_user'); $new_master_user = $_POST['jetpack-new-master']; $user_token = Jetpack_Data::get_access_token($new_master_user); $is_user_connected = $user_token && !is_wp_error($user_token); if (current_user_can('manage_options') && $is_user_connected) { Jetpack::log('switch_master_user', array('old_master' => $old_master_user, 'new_master' => $new_master_user)); Jetpack_Options::update_option('master_user', $new_master_user); Jetpack::state('message', 'switch_master'); //My Jetpack primary user successfully changed, send to MC Stats Jetpack::init()->stat('admin', 'change-primary-successful'); Jetpack::init()->do_stats('server_side'); // Change the blog owner dotcom side $this->wpcom_switch_blog_owner($new_master_user); } } }
/** * Handles the page load events for the Jetpack admin page */ function admin_page_load() { $error = false; // Make sure we have the right body class to hook stylings for subpages off of. add_filter('admin_body_class', array(__CLASS__, 'add_jetpack_pagestyles')); if (!empty($_GET['jetpack_restate'])) { // Should only be used in intermediate redirects to preserve state across redirects Jetpack::restate(); } if (isset($_GET['connect_url_redirect'])) { // User clicked in the iframe to link their accounts if (!Jetpack::is_user_connected()) { $connect_url = $this->build_connect_url(true); if (isset($_GET['notes_iframe'])) { $connect_url .= '¬es_iframe'; } wp_redirect($connect_url); exit; } else { Jetpack::state('message', 'already_authorized'); wp_safe_redirect(Jetpack::admin_url()); exit; } } if (isset($_GET['action'])) { switch ($_GET['action']) { case 'authorize': if (Jetpack::is_active() && Jetpack::is_user_connected()) { Jetpack::state('message', 'already_authorized'); wp_safe_redirect(Jetpack::admin_url()); exit; } Jetpack::log('authorize'); $client_server = new Jetpack_Client_Server(); $client_server->authorize(); exit; case 'register': check_admin_referer('jetpack-register'); Jetpack::log('register'); Jetpack::maybe_set_version_option(); $registered = Jetpack::try_registration(); if (is_wp_error($registered)) { $error = $registered->get_error_code(); Jetpack::state('error_description', $registered->get_error_message()); break; } wp_redirect($this->build_connect_url(true)); exit; case 'activate': if (!current_user_can('jetpack_activate_modules')) { $error = 'cheatin'; break; } $module = stripslashes($_GET['module']); check_admin_referer("jetpack_activate-{$module}"); Jetpack::log('activate', $module); Jetpack::activate_module($module); // The following two lines will rarely happen, as Jetpack::activate_module normally exits at the end. wp_safe_redirect(Jetpack::admin_url('page=jetpack')); exit; case 'activate_default_modules': check_admin_referer('activate_default_modules'); Jetpack::log('activate_default_modules'); Jetpack::restate(); $min_version = isset($_GET['min_version']) ? $_GET['min_version'] : false; $max_version = isset($_GET['max_version']) ? $_GET['max_version'] : false; $other_modules = isset($_GET['other_modules']) && is_array($_GET['other_modules']) ? $_GET['other_modules'] : array(); Jetpack::activate_default_modules($min_version, $max_version, $other_modules); wp_safe_redirect(Jetpack::admin_url('page=jetpack')); exit; case 'disconnect': if (!current_user_can('jetpack_disconnect')) { $error = 'cheatin'; break; } check_admin_referer('jetpack-disconnect'); Jetpack::log('disconnect'); Jetpack::disconnect(); wp_safe_redirect(Jetpack::admin_url()); exit; case 'reconnect': if (!current_user_can('jetpack_reconnect')) { $error = 'cheatin'; break; } check_admin_referer('jetpack-reconnect'); Jetpack::log('reconnect'); $this->disconnect(); wp_redirect($this->build_connect_url(true)); exit; case 'deactivate': if (!current_user_can('jetpack_deactivate_modules')) { $error = 'cheatin'; break; } $modules = stripslashes($_GET['module']); check_admin_referer("jetpack_deactivate-{$modules}"); foreach (explode(',', $modules) as $module) { Jetpack::log('deactivate', $module); Jetpack::deactivate_module($module); Jetpack::state('message', 'module_deactivated'); } Jetpack::state('module', $modules); wp_safe_redirect(Jetpack::admin_url('page=jetpack')); exit; case 'unlink': check_admin_referer('jetpack-unlink'); Jetpack::log('unlink'); $this->unlink_user(); Jetpack::state('message', 'unlinked'); wp_safe_redirect(Jetpack::admin_url()); exit; default: do_action('jetpack_unrecognized_action', sanitize_key($_GET['action'])); } } if (!($error = $error ? $error : Jetpack::state('error'))) { $this->activate_new_modules(); } switch ($error) { case 'cheatin': $this->error = __('Cheatin’ uh?', 'jetpack'); break; case 'access_denied': $this->error = __('You need to authorize the Jetpack connection between your site and WordPress.com to enable the awesome features.', 'jetpack'); break; case 'wrong_state': $this->error = __('Don’t cross the streams! You need to stay logged in to your WordPress blog while you authorize Jetpack.', 'jetpack'); break; case 'invalid_client': // @todo re-register instead of deactivate/reactivate $this->error = __('Return to sender. Whoops! It looks like you got the wrong Jetpack in the mail; deactivate then reactivate the Jetpack plugin to get a new one.', 'jetpack'); break; case 'invalid_grant': $this->error = __('Wrong size. Hm… it seems your Jetpack doesn’t quite fit. Have you lost weight? Click “Connect to WordPress.com” again to get your Jetpack adjusted.', 'jetpack'); break; case 'site_inaccessible': case 'site_requires_authorization': $this->error = sprintf(__('Your website needs to be publicly accessible to use Jetpack: %s', 'jetpack'), "<code>{$error}</code>"); break; case 'module_activation_failed': $module = Jetpack::state('module'); if (!empty($module) && ($mod = Jetpack::get_module($module))) { $this->error = sprintf(__('%s could not be activated because it triggered a <strong>fatal error</strong>. Perhaps there is a conflict with another plugin you have installed?', 'jetpack'), $mod['name']); if (isset($this->plugins_to_deactivate[$module])) { $this->error .= ' ' . sprintf(__('Do you still have the %s plugin installed?', 'jetpack'), $this->plugins_to_deactivate[$module][1]); } } else { $this->error = __('Module could not be activated because it triggered a <strong>fatal error</strong>. Perhaps there is a conflict with another plugin you have installed?', 'jetpack'); } if ($php_errors = Jetpack::state('php_errors')) { $this->error .= "<br />\n"; $this->error .= $php_errors; } break; case 'master_user_required': $module = Jetpack::state('module'); $module_name = ''; if (!empty($module) && ($mod = Jetpack::get_module($module))) { $module_name = $mod['name']; } $master_user = Jetpack_Options::get_option('master_user'); $master_userdata = get_userdata($master_user); if ($master_userdata) { if (!in_array($module, Jetpack::get_active_modules())) { $this->error = sprintf(__('%s was not activated.', 'jetpack'), $module_name); } else { $this->error = sprintf(__('%s was not deactivated.', 'jetpack'), $module_name); } $this->error .= ' ' . sprintf(__('This module can only be altered by %s, the user who initiated the Jetpack connection on this site.', 'jetpack'), esc_html($master_userdata->display_name)); } else { $this->error = sprintf(__('Only the user who initiated the Jetpack connection on this site can toggle %s, but that user no longer exists. This should not happen.', 'jetpack'), $module_name); } break; case 'not_public': $this->error = __('<strong>Your Jetpack has a glitch.</strong> Connecting this site with WordPress.com is not possible. This usually means your site is not publicly accessible (localhost).', 'jetpack'); break; case 'wpcom_408': case 'wpcom_5??': case 'wpcom_bad_response': case 'wpcom_outage': $this->error = __('WordPress.com is currently having problems and is unable to fuel up your Jetpack. Please try again later.', 'jetpack'); break; case 'register_http_request_failed': case 'token_http_request_failed': $this->error = sprintf(__('Jetpack could not contact WordPress.com: %s. This usually means something is incorrectly configured on your web host.', 'jetpack'), "<code>{$error}</code>"); break; default: if (empty($error)) { break; } $error = trim(substr(strip_tags($error), 0, 20)); // no break: fall through // no break: fall through case 'no_role': case 'no_cap': case 'no_code': case 'no_state': case 'invalid_state': case 'invalid_request': case 'invalid_scope': case 'unsupported_response_type': case 'invalid_token': case 'no_token': case 'missing_secrets': case 'home_missing': case 'siteurl_missing': case 'gmt_offset_missing': case 'site_name_missing': case 'secret_1_missing': case 'secret_2_missing': case 'site_lang_missing': case 'home_malformed': case 'siteurl_malformed': case 'gmt_offset_malformed': case 'timezone_string_malformed': case 'site_name_malformed': case 'secret_1_malformed': case 'secret_2_malformed': case 'site_lang_malformed': case 'secrets_mismatch': case 'verify_secret_1_missing': case 'verify_secret_1_malformed': case 'verify_secrets_missing': case 'verify_secrets_mismatch': $error = esc_html($error); $this->error = sprintf(__('<strong>Your Jetpack has a glitch.</strong> Something went wrong that’s never supposed to happen. Guess you’re just lucky: %s', 'jetpack'), "<code>{$error}</code>"); if (!Jetpack::is_active()) { $this->error .= '<br />'; $this->error .= sprintf(__('Try connecting again.', 'jetpack')); } break; } $message_code = Jetpack::state('message'); $active_state = Jetpack::state('activated_modules'); if (!empty($active_state)) { $available = Jetpack::get_available_modules(); $active_state = explode(',', $active_state); $active_state = array_intersect($active_state, $available); if (count($active_state)) { foreach ($active_state as $mod) { $this->stat('module-activated', $mod); } } else { $active_state = false; } } switch ($message_code) { case 'modules_activated': $this->message = sprintf(__('Welcome to <strong>Jetpack %s</strong>!', 'jetpack'), JETPACK__VERSION); if ($active_state) { $titles = array(); foreach ($active_state as $mod) { if ($mod_headers = Jetpack::get_module($mod)) { $titles[] = '<strong>' . preg_replace('/\\s+(?![^<>]++>)/', ' ', $mod_headers['name']) . '</strong>'; } } if ($titles) { $this->message .= '<br /><br />' . wp_sprintf(__('The following new modules have been activated: %l.', 'jetpack'), $titles); } } if ($reactive_state = Jetpack::state('reactivated_modules')) { $titles = array(); foreach (explode(',', $reactive_state) as $mod) { if ($mod_headers = Jetpack::get_module($mod)) { $titles[] = '<strong>' . preg_replace('/\\s+(?![^<>]++>)/', ' ', $mod_headers['name']) . '</strong>'; } } if ($titles) { $this->message .= '<br /><br />' . wp_sprintf(__('The following modules have been updated: %l.', 'jetpack'), $titles); } } $this->message .= Jetpack::jetpack_comment_notice(); break; case 'module_activated': if ($module = Jetpack::get_module(Jetpack::state('module'))) { $this->message = sprintf(__('<strong>%s Activated!</strong> You can deactivate at any time by clicking the Deactivate link next to each module.', 'jetpack'), $module['name']); $this->stat('module-activated', Jetpack::state('module')); } break; case 'module_deactivated': $modules = Jetpack::state('module'); if (!$modules) { break; } $module_names = array(); foreach (explode(',', $modules) as $module_slug) { $module = Jetpack::get_module($module_slug); if ($module) { $module_names[] = $module['name']; } $this->stat('module-deactivated', $module_slug); } if (!$module_names) { break; } $this->message = wp_sprintf(_nx('<strong>%l Deactivated!</strong> You can activate it again at any time using the activate link next to each module.', '<strong>%l Deactivated!</strong> You can activate them again at any time using the activate links next to each module.', count($module_names), '%l = list of Jetpack module/feature names', 'jetpack'), $module_names); break; case 'module_configured': $this->message = __('<strong>Module settings were saved.</strong> ', 'jetpack'); break; case 'already_authorized': $this->message = __('<strong>Your Jetpack is already connected.</strong> ', 'jetpack'); break; case 'authorized': $this->message = __('<strong>You’re fueled up and ready to go.</strong> ', 'jetpack'); $this->message .= "<br />\n"; $this->message .= sprintf(__('Jetpack is now active. Browse through each Jetpack feature below. Visit the <a href="%s">settings page</a> to activate/deactivate features.', 'jetpack'), admin_url('admin.php?page=jetpack_modules')); $this->message .= Jetpack::jetpack_comment_notice(); break; case 'linked': $this->message = __('<strong>You’re fueled up and ready to go.</strong> ', 'jetpack'); $this->message .= Jetpack::jetpack_comment_notice(); break; case 'unlinked': $user = wp_get_current_user(); $this->message = sprintf(__('<strong>You have unlinked your account (%s) from WordPress.com.</strong>', 'jetpack'), $user->user_login); break; } $deactivated_plugins = Jetpack::state('deactivated_plugins'); if (!empty($deactivated_plugins)) { $deactivated_plugins = explode(',', $deactivated_plugins); $deactivated_titles = array(); foreach ($deactivated_plugins as $deactivated_plugin) { if (!isset($this->plugins_to_deactivate[$deactivated_plugin])) { continue; } $deactivated_titles[] = '<strong>' . str_replace(' ', ' ', $this->plugins_to_deactivate[$deactivated_plugin][1]) . '</strong>'; } if ($deactivated_titles) { if ($this->message) { $this->message .= "<br /><br />\n"; } $this->message .= wp_sprintf(_n('Jetpack contains the most recent version of the old %l plugin.', 'Jetpack contains the most recent versions of the old %l plugins.', count($deactivated_titles), 'jetpack'), $deactivated_titles); $this->message .= "<br />\n"; $this->message .= _n('The old version has been deactivated and can be removed from your site.', 'The old versions have been deactivated and can be removed from your site.', count($deactivated_titles), 'jetpack'); } } $this->privacy_checks = Jetpack::state('privacy_checks'); if ($this->message || $this->error || $this->privacy_checks) { add_action('jetpack_notices', array($this, 'admin_notices')); } if (isset($_GET['configure']) && Jetpack::is_module($_GET['configure']) && current_user_can('manage_options')) { do_action('jetpack_module_configuration_load_' . $_GET['configure']); } add_filter('jetpack_short_module_description', 'wptexturize'); }
/** * Manage Jetpack Modules * * ## OPTIONS * * list : View all available modules, and their status. * activate all : Activate all modules * deactivate all: Deactivate all modules * * activate <module_slug> : Activate a module. * deactivate <module_slug> : Deactivate a module. * toggle <module_slug> : Toggle a module on or off. * * ## EXAMPLES * * wp jetpack module list * wp jetpack module activate stats * wp jetpack module deactivate stats * wp jetpack module toggle stats * * wp jetpack module activate all * wp jetpack module deactivate all * * @synopsis <list|activate|deactivate|toggle> [<module_name>] */ public function module($args, $assoc_args) { $action = isset($args[0]) ? $args[0] : 'list'; if (!in_array($action, array('list', 'activate', 'deactivate', 'toggle'))) { WP_CLI::error(sprintf(__('%s is not a valid command.', 'jetpack'), $action)); } if (in_array($action, array('activate', 'deactivate', 'toggle'))) { if (isset($args[1])) { $module_slug = $args[1]; if ('all' !== $module_slug && !Jetpack::is_module($module_slug)) { WP_CLI::error(sprintf(__('%s is not a valid module.', 'jetpack'), $module_slug)); } if ('toggle' == $action) { $action = Jetpack::is_module_active($module_slug) ? 'deactivate' : 'activate'; } // Bulk actions if ('all' == $args[1]) { $action = 'deactivate' == $action ? 'deactivate_all' : 'activate_all'; } // VaultPress needs to be handled elsewhere. if (in_array($action, array('activate', 'deactivate', 'toggle')) && 'vaultpress' == $args[1]) { WP_CLI::error(sprintf(_x('Please visit %s to configure your VaultPress subscription.', '%s is a website', 'jetpack'), esc_url('https://vaultpress.com/jetpack/'))); } } else { WP_CLI::line(__('Please specify a valid module.', 'jetpack')); $action = 'list'; } } switch ($action) { case 'list': WP_CLI::line(__('Available Modules:', 'jetpack')); $modules = Jetpack::get_available_modules(); sort($modules); foreach ($modules as $module_slug) { if ('vaultpress' == $module_slug) { continue; } $active = Jetpack::is_module_active($module_slug) ? __('Active', 'jetpack') : __('Inactive', 'jetpack'); WP_CLI::line("\t" . str_pad($module_slug, 24) . $active); } break; case 'activate': $module = Jetpack::get_module($module_slug); Jetpack::log('activate', $module_slug); Jetpack::activate_module($module_slug, false, false); WP_CLI::success(sprintf(__('%s has been activated.', 'jetpack'), $module['name'])); break; case 'activate_all': $modules = Jetpack::get_available_modules(); Jetpack::update_active_modules($modules); WP_CLI::success(__('All modules activated!', 'jetpack')); break; case 'deactivate': $module = Jetpack::get_module($module_slug); Jetpack::log('deactivate', $module_slug); Jetpack::deactivate_module($module_slug); WP_CLI::success(sprintf(__('%s has been deactivated.', 'jetpack'), $module['name'])); break; case 'deactivate_all': Jetpack::delete_active_modules(); WP_CLI::success(__('All modules deactivated!', 'jetpack')); break; case 'toggle': // Will never happen, should have been handled above and changed to activate or deactivate. break; } }
/** * Manage Jetpack Modules * * ## OPTIONS * * list: View all available modules, and their status. * * activate <module_slug>: Activate a module. * * deactivate <module_slug>: Deactivate a module. * * toggle <module_slug>: Toggle a module on or off. * * ## EXAMPLES * * wp jetpack module list * wp jetpack module activate stats * wp jetpack module deactivate stats * wp jetpack module toggle stats * * @synopsis [list|activate|deactivate|toggle [<module_name>]] */ public function module($args, $assoc_args) { $action = isset($args[0]) ? $args[0] : 'list'; if (!in_array($action, array('list', 'activate', 'deactivate', 'toggle'))) { WP_CLI::error(sprintf(__('%s is not a valid command.', 'jetpack'), $action)); } if (in_array($action, array('activate', 'deactivate', 'toggle'))) { if (isset($args[1])) { $module_slug = $args[1]; if (!Jetpack::is_module($module_slug)) { WP_CLI::error(sprintf(__('%s is not a valid module.', 'jetpack'), $module_slug)); } if ('toggle' == $action) { $action = Jetpack::is_module_active($module_slug) ? 'deactivate' : 'activate'; } } else { WP_CLI::line(__('Please specify a valid module.', 'jetpack')); $action = 'list'; } } switch ($action) { case 'list': WP_CLI::line(__('Available Modules:', 'jetpack')); $modules = Jetpack::get_available_modules(); sort($modules); foreach ($modules as $module_slug) { $active = Jetpack::is_module_active($module_slug) ? __('Active', 'jetpack') : __('Inactive', 'jetpack'); WP_CLI::line("\t" . str_pad($module_slug, 24) . $active); } break; case 'activate': $module = Jetpack::get_module($module_slug); Jetpack::log('activate', $module_slug); Jetpack::activate_module($module_slug, false); WP_CLI::success(sprintf(__('%s has been activated.', 'jetpack'), $module['name'])); break; case 'deactivate': $module = Jetpack::get_module($module_slug); Jetpack::log('deactivate', $module_slug); Jetpack::deactivate_module($module_slug); WP_CLI::success(sprintf(__('%s has been deactivated.', 'jetpack'), $module['name'])); break; case 'toggle': // Will never happen, should have been handled above and changed to activate or deactivate. break; } }
public static function jetpack_site_icon_available_in_core() { global $wp_version; $core_icon_available = function_exists('has_site_icon') && version_compare($wp_version, '4.3-beta') >= 0; if (!$core_icon_available) { return false; } // No need for Jetpack's site icon anymore if core's is already set if (has_site_icon()) { if (Jetpack::is_module_active('site-icon')) { Jetpack::log('deactivate', 'site-icon'); Jetpack::deactivate_module('site-icon'); } return true; } // Transfer Jetpack's site icon to use core. $site_icon_id = Jetpack::get_option('site_icon_id'); if ($site_icon_id) { // Update core's site icon update_option('site_icon', $site_icon_id); // Delete Jetpack's icon option. We still want the blavatar and attached data though. delete_option('site_icon_id'); } // No need for Jetpack's site icon anymore if (Jetpack::is_module_active('site-icon')) { Jetpack::log('deactivate', 'site-icon'); Jetpack::deactivate_module('site-icon'); } return true; }
static function deactivate_jetpack_modules() { check_ajax_referer(self::AJAX_NONCE, 'nonce'); // shamelessly copied from class.jetpack.php $modules = $_REQUEST['modules']; $modules = array_map('sanitize_key', $modules); // $modules_filtered = Jetpack::init()->filter_default_modules( $modules ); foreach ($modules as $module_slug) { Jetpack::log('deactivate', $module_slug); Jetpack::deactivate_module($module_slug); Jetpack::state('message', 'module_deactivated'); } wp_send_json_success($modules); }
/** * Handles the page load events for the Jetpack admin page */ function admin_page_load() { $error = false; // Make sure we have the right body class to hook stylings for subpages off of. add_filter('admin_body_class', array(__CLASS__, 'add_jetpack_pagestyles')); if (!empty($_GET['jetpack_restate'])) { // Should only be used in intermediate redirects to preserve state across redirects Jetpack::restate(); } if (isset($_GET['connect_url_redirect'])) { // User clicked in the iframe to link their accounts if (!Jetpack::is_user_connected()) { $connect_url = $this->build_connect_url(true, false, 'iframe'); if (isset($_GET['notes_iframe'])) { $connect_url .= '¬es_iframe'; } wp_redirect($connect_url); exit; } else { if (!isset($_GET['calypso_env'])) { Jetpack::state('message', 'already_authorized'); wp_safe_redirect(Jetpack::admin_url()); } else { $connect_url = $this->build_connect_url(true, false, 'iframe'); $connect_url .= '&already_authorized=true'; wp_redirect($connect_url); } } } if (isset($_GET['action'])) { switch ($_GET['action']) { case 'authorize': if (Jetpack::is_active() && Jetpack::is_user_connected()) { Jetpack::state('message', 'already_authorized'); wp_safe_redirect(Jetpack::admin_url()); exit; } Jetpack::log('authorize'); $client_server = new Jetpack_Client_Server(); $client_server->client_authorize(); exit; case 'register': if (!current_user_can('jetpack_connect')) { $error = 'cheatin'; break; } check_admin_referer('jetpack-register'); Jetpack::log('register'); Jetpack::maybe_set_version_option(); $registered = Jetpack::try_registration(); if (is_wp_error($registered)) { $error = $registered->get_error_code(); Jetpack::state('error', $error); Jetpack::state('error', $registered->get_error_message()); break; } $from = isset($_GET['from']) ? $_GET['from'] : false; wp_redirect($this->build_connect_url(true, false, $from)); exit; case 'activate': if (!current_user_can('jetpack_activate_modules')) { $error = 'cheatin'; break; } $module = stripslashes($_GET['module']); check_admin_referer("jetpack_activate-{$module}"); Jetpack::log('activate', $module); Jetpack::activate_module($module); // The following two lines will rarely happen, as Jetpack::activate_module normally exits at the end. wp_safe_redirect(Jetpack::admin_url('page=jetpack')); exit; case 'activate_default_modules': check_admin_referer('activate_default_modules'); Jetpack::log('activate_default_modules'); Jetpack::restate(); $min_version = isset($_GET['min_version']) ? $_GET['min_version'] : false; $max_version = isset($_GET['max_version']) ? $_GET['max_version'] : false; $other_modules = isset($_GET['other_modules']) && is_array($_GET['other_modules']) ? $_GET['other_modules'] : array(); Jetpack::activate_default_modules($min_version, $max_version, $other_modules); wp_safe_redirect(Jetpack::admin_url('page=jetpack')); exit; case 'disconnect': if (!current_user_can('jetpack_disconnect')) { $error = 'cheatin'; break; } check_admin_referer('jetpack-disconnect'); Jetpack::log('disconnect'); Jetpack::disconnect(); wp_safe_redirect(Jetpack::admin_url('disconnected=true')); exit; case 'reconnect': if (!current_user_can('jetpack_reconnect')) { $error = 'cheatin'; break; } check_admin_referer('jetpack-reconnect'); Jetpack::log('reconnect'); $this->disconnect(); wp_redirect($this->build_connect_url(true, false, 'reconnect')); exit; case 'deactivate': if (!current_user_can('jetpack_deactivate_modules')) { $error = 'cheatin'; break; } $modules = stripslashes($_GET['module']); check_admin_referer("jetpack_deactivate-{$modules}"); foreach (explode(',', $modules) as $module) { Jetpack::log('deactivate', $module); Jetpack::deactivate_module($module); Jetpack::state('message', 'module_deactivated'); } Jetpack::state('module', $modules); wp_safe_redirect(Jetpack::admin_url('page=jetpack')); exit; case 'unlink': $redirect = isset($_GET['redirect']) ? $_GET['redirect'] : ''; check_admin_referer('jetpack-unlink'); Jetpack::log('unlink'); $this->unlink_user(); Jetpack::state('message', 'unlinked'); if ('sub-unlink' == $redirect) { wp_safe_redirect(admin_url()); } else { wp_safe_redirect(Jetpack::admin_url(array('page' => $redirect))); } exit; default: /** * Fires when a Jetpack admin page is loaded with an unrecognized parameter. * * @since 2.6.0 * * @param string sanitize_key( $_GET['action'] ) Unrecognized URL parameter. */ do_action('jetpack_unrecognized_action', sanitize_key($_GET['action'])); } } if (!($error = $error ? $error : Jetpack::state('error'))) { self::activate_new_modules(true); } $message_code = Jetpack::state('message'); if (Jetpack::state('optin-manage')) { $activated_manage = $message_code; $message_code = 'jetpack-manage'; } switch ($message_code) { case 'jetpack-manage': $this->message = '<strong>' . sprintf(__('You are all set! Your site can now be managed from <a href="%s" target="_blank">wordpress.com/sites</a>.', 'jetpack'), 'https://wordpress.com/sites') . '</strong>'; if ($activated_manage) { $this->message .= '<br /><strong>' . __('Manage has been activated for you!', 'jetpack') . '</strong>'; } break; } $deactivated_plugins = Jetpack::state('deactivated_plugins'); if (!empty($deactivated_plugins)) { $deactivated_plugins = explode(',', $deactivated_plugins); $deactivated_titles = array(); foreach ($deactivated_plugins as $deactivated_plugin) { if (!isset($this->plugins_to_deactivate[$deactivated_plugin])) { continue; } $deactivated_titles[] = '<strong>' . str_replace(' ', ' ', $this->plugins_to_deactivate[$deactivated_plugin][1]) . '</strong>'; } if ($deactivated_titles) { if ($this->message) { $this->message .= "<br /><br />\n"; } $this->message .= wp_sprintf(_n('Jetpack contains the most recent version of the old %l plugin.', 'Jetpack contains the most recent versions of the old %l plugins.', count($deactivated_titles), 'jetpack'), $deactivated_titles); $this->message .= "<br />\n"; $this->message .= _n('The old version has been deactivated and can be removed from your site.', 'The old versions have been deactivated and can be removed from your site.', count($deactivated_titles), 'jetpack'); } } $this->privacy_checks = Jetpack::state('privacy_checks'); if ($this->message || $this->error || $this->privacy_checks || $this->can_display_jetpack_manage_notice()) { add_action('jetpack_notices', array($this, 'admin_notices')); } if (isset($_GET['configure']) && Jetpack::is_module($_GET['configure']) && current_user_can('manage_options')) { /** * Fires when a module configuration page is loaded. * The dynamic part of the hook is the configure parameter from the URL. * * @since 1.1.0 */ do_action('jetpack_module_configuration_load_' . $_GET['configure']); } add_filter('jetpack_short_module_description', 'wptexturize'); }
/** * Provides functionality for the Jetpack > Sites page. * Does not do the display! * * @since 2.9 */ public function jetpack_sites_list() { Jetpack::init(); if (isset($_GET['action'])) { switch ($_GET['action']) { case 'subsiteregister': /* * @todo check_admin_referer( 'jetpack-subsite-register' ); */ Jetpack::log('subsiteregister'); // If !$_GET['site_id'] stop registration and error if (!isset($_GET['site_id']) || empty($_GET['site_id'])) { // Log error to state cookie for display later /** * @todo Make state messages show on Jetpack NA pages **/ Jetpack::state('missing_site_id', 'Site ID must be provided to register a sub-site'); break; } // Send data to register endpoint and retrieve shadow blog details $result = $this->do_subsiteregister(); $url = $this->get_url('network_admin_page'); if (is_wp_error($result)) { $url = add_query_arg('action', 'connection_failed', $url); } else { $url = add_query_arg('action', 'connected', $url); } wp_safe_redirect($url); break; case 'subsitedisconnect': Jetpack::log('subsitedisconnect'); if (!isset($_GET['site_id']) || empty($_GET['site_id'])) { Jetpack::state('missing_site_id', 'Site ID must be provided to disconnect a sub-site'); break; } $this->do_subsitedisconnect(); break; case 'connected': case 'connection_failed': add_action('jetpack_notices', array($this, 'show_jetpack_notice')); break; } } }
function handle_unrecognized_action($action) { switch ($action) { case 'bulk-activate': if (!current_user_can('jetpack_activate_modules')) { break; } $modules = (array) $_GET['modules']; $modules = array_map('sanitize_key', $modules); check_admin_referer('bulk-jetpack_page_jetpack_modules'); foreach ($modules as $module) { Jetpack::log('activate', $module); Jetpack::activate_module($module, false); } // The following two lines will rarely happen, as Jetpack::activate_module normally exits at the end. wp_safe_redirect(wp_get_referer()); exit; case 'bulk-deactivate': if (!current_user_can('jetpack_deactivate_modules')) { break; } $modules = (array) $_GET['modules']; $modules = array_map('sanitize_key', $modules); check_admin_referer('bulk-jetpack_page_jetpack_modules'); foreach ($modules as $module) { Jetpack::log('deactivate', $module); Jetpack::deactivate_module($module); Jetpack::state('message', 'module_deactivated'); } Jetpack::state('module', $modules); wp_safe_redirect(wp_get_referer()); exit; default: return; } }
public static function do_migration() { Jetpack_Options::update_option('custom_css_4.7_migration', true); Jetpack::log('custom_css_4.7_migration', 'start'); if (!post_type_exists('safecss')) { self::register_legacy_post_type(); } /** This filter is documented in modules/custom-css/custom-css.php */ $preprocessors = apply_filters('jetpack_custom_css_preprocessors', array()); $core_css_post = wp_get_custom_css_post(); $jetpack_css_post = self::get_post(); $revisions = self::get_all_revisions(); // Migrate the settings from revision meta to theme mod. $options = self::get_options($jetpack_css_post->ID); set_theme_mod('jetpack_custom_css', $options); if (empty($revisions) || !is_array($revisions)) { if ($jetpack_css_post instanceof WP_Post) { // Feed in the raw, if the current setting is Sass/LESS, it'll filter it inside. wp_update_custom_css_post($jetpack_css_post->post_content); return 1; } return null; } $revisions = array_reverse($revisions); $themes = Jetpack_Custom_CSS_Enhancements::get_themes(); $migrated = array(); foreach ($revisions as $post_id => $post) { // Jetpack had stored the theme Name, not the stylesheet directory, for ... reasons. // Get the stylesheet. If null, the theme is no longer available. Skip. $stylesheet = isset($themes[$post->post_excerpt]) ? $themes[$post->post_excerpt] : null; if (empty($stylesheet)) { continue; } $migrated[] = $post->ID; $preprocessor = get_post_meta($post->ID, 'custom_css_preprocessor', true); $css = $post->post_content; $pre = ''; // Do a revision by revision parsing. if ($preprocessor && isset($preprocessors[$preprocessor])) { $pre = $css; $css = call_user_func($preprocessors[$preprocessor]['callback'], $pre); } // Do we need to remove any filters here for users without `unfiltered_html` ? wp_update_custom_css_post($css, array('stylesheet' => $stylesheet, 'preprocessed' => $pre)); } // If we've migrated some CSS for the current theme and there was already something there in the Core dataset ... if ($core_css_post && $jetpack_css_post) { $preprocessor = $options['preprocessor']; $css = $core_css_post->post_content; $pre = $core_css_post->post_content_filtered; if ($preprocessor) { if ($pre) { $pre .= "\r\n\r\n/*\r\n\t" . esc_js(__('CSS Migrated from Jetpack:', 'jetpack')) . "\r\n*/\r\n\r\n"; } $pre .= $jetpack_css_post->post_content; $css .= "\r\n\r\n/*\r\n\t" . esc_js(__('CSS Migrated from Jetpack:', 'jetpack')) . "\r\n*/\r\n\r\n"; $css .= call_user_func($preprocessors[$preprocessor]['callback'], $jetpack_css_post->post_content); } else { $css .= "\r\n\r\n/*\r\n\t" . esc_js(__('CSS Migrated from Jetpack:', 'jetpack')) . "\r\n*/\r\n\r\n"; $css .= $jetpack_css_post->post_content; } wp_update_custom_css_post($css, array('preprocessed' => $pre)); } Jetpack::log('custom_css_4.7_migration', sizeof($migrated) . 'revisions migrated'); return sizeof($migrated); }
/** * Activates a series of valid Jetpack modules and initializes some options. * * @since 4.3.0 * * @param WP_REST_Request $data { * Array of parameters received by request. * } * * @return bool|WP_Error True if Jumpstart succeeded. Otherwise, a WP_Error instance with the corresponding error. */ public static function jumpstart_activate($data) { $modules = Jetpack::get_available_modules(); $activate_modules = array(); foreach ($modules as $module) { $module_info = Jetpack::get_module($module); if (isset($module_info['feature']) && is_array($module_info['feature']) && in_array('Jumpstart', $module_info['feature'])) { $activate_modules[] = $module; } } // Collect success/error messages like modules that are properly activated. $result = array('activated_modules' => array(), 'failed_modules' => array()); // Update the jumpstart option if ('new_connection' === Jetpack_Options::get_option('jumpstart')) { $result['jumpstart_activated'] = Jetpack_Options::update_option('jumpstart', 'jumpstart_activated'); } // Check for possible conflicting plugins $module_slugs_filtered = Jetpack::init()->filter_default_modules($activate_modules); foreach ($module_slugs_filtered as $module_slug) { Jetpack::log('activate', $module_slug); if (Jetpack::activate_module($module_slug, false, false)) { $result['activated_modules'][] = $module_slug; } else { $result['failed_modules'][] = $module_slug; } } // Set the default sharing buttons and set to display on posts if none have been set. $sharing_services = get_option('sharing-services'); $sharing_options = get_option('sharing-options'); if (empty($sharing_services['visible'])) { // Default buttons to set $visible = array('twitter', 'facebook', 'google-plus-1'); $hidden = array(); // Set some sharing settings $sharing = new Sharing_Service(); $sharing_options['global'] = array('button_style' => 'icon', 'sharing_label' => $sharing->default_sharing_label, 'open_links' => 'same', 'show' => array('post'), 'custom' => isset($sharing_options['global']['custom']) ? $sharing_options['global']['custom'] : array()); $result['sharing_options'] = update_option('sharing-options', $sharing_options); $result['sharing_services'] = update_option('sharing-services', array('visible' => $visible, 'hidden' => $hidden)); } // If all Jumpstart modules were activated if (empty($result['failed_modules'])) { return rest_ensure_response(array('code' => 'success', 'message' => esc_html__('Jumpstart done.', 'jetpack'), 'data' => $result)); } return new WP_Error('jumpstart_failed', esc_html(sprintf(_n('Jumpstart failed activating this module: %s.', 'Jumpstart failed activating these modules: %s.', count($result['failed_modules']), 'jetpack'), join(', ', $result['failed_modules']))), array('status' => 400)); }
/** * Unlink a user from WordPress.com * * This will fail if called by the Master User. */ function unlink_user() { Jetpack::log('unlink'); return Jetpack::unlink_user(); }