This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /** |
||
3 | * WooCommerce API |
||
4 | * |
||
5 | * Handles WC-API endpoint requests. |
||
6 | * |
||
7 | * @author WooThemes |
||
8 | * @category API |
||
9 | * @package WooCommerce/API |
||
10 | * @since 2.0 |
||
11 | */ |
||
12 | |||
13 | if ( ! defined( 'ABSPATH' ) ) { |
||
14 | exit; |
||
15 | } |
||
16 | |||
17 | if ( ! class_exists( 'WC_API' ) ) : |
||
18 | |||
19 | class WC_API { |
||
20 | |||
21 | /** |
||
22 | * This is the major version for the REST API and takes |
||
23 | * first-order position in endpoint URLs. |
||
24 | * |
||
25 | * @deprecated 2.6.0 |
||
26 | * @var string |
||
27 | */ |
||
28 | const VERSION = '3.1.0'; |
||
29 | |||
30 | /** |
||
31 | * The REST API server. |
||
32 | * |
||
33 | * @deprecated 2.6.0 |
||
34 | * @var WC_API_Server |
||
35 | */ |
||
36 | public $server; |
||
37 | |||
38 | /** |
||
39 | * REST API authentication class instance. |
||
40 | * |
||
41 | * @deprecated 2.6.0 |
||
42 | * @var WC_API_Authentication |
||
43 | */ |
||
44 | public $authentication; |
||
45 | |||
46 | /** |
||
47 | * Setup class. |
||
48 | * |
||
49 | * @since 2.0 |
||
50 | * @return WC_API |
||
0 ignored issues
–
show
|
|||
51 | */ |
||
52 | public function __construct() { |
||
53 | // Add query vars. |
||
54 | add_filter( 'query_vars', array( $this, 'add_query_vars' ), 0 ); |
||
55 | |||
56 | // Register API endpoints. |
||
57 | add_action( 'init', array( $this, 'add_endpoint' ), 0 ); |
||
58 | |||
59 | // Handle REST API requests. |
||
60 | add_action( 'parse_request', array( $this, 'handle_rest_api_requests' ), 0 ); |
||
61 | |||
62 | // Handle wc-api endpoint requests. |
||
63 | add_action( 'parse_request', array( $this, 'handle_api_requests' ), 0 ); |
||
64 | |||
65 | // Ensure payment gateways are initialized in time for API requests. |
||
66 | add_action( 'woocommerce_api_request', array( 'WC_Payment_Gateways', 'instance' ), 0 ); |
||
67 | |||
68 | // WP REST API. |
||
69 | $this->rest_api_init(); |
||
70 | } |
||
71 | |||
72 | /** |
||
73 | * Add new query vars. |
||
74 | * |
||
75 | * @since 2.0 |
||
76 | * @param array $vars |
||
77 | * @return string[] |
||
78 | */ |
||
79 | public function add_query_vars( $vars ) { |
||
80 | $vars[] = 'wc-api'; |
||
81 | $vars[] = 'wc-api-version'; // Deprecated since 2.6.0. |
||
82 | $vars[] = 'wc-api-route'; // Deprecated since 2.6.0. |
||
83 | |||
84 | return $vars; |
||
85 | } |
||
86 | |||
87 | /** |
||
88 | * Add new endpoints. |
||
89 | * |
||
90 | * @since 2.0 |
||
91 | */ |
||
92 | public static function add_endpoint() { |
||
93 | |||
94 | // REST API, deprecated since 2.6.0. |
||
95 | add_rewrite_rule( '^wc-api/v([1-3]{1})/?$', 'index.php?wc-api-version=$matches[1]&wc-api-route=/', 'top' ); |
||
96 | add_rewrite_rule( '^wc-api/v([1-3]{1})(.*)?', 'index.php?wc-api-version=$matches[1]&wc-api-route=$matches[2]', 'top' ); |
||
97 | |||
98 | // WC API for payment gateway IPNs, etc. |
||
99 | add_rewrite_endpoint( 'wc-api', EP_ALL ); |
||
100 | } |
||
101 | |||
102 | |||
103 | /** |
||
104 | * Handle REST API requests. |
||
105 | * |
||
106 | * @since 2.2 |
||
107 | * @deprecated 2.6.0 |
||
108 | */ |
||
109 | public function handle_rest_api_requests() { |
||
110 | global $wp; |
||
111 | |||
112 | if ( ! empty( $_GET['wc-api-version'] ) ) { |
||
113 | $wp->query_vars['wc-api-version'] = $_GET['wc-api-version']; |
||
114 | } |
||
115 | |||
116 | if ( ! empty( $_GET['wc-api-route'] ) ) { |
||
117 | $wp->query_vars['wc-api-route'] = $_GET['wc-api-route']; |
||
118 | } |
||
119 | |||
120 | // REST API request. |
||
121 | if ( ! empty( $wp->query_vars['wc-api-version'] ) && ! empty( $wp->query_vars['wc-api-route'] ) ) { |
||
122 | |||
123 | define( 'WC_API_REQUEST', true ); |
||
124 | define( 'WC_API_REQUEST_VERSION', absint( $wp->query_vars['wc-api-version'] ) ); |
||
125 | |||
126 | // Legacy v1 API request. |
||
127 | if ( 1 === WC_API_REQUEST_VERSION ) { |
||
128 | $this->handle_v1_rest_api_request(); |
||
129 | } else if ( 2 === WC_API_REQUEST_VERSION ) { |
||
130 | $this->handle_v2_rest_api_request(); |
||
131 | } else { |
||
132 | $this->includes(); |
||
133 | |||
134 | $this->server = new WC_API_Server( $wp->query_vars['wc-api-route'] ); |
||
135 | |||
136 | // load API resource classes. |
||
137 | $this->register_resources( $this->server ); |
||
138 | |||
139 | // Fire off the request. |
||
140 | $this->server->serve_request(); |
||
141 | } |
||
142 | |||
143 | exit; |
||
144 | } |
||
145 | } |
||
146 | |||
147 | /** |
||
148 | * Include required files for REST API request. |
||
149 | * |
||
150 | * @since 2.1 |
||
151 | * @deprecated 2.6.0 |
||
152 | */ |
||
153 | public function includes() { |
||
154 | |||
155 | // API server / response handlers. |
||
156 | include_once( 'api/legacy/v3/class-wc-api-exception.php' ); |
||
157 | include_once( 'api/legacy/v3/class-wc-api-server.php' ); |
||
158 | include_once( 'api/legacy/v3/interface-wc-api-handler.php' ); |
||
159 | include_once( 'api/legacy/v3/class-wc-api-json-handler.php' ); |
||
160 | |||
161 | // Authentication. |
||
162 | include_once( 'api/legacy/v3/class-wc-api-authentication.php' ); |
||
163 | $this->authentication = new WC_API_Authentication(); |
||
164 | |||
165 | include_once( 'api/legacy/v3/class-wc-api-resource.php' ); |
||
166 | include_once( 'api/legacy/v3/class-wc-api-coupons.php' ); |
||
167 | include_once( 'api/legacy/v3/class-wc-api-customers.php' ); |
||
168 | include_once( 'api/legacy/v3/class-wc-api-orders.php' ); |
||
169 | include_once( 'api/legacy/v3/class-wc-api-products.php' ); |
||
170 | include_once( 'api/legacy/v3/class-wc-api-reports.php' ); |
||
171 | include_once( 'api/legacy/v3/class-wc-api-taxes.php' ); |
||
172 | include_once( 'api/legacy/v3/class-wc-api-webhooks.php' ); |
||
173 | |||
174 | // Allow plugins to load other response handlers or resource classes. |
||
175 | do_action( 'woocommerce_api_loaded' ); |
||
176 | } |
||
177 | |||
178 | /** |
||
179 | * Register available API resources. |
||
180 | * |
||
181 | * @since 2.1 |
||
182 | * @deprecated 2.6.0 |
||
183 | * @param WC_API_Server $server the REST server |
||
184 | */ |
||
185 | public function register_resources( $server ) { |
||
186 | |||
187 | $api_classes = apply_filters( 'woocommerce_api_classes', |
||
188 | array( |
||
189 | 'WC_API_Coupons', |
||
190 | 'WC_API_Customers', |
||
191 | 'WC_API_Orders', |
||
192 | 'WC_API_Products', |
||
193 | 'WC_API_Reports', |
||
194 | 'WC_API_Taxes', |
||
195 | 'WC_API_Webhooks', |
||
196 | ) |
||
197 | ); |
||
198 | |||
199 | foreach ( $api_classes as $api_class ) { |
||
200 | $this->$api_class = new $api_class( $server ); |
||
201 | } |
||
202 | } |
||
203 | |||
204 | |||
205 | /** |
||
206 | * Handle legacy v1 REST API requests. |
||
207 | * |
||
208 | * @since 2.2 |
||
209 | * @deprecated 2.6.0 |
||
210 | */ |
||
211 | View Code Duplication | private function handle_v1_rest_api_request() { |
|
212 | |||
213 | // Include legacy required files for v1 REST API request. |
||
214 | include_once( 'api/legacy/v1/class-wc-api-server.php' ); |
||
215 | include_once( 'api/legacy/v1/interface-wc-api-handler.php' ); |
||
216 | include_once( 'api/legacy/v1/class-wc-api-json-handler.php' ); |
||
217 | include_once( 'api/legacy/v1/class-wc-api-xml-handler.php' ); |
||
218 | |||
219 | include_once( 'api/legacy/v1/class-wc-api-authentication.php' ); |
||
220 | $this->authentication = new WC_API_Authentication(); |
||
221 | |||
222 | include_once( 'api/legacy/v1/class-wc-api-resource.php' ); |
||
223 | include_once( 'api/legacy/v1/class-wc-api-coupons.php' ); |
||
224 | include_once( 'api/legacy/v1/class-wc-api-customers.php' ); |
||
225 | include_once( 'api/legacy/v1/class-wc-api-orders.php' ); |
||
226 | include_once( 'api/legacy/v1/class-wc-api-products.php' ); |
||
227 | include_once( 'api/legacy/v1/class-wc-api-reports.php' ); |
||
228 | |||
229 | // Allow plugins to load other response handlers or resource classes. |
||
230 | do_action( 'woocommerce_api_loaded' ); |
||
231 | |||
232 | $this->server = new WC_API_Server( $GLOBALS['wp']->query_vars['wc-api-route'] ); |
||
233 | |||
234 | // Register available resources for legacy v1 REST API request. |
||
235 | $api_classes = apply_filters( 'woocommerce_api_classes', |
||
236 | array( |
||
237 | 'WC_API_Customers', |
||
238 | 'WC_API_Orders', |
||
239 | 'WC_API_Products', |
||
240 | 'WC_API_Coupons', |
||
241 | 'WC_API_Reports', |
||
242 | ) |
||
243 | ); |
||
244 | |||
245 | foreach ( $api_classes as $api_class ) { |
||
246 | $this->$api_class = new $api_class( $this->server ); |
||
247 | } |
||
248 | |||
249 | // Fire off the request. |
||
250 | $this->server->serve_request(); |
||
251 | } |
||
252 | |||
253 | /** |
||
254 | * Handle legacy v2 REST API requests. |
||
255 | * |
||
256 | * @since 2.4 |
||
257 | * @deprecated 2.6.0 |
||
258 | */ |
||
259 | View Code Duplication | private function handle_v2_rest_api_request() { |
|
260 | include_once( 'api/legacy/v2/class-wc-api-exception.php' ); |
||
261 | include_once( 'api/legacy/v2/class-wc-api-server.php' ); |
||
262 | include_once( 'api/legacy/v2/interface-wc-api-handler.php' ); |
||
263 | include_once( 'api/legacy/v2/class-wc-api-json-handler.php' ); |
||
264 | |||
265 | include_once( 'api/legacy/v2/class-wc-api-authentication.php' ); |
||
266 | $this->authentication = new WC_API_Authentication(); |
||
267 | |||
268 | include_once( 'api/legacy/v2/class-wc-api-resource.php' ); |
||
269 | include_once( 'api/legacy/v2/class-wc-api-coupons.php' ); |
||
270 | include_once( 'api/legacy/v2/class-wc-api-customers.php' ); |
||
271 | include_once( 'api/legacy/v2/class-wc-api-orders.php' ); |
||
272 | include_once( 'api/legacy/v2/class-wc-api-products.php' ); |
||
273 | include_once( 'api/legacy/v2/class-wc-api-reports.php' ); |
||
274 | include_once( 'api/legacy/v2/class-wc-api-webhooks.php' ); |
||
275 | |||
276 | // allow plugins to load other response handlers or resource classes. |
||
277 | do_action( 'woocommerce_api_loaded' ); |
||
278 | |||
279 | $this->server = new WC_API_Server( $GLOBALS['wp']->query_vars['wc-api-route'] ); |
||
280 | |||
281 | // Register available resources for legacy v2 REST API request. |
||
282 | $api_classes = apply_filters( 'woocommerce_api_classes', |
||
283 | array( |
||
284 | 'WC_API_Customers', |
||
285 | 'WC_API_Orders', |
||
286 | 'WC_API_Products', |
||
287 | 'WC_API_Coupons', |
||
288 | 'WC_API_Reports', |
||
289 | 'WC_API_Webhooks', |
||
290 | ) |
||
291 | ); |
||
292 | |||
293 | foreach ( $api_classes as $api_class ) { |
||
294 | $this->$api_class = new $api_class( $this->server ); |
||
295 | } |
||
296 | |||
297 | // Fire off the request. |
||
298 | $this->server->serve_request(); |
||
299 | } |
||
300 | |||
301 | /** |
||
302 | * API request - Trigger any API requests. |
||
303 | * |
||
304 | * @since 2.0 |
||
305 | * @version 2.4 |
||
306 | */ |
||
307 | public function handle_api_requests() { |
||
308 | global $wp; |
||
309 | |||
310 | if ( ! empty( $_GET['wc-api'] ) ) { |
||
311 | $wp->query_vars['wc-api'] = $_GET['wc-api']; |
||
312 | } |
||
313 | |||
314 | // wc-api endpoint requests. |
||
315 | if ( ! empty( $wp->query_vars['wc-api'] ) ) { |
||
316 | |||
317 | // Buffer, we won't want any output here. |
||
318 | ob_start(); |
||
319 | |||
320 | // No cache headers. |
||
321 | nocache_headers(); |
||
322 | |||
323 | // Clean the API request. |
||
324 | $api_request = strtolower( wc_clean( $wp->query_vars['wc-api'] ) ); |
||
325 | |||
326 | // Trigger generic action before request hook. |
||
327 | do_action( 'woocommerce_api_request', $api_request ); |
||
328 | |||
329 | // Is there actually something hooked into this API request? If not trigger 400 - Bad request. |
||
330 | status_header( has_action( 'woocommerce_api_' . $api_request ) ? 200 : 400 ); |
||
331 | |||
332 | // Trigger an action which plugins can hook into to fulfill the request. |
||
333 | do_action( 'woocommerce_api_' . $api_request ); |
||
334 | |||
335 | // Done, clear buffer and exit. |
||
336 | ob_end_clean(); |
||
337 | die( '-1' ); |
||
338 | } |
||
339 | } |
||
340 | |||
341 | /** |
||
342 | * Init WP REST API. |
||
343 | * |
||
344 | * @since 2.6.0 |
||
345 | */ |
||
346 | private function rest_api_init() { |
||
347 | global $wp_version; |
||
348 | |||
349 | // REST API was included starting WordPress 4.4. |
||
350 | if ( version_compare( $wp_version, 4.4, '<' ) ) { |
||
351 | return; |
||
352 | } |
||
353 | |||
354 | $this->rest_api_includes(); |
||
355 | |||
356 | // Init REST API routes. |
||
357 | add_action( 'rest_api_init', array( $this, 'register_rest_routes' ) ); |
||
358 | } |
||
359 | |||
360 | /** |
||
361 | * Include REST API classes. |
||
362 | * |
||
363 | * @since 2.6.0 |
||
364 | */ |
||
365 | private function rest_api_includes() { |
||
366 | // Exception handler. |
||
367 | include_once( 'api/class-wc-rest-exception.php' ); |
||
368 | |||
369 | // Authentication. |
||
370 | include_once( 'api/class-wc-rest-authentication.php' ); |
||
371 | |||
372 | // WP-API classes and functions. |
||
373 | include_once( 'vendor/wp-rest-functions.php' ); |
||
374 | if ( ! class_exists( 'WP_REST_Controller' ) ) { |
||
375 | include_once( 'vendor/class-wp-rest-controller.php' ); |
||
376 | } |
||
377 | |||
378 | // Abstract controllers. |
||
379 | include_once( 'abstracts/abstract-wc-rest-controller.php' ); |
||
380 | include_once( 'abstracts/abstract-wc-rest-posts-controller.php' ); |
||
381 | include_once( 'abstracts/abstract-wc-rest-terms-controller.php' ); |
||
382 | |||
383 | // REST API controllers. |
||
384 | include_once( 'api/class-wc-rest-coupons-controller.php' ); |
||
385 | include_once( 'api/class-wc-rest-customer-downloads-controller.php' ); |
||
386 | include_once( 'api/class-wc-rest-customers-controller.php' ); |
||
387 | include_once( 'api/class-wc-rest-order-notes-controller.php' ); |
||
388 | include_once( 'api/class-wc-rest-order-refunds-controller.php' ); |
||
389 | include_once( 'api/class-wc-rest-orders-controller.php' ); |
||
390 | include_once( 'api/class-wc-rest-product-attribute-terms-controller.php' ); |
||
391 | include_once( 'api/class-wc-rest-product-attributes-controller.php' ); |
||
392 | include_once( 'api/class-wc-rest-product-categories-controller.php' ); |
||
393 | include_once( 'api/class-wc-rest-product-reviews-controller.php' ); |
||
394 | include_once( 'api/class-wc-rest-product-shipping-classes-controller.php' ); |
||
395 | include_once( 'api/class-wc-rest-product-tags-controller.php' ); |
||
396 | include_once( 'api/class-wc-rest-products-controller.php' ); |
||
397 | include_once( 'api/class-wc-rest-report-sales-controller.php' ); |
||
398 | include_once( 'api/class-wc-rest-report-top-sellers-controller.php' ); |
||
399 | include_once( 'api/class-wc-rest-reports-controller.php' ); |
||
400 | include_once( 'api/class-wc-rest-tax-classes-controller.php' ); |
||
401 | include_once( 'api/class-wc-rest-taxes-controller.php' ); |
||
402 | include_once( 'api/class-wc-rest-webhook-deliveries.php' ); |
||
403 | include_once( 'api/class-wc-rest-webhooks-controller.php' ); |
||
404 | } |
||
405 | |||
406 | /** |
||
407 | * Register REST API routes. |
||
408 | * |
||
409 | * @since 2.6.0 |
||
410 | */ |
||
411 | public function register_rest_routes() { |
||
412 | $controllers = array( |
||
413 | 'WC_REST_Coupons_Controller', |
||
414 | 'WC_REST_Customer_Downloads_Controller', |
||
415 | 'WC_REST_Customers_Controller', |
||
416 | 'WC_REST_Order_Notes_Controller', |
||
417 | 'WC_REST_Order_Refunds_Controller', |
||
418 | 'WC_REST_Orders_Controller', |
||
419 | 'WC_REST_Product_Attribute_Terms_Controller', |
||
420 | 'WC_REST_Product_Attributes_Controller', |
||
421 | 'WC_REST_Product_Categories_Controller', |
||
422 | 'WC_REST_Product_Reviews_Controller', |
||
423 | 'WC_REST_Product_Shipping_Classes_Controller', |
||
424 | 'WC_REST_Product_Tags_Controller', |
||
425 | 'WC_REST_Products_Controller', |
||
426 | 'WC_REST_Report_Sales_Controller', |
||
427 | 'WC_REST_Report_Top_Sellers_Controller', |
||
428 | 'WC_REST_Reports_Controller', |
||
429 | 'WC_REST_Tax_Classes_Controller', |
||
430 | 'WC_REST_Taxes_Controller', |
||
431 | 'WC_REST_Webhook_Deliveries_Controller', |
||
432 | 'WC_REST_Webhooks_Controller', |
||
433 | ); |
||
434 | |||
435 | foreach ( $controllers as $controller ) { |
||
436 | $this->$controller = new $controller(); |
||
437 | $this->$controller->register_routes(); |
||
438 | } |
||
439 | } |
||
440 | } |
||
441 | |||
442 | endif; |
||
443 | |||
444 | return new WC_API(); |
||
445 |
Adding a
@return
annotation to a constructor is not recommended, since a constructor does not have a meaningful return value.Please refer to the PHP core documentation on constructors.