• Модуль: ldap
  • Путь к файлу: ~/bitrix/modules/ldap/classes/general/ldap.php
  • Класс: CLDAP
  • Вызов: CLDAP::OnUserLogin
static function OnUserLogin(&$arArgs)
{
	global $APPLICATION;

	if(!function_exists("ldap_connect"))
	{
		return 0;
	}

	$login = (string)$arArgs["LOGIN"];
	$password = (string)$arArgs["PASSWORD"];

	if($login === '' || $password === '')
	{
		return 0;
	}

	$isPasswordOriginal = isset($arArgs["PASSWORD_ORIGINAL"]) && $arArgs["PASSWORD_ORIGINAL"] === "Y";

	if(static::isApplicationPassword($login, $password, $isPasswordOriginal))
	{
		return 0;
	}

	$filter = ["ACTIVE" => "Y"];
	$prefix = mb_strpos($login, "\");

	if($prefix===false && COption::GetOptionString("ldap", "ntlm_auth_without_prefix", "Y") !== "Y")
	{
		return 0;
	}

	if($prefix > 0)
	{
		$filter["CODE"] = mb_substr($login, 0, $prefix);
		$login = mb_substr($login, $prefix + 1);
	}

	$params = [
		"LOGIN" => &$login,
		"PASSWORD" => &$password,
		"LDAP_FILTER" => &$filter,
	];

	$APPLICATION->ResetException();
	foreach(GetModuleEvents("ldap", "OnBeforeUserLogin", true) as $arEvent)
	{
		if(ExecuteModuleEventEx($arEvent, [&$params]) === false)
		{
			if($err = $APPLICATION->GetException())
			{
				$arArgs['RESULT_MESSAGE'] = ["MESSAGE"=>$err->GetString()."
", "TYPE"=>"ERROR"]; } else { $APPLICATION->ThrowException("Unknown error"); $arArgs['RESULT_MESSAGE'] = ["MESSAGE"=>"Unknown error"."
", "TYPE"=>"ERROR"]; } return 0; } } /** * variants: * password = 12345678 otp = '' <- no otp * password = 12345678 otp = 345678 <- with otp * password = 12345678 otp = 876543 <- with otp * password = 12345678 otp = 345678 <- no otp */ $otp = (string)($arArgs["OTP"] ?? ''); if ($otp !== '' && mb_substr($password, -6) === $otp) { $password = mb_substr($password, 0, -6); } $userId = 0; $dbRes = CLdapServer::GetList([], $filter); while($xLDAP = $dbRes->GetNextServer()) { if($xLDAP->Connect()) { $arLdapUser = false; if($otp !== '') { $arLdapUser = $xLDAP->FindUser($login, $password.$otp); } if(!$arLdapUser && $password !== '') { $arLdapUser = $xLDAP->FindUser($login, $password); } // user AD parameters are queried here, inside FindUser function if($arLdapUser) { $userId = (int)$xLDAP->SetUser( $arLdapUser, (COption::GetOptionString("ldap", "add_user_when_auth", "Y") === "Y") ); $xLDAP->Disconnect(); if ($userId > 0) { $arArgs["STORE_PASSWORD"] = "N"; break; } if(BitrixLdapLimit::isUserLimitExceeded()) { $arArgs['RESULT_MESSAGE'] = BitrixLdapLimit::getUserLimitNotifyMessage(); break; } } else { $xLDAP->Disconnect(); } } } return $userId; }