static function SendPassword($LOGIN, $EMAIL, $SITE_ID = false, $captcha_word = '', $captcha_sid = 0, $phoneNumber = '', $shortCode = false)
{
/** @global CMain $APPLICATION */
global $DB, $APPLICATION;
$arParams = [
"LOGIN" => $LOGIN,
"EMAIL" => $EMAIL,
"SITE_ID" => $SITE_ID,
"PHONE_NUMBER" => $phoneNumber,
"SHORT_CODE" => $shortCode,
];
$result_message = ["MESSAGE" => GetMessage('ACCOUNT_INFO_SENT') . "
", "TYPE" => "OK"];
$APPLICATION->ResetException();
$bOk = true;
foreach (GetModuleEvents('main', 'OnBeforeUserSendPassword', true) as $arEvent)
{
if (ExecuteModuleEventEx($arEvent, [&$arParams]) === false)
{
if ($err = $APPLICATION->GetException())
{
$result_message = ["MESSAGE" => $err->GetString() . "
", "TYPE" => "ERROR"];
}
$bOk = false;
break;
}
}
if ($bOk && !$arParams["SHORT_CODE"] && Option::get('main', 'captcha_restoring_password', 'N') == 'Y')
{
if (!($APPLICATION->CaptchaCheckCode($captcha_word, $captcha_sid)))
{
$result_message = ["MESSAGE" => GetMessage("main_user_captcha_error") . "
", "TYPE" => "ERROR"];
$bOk = false;
}
}
if ($bOk)
{
$found = false;
if ($arParams["PHONE_NUMBER"] != '')
{
//user registered by phone number
$siteId = ($arParams["SITE_ID"] === false ? null : $arParams["SITE_ID"]);
$result = static::SendPhoneCode($arParams["PHONE_NUMBER"], "SMS_USER_RESTORE_PASSWORD", $siteId);
if ($result->isSuccess())
{
$found = true;
$result_message = ["MESSAGE" => GetMessage("main_user_pass_request_sent") . "
", "TYPE" => "OK", "TEMPLATE" => "SMS_USER_RESTORE_PASSWORD"];
if (Option::get('main', 'event_log_password_request', 'N') === 'Y')
{
$data = $result->getData();
CEventLog::Log('SECURITY', 'USER_INFO', 'main', $data["USER_ID"]);
}
}
else
{
if ($result->getErrorCollection()->getErrorByCode("ERR_NOT_FOUND") === null)
{
//user found but there is another error
$found = true;
$result_message = ["MESSAGE" => implode("
", $result->getErrorMessages()), "TYPE" => "ERROR"];
}
}
}
elseif ($arParams["LOGIN"] != '' || $arParams["EMAIL"] != '')
{
$confirmation = (Option::get('main', 'new_user_registration_email_confirmation', 'N') == 'Y');
$strSql = '';
if ($arParams["LOGIN"] != '')
{
$strSql =
"SELECT ID, LID, ACTIVE, BLOCKED, CONFIRM_CODE, LOGIN, EMAIL, NAME, LAST_NAME, LANGUAGE_ID " .
"FROM b_user u " .
"WHERE LOGIN='" . $DB->ForSQL($arParams["LOGIN"]) . "' " .
" AND (ACTIVE='Y' OR NOT(CONFIRM_CODE IS NULL OR CONFIRM_CODE='')) " .
(
// $arParams["EXTERNAL_AUTH_ID"] can be changed in the OnBeforeUserSendPassword event
isset($arParams["EXTERNAL_AUTH_ID"]) && $arParams["EXTERNAL_AUTH_ID"] != '' ?
" AND EXTERNAL_AUTH_ID='" . $DB->ForSQL($arParams["EXTERNAL_AUTH_ID"]) . "' " :
" AND (EXTERNAL_AUTH_ID IS NULL OR EXTERNAL_AUTH_ID='') "
);
}
if ($arParams["EMAIL"] != '')
{
if ($strSql != '')
{
$strSql .= "nUNIONn";
}
$strSql .=
"SELECT ID, LID, ACTIVE, BLOCKED, CONFIRM_CODE, LOGIN, EMAIL, NAME, LAST_NAME, LANGUAGE_ID " .
"FROM b_user u " .
"WHERE EMAIL='" . $DB->ForSQL($arParams["EMAIL"]) . "' " .
" AND (ACTIVE='Y' OR NOT(CONFIRM_CODE IS NULL OR CONFIRM_CODE='')) " .
(
isset($arParams["EXTERNAL_AUTH_ID"]) && $arParams["EXTERNAL_AUTH_ID"] != '' ?
" AND EXTERNAL_AUTH_ID='" . $DB->ForSQL($arParams["EXTERNAL_AUTH_ID"]) . "' " :
" AND (EXTERNAL_AUTH_ID IS NULL OR EXTERNAL_AUTH_ID='') "
);
}
$res = $DB->Query($strSql);
while ($arUser = $res->Fetch())
{
if ($arParams["SITE_ID"] === false)
{
if (defined("ADMIN_SECTION") && ADMIN_SECTION === true)
{
$arParams["SITE_ID"] = CSite::GetDefSite($arUser["LID"]);
}
else
{
$arParams["SITE_ID"] = SITE_ID;
}
}
if ($arUser["ACTIVE"] == 'Y')
{
if ($arUser["BLOCKED"] != 'Y')
{
$found = true;
if ($arParams["SHORT_CODE"])
{
$result = static::SendEmailCode($arUser["ID"], $arParams["SITE_ID"]);
if ($result->isSuccess())
{
$result_message = ["MESSAGE" => GetMessage("main_send_password_email_code") . "
", "TYPE" => "OK", "USER_ID" => $arUser["ID"], "RESULT" => $result];
}
else
{
$result_message = ["MESSAGE" => implode("
", $result->getErrorMessages()), "TYPE" => "ERROR", "RESULT" => $result];
}
}
else
{
static::SendUserInfo($arUser["ID"], $arParams["SITE_ID"], GetMessage("INFO_REQ"), true, 'USER_PASS_REQUEST');
}
}
}
elseif ($confirmation)
{
$found = true;
//unconfirmed registration - resend confirmation email
$arFields = [
"USER_ID" => $arUser["ID"],
"LOGIN" => $arUser["LOGIN"],
"EMAIL" => $arUser["EMAIL"],
"NAME" => $arUser["NAME"],
"LAST_NAME" => $arUser["LAST_NAME"],
"CONFIRM_CODE" => $arUser["CONFIRM_CODE"],
"USER_IP" => $_SERVER["REMOTE_ADDR"],
"USER_HOST" => @gethostbyaddr($_SERVER["REMOTE_ADDR"]),
];
$event = new CEvent;
$event->SendImmediate("NEW_USER_CONFIRM", $arParams["SITE_ID"], $arFields, 'Y', '', [], $arUser["LANGUAGE_ID"]);
$result_message = ["MESSAGE" => GetMessage("MAIN_SEND_PASS_CONFIRM") . "
", "TYPE" => "OK"];
}
if (Option::get('main', 'event_log_password_request', 'N') === 'Y')
{
CEventLog::Log('SECURITY', 'USER_INFO', 'main', $arUser['ID']);
}
}
}
if (!$found)
{
return ["MESSAGE" => GetMessage('DATA_NOT_FOUND1') . "
", "TYPE" => "ERROR"];
}
}
return $result_message;
}