2018-01-28 16:40:49 +00:00
< ? php
2018-12-10 16:39:09 +00:00
require_once ( " config.php " );
2018-01-28 16:40:49 +00:00
2018-12-10 16:15:11 +00:00
function random_password ()
{
$chars = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 " ;
$password = substr ( str_shuffle ( $chars ), 0 , 8 );
2018-01-28 16:40:49 +00:00
return $password ;
}
2018-12-10 16:15:11 +00:00
2018-01-28 16:40:49 +00:00
function mail_send ( $to , $from_user , $from_email , $subject = '(No subject)' , $message = '' )
{
2018-12-10 16:15:11 +00:00
$from_user = " =?UTF-8?B? " . base64_encode ( $from_user ) . " ?= " ;
$subject = " =?UTF-8?B? " . base64_encode ( $subject ) . " ?= " ;
2018-01-28 16:40:49 +00:00
2018-12-10 16:15:11 +00:00
$headers = " From: $from_user < $from_email > \r \n " .
2018-01-28 16:40:49 +00:00
" 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 );
//TODO Сделать всё нормальным человеческим способом, как у белых людей. С б р о с пароля генерирует ссылку на почту, ссылка на почте разрешает одноразовую смену пароля.
if ( $login ) {
2018-12-10 16:15:11 +00:00
$sql = db :: c () -> query ( 'SELECT `login`, `email` FROM `users` WHERE `login` = "?s"' , $login ) -> fetch_assoc ();
2018-01-28 16:40:49 +00:00
$newpass = random_password ();
2018-12-10 16:20:34 +00:00
$lasttime = date ( 'Y-m-d' , strtotime ( '+1days' ));
2018-01-28 16:40:49 +00:00
$ip = $_SERVER [ 'REMOTE_ADDR' ];
if ( $sql [ 'login' ] && db :: c () -> query ( 'INSERT INTO `confirmpasswd` (`login`, `passwd`, `date`, `ip`, `active`) VALUES ("?s", "?s", "?s", "?s", "?s")' , $sql [ 'login' ], $newpass , $lasttime , $ip )) {
$message = " Здравствуйте!<br><br>
2018-12-10 16:15:11 +00:00
Кто - то запросил восстановление пароля к вашему персонажу " . $sql['login'] . " .< br >
Ваш новый пароль : " . $newpass . " .< br >< br >
2018-01-28 16:40:49 +00:00
Для подтверждения нового пароля пройдите по
2018-12-10 16:15:11 +00:00
< a href = '" . GAMEDOMAIN . "/rememberpassword.php?newpass=" . $newpass . "&l=" . $sql[' login '] . "&t=" . $lasttime . "' > данной ссылке </ a >.< br >< br >
Ссылка будет действовать до < em > " . date('d-M-Y', $lasttime ) . " </ em >.
2018-01-28 16:40:49 +00:00
" ;
2018-12-10 16:15:11 +00:00
if ( mail_send ( $sql [ 'email' ], " Noreply " , " noreply@ " . GAMEDOMAIN , " Восстановление забытого пароля " , $message )) {
$statusMessage = 'Письмо отправлено.' ;
} else $statusMessage = 'Ошибка: письмо не отправлено!' ;
} else $statusMessage = 'Ошибка: имя пользователя не существует!' ;
2018-01-28 16:40:49 +00:00
}
2018-12-10 16:15:11 +00:00
2018-12-10 16:37:50 +00:00
$realtime = ( int ) mktime ( date ( 'H i s m d Y' ));
$login2 = filter_input ( INPUT_GET , 'l' , FILTER_SANITIZE_SPECIAL_CHARS );
$passwd = filter_input ( INPUT_GET , 'newpass' );
$timev = filter_input ( INPUT_GET , 't' );
if ( $passwd && $login2 && $timev ) {
if ( $realtime <= $timev ) {
include ( " config.php " );
$sql2 = db :: c () -> query ( 'SELECT `login` FROM `confirmpasswd` WHERE `login` = "?s" AND `passwd` = "?s" AND `date` = "?s" AND `active` = "?s"' , $login2 , $passwd , $timev , 1 );
if ( $sql2 -> getNumRows () == 0 ) die ( " Ссылка устарела! " );
$sql2 = $sql2 -> fetch_assoc ();
//FIXME Убрать md5.
db :: c () -> query ( 'UPDATE `users` SET `pass` = "?s" WHERE `login` = "?s"' , md5 ( $passwd ), $sql2 [ 'login' ]);
db :: c () -> query ( 'UPDATE `confirmpasswd` SET `active` = "?s" WHERE `login` = "?s" AND `passwd` = "?s" AND `date` = "?s" AND `active` = "?s"' , 0 , $login2 , $passwd , $timev , 1 );
$statusMessage = 'Пароль изменён!' ;
} else $statusMessage = 'Ошибка: ссылка устарела!' ;
}
2018-01-28 16:40:49 +00:00
?>
<! DOCTYPE html >
< html lang = " ru_RU " >
< head >
< meta charset = " utf-8 " >
2018-12-10 16:15:11 +00:00
< link href = " css/main.css " rel = " stylesheet " />
2018-01-28 16:40:49 +00:00
< title > Восстановление пароля </ title >
</ head >
< body >
2018-12-10 16:15:11 +00:00
< a href = " / " > ← на главную </ a >
< ? php if ( ! empty ( $statusMessage )) : ?>
< h3 >< ? php echo $statusMessage ; ?> </h3>
2018-01-28 16:40:49 +00:00
< ? php endif ; ?>
2018-12-10 16:15:11 +00:00
< h1 > Восстановление пароля </ h1 >
2018-12-10 16:37:50 +00:00
< p > Для восстановления пароля введите свой login и нажмите кнопку & laquo ; Отправить письмо & raquo ; .< br >
2018-12-10 16:15:11 +00:00
Письмо будет выслано на email адрес , указанный вами при регистрации .< br >
2018-12-10 16:37:50 +00:00
Восстанавливать пароль можно только раз в сутки .</ p >
2018-12-10 16:15:11 +00:00
< form method = " post " >
< input required name = " loginid " placeholder = " Имя персонажа " value = " <?= $login ?> " >< br >
< input type = submit >
2018-01-28 16:40:49 +00:00
</ form >
</ body >
</ html >