Your IP : 18.191.86.218


Current Path : /var/www/axolotl/data/www/novosibirsk.axolotls.ru/bitrix/modules/crm/lib/webform/
Upload File :
Current File : /var/www/axolotl/data/www/novosibirsk.axolotls.ru/bitrix/modules/crm/lib/webform/recaptcha.php

<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage crm
 * @copyright 2001-2016 Bitrix
 */
namespace Bitrix\Crm\WebForm;

use Bitrix\Main\Config\Option;
use Bitrix\Main\Context;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Web\Json;
use Bitrix\Main\Web\HttpClient;
use Bitrix\Main\SystemException;

Loc::loadMessages(__FILE__);

/**
 * reCAPTCHA client.
 */
class ReCaptcha
{
	/**
	 * Version of this client library.
	 * @const string
	 */
	const VERSION = 'php_1.1.2';
	const MODULE_ID = 'crm';
	const OPTION_NAME = 'crm_recaptcha';

	/**
	 * Shared secret for the site.
	 * @var string
	 */
	private $secret;

	/**
	 * Error code.
	 * @var string
	 */
	private $error = '';

	/**
	 * Method used to communicate with service. Defaults to POST request.
	 * @var HttpClient
	 */
	private $httpClient;

	/**
	 * Create a configured instance to use the reCAPTCHA service.
	 *
	 * @param string $secret shared secret between site and reCAPTCHA server.
	 * @param HttpClient $httpClient method used to send the request. Defaults to POST.
	 * @throws SystemException if $secret is invalid
	 */
	public function __construct($secret, HttpClient $httpClient = null)
	{
		if (empty($secret))
		{
			throw new SystemException('No secret provided');
		}

		if (!is_string($secret))
		{
			throw new SystemException('The provided secret must be a string');
		}

		$this->secret = $secret;
		if (!is_null($httpClient))
		{
			$this->httpClient = $httpClient;
		}
		else
		{
			$this->httpClient = new HttpClient();
		}
	}

	/**
	 * Calls the reCAPTCHA siteverify API to verify whether the user passes
	 * CAPTCHA test.
	 *
	 * @param string $response The value of 'g-recaptcha-response' in the submitted form.
	 * @param string $remoteIp The end user's IP address.
	 * @return bool Verifying result.
	 */
	public function verify($response, $remoteIp = null)
	{
		$this->error = '';
		// Discard empty solution submissions
		if (empty($response))
		{
			$this->error = Loc::getMessage('CRM_WEBFORM_RECAPTCHA_ERROR_MISSING_INPUT_RESPONSE');
			return false;
		}

		$rawResponse = $this->httpClient->post(
			'https://www.google.com/recaptcha/api/siteverify',
			array(
				'secret' => $this->secret,
				'response' => $response,
				'remoteip' => $remoteIp ? $remoteIp : Context::getCurrent()->getServer()->get('REMOTE_ADDR'),
			)
		);

		try
		{
			$response = Json::decode($rawResponse);
		}
		catch (\Exception $exception)
		{
			$this->error = $exception->getMessage();
			return false;
		}

		if (!empty($response['error-codes']))
		{
			switch ($response['error-codes'][0])
			{
				case 'invalid-input-response':
					$this->error = Loc::getMessage('CRM_WEBFORM_RECAPTCHA_ERROR_INVALID_INPUT_RESPONSE');
					break;

				case 'missing-input-response':
					$this->error = Loc::getMessage('CRM_WEBFORM_RECAPTCHA_ERROR_MISSING_INPUT_RESPONSE');
					break;

				case 'invalid-input-secret':
					$this->error = Loc::getMessage('CRM_WEBFORM_RECAPTCHA_ERROR_INVALID_INPUT_SECRET');
					break;

				case 'missing-input-secret':
					$this->error = Loc::getMessage('CRM_WEBFORM_RECAPTCHA_ERROR_MISSING_INPUT_SECRET');
					break;

				default:
					$this->error = 'reCAPTCHA: ' . Loc::getMessage('CRM_WEBFORM_RECAPTCHA_ERROR_UNKNOWN');
					break;
			}

		}

		return (bool) $response['success'];
	}

	/**
	 * Return error code.
	 *
	 * @return string
	 */
	public function getError()
	{
		return $this->error;
	}

	/**
	 * Get default key.
	 *
	 * @var string $lang Language id.
	 * @return string
	 */
	public static function getJavascriptResource($lang = LANGUAGE_ID)
	{
		switch ($lang)
		{
			case 'pl': //polish
			case 'de': //german
			case 'fr': //french
				// use $lang
				break;

			case 'la': //spanish
				$lang = 'es';
				break;

			case 'br': //brasiliero
				$lang = 'pt';
				break;

			case 'ru': //russian
			case 'by':
			case 'kz':
				$lang = 'ru';
				break;

			case 'ua': //ukrainian
				$lang = 'uk';
				break;

			case 'sc': //Chinese simplified
				$lang = 'zh-TW';
				break;

			case 'tc': //chinese traditional
				$lang = 'zh-CN';
				break;

			case 'in': //india
			case 'en': //english
			default:
				$lang = 'en';
				break;
		}

		return 'https://www.google.com/recaptcha/api.js?onload=onReCaptchaLoadCallback&render=explicit&hl=' . $lang;
	}

	/**
	 * Get default key.
	 *
	 * @param string $version Version.
	 * @return string
	 */
	public static function getDefaultKey($version = '')
	{
		return Option::get(self::MODULE_ID, self::OPTION_NAME . $version . '_def_key');
	}

	/**
	 * Get default secret.
	 *
	 * @param string $version Version.
	 * @return string
	 */
	public static function getDefaultSecret($version = '')
	{
		return Option::get(self::MODULE_ID, self::OPTION_NAME . $version . '_def_secret');
	}

	/**
	 * Get key.
	 *
	 * @param string $version Version.
	 * @return string
	 */
	public static function getKey($version = '')
	{
		return Option::get(self::MODULE_ID, self::OPTION_NAME . $version . '_key');
	}

	/**
	 * Get secret.
	 *
	 * @param string $version Version.
	 * @return string
	 */
	public static function getSecret($version = '')
	{
		return Option::get(self::MODULE_ID, self::OPTION_NAME . $version . '_secret');
	}

	/**
	 * Set key & secret.
	 *
	 * @param string $key Key.
	 * @param string $secret Secret.
	 * @param string $version Version.
	 * @return void
	 */
	public static function setKey($key, $secret, $version = '')
	{
		Option::set(self::MODULE_ID, self::OPTION_NAME . $version . '_key', $key);
		Option::set(self::MODULE_ID, self::OPTION_NAME . $version . '_secret', $secret);
	}
}