function authorize($data = array())
{
$redirect = isset($data['redirect']) ? esc_url_raw((string) $data['redirect']) : '';
$jetpack_unique_connection = Jetpack_Options::get_option('unique_connection');
// Checking if site has been active/connected previously before recording unique connection
if (!$jetpack_unique_connection) {
// jetpack_unique_connection option has never been set
$jetpack_unique_connection = array('connected' => 0, 'disconnected' => 0, 'version' => '3.6.1');
update_option('jetpack_unique_connection', $jetpack_unique_connection);
//track unique connection
$jetpack = $this->get_jetpack();
$jetpack->stat('connections', 'unique-connection');
$jetpack->do_stats('server_side');
}
// increment number of times connected
$jetpack_unique_connection['connected'] += 1;
Jetpack_Options::update_option('unique_connection', $jetpack_unique_connection);
$role = Jetpack::translate_current_user_to_role();
if (!$role) {
return new Jetpack_Error('no_role', 'Invalid request.', 400);
}
$cap = Jetpack::translate_role_to_cap($role);
if (!$cap) {
return new Jetpack_Error('no_cap', 'Invalid request.', 400);
}
if (!empty($data['error'])) {
return new Jetpack_Error($data['error'], 'Error included in the request.', 400);
}
if (!isset($data['state'])) {
return new Jetpack_Error('no_state', 'Request must include state.', 400);
}
if (!ctype_digit($data['state'])) {
return new Jetpack_Error($data['error'], 'State must be an integer.', 400);
}
$current_user_id = get_current_user_id();
if ($current_user_id != $data['state']) {
return new Jetpack_Error('wrong_state', 'State does not match current user.', 400);
}
if (empty($data['code'])) {
return new Jetpack_Error('no_code', 'Request must include an authorization code.', 400);
}
$token = $this->get_token($data);
if (is_wp_error($token)) {
$code = $token->get_error_code();
if (empty($code)) {
$code = 'invalid_token';
}
return new Jetpack_Error($code, $token->get_error_message(), 400);
}
if (!$token) {
return new Jetpack_Error('no_token', 'Error generating token.', 400);
}
$is_master_user = !Jetpack::is_active();
Jetpack::update_user_token($current_user_id, sprintf('%s.%d', $token, $current_user_id), $is_master_user);
if (!$is_master_user) {
Jetpack::state('message', 'linked');
// Don't activate anything since we are just connecting a user.
return 'linked';
}
$redirect_on_activation_error = 'client' === $data['auth_type'] ? true : false;
if ($active_modules = Jetpack_Options::get_option('active_modules')) {
Jetpack::delete_active_modules();
Jetpack::activate_default_modules(999, 1, $active_modules, $redirect_on_activation_error);
} else {
Jetpack::activate_default_modules(false, false, array(), $redirect_on_activation_error);
}
// Since this is a fresh connection, be sure to clear out IDC options
Jetpack_IDC::clear_all_idc_options();
// Start nonce cleaner
wp_clear_scheduled_hook('jetpack_clean_nonces');
wp_schedule_event(time(), 'hourly', 'jetpack_clean_nonces');
Jetpack::state('message', 'authorized');
return 'authorized';
}