summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/jetpack_vendor/automattic/jetpack-connection/src/class-server-sandbox.php')
-rw-r--r--plugins/jetpack/jetpack_vendor/automattic/jetpack-connection/src/class-server-sandbox.php132
1 files changed, 132 insertions, 0 deletions
diff --git a/plugins/jetpack/jetpack_vendor/automattic/jetpack-connection/src/class-server-sandbox.php b/plugins/jetpack/jetpack_vendor/automattic/jetpack-connection/src/class-server-sandbox.php
new file mode 100644
index 00000000..619194ad
--- /dev/null
+++ b/plugins/jetpack/jetpack_vendor/automattic/jetpack-connection/src/class-server-sandbox.php
@@ -0,0 +1,132 @@
+<?php
+/**
+ * The Server_Sandbox class.
+ *
+ * This feature is only useful for Automattic developers.
+ * It configures Jetpack to talk to staging/sandbox servers
+ * on WordPress.com instead of production servers.
+ *
+ * @package automattic/jetpack-sandbox
+ */
+
+namespace Automattic\Jetpack\Connection;
+
+use Automattic\Jetpack\Constants;
+
+/**
+ * The Server_Sandbox class.
+ */
+class Server_Sandbox {
+
+ /**
+ * Sets up the action hooks for the server sandbox.
+ */
+ public function init() {
+ if ( did_action( 'jetpack_server_sandbox_init' ) ) {
+ return;
+ }
+
+ add_action( 'requests-requests.before_request', array( $this, 'server_sandbox' ), 10, 2 );
+ add_action( 'admin_bar_menu', array( $this, 'admin_bar_add_sandbox_item' ), 999 );
+
+ /**
+ * Fires when the server sandbox is initialized. This action is used to ensure that
+ * the server sandbox action hooks are set up only once.
+ *
+ * @since $$next_version$$
+ */
+ do_action( 'jetpack_server_sandbox_init' );
+ }
+
+ /**
+ * Returns the new url and host values.
+ *
+ * @param string $sandbox Sandbox domain.
+ * @param string $url URL of request about to be made.
+ * @param array $headers Headers of request about to be made.
+ *
+ * @return array [ 'url' => new URL, 'host' => new Host ]
+ */
+ public function server_sandbox_request_parameters( $sandbox, $url, $headers ) {
+ $host = '';
+
+ if ( ! is_string( $sandbox ) || ! is_string( $url ) ) {
+ return array(
+ 'url' => $url,
+ 'host' => $host,
+ );
+ }
+
+ $url_host = wp_parse_url( $url, PHP_URL_HOST );
+
+ switch ( $url_host ) {
+ case 'public-api.wordpress.com':
+ case 'jetpack.wordpress.com':
+ case 'jetpack.com':
+ case 'dashboard.wordpress.com':
+ $host = isset( $headers['Host'] ) ? $headers['Host'] : $url_host;
+ $url = preg_replace(
+ '@^(https?://)' . preg_quote( $url_host, '@' ) . '(?=[/?#].*|$)@',
+ '${1}' . $sandbox,
+ $url,
+ 1
+ );
+ }
+
+ return compact( 'url', 'host' );
+ }
+
+ /**
+ * Modifies parameters of request in order to send the request to the
+ * server specified by `JETPACK__SANDBOX_DOMAIN`.
+ *
+ * Attached to the `requests-requests.before_request` filter.
+ *
+ * @param string $url URL of request about to be made.
+ * @param array $headers Headers of request about to be made.
+ * @return void
+ */
+ public function server_sandbox( &$url, &$headers ) {
+ if ( ! Constants::get_constant( 'JETPACK__SANDBOX_DOMAIN' ) ) {
+ return;
+ }
+
+ $original_url = $url;
+
+ $request_parameters = $this->server_sandbox_request_parameters( Constants::get_constant( 'JETPACK__SANDBOX_DOMAIN' ), $url, $headers );
+
+ $url = $request_parameters['url'];
+
+ if ( $request_parameters['host'] ) {
+ $headers['Host'] = $request_parameters['host'];
+
+ if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
+ error_log( sprintf( "SANDBOXING via '%s': '%s'", Constants::get_constant( 'JETPACK__SANDBOX_DOMAIN' ), $original_url ) ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log
+ }
+ }
+ }
+
+ /**
+ * Adds a "Jetpack API Sandboxed" item to the admin bar if the JETPACK__SANDBOX_DOMAIN
+ * constant is set.
+ *
+ * Attached to the `admin_bar_menu` action.
+ *
+ * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
+ */
+ public function admin_bar_add_sandbox_item( $wp_admin_bar ) {
+ if ( ! Constants::get_constant( 'JETPACK__SANDBOX_DOMAIN' ) ) {
+ return;
+ }
+
+ $node = array(
+ 'id' => 'jetpack-connection-api-sandbox',
+ 'title' => 'Jetpack API Sandboxed',
+ 'meta' => array(
+ 'title' => 'Sandboxing via ' . Constants::get_constant( 'JETPACK__SANDBOX_DOMAIN' ),
+ ),
+ );
+
+ $wp_admin_bar->add_menu( $node );
+ }
+}