%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/security/classes/general/tests/ |
Current File : /home/bitrix/www/bitrix/modules/security/classes/general/tests/cloud_monitor_request.php |
<? /** * Bitrix Framework * @package bitrix * @subpackage security * @copyright 2001-2013 Bitrix */ /** * Class CSecurityCloudMonitorRequest * @since 12.5.0 */ class CSecurityCloudMonitorRequest { const BITRIX_CHECKER_URL_PATH = "/bitrix/site_checker.php"; const REMOTE_STATUS_OK = "ok"; const REMOTE_STATUS_ERROR = "error"; const REMOTE_STATUS_FATAL_ERROR = "fatal_error"; const TIMEOUT = 10; private static $validActions = array("check", "get_results"); protected static $trustedHosts = array("www.1c-bitrix.ru", "www.bitrixsoft.com", "www.bitrix.de"); protected $response = array(); protected $checkingToken = ""; protected $protocolVersion = 2; public function __construct($action, $protocolVersion, $token = "") { if(!in_array($action, self::$validActions)) return null; $this->checkingToken = $token; $this->response = $this->receiveData($action); $this->protocolVersion = $protocolVersion; } /** * @param string $checkingToken * @return $this */ public function setCheckingToken($checkingToken) { $this->checkingToken = $checkingToken; return $this; } /** * @return string */ public function getCheckingToken() { return $this->checkingToken; } /** * Make a request to the Bitrix server and returns the result * @param array $action * @return array|bool */ public function receiveData($action) { $payload = $this->getPayload($action, false); if(!$payload) return false; $response = self::sendRequest($payload); if(!$response) { $response = array(); } if(!isset($response["status"])) { $response["status"] = self::REMOTE_STATUS_FATAL_ERROR; $response["error_text"] = GetMessage("SECURITY_SITE_CHECKER_CONNECTION_ERROR"); } return $response; } /** * @return bool */ public function isOk() { return $this->checkStatus(self::REMOTE_STATUS_OK); } /** * @return bool */ public function isFatalError() { return $this->checkStatus(self::REMOTE_STATUS_FATAL_ERROR); } /** * @return bool */ public function isError() { return $this->checkStatus(self::REMOTE_STATUS_ERROR); } /** * @return bool */ public function isSuccess() { return (isset($this->response["status"])); } /** * @param string $key * @return string */ public function getValue($key) { if(isset($this->response[$key])) { return $this->response[$key]; } else { return ""; } } /** * @param string $status * @return bool */ protected function checkStatus($status) { return (isset($this->response["status"]) && $this->response["status"] === $status); } /** * Generate payload for request to Bitrix * @param string $action - "check" or "receive_results" * @param bool $collectInformation * @return string */ protected function getPayload($action = "check", $collectInformation = true) { if(!in_array($action, self::$validActions)) return false; $payload = array( "action" => $action, "host" => self::getHostName(), "lang" => LANGUAGE_ID, "license_key" => self::getLicenseKey(), "testing_token" => $this->checkingToken, "version" => $this->protocolVersion ); if($collectInformation || $action === "check") { $payload["system_information"] = base64_encode(serialize(self::getSystemInformation())); $payload["additional_information"] = base64_encode(serialize(self::getAdditionalInformation())); } return $payload; } /** * @param string $response * @return array */ protected static function decodeResponse($response) { /** @global CMain $APPLICATION */ global $APPLICATION; $result = json_decode($response, true); if(!defined("BX_UTF")) $result = $APPLICATION->ConvertCharsetArray($result, "UTF-8", LANG_CHARSET); return $result; } /** * Return Bitrix Cloud Security web service url * * @param string $host Bitrix security scanner host. * @return string */ protected static function buildCheckerUrl($host) { return sprintf('https://%s%s', $host, self::BITRIX_CHECKER_URL_PATH); } /** * Return Bitrix Cloud Security host * * @return string */ protected static function getServiceHost() { return COption::GetOptionString("main", "update_site", "www.bitrixsoft.com"); } /** * Send request to Bitrix (check o receive) * @param array $payload * @return array|bool */ protected static function sendRequest(array $payload) { $targetHost = static::getServiceHost(); // Trusted host *must* have a valid SSL certificate $skipSslValidation = !in_array($targetHost, static::$trustedHosts, true); $httpClient = new \Bitrix\Main\Web\HttpClient(array( 'disableSslVerification' => $skipSslValidation, 'streamTimeout' => static::TIMEOUT )); $response = $httpClient->post(self::buildCheckerUrl($targetHost), $payload); if ($response && $httpClient->getStatus() == 200) { return self::decodeResponse($response); } return false; } /** * Return License key, your Captain Obvious * @return string */ protected static function getLicenseKey() { if (defined("LICENSE_KEY")) { $licenseKey = LICENSE_KEY; } else { $licenseKey = "DEMO"; } return md5($licenseKey); } /** * Return system information, such as php version * @return array */ protected static function getSystemInformation() { return CSecuritySystemInformation::getSystemInformation(); } /** * Return additional information, such as P&P or LDAP server information * * @since 14.5.4 * @return array */ protected static function getAdditionalInformation() { return CSecuritySystemInformation::getAdditionalInformation(); } /** * Return host name for site checking * @return string */ protected function getHostName() { $sheme = (CMain::IsHTTPS() ? "https" : "http")."://"; $serverPort = self::getServerPort(); $url = self::getDomainName(); $url .= ($serverPort && strpos($url, ":") === false) ? ":".$serverPort : ""; return $sheme.$url; } /** * Return current server port, except 80 and 443 * @return int|bool */ protected static function getServerPort() { if($_SERVER["SERVER_PORT"] && !in_array($_SERVER["SERVER_PORT"], array(80, 443))) return $_SERVER["SERVER_PORT"]; else return false; } /** * Return current domain name (in puny code for cyrillic domain) * @return string */ protected static function getDomainName() { return CSecuritySystemInformation::getCurrentHost(); } }