- Модуль: 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;
}