View file app/modules/mail/lostpassword.php

File size: 14.36Kb
<?php
App::view($config['themes'].'/index');

$act = (isset($_GET['act'])) ? check($_GET['act']) : 'index';

show_title('Восстановление пароля');

if (! is_user()) {
switch ($act):
############################################################################################
##                                    Главная страница                                    ##
############################################################################################
case 'index':

    $cooklog = (isset($_COOKIE['login'])) ? check($_COOKIE['login']): '';

    echo 'Инструкция по восстановлению будет выслана на электронный адрес указанный в профиле<br />';
    echo 'Восстанавливать пароль можно не чаще чем раз в 12 часов<br /><br />';

    echo '<div class="form">';
    echo '<form method="post" action="/lostpassword?act=remind">';
    echo 'Логин, ник или email:<br />';
    echo '<input name="uz" type="text" maxlength="20" value="'.$cooklog.'" /><br />';
    echo '<input value="Продолжить" type="submit" /></form></div><br />';

    echo 'Если у вас установлен секретный вопрос, вам будет предложено на него ответить<br /><br />';

break;

############################################################################################
##                                  Восстановление пароля                                 ##
############################################################################################
case 'remind':

    $uz = check(utf_lower(Request::input('uz')));

    if (!empty($uz)) {

        $user = DB::run() -> queryFetch("SELECT * FROM `users` WHERE LOWER(`login`)=? OR `email`=? OR LOWER(`nickname`)=? LIMIT 1;", [$uz, $uz, $uz]);

        if (!empty($user)) {

            $email = ($uz == $user['email']) ? $user['email'] : '';

            echo '<div class="b">'.user_gender($user['login']).' <b>'.profile($user['login']).'</b> '.user_visit($user['login']).'</div>';

            if (!empty($user['email'])) {
                echo '<b><big>Восстановление на e-mail:</big></b><br />';
                echo '<div class="form">';
                echo '<form method="post" action="/lostpassword?act=send">';
                echo 'Введите e-mail:<br />';
                echo '<input name="email" type="text" value="'.$email.'" maxlength="50" /><br />';
                echo 'Проверочный код:<br /> ';
                echo '<img src="/captcha" onclick="this.src=\'/captcha?\'+Math.random()" class="img-rounded" alt="" style="cursor: pointer;" alt="" /><br />';
                echo '<input name="provkod" size="6" maxlength="6" /><br />';
                echo '<input name="uz" type="hidden" value="'.$user['login'].'" />';
                echo '<br /><input value="Восстановить" type="submit" /></form></div><br />';
            }
            // --------------------------------------------------------------//
            if (!empty($user['secquest'])) {
                echo '<b><big>Ответ на секретный вопрос:</big></b><br />';
                echo '<div class="form">';
                echo '<form method="post" action="/lostpassword?act=answer">';

                echo $user['secquest'].'<br />';
                echo '<input name="answer" type="text" maxlength="30" /><br />';

                echo 'Проверочный код:<br /> ';
                echo '<img src="/captcha" onclick="this.src=\'/captcha?\'+Math.random()" class="img-rounded" alt="" style="cursor: pointer;" alt="" /><br />';
                echo '<input name="provkod" size="6" maxlength="6" /><br />';
                echo '<input name="uz" type="hidden" value="'.$user['login'].'" />';
                echo '<br /><input value="Восстановить" type="submit" /></form></div><br />';
            }

            if (empty($user['email']) && empty($user['secquest'])) {
                echo '<i class="fa fa-times"></i> <b>Невозможно восстановить пароль!</b><br />';
                echo 'Нет технической возможности восстановить пароль, так как у данного пользователя не указан адрес почтового ящика и не установлен секретный вопрос<br />';
                echo 'Для того чтобы вернуть доступ к своему аккаунту необходимо связаться с администрацией сайта<br /><br />';
            }
        } else {
            show_error('Ошибка! Пользователь с данным логином или email не найден!');
        }
    } else {
        show_error('Ошибка! Вы не ввели логин или email пользователя для восстановления!');
    }

    echo '<i class="fa fa-arrow-circle-left"></i> <a href="/lostpassword">Вернуться</a><br />';
break;

############################################################################################
##                            Подтверждение восстановления                                ##
############################################################################################
case 'send':

    $uz = check(Request::input('uz'));
    $email = check(Request::input('email'));
    $provkod = check(Request::input('provkod'));

    $user = DB::run() -> queryFetch("SELECT * FROM `users` WHERE `login`=? LIMIT 1;", [$uz]);
    if (! empty($user)) {

        $validation = new Validation();

        $validation -> addRule('equal', [$provkod, $_SESSION['protect']], 'Проверочное число не совпало с данными на картинке!')
            -> addRule('not_empty', $email, 'Не введен адрес почтового ящика для восстановления!')
            -> addRule('not_empty', $user['email'], 'У данного пользователя не установлен email!')
            -> addRule('equal', [$email, $user['email']], 'Введенный адрес email не совпадает с адресом в профиле!')
            -> addRule('min', [$user['timepasswd'], SITETIME], 'Восстанавливать пароль можно не чаще чем раз в 12 часов!');

        if ($validation->run()) {

            $restkey = str_random();

            DB::run() -> query("UPDATE `users` SET `keypasswd`=?, `timepasswd`=? WHERE `login`=?;", [$restkey, SITETIME + 43200, $uz]);
            // ---------------- Инструкция по восстановлению пароля на E-mail --------------------------//
            sendMail($user['email'],
                'Подтверждение восстановления пароля на сайте '.$config['title'],
                nl2br("Здравствуйте, ".nickname($user['login'])." \nВами была произведена операция по восстановлению пароля на сайте ".$config['home']." \n\nДанные отправителя: \nIp: ".App::getClientIp()." \nБраузер: ".App::getUserAgent()." \nОтправлено: ".date('j.m.Y / H:i', SITETIME)."\n\nДля того чтобы восстановить пароль, вам необходимо перейти по ссылке: \n\n".$config['home']."/lostpassword?act=restore&uz=".$user['login']."&key=".$restkey." \n\nЕсли это письмо попало к вам по ошибке или вы не собираетесь восстанавливать пароль, то просто проигнорируйте его")
            );

            echo '<i class="fa fa-check"></i> <b>Восстановление пароля инициализировано!</b><br /><br />';
            echo 'Письмо с инструкцией по восстановлению пароля успешно выслано на E-mail указанный в профиле<br />';
            echo 'Внимательно прочтите письмо и выполните все необходимые действия для восстановления пароля<br />';
            echo 'Восстанавливать пароль можно не чаще чем раз в 12 часов<br /><br />';

        } else {
            show_error($validation->getErrors());
        }
    } else {
        show_error('Ошибка! Пользователь с данным логином не найден!');
    }

    echo '<i class="fa fa-arrow-circle-left"></i> <a href="/lostpassword?act=remind&amp;uz='.$uz.'">Вернуться</a><br />';
break;

############################################################################################
##                                Восстановление пароля                                   ##
############################################################################################
case 'restore':

    $uz = check(Request::input('uz'));
    $key = check(Request::input('key'));

    $user = DB::run() -> queryFetch("SELECT * FROM `users` WHERE `login`=? LIMIT 1;", [$uz]);
    if (!empty($user)) {

        $validation = new Validation();

        $validation -> addRule('not_empty', $key, 'Отсутствует секретный код в ссылке для восстановления пароля!')
            -> addRule('not_empty', $user['keypasswd'], 'Данный пользователь не запрашивал восстановление пароля!')
            -> addRule('equal', [$key, $user['keypasswd']], 'Секретный код в ссылке не совпадает с данными в профиле!')
            -> addRule('max', [$user['timepasswd'], SITETIME], 'Секретный ключ для восстановления уже устарел!');

        if ($validation->run()) {

            $newpass = str_random();
            $hashnewpas = password_hash($newpass, PASSWORD_BCRYPT);;

            DB::run() -> query("UPDATE `users` SET `password`=?, `keypasswd`=?, `timepasswd`=? WHERE `login`=?;", [$hashnewpas, '', 0, $uz]);

            echo '<b>Пароль успешно восстановлен!</b><br />';
            echo 'Ваши новые данные для входа на сайт<br /><br />';

            echo 'Логин: <b>'.$user['login'].'</b><br />';
            echo 'Пароль: <b>'.$newpass.'</b><br /><br />';

            echo 'Запомните и постарайтесь больше не забывать данные<br /><br />';

            echo 'Пароль вы сможете поменять в своем профиле<br /><br />';

            // --------------------------- Восстановлению пароля на E-mail --------------------------//
            sendMail($user['email'],
                'Восстановление пароля на сайте '.$config['title'],
                nl2br("Здравствуйте, ".nickname($user['login'])." \nВаши новые данные для входа на на сайт ".$config['home']." \nЛогин: ".$user['login']." \nПароль: ".$newpass." \n\nЗапомните и постарайтесь больше не забывать данные \nПароль вы сможете поменять в своем профиле \nВсего наилучшего!")
            );

        } else {
            show_error($validation->getErrors());
        }
    } else {
        show_error('Ошибка! Пользователь с данным логином не найден!');
    }
    echo '<i class="fa fa-arrow-circle-left"></i> <a href="/lostpassword">Вернуться</a><br />';
break;

############################################################################################
##                            Ответ на секретный вопрос                                   ##
############################################################################################
case 'answer':

    $uz = check(Request::input('uz'));
    $answer = check(Request::input('answer'));
    $provkod = check(Request::input('provkod'));

    $user = DB::run() -> queryFetch("SELECT * FROM `users` WHERE `login`=? LIMIT 1;", [$uz]);
    if (!empty($user)) {

        $validation = new Validation();

        $validation -> addRule('equal', [$provkod, $_SESSION['protect']], 'Проверочное число не совпало с данными на картинке!')
            -> addRule('not_empty', $answer, 'Не введен ответ на секретный вопрос для восстановления!')
            -> addRule('not_empty', $user['secquest'], 'У данного пользователя не установлен секретный вопрос!')
            -> addRule('equal', [md5(md5($answer)), $user['secanswer']], 'Ответ на секретный вопрос не совпадает с данными в профиле!');

        if ($validation->run()) {

            $newpass = str_random();
            $hashnewpas = password_hash($newpass, PASSWORD_BCRYPT);

            DB::run() -> query("UPDATE `users` SET `password`=?, `keypasswd`=?, `timepasswd`=? WHERE `login`=?;", [$hashnewpas, '', 0, $uz]);

            echo '<b>Пароль успешно восстановлен!</b><br />';
            echo 'Ваши новые данные для входа на сайт<br /><br />';

            echo 'Логин: <b>'.$user['login'].'</b><br />';
            echo 'Пароль: <b>'.$newpass.'</b><br /><br />';

            echo 'Запомните и постарайтесь больше не забывать данные<br /><br />';

            echo 'Пароль вы сможете поменять в своем профиле<br /><br />';

        } else {
            show_error($validation->getErrors());
        }
    } else {
        show_error('Ошибка! Пользователь с данным логином не найден!');
    }

    echo '<i class="fa fa-arrow-circle-left"></i> <a href="/lostpassword?act=remind&amp;uz='.$uz.'">Вернуться</a><br />';
break;

endswitch;

} else {
    show_error('Ошибка! Вы авторизованы, восстановление пароля невозможно!');
}

App::view($config['themes'].'/foot');