HEX
Server: LiteSpeed
System: Linux melbournecleaninggroup 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: www-data (33)
PHP: 7.3.33-1+focal
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
File: /var/www/html/wp-content/plugins/backup-guard-security-platinum/com/lib/AuthClient.php
<?php

namespace BackupGuard\Security;
use BackupGuard\Security\API as API;

require_once(dirname(__FILE__).'/BackupGuard/Client.php');

class AuthClient
{
	private static $instance = null;
	private $client = null;
	private $accessToken = '';
	private $accessTokenExpires = 0;

	private function __construct()
	{
		$this->accessToken = Config::get('BGS_BACKUPGUARD_ACCESS_TOKEN', true);
		$this->accessTokenExpires = Config::get('BGS_BACKUPGUARD_ACCESS_TOKEN_EXPIRES', true);

		$this->client = new API\Client($this->accessToken);
	}

	private function __clone()
	{

	}

	public static function getInstance()
	{
		if (!self::$instance) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	public function getAccessToken()
	{
		return $this->accessToken;
	}

	public function login($email, $password)
	{
		try {
			$accessToken = $this->createAccessToken($email, $password);
		}
		catch (API\Exception $ex) {
			return false;
		}

		$this->client->setAccessToken($accessToken);

		return true;
	}

	public function logout()
	{
		$this->setTokens(); //reset all tokens
		$this->client->setAccessToken(null);
		return true;
	}

	public function getCurrentUser()
	{
		try {
			$user = $this->client->getCurrentUser();
		}
		catch (API\Exception $ex) {
			return false;
		}

		return $user;
	}

	public function validateUrl($url)
	{
		if (!$this->prepareAuthorizedRequest()) {
			return -1;
		}

		try {
			$result = $this->client->validateUrl($url, BGS_PRODUCT_IDENTIFIER);
		}
		catch (API\Exception $ex) {
			$result = $this->handleUnauthorizedException($ex);
			if ($result === true) { //we can try again
				$result = $this->validateUrl($url);
			}
		}

		return $result;
	}

	public function getAllUserProducts()
	{
		if (!$this->prepareAuthorizedRequest()) {
			return -1;
		}

		try {
			$result = $this->client->getAllUserProducts(BGS_PRODUCT_IDENTIFIER);
		}
		catch (API\Exception $ex) {
			$result = $this->handleUnauthorizedException($ex);
			if ($result === true) { //we can try again
				$result = $this->getAllUserProducts();
			}
		}

		return $result;
	}

	public function isAnyLicenseAvailable($products)
	{
		if (empty($products) || !is_array($products)) {
			return false;
		}
		foreach ($products as $product) {
			if (!$product['licenses']) {
				return true;
			}
			$availableLicenses = $product['licenses']-$product['used_licenses'];
			if ($availableLicenses > 0) {
				return true;
			}
		}

		return false;
	}

	public function linkUrlToProduct($url, $userProductId, &$error)
	{
		if (!$this->prepareAuthorizedRequest()) {
			return -1;
		}

		try {
			$result = $this->client->linkUrlToProduct($url, $userProductId);
		}
		catch (API\Exception $ex) {
			$result = $this->handleUnauthorizedException($ex);
			if ($result === true) { //we can try again
				$result = $this->linkUrlToProduct($url, $userProductId);
			}

			$error = $ex->getMessage();
		}

		return $result;
	}

	public function filterUpdateChecks($options)
	{
		//we need to be sure that access token is fresh before checking for updates
		$this->prepareAuthorizedRequest();

		$options['headers']['access_token'] = $this->getAccessToken();

		return $options;
	}

	private function handleUnauthorizedException($ex)
	{
		if ($ex instanceof API\UnauthorizedException) {
			//access token has expired or is invalid, refresh it
			if ($this->refreshAccessToken()) {
				return true;
			}
			else {
				return -1; //could not refresh token, login is required
			}
		}

		return false;
	}

	private function prepareAuthorizedRequest()
	{
		//no access token found, login is required
		if (!$this->accessToken) {
			return false;
		}

		//access token is expired, try to refresh it
		if (time() > $this->accessTokenExpires) {
			if (!$this->refreshAccessToken()) {
				return false;
			}
		}

		return true;
	}

	private function setTokens($accessToken = '', $accessTokenExpires = 0, $refreshToken = '')
	{
		$this->accessToken = $accessToken;
		$this->accessTokenExpires = $accessTokenExpires;
		$this->client->setAccessToken($accessToken);

		Config::set('BGS_BACKUPGUARD_ACCESS_TOKEN', $accessToken, true);
		Config::set('BGS_BACKUPGUARD_ACCESS_TOKEN_EXPIRES', $accessTokenExpires, true);

		Config::set('BGS_BACKUPGUARD_REFRESH_TOKEN', $refreshToken, true);
	}

	private function createAccessToken($email, $password)
	{
		$tokens = $this->client->createAccessToken(
			BGS_BACKUPGUARD_CLIENT_ID,
			BGS_BACKUPGUARD_CLIENT_SECRET,
			$email,
			$password
		);

		$this->setTokens(
			$tokens['access_token'],
			time() + API\Config::TOKEN_EXPIRES,
			$tokens['refresh_token']
		);

		return $tokens['access_token'];
	}

	private function refreshAccessToken()
	{
		$refreshToken = Config::get('BGS_BACKUPGUARD_REFRESH_TOKEN', true);
		if (!$refreshToken) {
			$this->logout();
			return false;
		}

		try {
			$tokens = $this->client->refreshAccessToken(
				BGS_BACKUPGUARD_CLIENT_ID,
				BGS_BACKUPGUARD_CLIENT_SECRET,
				$refreshToken
			);
		}
		catch (API\Exception $ex) { //for some reason the refresh token doesn't work
			$this->logout();
			return false;
		}

		$this->setTokens(
			$tokens['access_token'],
			time() + API\Config::TOKEN_EXPIRES,
			$tokens['refresh_token']
		);

		return $tokens['access_token'];
	}
}