function remote_authorize($request)
 {
     foreach (array('secret', 'state', 'redirect_uri', 'code') as $required) {
         if (!isset($request[$required]) || empty($request[$required])) {
             return $this->error(new Jetpack_Error('missing_parameter', 'One or more parameters is missing from the request.', 400));
         }
     }
     if (!get_user_by('id', $request['state'])) {
         return $this->error(new Jetpack_Error('user_unknown', 'User not found.', 404));
     }
     if (Jetpack::is_active() && Jetpack::is_user_connected($request['state'])) {
         return $this->error(new Jetpack_Error('already_connected', 'User already connected.', 400));
     }
     $verified = $this->verify_action(array('authorize', $request['secret'], $request['state']));
     if (is_a($verified, 'IXR_Error')) {
         return $verified;
     }
     wp_set_current_user($request['state']);
     $client_server = new Jetpack_Client_Server();
     $result = $client_server->authorize($request);
     if (is_wp_error($result)) {
         return $this->error($result);
     }
     return $result;
 }
 /**
  * @author scotchfield
  * @runInSeparateProcess
  * @covers Jetpack_Client_Server::get_token
  * @since 3.2
  */
 public function test_jetpack_client_server_get_token()
 {
     $author_id = $this->factory->user->create(array('role' => 'administrator'));
     wp_set_current_user($author_id);
     $client_server = new Jetpack_Client_Server();
     $return_value = $client_server->get_token('test');
     $this->assertInstanceOf('Jetpack_Error', $return_value);
 }
 /**
  * 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 .= '&notes_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&#8217;s never supposed to happen.  Guess you&#8217;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+(?![^<>]++>)/', '&nbsp;', $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+(?![^<>]++>)/', '&nbsp;', $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&#8217;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&#8217;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(' ', '&nbsp;', $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');
 }
Example #4
0
 /**
  * Request an api key from wordpress.com
  *
  * @return bool | string
  */
 public function get_protect_key()
 {
     $protect_blog_id = Jetpack_Protect_Module::get_main_blog_jetpack_id();
     // If we can't find the the blog id, that means we are on multisite, and the main site never connected
     // the protect api key is linked to the main blog id - instruct the user to connect their main blog
     if (!$protect_blog_id) {
         $this->api_key_error = __('Your main blog is not connected to WordPress.com. Please connect to get an API key.', 'jetpack');
         return false;
     }
     $request = array('jetpack_blog_id' => $protect_blog_id, 'bruteprotect_api_key' => get_site_option('bruteprotect_api_key'), 'multisite' => '0');
     // Send the number of blogs on the network if we are on multisite
     if (is_multisite()) {
         $request['multisite'] = get_blog_count();
         if (!$request['multisite']) {
             global $wpdb;
             $request['multisite'] = $wpdb->get_var("SELECT COUNT(blog_id) as c FROM {$wpdb->blogs} WHERE spam = '0' AND deleted = '0' and archived = '0'");
         }
     }
     // Request the key
     Jetpack::load_xml_rpc_client();
     $xml = new Jetpack_IXR_Client(array('user_id' => get_current_user_id()));
     $xml->query('jetpack.protect.requestKey', $request);
     // Hmm, can't talk to wordpress.com
     if ($xml->isError()) {
         $code = $xml->getErrorCode();
         $message = $xml->getErrorMessage();
         $this->api_key_error = sprintf(__('Error connecting to WordPress.com. Code: %1$s, %2$s', 'jetpack'), $code, $message);
         return false;
     }
     $response = $xml->getResponse();
     // Hmm. Can't talk to the protect servers ( api.bruteprotect.com )
     if (!isset($response['data'])) {
         $this->api_key_error = __('No reply from Jetpack servers', 'jetpack');
         return false;
     }
     // There was an issue generating the key
     if (empty($response['success'])) {
         $this->api_key_error = $response['data'];
         return false;
     }
     // Key generation successful!
     $active_plugins = Jetpack::get_active_plugins();
     // We only want to deactivate BruteProtect if we successfully get a key
     if (in_array('bruteprotect/bruteprotect.php', $active_plugins)) {
         Jetpack_Client_Server::deactivate_plugin('bruteprotect/bruteprotect.php', 'BruteProtect');
     }
     $key = $response['data'];
     update_site_option('jetpack_protect_key', $key);
     return $key;
 }
 /**
  * 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 .= '&notes_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->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_description', $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);
     }
     switch ($error) {
         case 'cheatin':
             $this->error = __('Cheatin&#8217; uh?', 'jetpack');
             break;
         case 'access_denied':
             $this->error = sprintf(__('Would you mind telling us why you did not complete the Jetpack connection in this <a href="%s">1 question survey</a>?', 'jetpack'), 'http://jetpack.com/cancelled-connection/') . '<br /><small>' . __('A Jetpack connection is required for our free security and traffic features to work.', 'jetpack') . '</small>';
             break;
         case 'wrong_state':
             $this->error = __('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 = __('We had an issue connecting Jetpack; deactivate then reactivate the Jetpack plugin, then connect again.', 'jetpack');
             break;
         case 'invalid_grant':
             $this->error = __('There was an issue connecting your Jetpack. Please click &#8220;Connect to WordPress.com&#8221; again.', '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>  We&#8217;re sorry for the inconvenience. Please try again later, if the issue continues please contact support with this message: %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;
         }
     }
     if (Jetpack::state('optin-manage')) {
         $activated_manage = $message_code;
         $message_code = 'jetpack-manage';
     }
     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+(?![^<>]++>)/', '&nbsp;', $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+(?![^<>]++>)/', '&nbsp;', $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 '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;
         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&#8217;re fueled up and ready to go, Jetpack is now active.</strong> ', 'jetpack');
             $this->message .= Jetpack::jetpack_comment_notice();
             break;
         case 'linked':
             $this->message = __('<strong>You&#8217;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;
         case 'switch_master':
             global $current_user;
             $is_master_user = $current_user->ID == Jetpack_Options::get_option('master_user');
             $master_userdata = get_userdata(Jetpack_Options::get_option('master_user'));
             if ($is_master_user) {
                 $this->message = __('You have successfully set yourself as Jetpack’s primary user.', 'jetpack');
             } else {
                 $this->message = sprintf(_x('You have successfully set %s as Jetpack’s primary user.', '%s is a username', 'jetpack'), $master_userdata->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(' ', '&nbsp;', $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');
 }
 function activate_module($module)
 {
     $jetpack = Jetpack::init();
     if (!Jetpack::is_active()) {
         return false;
     }
     if (!strlen($module)) {
         return false;
     }
     if (!Jetpack::is_module($module)) {
         return false;
     }
     // If it's already active, then don't do it again
     $active = Jetpack::get_active_modules();
     foreach ($active as $act) {
         if ($act == $module) {
             return true;
         }
     }
     // Check and see if the old plugin is active
     if (isset($jetpack->plugins_to_deactivate[$module])) {
         // Deactivate the old plugin
         if (Jetpack_Client_Server::deactivate_plugin($jetpack->plugins_to_deactivate[$module][0], $jetpack->plugins_to_deactivate[$module][1])) {
             // If we deactivated the old plugin, remembere that with ::state() and redirect back to this page to activate the module
             // We can't activate the module on this page load since the newly deactivated old plugin is still loaded on this page load.
             Jetpack::state('deactivated_plugins', $module);
             wp_safe_redirect(add_query_arg('jetpack_restate', 1));
             exit;
         }
     }
     // Check the file for fatal errors, a la wp-admin/plugins.php::activate
     Jetpack::state('module', $module);
     Jetpack::state('error', 'module_activation_failed');
     // we'll override this later if the plugin can be included without fatal error
     wp_safe_redirect(Jetpack::admin_url());
     if ('sharedaddy' == $module && version_compare(PHP_VERSION, '5', '<')) {
         exit;
     }
     Jetpack::catch_errors(true);
     ob_start();
     require Jetpack::get_module_path($module);
     do_action("jetpack_activate_module_{$module}");
     $active[] = $module;
     Jetpack::update_option('active_modules', array_unique($active));
     Jetpack::state('error', false);
     // the override
     Jetpack::state('message', 'module_activated');
     Jetpack::state('module', $module);
     ob_end_clean();
     Jetpack::catch_errors(false);
     exit;
 }
Example #7
0
 /**
  * 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 .= '&notes_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(' ', '&nbsp;', $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');
 }
 function remote_authorize($request)
 {
     foreach (array('secret', 'state', 'redirect_uri', 'code') as $required) {
         if (!isset($request[$required]) || empty($request[$required])) {
             return $this->error(new Jetpack_Error('missing_parameter', 'One or more parameters is missing from the request.', 400));
         }
     }
     if (!get_user_by('id', $request['state'])) {
         return $this->error(new Jetpack_Error('user_unknown', 'User not found.', 404));
     }
     if (Jetpack::is_active() && Jetpack::is_user_connected($request['state'])) {
         return $this->error(new Jetpack_Error('already_connected', 'User already connected.', 400));
     }
     $verified = $this->verify_action(array('authorize', $request['secret'], $request['state']));
     if (is_a($verified, 'IXR_Error')) {
         return $verified;
     }
     wp_set_current_user($request['state']);
     $client_server = new Jetpack_Client_Server();
     $result = $client_server->authorize($request);
     if (is_wp_error($result)) {
         return $this->error($result);
     }
     // Creates a new secret, allowing someone to activate the manage module for up to 1 day after authorization.
     $secrets = Jetpack::init()->generate_secrets('activate_manage', DAY_IN_SECONDS);
     @(list($secret) = explode(':', $secrets));
     $response = array('result' => $result, 'activate_manage' => $secret);
     return $response;
 }
Example #9
0
 function admin_page_load()
 {
     $error = false;
     if (isset($_GET['action'])) {
         switch ($_GET['action']) {
             case 'authorize':
                 if (Jetpack::is_active()) {
                     Jetpack::state('message', 'already_authorized');
                     wp_redirect(Jetpack::admin_url());
                     exit;
                 }
                 $client_server = new Jetpack_Client_Server();
                 $client_server->authorize();
                 exit;
             case 'register':
                 check_admin_referer('jetpack-register');
                 $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':
                 $module = stripslashes($_GET['module']);
                 check_admin_referer("jetpack_activate-{$module}");
                 Jetpack::activate_module($module);
                 wp_redirect(Jetpack::admin_url());
                 exit;
             case 'activate_default_modules':
                 check_admin_referer('activate_default_modules');
                 Jetpack::restate();
                 Jetpack::activate_default_modules();
                 wp_redirect(Jetpack::admin_url());
                 exit;
             case 'disconnect':
                 check_admin_referer('jetpack-disconnect');
                 $this->plugin_deactivation(false);
                 update_option('jetpack_activated', 4);
                 wp_redirect(Jetpack::admin_url());
                 exit;
             case 'deactivate':
                 $module = stripslashes($_GET['module']);
                 check_admin_referer("jetpack_deactivate-{$module}");
                 Jetpack::deactivate_module($module);
                 Jetpack::state('message', 'module_deactivated');
                 Jetpack::state('module', $module);
                 wp_redirect(Jetpack::admin_url());
                 exit;
         }
     }
     $error = $error ? $error : Jetpack::state('error');
     switch ($error) {
         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&#8217;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&#8230; it seems your Jetpack doesn&#8217;t quite fit.  Have you lost weight? Click &#8220;Connect to WordPress.com&#8221; 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))) {
                 if ('sharedaddy' == $module && version_compare(PHP_VERSION, '5', '<')) {
                     $this->error = sprintf(__('The %1$s module requires <strong>PHP version %2$s</strong> or higher.', 'jetpack'), '<strong>' . $mod['name'] . '</strong>', '5');
                 } else {
                     $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']);
                 }
             } 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 '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&#8217;s never supposed to happen.  Guess you&#8217;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');
     switch ($message_code) {
         case 'module_activated':
             if ($module = Jetpack::get_module(Jetpack::state('module'))) {
                 $this->message = sprintf(__('<strong>%s Activated!</strong> You can deactivate at any time using the deactivate button on the module card.', 'jetpack'), $module['name']);
                 $this->stat('module-activated', Jetpack::state('module'));
             }
             break;
         case 'module_deactivated':
             if ($module = Jetpack::get_module(Jetpack::state('module'))) {
                 $this->message = sprintf(__('<strong>%s Deactivated!</strong> You can activate it again at any time using the activate button on the module card.', 'jetpack'), $module['name']);
                 $this->stat('module-deactivated', Jetpack::state('module'));
             }
             break;
         case 'module_configured':
             $this->message = __('<strong>Success!</strong> Module settings were saved.', 'jetpack');
             break;
         case 'already_authorized':
             $this->message = __('<strong>Whoops!</strong> Your Jetpack is already connected.', 'jetpack');
             break;
         case 'authorized':
             $this->message = __("<strong>All Done!</strong> You&#8217;re fueled up and ready to go!", 'jetpack');
             $this->message .= "<br />\n";
             $this->message .= __('The features below are now active. Click the learn more buttons to explore each feature.', 'jetpack');
             break;
     }
     $active_state = Jetpack::state('activated_modules');
     if (!empty($active_state)) {
         $mods = explode(',', $active_state);
         if (count($mods)) {
             $available = Jetpack::get_available_modules();
             foreach ($mods as $mod) {
                 if (in_array($mod, $available)) {
                     $this->stat('module-activated', $mod);
                 }
             }
         }
     }
     $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(' ', '&nbsp;', $this->plugins_to_deactivate[$deactivated_plugin]) . '</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 %l plugin.', 'Jetpack contains the most recent versions of the %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');
         }
     }
     if ($this->message || $this->error) {
         add_action('jetpack_notices', array($this, 'admin_notices'));
     }
     if (isset($_GET['configure']) && Jetpack::is_module($_GET['configure'])) {
         do_action('jetpack_module_configuration_load_' . $_GET['configure']);
     }
 }