laipower/wp-content/plugins/jetpack-protect/jetpack_vendor/automattic/jetpack-my-jetpack/src/class-rest-products.php

249 lines
6.6 KiB
PHP

<?php
/**
* Sets up the Products REST API endpoints.
*
* @package automattic/my-jetpack
*/
namespace Automattic\Jetpack\My_Jetpack;
use WP_Error;
/**
* Registers the REST routes for Products.
*/
class REST_Products {
/**
* Constructor.
*/
public function __construct() {
register_rest_route(
'my-jetpack/v1',
'site/products',
array(
array(
'methods' => \WP_REST_Server::READABLE,
'callback' => __CLASS__ . '::get_products',
'permission_callback' => __CLASS__ . '::permissions_callback',
),
'schema' => array( $this, 'get_products_schema' ),
)
);
$product_arg = array(
'description' => __( 'Product slug', 'jetpack-my-jetpack' ),
'type' => 'string',
'enum' => Products::get_products_slugs(),
'required' => true,
'validate_callback' => __CLASS__ . '::check_product_argument',
);
register_rest_route(
'my-jetpack/v1',
'site/products/(?P<product>[a-z\-]+)',
array(
array(
'methods' => \WP_REST_Server::READABLE,
'callback' => __CLASS__ . '::get_product',
'permission_callback' => __CLASS__ . '::permissions_callback',
'args' => array(
'product' => $product_arg,
),
),
array(
'methods' => \WP_REST_Server::EDITABLE,
'callback' => __CLASS__ . '::activate_product',
'permission_callback' => __CLASS__ . '::edit_permissions_callback',
'args' => array(
'product' => $product_arg,
),
),
array(
'methods' => \WP_REST_Server::DELETABLE,
'callback' => __CLASS__ . '::deactivate_product',
'permission_callback' => __CLASS__ . '::edit_permissions_callback',
'args' => array(
'product' => $product_arg,
),
),
)
);
register_rest_route(
'my-jetpack/v1',
'site/products/(?P<product>[a-z\-]+)/install-standalone',
array(
array(
'methods' => \WP_REST_Server::EDITABLE,
'callback' => __CLASS__ . '::install_standalone',
'permission_callback' => __CLASS__ . '::edit_permissions_callback',
'args' => array(
'product' => $product_arg,
),
),
)
);
}
/**
* Get the schema for the products endpoint
*
* @return array
*/
public function get_products_schema() {
return array(
'$schema' => 'http://json-schema.org/draft-04/schema#',
'title' => 'products',
'type' => 'object',
'properties' => Products::get_product_data_schema(),
);
}
/**
* Check user capability to access the endpoint.
*
* @access public
* @static
*
* @return true|WP_Error
*/
public static function permissions_callback() {
return current_user_can( 'manage_options' );
}
/**
* Check Product arguments.
*
* @access public
* @static
*
* @param mixed $value - Value of the 'product' argument.
* @return true|WP_Error True if the value is valid, WP_Error otherwise.
*/
public static function check_product_argument( $value ) {
if ( ! is_string( $value ) ) {
return new WP_Error(
'rest_invalid_param',
esc_html__( 'The product argument must be a string.', 'jetpack-my-jetpack' ),
array( 'status' => 400 )
);
}
return true;
}
/**
* Site products endpoint.
*
* @return array of site products list.
*/
public static function get_products() {
$response = Products::get_products();
return rest_ensure_response( $response, 200 );
}
/**
* Site single product endpoint.
*
* @param \WP_REST_Request $request The request object.
* @return array of site products list.
*/
public static function get_product( $request ) {
$product_slug = $request->get_param( 'product' );
return rest_ensure_response( Products::get_product( $product_slug ), 200 );
}
/**
* Check permission to edit product
*
* @return bool
*/
public static function edit_permissions_callback() {
if ( ! current_user_can( 'activate_plugins' ) ) {
return false;
}
if ( is_multisite() && ! current_user_can( 'manage_network' ) ) {
return false;
}
return true;
}
/**
* Callback for activating a product
*
* @param \WP_REST_Request $request The request object.
* @return \WP_REST_Response
*/
public static function activate_product( $request ) {
$product_slug = $request->get_param( 'product' );
$product = Products::get_product( $product_slug );
if ( ! isset( $product['class'] ) ) {
return new \WP_Error(
'not_implemented',
esc_html__( 'The product class handler is not implemented', 'jetpack-my-jetpack' ),
array( 'status' => 501 )
);
}
$activate_product_result = call_user_func( array( $product['class'], 'activate' ) );
if ( is_wp_error( $activate_product_result ) ) {
$activate_product_result->add_data( array( 'status' => 400 ) );
return $activate_product_result;
}
return rest_ensure_response( Products::get_product( $product_slug ), 200 );
}
/**
* Callback for deactivating a product
*
* @param \WP_REST_Request $request The request object.
* @return \WP_REST_Response
*/
public static function deactivate_product( $request ) {
$product_slug = $request->get_param( 'product' );
$product = Products::get_product( $product_slug );
if ( ! isset( $product['class'] ) ) {
return new \WP_Error(
'not_implemented',
esc_html__( 'The product class handler is not implemented', 'jetpack-my-jetpack' ),
array( 'status' => 501 )
);
}
$deactivate_product_result = call_user_func( array( $product['class'], 'deactivate' ) );
if ( is_wp_error( $deactivate_product_result ) ) {
$deactivate_product_result->add_data( array( 'status' => 400 ) );
return $deactivate_product_result;
}
return rest_ensure_response( Products::get_product( $product_slug ), 200 );
}
/**
* Callback for installing the standalone plugin on a Hybrid Product.
*
* @param \WP_REST_Request $request The request object.
* @return \WP_REST_Response
*/
public static function install_standalone( $request ) {
$product_slug = $request->get_param( 'product' );
$product = Products::get_product( $product_slug );
if ( ! isset( $product['class'] ) ) {
return new \WP_Error(
'not_implemented',
__( 'The product class handler is not implemented', 'jetpack-my-jetpack' ),
array( 'status' => 501 )
);
}
$install_product_result = call_user_func( array( $product['class'], 'install_and_activate_standalone' ) );
if ( is_wp_error( $install_product_result ) ) {
$install_product_result->add_data( array( 'status' => 400 ) );
return $install_product_result;
}
return rest_ensure_response( Products::get_product( $product_slug ), 200 );
}
}