battles/rememberpassword.php

106 lines
4.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
require_once("config.php");
define('OK_MAIL_SENT', 'Письмо отправлено!');
define('OK_PASSWORD_CHANGED', 'Пароль изменён!');
define('ERROR_MAIL_NOT_SENT', 'Письмо не отправлено!');
define('ERROR_WRONG_LOGIN', 'Такого пользователя не существует!');
define('ERROR_TOO_MANY_TRIES', 'Вы уже отправляли себе письмо сегодня!');
define('ERROR_OLD_HASH', 'Ссылка устарела!');
define('ERROR_WRONG_HASH', 'Неверная ссылка!');
$login = filter_input(INPUT_POST, 'loginid', FILTER_SANITIZE_SPECIAL_CHARS);
$password = password_hash($_POST['psw'], PASSWORD_DEFAULT) ?? null;
$allowChange = false;
$changePassword = $_GET['change'] ?? 0;
$newPassword = $_POST['newpasswd'] ?? 0;
$hashCheck = $_POST['hashcheck'] ?? 0;
function mail_send($to, $from_user, $from_email, $subject = '(No subject)', $message = '')
{
$from_user = "=?UTF-8?B?" . base64_encode($from_user) . "?=";
$subject = "=?UTF-8?B?" . base64_encode($subject) . "?=";
$headers = "From: $from_user <$from_email>\r\n" .
"MIME-Version: 1.0" . "\r\n" .
"Content-type: text/html; charset=UTF-8" . "\r\n";
return mail($to, $subject, $message, $headers);
}
if ($login) {
$loginCheck = db::c()->query('SELECT email FROM users WHERE login = "?s"', $login)->fetch_assoc();
if ($loginCheck) {
$recovery = db::c()->query('SELECT 1 FROM users_recovery WHERE login = "?s"', $login)->getNumRows() ?? 0;
if (!$recovery) {
$hash = bin2hex(random_bytes(8));
$lasttime = date('Y-m-d', strtotime('+1days'));
$ip = $_SERVER['REMOTE_ADDR'];
db::c()->query('INSERT INTO users_recovery (login, hash, ip, date) VALUES ("?s", "?s", "?s", "?s")', $login, $hash, $lasttime, $ip);
$message = "Здравствуйте!<br><br>
Кто-то запросил восстановление пароля к вашему персонажу " . $login . ".<br><br>
Для смены пароля пройдите по
<a href='" . GAMEDOMAIN . "/rememberpassword.php?change=" . $hash . "'> данной ссылке</a>.<br><br>
Ссылка будет действовать до <em>" . date('d-M-Y', strtotime($lasttime)) . "</em>.
";
if (mail_send($loginCheck['email'], "Noreply", "noreply@" . GAMEDOMAIN, "Восстановление забытого пароля", $message)) {
$statusMessage = OK_MAIL_SENT;
} else {
$statusMessage = ERROR_MAIL_NOT_SENT;
}
} else {
$statusMessage = ERROR_TOO_MANY_TRIES;
}
} else {
$statusMessage = ERROR_WRONG_LOGIN;
}
}
if ($changePassword) {
if (db::c()->query('SELECT 1 FROM users_recovery WHERE `hash` = "?s" AND `date` < "?s"', $changePassword, date('Y-m-d'))->getNumRows()) {
$allowChange = true;
}
else {
$statusMessage = ERROR_OLD_HASH;
}
}
if ($newPassword && $hashCheck) {
$query = db::c()->query('SELECT login FROM users_recovery WHERE hash = "?s"', $hashCheck);
if ($query->getNumRows()) {
$query = $query->fetch_assoc();
$passwordHashed = password_hash($newPassword, PASSWORD_DEFAULT);
db::c()->query('UPDATE users SET pass = "?s" WHERE login = "?s"', $passwordHashed, $query['login']);
db::c()->query('DELETE FROM users_recovery WHERE hash = "?s"', $hashCheck);
$statusMessage = OK_PASSWORD_CHANGED;
} else {
$statusMessage = ERROR_WRONG_HASH;
}
}
?>
<!DOCTYPE html>
<html lang="ru_RU">
<head>
<meta charset="utf-8">
<link href="css/main.css" rel="stylesheet"/>
<title>Восстановление пароля</title>
</head>
<body>
<a href="/"> ← на главную</a>
<?php if (!empty($statusMessage)): ?>
<h3><?php echo $statusMessage; ?></h3>
<?php endif; ?>
<?php if ($allowChange === true): ?>
<h1>Создайте себе новый пароль</h1>
<form method="post">
<input required name="newpasswd" placeholder="Новый пароль">
<input type="hidden" name="hashcheck" value="<?= $changePassword ?>"><br>
<input type=submit>
</form>
<?php else: ?>
<h1>Восстановление пароля</h1>
<p>Для восстановления пароля введите свой login и нажмите кнопку &laquo;Отправить письмо&raquo;.<br>
Письмо будет выслано на email адрес, указанный вами при регистрации.<br>
Восстанавливать пароль можно только раз в сутки.</p>
<form method="post">
<input required name="loginid" placeholder="Имя персонажа" value="<?= $login ?>"><br>
<input type=submit>
</form>
<?php endif; ?>
</body>
</html>