diff options
Diffstat (limited to 'plugins/jetpack/jetpack_vendor/automattic/jetpack-licensing/src/class-licensing.php')
-rw-r--r-- | plugins/jetpack/jetpack_vendor/automattic/jetpack-licensing/src/class-licensing.php | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/plugins/jetpack/jetpack_vendor/automattic/jetpack-licensing/src/class-licensing.php b/plugins/jetpack/jetpack_vendor/automattic/jetpack-licensing/src/class-licensing.php new file mode 100644 index 00000000..056004f5 --- /dev/null +++ b/plugins/jetpack/jetpack_vendor/automattic/jetpack-licensing/src/class-licensing.php @@ -0,0 +1,272 @@ +<?php +/** + * A Terms of Service class for Jetpack. + * + * @package automattic/jetpack-licensing + */ + +namespace Automattic\Jetpack; + +use Automattic\Jetpack\Connection\Manager as Connection_Manager; +use Jetpack_IXR_ClientMulticall; +use Jetpack_Options; +use WP_Error; + +/** + * Class Licensing. + * Helper class that is responsible for attaching licenses to the current site. + * + * @since 1.1.1 + */ +class Licensing { + /** + * Name of the WordPress option that holds all known Jetpack licenses. + * + * @const string + */ + const LICENSES_OPTION_NAME = 'jetpack_licenses'; + + /** + * Name of the WordPress transient that holds the last license attaching error, if any. + * + * @const string + */ + const ERROR_TRANSIENT_NAME = 'jetpack_licenses_error'; + + /** + * Holds the singleton instance of this class. + * + * @var self + */ + protected static $instance = false; + + /** + * Singleton. + * + * @static + */ + public static function instance() { + if ( ! self::$instance ) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * Initialize. + * + * @return void + */ + public function initialize() { + add_action( 'add_option_' . self::LICENSES_OPTION_NAME, array( $this, 'attach_stored_licenses' ) ); + add_action( 'update_option_' . self::LICENSES_OPTION_NAME, array( $this, 'attach_stored_licenses' ) ); + add_action( 'jetpack_authorize_ending_authorized', array( $this, 'attach_stored_licenses_on_connection' ) ); + } + + /** + * Get Jetpack connection manager instance. + * + * @return Connection_Manager + */ + protected function connection() { + static $connection; + + if ( null === $connection ) { + $connection = new Connection_Manager(); + } + + return $connection; + } + + /** + * Get the last license attach request error that has occurred, if any. + * + * @return string Human-readable error message or an empty string. + */ + public function last_error() { + return Jetpack_Options::get_option( 'licensing_error', '' ); + } + + /** + * Log an error to be surfaced to the user at a later time. + * + * @param string $error Human-readable error message. + * @return void + */ + public function log_error( $error ) { + $substr = function_exists( 'mb_substr' ) ? 'mb_substr' : 'substr'; + Jetpack_Options::update_option( 'licensing_error', $substr( $error, 0, 1024 ) ); + } + + /** + * Get all stored licenses. + * + * @return string[] License keys. + */ + public function stored_licenses() { + $licenses = (array) get_option( self::LICENSES_OPTION_NAME, array() ); + $licenses = array_filter( $licenses, 'is_scalar' ); + $licenses = array_map( 'strval', $licenses ); + $licenses = array_filter( $licenses ); + + return $licenses; + } + + /** + * Append a license + * + * @param string $license A jetpack license key. + * @return bool True if the option was updated with the new license, false otherwise. + */ + public function append_license( $license ) { + $licenses = $this->stored_licenses(); + + array_push( $licenses, $license ); + + return update_option( self::LICENSES_OPTION_NAME, $licenses ); + } + + /** + * Make an authenticated WP.com XMLRPC multicall request to attach the provided license keys. + * + * @param string[] $licenses License keys to attach. + * @return Jetpack_IXR_ClientMulticall + */ + protected function attach_licenses_request( array $licenses ) { + $xml = new Jetpack_IXR_ClientMulticall( array( 'timeout' => 30 ) ); + + foreach ( $licenses as $license ) { + $xml->addCall( 'jetpack.attachLicense', $license ); + } + + $xml->query(); + + return $xml; + } + + /** + * Attach the given licenses. + * + * @param string[] $licenses Licenses to attach. + * @return array|WP_Error Results for each license (which may include WP_Error instances) or a WP_Error instance. + */ + public function attach_licenses( array $licenses ) { + if ( ! $this->connection()->has_connected_owner() ) { + return new WP_Error( 'not_connected', __( 'Jetpack doesn\'t have a connected owner.', 'jetpack-licensing' ) ); + } + + if ( empty( $licenses ) ) { + return array(); + } + + $xml = $this->attach_licenses_request( $licenses ); + + if ( $xml->isError() ) { + $error = new WP_Error( 'request_failed', __( 'License attach request failed.', 'jetpack-licensing' ) ); + $error->add( $xml->getErrorCode(), $xml->getErrorMessage() ); + return $error; + } + + $results = array_map( + function ( $response ) { + if ( isset( $response['faultCode'] ) || isset( $response['faultString'] ) ) { + return new WP_Error( $response['faultCode'], $response['faultString'] ); + } + + return $response; + }, + (array) $xml->getResponse() + ); + + return $results; + } + + /** + * Attach all stored licenses. + * + * @return array|WP_Error Results for each license (which may include WP_Error instances) or a WP_Error instance. + */ + public function attach_stored_licenses() { + $licenses = $this->stored_licenses(); + $results = $this->attach_licenses( $licenses ); + + if ( is_wp_error( $results ) ) { + if ( 'request_failed' === $results->get_error_code() ) { + $this->log_error( + __( 'Failed to attach your Jetpack license(s). Please try reconnecting Jetpack.', 'jetpack-licensing' ) + ); + } + + return $results; + } + + $failed = array(); + + foreach ( $results as $index => $result ) { + if ( isset( $licenses[ $index ] ) && is_wp_error( $result ) ) { + $failed[] = $licenses[ $index ]; + } + } + + if ( ! empty( $failed ) ) { + $this->log_error( + sprintf( + /* translators: %s is a comma-separated list of license keys. */ + __( 'The following Jetpack licenses are invalid, already in use, or revoked: %s', 'jetpack-licensing' ), + implode( ', ', $failed ) + ) + ); + } + + return $results; + } + + /** + * Attach all stored licenses during connection flow for the connection owner. + * + * @return void + */ + public function attach_stored_licenses_on_connection() { + if ( $this->connection()->is_connection_owner() ) { + $this->attach_stored_licenses(); + } + } + + /** + * Is the current user allowed to use the Licensing Input UI? + * + * @since 1.4.0 + * @return bool + */ + public static function is_licensing_input_enabled() { + /** + * Filter that checks if the user is allowed to see the Licensing UI. `true` enables it. + * + * @since 1.4.0 + * + * @param bool False by default. + */ + return apply_filters( 'jetpack_licensing_ui_enabled', false ) && current_user_can( 'jetpack_connect_user' ); + } + + /** + * Gets the user-licensing activation notice dismissal info. + * + * @since 10.4.0 + * @return array + */ + public function get_license_activation_notice_dismiss() { + + $default = array( + 'last_detached_count' => null, + 'last_dismissed_time' => null, + ); + + if ( $this->connection()->is_user_connected() && $this->connection()->is_connection_owner() ) { + return Jetpack_Options::get_option( 'licensing_activation_notice_dismiss', $default ); + } + + return $default; + } +} |