<?php $xslRestorePasswordMailXsl = Core_Array::get(Core_Page::instance()->libParams, 'xslRestorePasswordMailXsl'); // Ключ для разделения токена $key = "К"; // Минимальная длина пароля $password_length = PASSWORD_MIN_LENGTH; $action = "send_mail"; // Действие на форме отправка письма if (Core_Array::getPost('send_mail')) { $email = strval(Core_Array::getPost('email')); $login = $email; $oSiteuser = Core_Entity::factory('Site', CURRENT_SITE)->Siteusers->getByLoginAndEmail($login, $email); if (!is_null($oSiteuser) && $oSiteuser->active) { $Siteuser_Controller_Restore_Password = new Siteuser_Controller_Restore_Password( $oSiteuser ); $token = $Siteuser_Controller_Restore_Password->getToken($key); $Siteuser_Controller_Restore_Password->addEntity(Core::factory('Core_Xml_Entity')->name('token')->value($token)); $Siteuser_Controller_Restore_Password ->subject('Восстановление пароля') ->xsl( Core_Entity::factory('Xsl')->getByName($xslRestorePasswordMailXsl) ) ->send(); $path = '../'; $message = 'В Ваш адрес отправлено письмо с дальнейшими указаниями.'; } else { $error = 'Пользователь с такими параметрами не зарегистрирован или на указанный e-mail не может быть отправлено письмо.'; } } // Действие на форме обработка смены пароля if (Core_Array::getPost('change_password')) { $action = "change_password"; $password1 = Core_Array::getPost('password1'); $password2 = Core_Array::getPost('password2'); $token = Core_Array::getPost('token'); if ($password1 == $password2) { if (strlen($password1) >= $password_length) { // Получаем email $email = base64_decode(explode($key, $token)[0]); $oSiteuser = Core_Entity::factory('Site', CURRENT_SITE)->Siteusers->getByEmail($email); if ($oSiteuser && $oSiteuser->active) { $Siteuser_Controller_Restore_Password = new Siteuser_Controller_Restore_Password( $oSiteuser ); $check_token = $Siteuser_Controller_Restore_Password->getToken($key); if ($check_token == $token) { // Меняем пароль $oSiteuser->password = Core_Hash::instance()->hash($password1); $oSiteuser->save(); $message = "Пароль успешно изменен!"; } else { $message = "Пароль уже был изменен или истекло время действия токена!"; } } else { $message = "Пользователь не подтвержден!"; } } else { $error = "Минимальная длина пароля {$password_length} символа"; } } else { $error = "Пароли не совпадают!"; } } else { // Если пришли с токеном $token = Core_Array::getGet('token'); if ($token) { $action = "change_password"; // Получаем email $email = base64_decode(explode($key, $token)[0]); $oSiteuser = Core_Entity::factory('Site', CURRENT_SITE)->Siteusers->getByEmail($email); if ($oSiteuser && $oSiteuser->active) { $Siteuser_Controller_Restore_Password = new Siteuser_Controller_Restore_Password( $oSiteuser ); $check_token = $Siteuser_Controller_Restore_Password->getToken($key); if ($check_token != $token) { $message = "Пароль уже был изменен или истекло время действия токена!"; } } else { $message = "Пользователь не подтвержден!"; } } } switch ($action) { case "change_password": ?> <h1>Изменение пароля</h1> <? if (!empty($message)) { ?><div id="message"><?php echo $message?></div><?php } else { if (!empty($error)) { ?><div id="error"><?php echo $error?></div><?php } ?> <form action="." method="post"> <input name="token" type="hidden" size="30" class="large" value="<?=$token?>" /> <p> Пароль: <br /> <input name="password1" type="text" size="30" class="large"> </p> <p> Подтверждение пароля: <br /> <input name="password2" type="text" size="30" class="large"> </p> <p> <input name="change_password" type="submit" value="Изменить" class="button" /> </p> </form> <? } break; case "send_mail": ?> <h1>Восстановление пароля</h1> <? if (!empty($message)) { ?><div id="message"><?php echo $message?></div><?php } else { if (!empty($error)) { ?><div id="error"><?php echo $error?></div><?php } ?> <form action="." method="post"> <p> E-mail: <br /> <input name="email" type="text" size="30" class="large"> </p> <p> <input name="send_mail" type="submit" value="Восстановить" class="button" /> </p> </form> <? } break; } ?>