summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/jetpack_vendor/automattic/jetpack-backup/src/class-jetpack-backup.php')
-rw-r--r--plugins/jetpack/jetpack_vendor/automattic/jetpack-backup/src/class-jetpack-backup.php378
1 files changed, 378 insertions, 0 deletions
diff --git a/plugins/jetpack/jetpack_vendor/automattic/jetpack-backup/src/class-jetpack-backup.php b/plugins/jetpack/jetpack_vendor/automattic/jetpack-backup/src/class-jetpack-backup.php
new file mode 100644
index 00000000..aed428ae
--- /dev/null
+++ b/plugins/jetpack/jetpack_vendor/automattic/jetpack-backup/src/class-jetpack-backup.php
@@ -0,0 +1,378 @@
+<?php
+/**
+ * Primary class file for the Jetpack Backup plugin.
+ *
+ * @package automattic/jetpack-backup-plugin
+ */
+
+if ( ! defined( 'ABSPATH' ) ) {
+ exit;
+}
+
+use Automattic\Jetpack\Admin_UI\Admin_Menu;
+use Automattic\Jetpack\Assets;
+use Automattic\Jetpack\Backup\Initial_State as Backup_Initial_State;
+use Automattic\Jetpack\Backup\Jetpack_Backup_Upgrades;
+use Automattic\Jetpack\Connection\Initial_State as Connection_Initial_State;
+use Automattic\Jetpack\Connection\Manager as Connection_Manager;
+use Automattic\Jetpack\Connection\Rest_Authentication as Connection_Rest_Authentication;
+use Automattic\Jetpack\My_Jetpack\Initializer as My_Jetpack_Initializer;
+use Automattic\Jetpack\Status;
+
+/**
+ * Class Jetpack_Backup
+ */
+class Jetpack_Backup {
+
+ /**
+ * Slug.
+ *
+ * @var string
+ */
+ const JETPACK_BACKUP_SLUG = 'jetpack-backup';
+
+ /**
+ * Backup name.
+ *
+ * @var string
+ */
+ const JETPACK_BACKUP_NAME = 'Jetpack Backup';
+
+ /**
+ * Backup URL.
+ *
+ * @var string
+ */
+ const JETPACK_BACKUP_URI = 'https://jetpack.com/jetpack-backup';
+
+ /**
+ * Promoted product.
+ *
+ * @var string
+ */
+ const JETPACK_BACKUP_PROMOTED_PRODUCT = 'jetpack_backup_t1_yearly';
+
+ /**
+ * Jetpack Backup DB version.
+ *
+ * @var string
+ */
+ const JETPACK_BACKUP_DB_VERSION = '2';
+
+ /**
+ * Constructor.
+ */
+ public static function initialize() {
+ if ( did_action( 'jetpack_backup_initialized' ) ) {
+ return;
+ }
+
+ // Set up the REST authentication hooks.
+ Connection_Rest_Authentication::init();
+
+ add_action( 'rest_api_init', array( __CLASS__, 'register_rest_routes' ) );
+
+ $page_suffix = Admin_Menu::add_menu(
+ __( 'Jetpack Backup', 'jetpack-backup-pkg' ),
+ _x( 'Backup', 'The Jetpack Backup product name, without the Jetpack prefix', 'jetpack-backup-pkg' ),
+ 'manage_options',
+ 'jetpack-backup',
+ array( __CLASS__, 'plugin_settings_page' ),
+ 99
+ );
+ add_action( 'load-' . $page_suffix, array( __CLASS__, 'admin_init' ) );
+
+ // Init Jetpack packages and ConnectionUI.
+ add_action(
+ 'plugins_loaded',
+ function () {
+ $config = new Automattic\Jetpack\Config();
+ // Connection package.
+ $config->ensure(
+ 'connection',
+ array(
+ 'slug' => self::JETPACK_BACKUP_SLUG,
+ 'name' => self::JETPACK_BACKUP_NAME,
+ 'url_info' => self::JETPACK_BACKUP_URI,
+ )
+ );
+ // Sync package.
+ $config->ensure( 'sync' );
+
+ // Identity crisis package.
+ $config->ensure( 'identity_crisis' );
+ },
+ 1
+ );
+
+ add_action( 'plugins_loaded', array( __CLASS__, 'maybe_upgrade_db' ), 20 );
+
+ My_Jetpack_Initializer::init();
+
+ /**
+ * Runs right after the Jetpack Backup package is initialized.
+ *
+ * @since 1.3.0
+ */
+ do_action( 'jetpack_backup_initialized' );
+ }
+
+ /**
+ * Initialize the admin resources.
+ */
+ public static function admin_init() {
+ add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_admin_scripts' ) );
+ }
+
+ /**
+ * Checks current version against version in code and run upgrades if we are running a new version
+ */
+ public static function maybe_upgrade_db() {
+ $current_db_version = get_option( 'jetpack_backup_db_version' );
+ if ( version_compare( $current_db_version, self::JETPACK_BACKUP_DB_VERSION, '<' ) ) {
+ update_option( 'jetpack_backup_db_version', self::JETPACK_BACKUP_DB_VERSION );
+ Jetpack_Backup_Upgrades::upgrade();
+ }
+ }
+
+ /**
+ * Enqueue plugin admin scripts and styles.
+ */
+ public static function enqueue_admin_scripts() {
+ $status = new Status();
+ $manager = new Connection_Manager( 'jetpack-backup' );
+
+ Assets::register_script(
+ 'jetpack-backup',
+ '../build/index.js',
+ __FILE__,
+ array(
+ 'in_footer' => true,
+ 'textdomain' => 'jetpack-backup-pkg',
+ )
+ );
+ Assets::enqueue_script( 'jetpack-backup' );
+ // Initial JS state including JP Connection data.
+ wp_add_inline_script( 'jetpack-backup', self::get_initial_state(), 'before' );
+ wp_add_inline_script( 'jetpack-backup', Connection_Initial_State::render(), 'before' );
+
+ // Load script for analytics.
+ if ( ! $status->is_offline_mode() && $manager->is_connected() ) {
+ wp_enqueue_script( 'jp-tracks', '//stats.wp.com/w.js', array(), gmdate( 'YW' ), true );
+ }
+ }
+
+ /**
+ * Main plugin settings page.
+ */
+ public static function plugin_settings_page() {
+ ?>
+ <div id="jetpack-backup-root"></div>
+ <?php
+ }
+
+ /**
+ * Return the rendered initial state JavaScript code.
+ *
+ * @return string
+ */
+ private static function get_initial_state() {
+ return ( new Backup_Initial_State() )->render();
+ }
+
+ /**
+ * Register REST API
+ */
+ public static function register_rest_routes() {
+
+ // Get information on most recent 10 backups.
+ register_rest_route(
+ 'jetpack/v4',
+ '/backups',
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => __CLASS__ . '::get_recent_backups',
+ 'permission_callback' => __CLASS__ . '::backups_permissions_callback',
+ )
+ );
+
+ // Get site backup/scan/anti-spam capabilities.
+ register_rest_route(
+ 'jetpack/v4',
+ '/backup-capabilities',
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => __CLASS__ . '::get_backup_capabilities',
+ 'permission_callback' => __CLASS__ . '::backups_permissions_callback',
+ )
+ );
+
+ // Get information on site products.
+ // Backup plugin version of /site/purchases from JP plugin.
+ // Revert once this route and MyPlan component are extracted to a common package.
+ register_rest_route(
+ 'jetpack/v4',
+ '/site/current-purchases',
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => __CLASS__ . '::get_site_current_purchases',
+ 'permission_callback' => __CLASS__ . '::backups_permissions_callback',
+ )
+ );
+
+ // Get currently promoted product from the product's endpoint.
+ register_rest_route(
+ 'jetpack/v4',
+ '/backup-promoted-product-info',
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => __CLASS__ . '::get_backup_promoted_product_info',
+ 'permission_callback' => __CLASS__ . '::backups_permissions_callback',
+ )
+ );
+ }
+ /**
+ * The backup calls should only occur from a signed in admin user
+ *
+ * @access public
+ * @static
+ *
+ * @return true|WP_Error
+ */
+ public static function backups_permissions_callback() {
+ return current_user_can( 'manage_options' );
+ }
+
+ /**
+ * Get information about recent backups
+ *
+ * @access public
+ * @static
+ *
+ * @return array An array of recent backups
+ */
+ public static function get_recent_backups() {
+ $blog_id = \Jetpack_Options::get_option( 'id' );
+
+ $response = Automattic\Jetpack\Connection\Client::wpcom_json_api_request_as_blog(
+ '/sites/' . $blog_id . '/rewind/backups',
+ 'v2',
+ array(),
+ null,
+ 'wpcom'
+ );
+
+ if ( 200 !== $response['response']['code'] ) {
+ return null;
+ }
+
+ return rest_ensure_response(
+ json_decode( $response['body'], true )
+ );
+ }
+
+ /**
+ * Get an array of backup/scan/anti-spam site capabilities
+ *
+ * @access public
+ * @static
+ *
+ * @return array An array of capabilities
+ */
+ public static function get_backup_capabilities() {
+ $blog_id = \Jetpack_Options::get_option( 'id' );
+
+ $response = Automattic\Jetpack\Connection\Client::wpcom_json_api_request_as_user(
+ '/sites/' . $blog_id . '/rewind/capabilities',
+ 'v2',
+ array(),
+ null,
+ 'wpcom'
+ );
+
+ if ( is_wp_error( $response ) ) {
+ return null;
+ }
+
+ if ( 200 !== $response['response']['code'] ) {
+ return null;
+ }
+
+ return rest_ensure_response(
+ json_decode( $response['body'], true )
+ );
+ }
+
+ /**
+ * Gets information about the currently promoted backup product.
+ *
+ * @return string|WP_Error A JSON object of the current backup product being promoted if the request was successful, or a WP_Error otherwise.
+ */
+ public static function get_backup_promoted_product_info() {
+ $request_url = 'https://public-api.wordpress.com/rest/v1.1/products?locale=' . get_user_locale() . '&type=jetpack';
+ $wpcom_request = wp_remote_get( esc_url_raw( $request_url ) );
+ $response_code = wp_remote_retrieve_response_code( $wpcom_request );
+ if ( 200 === $response_code ) {
+ $products = json_decode( wp_remote_retrieve_body( $wpcom_request ) );
+ return $products->{self::JETPACK_BACKUP_PROMOTED_PRODUCT};
+ } else {
+ // Something went wrong so we'll just return the response without caching.
+ return new WP_Error(
+ 'failed_to_fetch_data',
+ esc_html__( 'Unable to fetch the requested data.', 'jetpack-backup-pkg' ),
+ array(
+ 'status' => $response_code,
+ 'request' => $wpcom_request,
+ )
+ );
+ }
+ }
+
+ /**
+ * Removes plugin from the connection manager
+ * If it's the last plugin using the connection, the site will be disconnected.
+ *
+ * @access public
+ * @static
+ */
+ public static function plugin_deactivation() {
+ $manager = new Connection_Manager( 'jetpack-backup' );
+ $manager->remove_connection();
+ }
+
+ /**
+ * Returns the result of `/sites/%d/purchases` endpoint call.
+ *
+ * @return array of site purchases.
+ */
+ public static function get_site_current_purchases() {
+
+ $request = sprintf( '/sites/%d/purchases', \Jetpack_Options::get_option( 'id' ) );
+ $response = Automattic\Jetpack\Connection\Client::wpcom_json_api_request_as_blog( $request, '1.1' );
+
+ // Bail if there was an error or malformed response.
+ if ( is_wp_error( $response ) || ! is_array( $response ) || ! isset( $response['body'] ) ) {
+ return self::get_failed_fetch_error();
+ }
+
+ if ( 200 !== (int) wp_remote_retrieve_response_code( $response ) ) {
+ return self::get_failed_fetch_error();
+ }
+
+ // Decode the results.
+ $results = json_decode( $response['body'], true );
+
+ // Bail if there were no results or purchase details returned.
+ if ( ! is_array( $results ) ) {
+ return self::get_failed_fetch_error();
+ }
+
+ return rest_ensure_response(
+ array(
+ 'code' => 'success',
+ 'message' => esc_html__( 'Site purchases correctly received.', 'jetpack-backup-pkg' ),
+ 'data' => wp_remote_retrieve_body( $response ),
+ )
+ );
+ }
+}