/blog.old/wp-content/plugins/jetpack/class.jetpack-client-server.php

https://github.com/chopsuei3/oscc · PHP · 219 lines · 162 code · 45 blank · 12 comment · 41 complexity · bfef7ad9c10de63ba4fb987ab487d0ac MD5 · raw file

  1. <?php
  2. /**
  3. * Client = Plugin
  4. * Client Server = API Methods the Plugin must respond to
  5. *
  6. * @todo Roll this into Jetpack? There's only one 'public' method now: ::authorize().
  7. */
  8. class Jetpack_Client_Server {
  9. function authorize() {
  10. $data = stripslashes_deep( $_GET );
  11. $args = array();
  12. $redirect = isset( $data['redirect'] ) ? esc_url_raw( (string) $data['redirect'] ) : '';
  13. do {
  14. $jetpack = Jetpack::init();
  15. $role = $jetpack->translate_current_user_to_role();
  16. if ( !$role ) {
  17. Jetpack::state( 'error', 'no_role' );
  18. break;
  19. }
  20. $cap = $jetpack->translate_role_to_cap( $role );
  21. if ( !$cap ) {
  22. Jetpack::state( 'error', 'no_cap' );
  23. break;
  24. }
  25. check_admin_referer( "jetpack-authorize_{$role}_{$redirect}" );
  26. if ( !empty( $data['error'] ) ) {
  27. Jetpack::state( 'error', $data['error'] );
  28. break;
  29. }
  30. if ( empty( $data['state'] ) ) {
  31. Jetpack::state( 'error', 'no_state' );
  32. break;
  33. }
  34. if ( !ctype_digit( $data['state'] ) ) {
  35. Jetpack::state( 'error', 'invalid_state' );
  36. break;
  37. }
  38. $current_user_id = get_current_user_id();
  39. if ( $current_user_id != $data['state'] ) {
  40. Jetpack::state( 'error', 'wrong_state' );
  41. break;
  42. }
  43. if ( empty( $data['code'] ) ) {
  44. Jetpack::state( 'error', 'no_code' );
  45. break;
  46. }
  47. $token = $this->get_token( $data );
  48. if ( is_wp_error( $token ) ) {
  49. if ( $error = $token->get_error_code() )
  50. Jetpack::state( 'error', $error );
  51. else
  52. Jetpack::state( 'error', 'invalid_token' );
  53. Jetpack::state( 'error_description', $token->get_error_message() );
  54. break;
  55. }
  56. if ( !$token ) {
  57. Jetpack::state( 'error', 'no_token' );
  58. break;
  59. }
  60. $is_master_user = ! Jetpack::is_active();
  61. Jetpack::update_user_token( $current_user_id, sprintf( '%s.%d', $token, $current_user_id ), $is_master_user );
  62. if ( $is_master_user ) {
  63. Jetpack::state( 'message', 'authorized' );
  64. } else {
  65. Jetpack::state( 'message', 'linked' );
  66. // Don't activate anything since we are just connecting a user.
  67. break;
  68. }
  69. if ( $active_modules = Jetpack_Options::get_option( 'active_modules' ) ) {
  70. Jetpack_Options::delete_option( 'active_modules' );
  71. Jetpack::activate_default_modules( 999, 1, $active_modules );
  72. } else {
  73. Jetpack::activate_default_modules();
  74. }
  75. $jetpack->sync->register( 'noop' ); // Spawn a sync to make sure the Jetpack Servers know what modules are active.
  76. // Start nonce cleaner
  77. wp_clear_scheduled_hook( 'jetpack_clean_nonces' );
  78. wp_schedule_event( time(), 'hourly', 'jetpack_clean_nonces' );
  79. } while ( false );
  80. if ( wp_validate_redirect( $redirect ) ) {
  81. wp_safe_redirect( $redirect );
  82. } else {
  83. wp_safe_redirect( Jetpack::admin_url() );
  84. }
  85. exit;
  86. }
  87. public static function deactivate_plugin( $probable_file, $probable_title ) {
  88. if ( is_plugin_active( $probable_file ) ) {
  89. deactivate_plugins( $probable_file );
  90. return 1;
  91. } else {
  92. // If the plugin is not in the usual place, try looking through all active plugins.
  93. $active_plugins = get_option( 'active_plugins', array() );
  94. foreach ( $active_plugins as $plugin ) {
  95. $data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );
  96. if ( $data['Name'] == $probable_title ) {
  97. deactivate_plugins( $plugin );
  98. return 1;
  99. }
  100. }
  101. }
  102. return 0;
  103. }
  104. /**
  105. * @return object|WP_Error
  106. */
  107. function get_token( $data ) {
  108. $jetpack = Jetpack::init();
  109. $role = $jetpack->translate_current_user_to_role();
  110. if ( !$role ) {
  111. return new Jetpack_Error( 'role', __( 'An administrator for this blog must set up the Jetpack connection.', 'jetpack' ) );
  112. }
  113. $client_secret = Jetpack_Data::get_access_token();
  114. if ( !$client_secret ) {
  115. return new Jetpack_Error( 'client_secret', __( 'You need to register your Jetpack before connecting it.', 'jetpack' ) );
  116. }
  117. $redirect = isset( $data['redirect'] ) ? esc_url_raw( (string) $data['redirect'] ) : '';
  118. $body = array(
  119. 'client_id' => Jetpack_Options::get_option( 'id' ),
  120. 'client_secret' => $client_secret->secret,
  121. 'grant_type' => 'authorization_code',
  122. 'code' => $data['code'],
  123. 'redirect_uri' => add_query_arg( array(
  124. 'action' => 'authorize',
  125. '_wpnonce' => wp_create_nonce( "jetpack-authorize_{$role}_{$redirect}" ),
  126. 'redirect' => $redirect ? urlencode( $redirect ) : false,
  127. ), menu_page_url( 'jetpack', false ) ),
  128. );
  129. $args = array(
  130. 'method' => 'POST',
  131. 'body' => $body,
  132. 'headers' => array(
  133. 'Accept' => 'application/json',
  134. ),
  135. );
  136. $response = Jetpack_Client::_wp_remote_request( Jetpack::fix_url_for_bad_hosts( Jetpack::api_url( 'token' ) ), $args );
  137. if ( is_wp_error( $response ) ) {
  138. return new Jetpack_Error( 'token_http_request_failed', $response->get_error_message() );
  139. }
  140. $code = wp_remote_retrieve_response_code( $response );
  141. $entity = wp_remote_retrieve_body( $response );
  142. if ( $entity )
  143. $json = json_decode( $entity );
  144. else
  145. $json = false;
  146. if ( 200 != $code || !empty( $json->error ) ) {
  147. if ( empty( $json->error ) )
  148. return new Jetpack_Error( 'unknown', '', $code );
  149. $error_description = isset( $json->error_description ) ? sprintf( __( 'Error Details: %s', 'jetpack' ), (string) $json->error_description ) : '';
  150. return new Jetpack_Error( (string) $json->error, $error_description, $code );
  151. }
  152. if ( empty( $json->access_token ) || !is_scalar( $json->access_token ) ) {
  153. return new Jetpack_Error( 'access_token', '', $code );
  154. }
  155. if ( empty( $json->token_type ) || 'X_JETPACK' != strtoupper( $json->token_type ) ) {
  156. return new Jetpack_Error( 'token_type', '', $code );
  157. }
  158. if ( empty( $json->scope ) ) {
  159. return new Jetpack_Error( 'scope', 'No Scope', $code );
  160. }
  161. @list( $role, $hmac ) = explode( ':', $json->scope );
  162. if ( empty( $role ) || empty( $hmac ) ) {
  163. return new Jetpack_Error( 'scope', 'Malformed Scope', $code );
  164. }
  165. if ( $jetpack->sign_role( $role ) !== $json->scope ) {
  166. return new Jetpack_Error( 'scope', 'Invalid Scope', $code );
  167. }
  168. if ( !$cap = $jetpack->translate_role_to_cap( $role ) )
  169. return new Jetpack_Error( 'scope', 'No Cap', $code );
  170. if ( !current_user_can( $cap ) )
  171. return new Jetpack_Error( 'scope', 'current_user_cannot', $code );
  172. return (string) $json->access_token;
  173. }
  174. }