204 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Class to handle Threats
 | |
|  *
 | |
|  * @package automattic/jetpack-protect-plugin
 | |
|  */
 | |
| 
 | |
| namespace Automattic\Jetpack\Protect;
 | |
| 
 | |
| use Automattic\Jetpack\Connection\Client;
 | |
| use Automattic\Jetpack\Connection\Manager as Connection_Manager;
 | |
| use Jetpack_Options;
 | |
| use WP_Error;
 | |
| 
 | |
| /**
 | |
|  * Class that handles management of individual threats.
 | |
|  */
 | |
| class Threats {
 | |
| 	/**
 | |
| 	 * Gets the base "Alerts" (Threats) endpoint.
 | |
| 	 *
 | |
| 	 * @return WP_Error|string
 | |
| 	 */
 | |
| 	private static function get_api_base() {
 | |
| 		$blog_id      = Jetpack_Options::get_option( 'id' );
 | |
| 		$is_connected = ( new Connection_Manager() )->is_connected();
 | |
| 
 | |
| 		if ( ! $blog_id || ! $is_connected ) {
 | |
| 			return new WP_Error( 'site_not_connected' );
 | |
| 		}
 | |
| 
 | |
| 		$api_url = sprintf( '/sites/%d/alerts', $blog_id );
 | |
| 
 | |
| 		return $api_url;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Update Threat
 | |
| 	 *
 | |
| 	 * @param string $threat_id The threat ID.
 | |
| 	 * @param array  $updates   The keys/values to update.
 | |
| 	 *
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	public static function update_threat( $threat_id, $updates ) {
 | |
| 		$api_base = self::get_api_base( $threat_id );
 | |
| 		if ( is_wp_error( $api_base ) ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		$response = Client::wpcom_json_api_request_as_user(
 | |
| 			"$api_base/$threat_id",
 | |
| 			'2',
 | |
| 			array( 'method' => 'POST' ),
 | |
| 			wp_json_encode( $updates ),
 | |
| 			'wpcom'
 | |
| 		);
 | |
| 
 | |
| 		$response_code = wp_remote_retrieve_response_code( $response );
 | |
| 
 | |
| 		if ( is_wp_error( $response ) || 200 !== $response_code ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		// clear the now out-of-date cache
 | |
| 		Scan_Status::delete_option();
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Ignore Threat
 | |
| 	 *
 | |
| 	 * @param string $threat_id The threat ID.
 | |
| 	 *
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	public static function ignore_threat( $threat_id ) {
 | |
| 		return self::update_threat( $threat_id, array( 'ignore' => true ) );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Fix Threats
 | |
| 	 *
 | |
| 	 * @param array<string> $threat_ids Threat IDs.
 | |
| 	 *
 | |
| 	 * @return bool|array
 | |
| 	 */
 | |
| 	public static function fix_threats( $threat_ids ) {
 | |
| 		$api_base = self::get_api_base();
 | |
| 		if ( is_wp_error( $api_base ) ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		$response = Client::wpcom_json_api_request_as_user(
 | |
| 			"$api_base/fix",
 | |
| 			'2',
 | |
| 			array( 'method' => 'POST' ),
 | |
| 			wp_json_encode(
 | |
| 				array(
 | |
| 					'threat_ids' => $threat_ids,
 | |
| 				)
 | |
| 			),
 | |
| 			'wpcom'
 | |
| 		);
 | |
| 
 | |
| 		$response_code = wp_remote_retrieve_response_code( $response );
 | |
| 
 | |
| 		if ( is_wp_error( $response ) || 200 !== $response_code ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		// clear the now out-of-date cache
 | |
| 		Scan_Status::delete_option();
 | |
| 
 | |
| 		$parsed_response = json_decode( $response['body'] );
 | |
| 
 | |
| 		if ( ! $parsed_response ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		return $parsed_response;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Fix Threats Status
 | |
| 	 *
 | |
| 	 * @param array<string> $threat_ids Threat IDs.
 | |
| 	 *
 | |
| 	 * @return bool|array
 | |
| 	 */
 | |
| 	public static function fix_threats_status( $threat_ids ) {
 | |
| 		$api_base = self::get_api_base();
 | |
| 		if ( is_wp_error( $api_base ) ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		$response = Client::wpcom_json_api_request_as_user(
 | |
| 			add_query_arg( 'threat_ids', $threat_ids, "$api_base/fix" ),
 | |
| 			'2',
 | |
| 			array( 'method' => 'GET' ),
 | |
| 			null,
 | |
| 			'wpcom'
 | |
| 		);
 | |
| 
 | |
| 		$response_code = wp_remote_retrieve_response_code( $response );
 | |
| 
 | |
| 		if ( is_wp_error( $response ) || 200 !== $response_code ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		$parsed_response = json_decode( $response['body'] );
 | |
| 
 | |
| 		if ( ! $parsed_response ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		// clear the potentially out-of-date cache
 | |
| 		Scan_Status::delete_option();
 | |
| 
 | |
| 		return $parsed_response;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Scan enqueue
 | |
| 	 *
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	public static function scan() {
 | |
| 		$blog_id      = Jetpack_Options::get_option( 'id' );
 | |
| 		$is_connected = ( new Connection_Manager() )->is_connected();
 | |
| 
 | |
| 		if ( ! $blog_id || ! $is_connected ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		$api_base = sprintf( '/sites/%d/scan', $blog_id );
 | |
| 
 | |
| 		if ( is_wp_error( $api_base ) ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		$response = Client::wpcom_json_api_request_as_blog(
 | |
| 			"$api_base/enqueue",
 | |
| 			'2',
 | |
| 			array( 'method' => 'POST' ),
 | |
| 			null,
 | |
| 			'wpcom'
 | |
| 		);
 | |
| 
 | |
| 		$response_code = wp_remote_retrieve_response_code( $response );
 | |
| 
 | |
| 		if ( is_wp_error( $response ) || 200 !== $response_code ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		// clear the now out-of-date cache
 | |
| 		Scan_Status::delete_option();
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| }
 |