battles/rememberpassword.php

87 lines
4.2 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");
$password = password_hash(filter_input(INPUT_POST, 'psw'), PASSWORD_DEFAULT);
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);
}
$login = filter_input(INPUT_POST, 'loginid', FILTER_SANITIZE_SPECIAL_CHARS);
if ($login) {
$sql = db::c()->query('SELECT `email` FROM `users` WHERE `login` = "?s"', $login)->fetch_assoc();
$hash = bin2hex(random_bytes(8));
$lasttime = date('Y-m-d', strtotime('+1days'));
$ip = $_SERVER['REMOTE_ADDR'];
if (db::c()->query('INSERT INTO `confirmpasswd` (`login`, hash, `date`, `ip`) 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', $lasttime) . "</em>.
";
if (mail_send($sql['email'], "Noreply", "noreply@" . GAMEDOMAIN, "Восстановление забытого пароля", $message)) {
$statusMessage = 'Письмо отправлено.';
} else $statusMessage = 'Ошибка: письмо не отправлено!';
} else $statusMessage = 'Ошибка: имя пользователя не существует!';
}
$allowChange = false;
$changePassword = filter_input(INPUT_GET, 'change');
if ($changePassword) {
if (db::c()->query('SELECT 1 FROM `confirmpasswd` WHERE `hash` = "?s" AND `date` < "?s"', $changePassword, date('Y-m-d'))->getNumRows())
$allowChange = true;
else $statusMessage = 'Ошибка: ссылка устарела!';
}
if (!empty($_POST['newpasswd']) AND !empty($_POST['hashcheck'])) {
$query = db::c()->query('SELECT `login` FROM `confirmpasswd` WHERE hash = "?s"', $_POST['hashcheck']);
if ($query->getNumRows()) {
$query->fetch_assoc();
$passwordHashed = password_hash($_POST['newpasswd'], PASSWORD_DEFAULT);
db::c()->query('UPDATE `users` SET `pass` = "?s" WHERE `login` = "?s"', $passwordHashed, $query['login']);
db::c()->query('DELETE FROM `confirmpasswd` WHERE `hash` = "?s"', $_POST['hashcheck']);
$statusMessage = 'Пароль изменен!';
} else $statusMessage = 'Ошибка: неверная ссылка!';
}
?>
<!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>