woothemes /
woocommerce
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
@returnannotation 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.