161 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace WPScan;
 | 
						|
 | 
						|
// Exit if accessed directly.
 | 
						|
defined( 'ABSPATH' ) || exit;
 | 
						|
 | 
						|
/**
 | 
						|
 * Account.
 | 
						|
 *
 | 
						|
 * Deals with user's wpvulndb API user accounts.
 | 
						|
 *
 | 
						|
 * @since 1.0.0
 | 
						|
 */
 | 
						|
class Account {
 | 
						|
	/**
 | 
						|
	 * Class constructor.
 | 
						|
	 *
 | 
						|
	 * @since 1.0.0
 | 
						|
	 * @param object $parent parent.
 | 
						|
	 * @access public
 | 
						|
	 * @return void
 | 
						|
	 */
 | 
						|
	public function __construct( $parent ) {
 | 
						|
		$this->parent = $parent;
 | 
						|
 | 
						|
		add_action( 'admin_init', array( $this, 'add_account_summary_meta_box' ) );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Update account status by calling the /status endpoint.
 | 
						|
	 *
 | 
						|
	 * @since 1.0.0
 | 
						|
	 * @param string $api_token
 | 
						|
	 * @access public
 | 
						|
	 * @return void
 | 
						|
	 */
 | 
						|
	public function update_account_status( $api_token = null ) {
 | 
						|
		$current = get_option( $this->parent->OPT_ACCOUNT_STATUS, array() );
 | 
						|
		$updated = $current;
 | 
						|
		
 | 
						|
		$req = $this->parent->api_get( '/status', $api_token );
 | 
						|
		
 | 
						|
		if ( is_object( $req ) ) {
 | 
						|
			$updated['plan'] = $req->plan;
 | 
						|
 | 
						|
			// Enterprise users.
 | 
						|
			if ( -1 === $req->requests_remaining ) {
 | 
						|
				$updated['limit']     = __( 'unlimited', 'wpscan' );
 | 
						|
				$updated['remaining'] = __( 'unlimited', 'wpscan' );
 | 
						|
				$updated['reset']     = __( 'unlimited', 'wpscan' );
 | 
						|
			} else {
 | 
						|
				$updated['limit']     = $req->requests_limit;
 | 
						|
				$updated['remaining'] = $req->requests_remaining;
 | 
						|
				$updated['reset']     = $req->requests_reset;
 | 
						|
			}
 | 
						|
 | 
						|
			update_option( $this->parent->OPT_ACCOUNT_STATUS, $updated );
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Add meta box
 | 
						|
	 *
 | 
						|
	 * @since 1.0.0
 | 
						|
	 * @access public
 | 
						|
	 * @return void
 | 
						|
	 */
 | 
						|
	public function add_account_summary_meta_box() {
 | 
						|
		if ( $this->parent->classes['settings']->api_token_set() ) {
 | 
						|
			add_meta_box(
 | 
						|
				'wpscan-account-summary',
 | 
						|
				__( 'Account Status', 'wpscan' ),
 | 
						|
				array( $this, 'do_meta_box_account_summary' ),
 | 
						|
				'wpscan',
 | 
						|
				'side',
 | 
						|
				'low'
 | 
						|
			);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Get account status
 | 
						|
	 *
 | 
						|
	 * @since 1.0.0
 | 
						|
	 * @access public
 | 
						|
	 * @return array
 | 
						|
	 */
 | 
						|
	public function get_account_status() {
 | 
						|
		$defaults = array(
 | 
						|
			'plan'      => 'None',
 | 
						|
			'limit'     => 25,
 | 
						|
			'remaining' => 25,
 | 
						|
			'reset'     => time(),
 | 
						|
		);
 | 
						|
 | 
						|
		return get_option( $this->parent->OPT_ACCOUNT_STATUS, $defaults );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Render account status metabox
 | 
						|
	 *
 | 
						|
	 * @since 1.0.0
 | 
						|
	 * @access public
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	public function do_meta_box_account_summary() {
 | 
						|
		extract( $this->get_account_status() );
 | 
						|
 | 
						|
		if ( 'enterprise' !== $plan ) {
 | 
						|
			if ( ! isset( $limit ) || ! is_numeric( $limit ) ) {
 | 
						|
				return;
 | 
						|
			}
 | 
						|
 | 
						|
			// Reset time in hours.
 | 
						|
			$diff          = $reset - time();
 | 
						|
			$days          = floor( $diff / ( 60 * 60 * 24 ) );
 | 
						|
			$hours         = round( ( $diff - $days * 60 * 60 * 24 ) / ( 60 * 60 ) );
 | 
						|
			$hours_display = $hours > 1 ? __( 'Hours', 'wpscan' ) : __( 'Hour', 'wpscan' );
 | 
						|
 | 
						|
			// Used.
 | 
						|
			$used = $limit - $remaining;
 | 
						|
 | 
						|
			// Usage percentage.
 | 
						|
			$percentage = 0 !== $limit ? ( $used * 100 ) / $limit : 0;
 | 
						|
 | 
						|
			// Usage color.
 | 
						|
			if ( $percentage < 50 ) {
 | 
						|
				$usage_color = 'wpscan-status-green';
 | 
						|
			} elseif ( $percentage >= 50 && $percentage < 95 ) {
 | 
						|
				$usage_color = 'wpscan-status-orange';
 | 
						|
			} else {
 | 
						|
				$usage_color = 'wpscan-status-red';
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			// For enterprise users.
 | 
						|
			$used          = $limit;
 | 
						|
			$hours         = $reset;
 | 
						|
			$hours_display = null;
 | 
						|
			$usage_color   = 'wpscan-status-green';
 | 
						|
		}
 | 
						|
 | 
						|
		// Upgrade button.
 | 
						|
		$btn_text = 'free' === $plan ? __( 'Upgrade', 'wpscan' ) : __( 'Manage', 'wpscan' );
 | 
						|
		$btn_url  = WPSCAN_PROFILE_URL;
 | 
						|
 | 
						|
		// Output data.
 | 
						|
		echo '<ul>';
 | 
						|
		echo '<li>' . __( 'Plan', 'wpscan' ) . '<span>' . esc_html( $plan ) . '</span></li>';
 | 
						|
 | 
						|
		if ( 'enterprise' !== $plan ) {
 | 
						|
			echo '<li>' . __( 'Usage', 'wpscan' ) . "<span class='$usage_color'> $used / $limit </span></li>";
 | 
						|
			echo '<li>' . __( 'Resets In', 'wpscan' ) . "<span> $hours $hours_display </span></li>";
 | 
						|
		}
 | 
						|
		echo '</ul>';
 | 
						|
 | 
						|
		// Output upgrade/manage button.
 | 
						|
		echo "<a class='button button-primary' href='$btn_url' target='_blank'>$btn_text</a>";
 | 
						|
	}
 | 
						|
}
 |