PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 7.2.1
Jetpack – WP Security, Backup, Speed, & Growth v7.2.1
15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / class.jetpack-client-server.php
jetpack Last commit date
3rd-party 7 years ago _inc 7 years ago bin 7 years ago css 7 years ago extensions 7 years ago images 7 years ago json-endpoints 7 years ago languages 7 years ago logs 9 years ago modules 7 years ago sal 7 years ago scss 7 years ago sync 7 years ago views 7 years ago .svnignore 12 years ago CODE-OF-CONDUCT.md 9 years ago changelog.txt 7 years ago class.frame-nonce-preview.php 9 years ago class.jetpack-admin.php 7 years ago class.jetpack-affiliate.php 7 years ago class.jetpack-autoupdate.php 8 years ago class.jetpack-bbpress-json-api-compat.php 9 years ago class.jetpack-cli.php 7 years ago class.jetpack-client-server.php 8 years ago class.jetpack-client.php 7 years ago class.jetpack-connection-banner.php 7 years ago class.jetpack-constants.php 8 years ago class.jetpack-data.php 7 years ago class.jetpack-debugger.php 7 years ago class.jetpack-error.php 10 years ago class.jetpack-gutenberg.php 7 years ago class.jetpack-heartbeat.php 7 years ago class.jetpack-idc.php 8 years ago class.jetpack-ixr-client.php 10 years ago class.jetpack-jitm.php 7 years ago class.jetpack-modules-list-table.php 7 years ago class.jetpack-network-sites-list-table.php 9 years ago class.jetpack-network.php 7 years ago class.jetpack-options.php 7 years ago class.jetpack-plan.php 7 years ago class.jetpack-post-images.php 7 years ago class.jetpack-signature.php 7 years ago class.jetpack-tracks.php 7 years ago class.jetpack-twitter-cards.php 7 years ago class.jetpack-user-agent.php 8 years ago class.jetpack-xmlrpc-server.php 7 years ago class.jetpack.php 7 years ago class.json-api-endpoints.php 7 years ago class.json-api.php 7 years ago class.photon.php 7 years ago composer.json 7 years ago functions.compat.php 7 years ago functions.gallery.php 8 years ago functions.global.php 7 years ago functions.opengraph.php 7 years ago functions.photon.php 7 years ago jetpack.php 7 years ago json-api-config.php 10 years ago json-endpoints.php 7 years ago locales.php 7 years ago readme.txt 7 years ago require-lib.php 7 years ago uninstall.php 8 years ago wpml-config.xml 10 years ago
class.jetpack-client-server.php
291 lines
1 <?php
2
3 /**
4 * Client = Plugin
5 * Client Server = API Methods the Plugin must respond to
6 */
7 class Jetpack_Client_Server {
8
9 /**
10 * Authorizations
11 */
12 function client_authorize() {
13 $data = stripslashes_deep( $_GET );
14 $data['auth_type'] = 'client';
15 $role = Jetpack::translate_current_user_to_role();
16 $redirect = isset( $data['redirect'] ) ? esc_url_raw( (string) $data['redirect'] ) : '';
17
18 check_admin_referer( "jetpack-authorize_{$role}_{$redirect}" );
19
20 $result = $this->authorize( $data );
21 if ( is_wp_error( $result ) ) {
22 Jetpack::state( 'error', $result->get_error_code() );
23 JetpackTracking::record_user_event( 'jpc_client_authorize_fail', array(
24 'error_code' => $result->get_error_code(),
25 'error_message' => $result->get_error_message()
26 ) );
27 } else {
28 /**
29 * Fires after the Jetpack client is authorized to communicate with WordPress.com.
30 *
31 * @since 4.2.0
32 *
33 * @param int Jetpack Blog ID.
34 */
35 do_action( 'jetpack_client_authorized', Jetpack_Options::get_option( 'id' ) );
36 }
37
38 if ( wp_validate_redirect( $redirect ) ) {
39 // Exit happens below in $this->do_exit()
40 wp_safe_redirect( $redirect );
41 } else {
42 // Exit happens below in $this->do_exit()
43 wp_safe_redirect( Jetpack::admin_url() );
44 }
45
46 JetpackTracking::record_user_event( 'jpc_client_authorize_success' );
47
48 $this->do_exit();
49 }
50
51 function authorize( $data = array() ) {
52 $redirect = isset( $data['redirect'] ) ? esc_url_raw( (string) $data['redirect'] ) : '';
53
54 $jetpack_unique_connection = Jetpack_Options::get_option( 'unique_connection' );
55 // Checking if site has been active/connected previously before recording unique connection
56 if ( ! $jetpack_unique_connection ) {
57 // jetpack_unique_connection option has never been set
58 $jetpack_unique_connection = array(
59 'connected' => 0,
60 'disconnected' => 0,
61 'version' => '3.6.1',
62 );
63
64 update_option( 'jetpack_unique_connection', $jetpack_unique_connection );
65
66 //track unique connection
67 $jetpack = $this->get_jetpack();
68
69 $jetpack->stat( 'connections', 'unique-connection' );
70 $jetpack->do_stats( 'server_side' );
71 }
72
73 // increment number of times connected
74 $jetpack_unique_connection['connected'] += 1;
75 Jetpack_Options::update_option( 'unique_connection', $jetpack_unique_connection );
76
77 $role = Jetpack::translate_current_user_to_role();
78
79 if ( ! $role ) {
80 return new Jetpack_Error( 'no_role', 'Invalid request.', 400 );
81 }
82
83 $cap = Jetpack::translate_role_to_cap( $role );
84 if ( ! $cap ) {
85 return new Jetpack_Error( 'no_cap', 'Invalid request.', 400 );
86 }
87
88 if ( ! empty( $data['error'] ) ) {
89 return new Jetpack_Error( $data['error'], 'Error included in the request.', 400 );
90 }
91
92 if ( ! isset( $data['state'] ) ) {
93 return new Jetpack_Error( 'no_state', 'Request must include state.', 400 );
94 }
95
96 if ( ! ctype_digit( $data['state'] ) ) {
97 return new Jetpack_Error( $data['error'], 'State must be an integer.', 400 );
98 }
99
100 $current_user_id = get_current_user_id();
101 if ( $current_user_id != $data['state'] ) {
102 return new Jetpack_Error( 'wrong_state', 'State does not match current user.', 400 );
103 }
104
105 if ( empty( $data['code'] ) ) {
106 return new Jetpack_Error( 'no_code', 'Request must include an authorization code.', 400 );
107 }
108
109 $token = $this->get_token( $data );
110
111 if ( is_wp_error( $token ) ) {
112 $code = $token->get_error_code();
113 if ( empty( $code ) ) {
114 $code = 'invalid_token';
115 }
116 return new Jetpack_Error( $code, $token->get_error_message(), 400 );
117 }
118
119 if ( ! $token ) {
120 return new Jetpack_Error( 'no_token', 'Error generating token.', 400 );
121 }
122
123 $is_master_user = ! Jetpack::is_active();
124
125 Jetpack::update_user_token( $current_user_id, sprintf( '%s.%d', $token, $current_user_id ), $is_master_user );
126
127 if ( ! $is_master_user ) {
128 Jetpack::state( 'message', 'linked' );
129 // Don't activate anything since we are just connecting a user.
130 return 'linked';
131 }
132
133 // If this site has been through the Jetpack Onboarding flow, delete the onboarding token
134 Jetpack::invalidate_onboarding_token();
135
136 // If redirect_uri is SSO, ensure SSO module is enabled
137 parse_str( parse_url( $data['redirect_uri'], PHP_URL_QUERY ), $redirect_options );
138
139 /** This filter is documented in class.jetpack-cli.php */
140 $jetpack_start_enable_sso = apply_filters( 'jetpack_start_enable_sso', true );
141
142 $activate_sso = (
143 isset( $redirect_options['action'] ) &&
144 'jetpack-sso' === $redirect_options['action'] &&
145 $jetpack_start_enable_sso
146 );
147
148 $do_redirect_on_error = ( 'client' === $data['auth_type'] );
149
150 Jetpack::handle_post_authorization_actions( $activate_sso, $do_redirect_on_error );
151
152 return 'authorized';
153 }
154
155 public static function deactivate_plugin( $probable_file, $probable_title ) {
156 include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
157 if ( is_plugin_active( $probable_file ) ) {
158 deactivate_plugins( $probable_file );
159 return 1;
160 } else {
161 // If the plugin is not in the usual place, try looking through all active plugins.
162 $active_plugins = Jetpack::get_active_plugins();
163 foreach ( $active_plugins as $plugin ) {
164 $data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );
165 if ( $data['Name'] == $probable_title ) {
166 deactivate_plugins( $plugin );
167 return 1;
168 }
169 }
170 }
171
172 return 0;
173 }
174
175 /**
176 * @return object|WP_Error
177 */
178 function get_token( $data ) {
179 $role = Jetpack::translate_current_user_to_role();
180
181 if ( ! $role ) {
182 return new Jetpack_Error( 'role', __( 'An administrator for this blog must set up the Jetpack connection.', 'jetpack' ) );
183 }
184
185 $client_secret = Jetpack_Data::get_access_token();
186 if ( ! $client_secret ) {
187 return new Jetpack_Error( 'client_secret', __( 'You need to register your Jetpack before connecting it.', 'jetpack' ) );
188 }
189
190 $redirect = isset( $data['redirect'] ) ? esc_url_raw( (string) $data['redirect'] ) : '';
191 $redirect_uri = ( 'calypso' === $data['auth_type'] )
192 ? $data['redirect_uri']
193 : add_query_arg( array(
194 'action' => 'authorize',
195 '_wpnonce' => wp_create_nonce( "jetpack-authorize_{$role}_{$redirect}" ),
196 'redirect' => $redirect ? urlencode( $redirect ) : false,
197 ), menu_page_url( 'jetpack', false ) );
198
199 // inject identity for analytics
200 $tracks_identity = jetpack_tracks_get_identity( get_current_user_id() );
201
202 $body = array(
203 'client_id' => Jetpack_Options::get_option( 'id' ),
204 'client_secret' => $client_secret->secret,
205 'grant_type' => 'authorization_code',
206 'code' => $data['code'],
207 'redirect_uri' => $redirect_uri,
208 '_ui' => $tracks_identity['_ui'],
209 '_ut' => $tracks_identity['_ut'],
210 );
211
212 $args = array(
213 'method' => 'POST',
214 'body' => $body,
215 'headers' => array(
216 'Accept' => 'application/json',
217 ),
218 );
219 $response = Jetpack_Client::_wp_remote_request( Jetpack::fix_url_for_bad_hosts( Jetpack::api_url( 'token' ) ), $args );
220
221 if ( is_wp_error( $response ) ) {
222 return new Jetpack_Error( 'token_http_request_failed', $response->get_error_message() );
223 }
224
225 $code = wp_remote_retrieve_response_code( $response );
226 $entity = wp_remote_retrieve_body( $response );
227
228 if ( $entity ) {
229 $json = json_decode( $entity );
230 } else {
231 $json = false;
232 }
233
234 if ( 200 != $code || ! empty( $json->error ) ) {
235 if ( empty( $json->error ) ) {
236 return new Jetpack_Error( 'unknown', '', $code );
237 }
238
239 $error_description = isset( $json->error_description ) ? sprintf( __( 'Error Details: %s', 'jetpack' ), (string) $json->error_description ) : '';
240
241 return new Jetpack_Error( (string) $json->error, $error_description, $code );
242 }
243
244 if ( empty( $json->access_token ) || ! is_scalar( $json->access_token ) ) {
245 return new Jetpack_Error( 'access_token', '', $code );
246 }
247
248 if ( empty( $json->token_type ) || 'X_JETPACK' != strtoupper( $json->token_type ) ) {
249 return new Jetpack_Error( 'token_type', '', $code );
250 }
251
252 if ( empty( $json->scope ) ) {
253 return new Jetpack_Error( 'scope', 'No Scope', $code );
254 }
255
256 @list( $role, $hmac ) = explode( ':', $json->scope );
257 if ( empty( $role ) || empty( $hmac ) ) {
258 return new Jetpack_Error( 'scope', 'Malformed Scope', $code );
259 }
260
261 if ( Jetpack::sign_role( $role ) !== $json->scope ) {
262 return new Jetpack_Error( 'scope', 'Invalid Scope', $code );
263 }
264
265 if ( ! $cap = Jetpack::translate_role_to_cap( $role ) ) {
266 return new Jetpack_Error( 'scope', 'No Cap', $code );
267 }
268
269 if ( ! current_user_can( $cap ) ) {
270 return new Jetpack_Error( 'scope', 'current_user_cannot', $code );
271 }
272
273 /**
274 * Fires after user has successfully received an auth token.
275 *
276 * @since 3.9.0
277 */
278 do_action( 'jetpack_user_authorized' );
279
280 return (string) $json->access_token;
281 }
282
283 public function get_jetpack() {
284 return Jetpack::init();
285 }
286
287 public function do_exit() {
288 exit;
289 }
290 }
291