diff --git a/rememberpassword.php b/rememberpassword.php index 4b63c21..49b3737 100644 --- a/rememberpassword.php +++ b/rememberpassword.php @@ -1,4 +1,8 @@ "; + $subject = "=?UTF-8?B?" . base64_encode('Восстановление забытого пароля') . "?="; + $headers = [ + 'From' => $from, + 'MIME-Version' => '1.0', + 'Content-type' => 'text/html; charset=UTF-8', + ]; - $headers = "From: $from_user <$from_email>\r\n" . - "MIME-Version: 1.0" . "\r\n" . - "Content-type: text/html; charset=UTF-8" . "\r\n"; + if (extension_loaded('tidy')) { + $cleaner = new tidy(); + $message = $cleaner->repairString($message, ['show-errors' => 0, 'show-warnings' => false], 'utf8'); + } + return mail($to, $subject, $message, $headers); + } - 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 = "Здравствуйте!

- Кто-то запросил восстановление пароля к вашему персонажу " . $login . ".

+ public function sendRecoveryMail(string $to): string + { + $db = new DBPDO(); + $check = $db->ofetch('SELECT email FROM users WHERE login = ?', $to); + if (!$check) { + return ERROR_WRONG_LOGIN; + } + if ($db->ofetch('SELECT 1 FROM users_recovery WHERE login = ?', $to)) { + return ERROR_TOO_MANY_TRIES; + } + $hash = bin2hex(random_bytes(8)); + $db->execute('INSERT INTO users_recovery (login, hash, ip, date) VALUES (?,?,?,?)', [$to, $hash, date('Y-m-d', strtotime('+1days')), $_SERVER['REMOTE_ADDR']]); + $message = "Здравствуйте!

+ Кто-то запросил восстановление пароля к вашему персонажу " . $to . ".

Для смены пароля пройдите по данной ссылке.

- Ссылка будет действовать до " . date('d-M-Y', strtotime($lasttime)) . ". + Ссылка будет действовать до " . date('d-M-Y', strtotime(date('Y-m-d', strtotime('+1days')))) . ". "; - 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; + return self::mailSend($check->email, $message) ? OK_MAIL_SENT : ERROR_MAIL_NOT_SENT; + } + + public function isAllowed($hash) + { + return DBPDO::INIT()->fetch('SELECT 1 FROM users_recovery WHERE hash = ? AND date < ?', [$hash, date('Y-m-d')]) ? true : ERROR_OLD_HASH; + } + + public function setNewPassword(string $newPassword, string $hash):string + { + $db = new DBPDO(); + $row = $db->ofetch('SELECT login FROM users_recovery WHERE hash = ?', $hash); + if (!$row) { + return ERROR_WRONG_HASH; } - } 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; + $newPassword = password_hash($newPassword, PASSWORD_DEFAULT); + $db->execute('UPDATE users SET pass = ? WHERE login = ?', [$newPassword, $row->login]); + $db->execute('DELETE FROM users_recovery WHERE hash = ?', $hash); + return OK_PASSWORD_CHANGED; } +}; + +if ($login) { + $statusMessage = $operation->sendRecoveryMail($login); } + 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; - } + $statusMessage = $operation->setNewPassword($newPassword, $hashCheck); } -\Battles\Template::header('Восстановление пароля'); +Template::header('Восстановление пароля'); ?> ← на главную

- +isAllowed($_GET['change']) === true): ?>

Создайте себе новый пароль

- -
+ +
@@ -91,7 +104,9 @@ if ($newPassword && $hashCheck) { Письмо будет выслано на email адрес, указанный вами при регистрации.
Восстанавливать пароль можно только раз в сутки.

-
+