Доброго времени суток!
Есть сайт на битриксе.
На сайте есть страница авторизации /auth/, где вызван компонент bitrix:system.auth.form.
Есть страница для запроса контрольной строки и восстановления пароля ( /forgot/ и /restore/ соответственно).
Для восстановления пароля переходим на страницу /forgot/, где вызван компонент bitrix:system.auth.forgotpasswd, вводим логин или email и жмем отправить - контрольная строка успешно приходит на почту (в базе видим, что у пользователя поменялось значение CHECKWORD т.е. отправленная строка действительно актуальна).
Везде, где выводятся компоненты, поставил шаблоны по умолчанию, во избежание ошибок с моей стороны..
Переходим по ссылке и попадаем в раздел /restore/, где сначала использовался компонент bitrix:system.auth.changepasswd, но по причине не возврата сообщений об ошибках был закомментирован и написан следующий код, который хотя-бы возвращает ошибки:
<?if(($_POST["AUTH_FORM"]=="Y")&&($_POST["TYPE"]=="CHANGE_PWD")){
global $USER;
$arResult = $USER->ChangePassword($_POST["USER_LOGIN"], $_POST["USER_CHECKWORD"], $_POST["USER_PASSWORD"], $_POST["USER_CONFIRM_PASSWORD"]);
if($arResult["TYPE"] == "OK"){
echo "Пароль успешно изменен.";
}else{
echo $arResult["MESSAGE"];
}
}
echo '<pre>';
print_r($arResult);
echo '</pre>';
if($arResult["TYPE"] != "OK"){
?>
<fo rm method="post" action="" name="bform" id="b-form">
<input type="hidden" name="backurl" value="">
<input type="hidden" name="AUTH_FORM" value="Y">
<input type="hidden" name="TYPE" value="CHANGE_PWD">
<input type="text" name="USER_LOGIN" maxlength="50" value="<?=$_GET['USER_LOGIN']?>" class="bx-auth-input" placeholder="Ваш логин" />
<input type="text" name="USER_CHECKWORD" maxlength="50" value="<?=$_GET["USER_CHECKWORD"]?>" class="bx-auth-input" placeholder="Контрольная строка"/>
<input type="password" name="USER_PASSWORD" maxlength="50" value="" class="bx-auth-input" autocomplete="off" placeholder="Новый пароль" />
<input type="password" name="USER_CONFIRM_PASSWORD" maxlength="50" value="" class="bx-auth-input" autocomplete="off" placeholder="Подтверждение пароля" />
<div class="clearfix b-form-buttons">
<input type="submit" name="change_pwd" value="Изменить пароль" />
</div>
</form>
<?}?>
При успешном вводе нового пароля и его подтверждения (они равны и соответствуют всем правилам) получаю массив $arResult:
Array
(
[MESSAGE] => Неверное контрольное слово для логина "test@mail.ru".
[TYPE] => ERROR
[FIELD] => CHECKWORD
)
На странице, после отправки формы вывожу массив $_POST, что подтверждает, что USER_CHECKWORD все таки передается:
Array
(
[backurl] =>
[AUTH_FORM] => Y
[TYPE] => CHANGE_PWD
[USER_LOGIN] => test@mail.ru
[USER_CHECKWORD] => 1a571b5f2170ff4ef7c0657c89befcd8
[USER_PASSWORD] => PASSWORDtest1!Q
[USER_CONFIRM_PASSWORD] => PASSWORDtest1!Q
[change_pwd] => Изменить пароль
)
Посмотрел код метода, такая ошибка возникает если он пуст (не передается) или он не равен хешу пароля из базы:
if($res["CHECKWORD"] == '' || $res["CHECKWORD"] != $salt.md5($salt.$arParams["CHECKWORD"]))
НО! Если на странице перед подключением header.php установить значение константы define("AUTH", true), и запросить пароль посредством выведенной формы, то пароль успешно меняется. WTF?
Уважаемые знатоки, внимание, вопрос: "Из - за чего возникает такая проблема, и как её решить?". Заранее спасибо! Очень надеюсь на помощь...