PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 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 / jetpack_vendor / automattic / jetpack-connection / src / traits / trait-wpcom-rest-api-proxy-request.php
jetpack / jetpack_vendor / automattic / jetpack-connection / src / traits Last commit date
trait-wpcom-rest-api-proxy-request.php 8 months ago
trait-wpcom-rest-api-proxy-request.php
152 lines
1 <?php
2 /**
3 * Trait WPCOM_REST_API_Proxy_Request
4 *
5 * Used to proxy requests to wpcom servers.
6 *
7 * @package automattic/jetpack-connection
8 */
9
10 namespace Automattic\Jetpack\Connection\Traits;
11
12 use Automattic\Jetpack\Connection\Client;
13 use Automattic\Jetpack\Connection\Manager;
14 use Automattic\Jetpack\Status\Visitor;
15 use WP_Error;
16 use WP_REST_Request;
17
18 trait WPCOM_REST_API_Proxy_Request {
19
20 /**
21 * Base path for the API.
22 *
23 * @var string
24 */
25 protected $base_api_path;
26
27 /**
28 * Version of the API.
29 *
30 * @var string
31 */
32 protected $version;
33
34 /**
35 * The base of the controller's route.
36 *
37 * @var string
38 */
39 protected $rest_base;
40
41 /**
42 * Proxy request to wpcom servers on behalf of a user or using the Site-level Connection (blog token).
43 *
44 * @param WP_REST_Request $request Request to proxy.
45 * @param string $path Path to append to the rest base.
46 * @param string $context Whether the request should be proxied on behalf of the current user or using the Site-level Connection, aka 'blog' token. Can be Either 'user' or 'blog'. Defaults to 'user'.
47 * @param bool $allow_fallback_to_blog If the $context is 'user', whether we should fallback to using the Site-level Connection in case the current user is not connected.
48 * @param array $request_options Request options to pass to wp_remote_request.
49 *
50 * @return mixed|WP_Error Response from wpcom servers or an error.
51 */
52 public function proxy_request_to_wpcom( $request, $path = '', $context = 'user', $allow_fallback_to_blog = false, $request_options = array() ) {
53 $blog_id = \Jetpack_Options::get_option( 'id' );
54 $path = '/sites/' . rawurldecode( $blog_id ) . '/' . rawurldecode( ltrim( $this->rest_base, '/' ) ) . ( $path ? '/' . rawurldecode( ltrim( $path, '/' ) ) : '' );
55 $query_params = $request->get_query_params();
56 $manager = new Manager();
57
58 /*
59 * A rest_route parameter can be added when using plain permalinks.
60 * It is not necessary to pass them to WordPress.com,
61 * and may even cause issues with some endpoints.
62 * Let's remove it.
63 */
64 if ( isset( $query_params['rest_route'] ) ) {
65 unset( $query_params['rest_route'] );
66 }
67 $api_url = add_query_arg( $query_params, $path );
68
69 $request_options = array_replace_recursive(
70 array(
71 'headers' => array(
72 'Content-Type' => 'application/json',
73 'X-Forwarded-For' => ( new Visitor() )->get_ip( true ),
74 ),
75 'method' => $request->get_method(),
76 ),
77 $request_options
78 );
79
80 // If no body is present, passing it as $request->get_body() will cause an error.
81 $body = $request->get_body() ? $request->get_body() : null;
82
83 $response = new WP_Error(
84 'rest_unauthorized',
85 __( 'Please connect your user account to WordPress.com', 'jetpack-connection' ),
86 array( 'status' => rest_authorization_required_code() )
87 );
88
89 if ( 'user' === $context ) {
90 if ( ! $manager->is_user_connected() ) {
91 if ( false === $allow_fallback_to_blog ) {
92 return $response;
93 }
94
95 $context = 'blog';
96 } else {
97 $response = Client::wpcom_json_api_request_as_user( $api_url, $this->version, $request_options, $body, $this->base_api_path );
98 }
99 }
100
101 if ( 'blog' === $context ) {
102 if ( ! $manager->is_connected() ) {
103 return $response;
104 }
105
106 $response = Client::wpcom_json_api_request_as_blog( $api_url, $this->version, $request_options, $body, $this->base_api_path );
107 }
108
109 if ( is_wp_error( $response ) ) {
110 return $response;
111 }
112
113 $response_status = wp_remote_retrieve_response_code( $response );
114 $response_body = json_decode( wp_remote_retrieve_body( $response ), true );
115
116 if ( $response_status >= 400 ) {
117 $code = $response_body['code'] ?? 'unknown_error';
118 $message = $response_body['message'] ?? __( 'An unknown error occurred.', 'jetpack-connection' );
119
120 return new WP_Error( $code, $message, array( 'status' => $response_status ) );
121 }
122
123 return $response_body;
124 }
125
126 /**
127 * Proxy request to wpcom servers on behalf of a user.
128 *
129 * @param WP_REST_Request $request Request to proxy.
130 * @param string $path Path to append to the rest base.
131 * @param array $request_options Request options to pass to wp_remote_request.
132 *
133 * @return mixed|WP_Error Response from wpcom servers or an error.
134 */
135 public function proxy_request_to_wpcom_as_user( $request, $path = '', $request_options = array() ) {
136 return $this->proxy_request_to_wpcom( $request, $path, 'user', false, $request_options );
137 }
138
139 /**
140 * Proxy request to wpcom servers using the Site-level Connection (blog token).
141 *
142 * @param WP_REST_Request $request Request to proxy.
143 * @param string $path Path to append to the rest base.
144 * @param array $request_options Request options to pass to wp_remote_request.
145 *
146 * @return mixed|WP_Error Response from wpcom servers or an error.
147 */
148 public function proxy_request_to_wpcom_as_blog( $request, $path = '', $request_options = array() ) {
149 return $this->proxy_request_to_wpcom( $request, $path, 'blog', false, $request_options );
150 }
151 }
152