• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/main.php
  • Класс: CAllMain
  • Вызов: CAllMain::NeedCAPTHAForLogin
public function NeedCAPTHAForLogin($login)
{
	//When last login was failed then ask for CAPTCHA
	if($this->NeedCAPTHA())
	{
		return true;
	}

	//This is local cache. May save one query.
	$USER_ATTEMPTS = false;

	$session = MainApplication::getInstance()->getSession();

	//Check if SESSION cache for POLICY_ATTEMPTS is actual for given login
	if(!$session->has("BX_LOGIN_NEED_CAPTCHA_LOGIN") || $session["BX_LOGIN_NEED_CAPTCHA_LOGIN"]["LOGIN"] !== $login)
	{
		$POLICY_ATTEMPTS = 0;
		if($login <> '')
		{
			$rsUser = CUser::GetList('LOGIN', 'DESC', array(
				"LOGIN_EQUAL_EXACT" => $login,
				"EXTERNAL_AUTH_ID" => "",
			),
				array('FIELDS' => array('ID', 'LOGIN', 'LOGIN_ATTEMPTS'))
			);
			$arUser = $rsUser->Fetch();
			if($arUser)
			{
				$policy = CUser::getPolicy($arUser["ID"]);
				$POLICY_ATTEMPTS = (int)$policy->getLoginAttempts();
				$USER_ATTEMPTS = (int)$arUser["LOGIN_ATTEMPTS"];
			}
		}
		$session["BX_LOGIN_NEED_CAPTCHA_LOGIN"] = [
			"LOGIN" => $login,
			"POLICY_ATTEMPTS" => $POLICY_ATTEMPTS,
		];
	}

	//For users who had successful login and if policy is set
	//check for CAPTCHA display
	if($login <> '' && $session["BX_LOGIN_NEED_CAPTCHA_LOGIN"]["POLICY_ATTEMPTS"] > 0)
	{
		//We need to know how many attempts user made
		if($USER_ATTEMPTS === false)
		{
			$rsUser = CUser::GetList('LOGIN', 'DESC', array(
				"LOGIN_EQUAL_EXACT" => $login,
				"EXTERNAL_AUTH_ID" => "",
			),
				array('FIELDS' => array('ID', 'LOGIN', 'LOGIN_ATTEMPTS'))
			);
			$arUser = $rsUser->Fetch();
			if($arUser)
				$USER_ATTEMPTS = intval($arUser["LOGIN_ATTEMPTS"]);
			else
				$USER_ATTEMPTS = 0;
		}
		//When user login attempts exceeding the policy we'll show the CAPTCHA
		if($USER_ATTEMPTS >= $session["BX_LOGIN_NEED_CAPTCHA_LOGIN"]["POLICY_ATTEMPTS"])
			return true;
	}

	return false;
}