Файл: 3020.ru/file_3020/plugins/recovery.password.php
Строк: 150
<?
if ($level > 0) {
header('Location: ?func=user.main');
exit;
}
$email = null;
$whats = array('1' => 'Любимое животное', '2' => 'Имя школьной учительницы', '3' => 'Девичья фамилия матери', '4' => 'Любимый город', '5' => 'Любимое блюдо');
if (isset($_GET['code'])) {
$key = $sql->esc($_GET['code']);
if ($sql -> selectCount("SELECT COUNT(*) FROM `users` WHERE `token` = '$key'") == 1) {
$user_recovery = $sql -> fetch("SELECT * FROM `users` WHERE `token` = '$key' LIMIT 1");
$codeget = md5(date("d:m:Y") . $user_recovery['email'] . $user_recovery['password'] . $user_recovery['login']);
if ($codeget != $user_recovery['token']) {
$sql -> update("UPDATE `users` SET `token` = '0' WHERE `id` = '$user_recovery[id]' LIMIT 1");
$err[] = 'К сожалению данная ссылка устарела';
}
if (!isset($err)) {
$_SESSION['token'] = $codeget;
}
} else {
$err[] = 'Неверная ссылка для восстановления доступа';
}
}
if (isset($_SESSION['token'])) {
function generatePassword($length=10, $complex=3)
{
$min = "abcdefghijklmnopqrstuvwxyz";
$num = "0123456789";
$maj = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$symb = "!@#$%&*()_-=+?";
$chars = $min;
if ($complex >= 2) { $chars .= $num; }
if ($complex >= 3) { $chars .= $maj; }
if ($complex >= 4) { $chars .= $symb; }
$password = substr( str_shuffle( $chars ), 0, $length );
return $password;
/*
$return = $chars = null;
if(strstr($type, 'a-z'))
$chars .= 'abcdefghijklmnopqrstuvwxyz';
if(strstr($type, 'A-Z'))
$chars .= 'ABCDEFGHIJKLMNOPRQSTUVWXYZ';
if(strstr($type, '0-9'))
$chars .= '0123456789';
for($i = 0, $sl = strlen($chars) - 1; $i < $length; $i++)
$return .= $chars[rand(0,$sl)];
return $return;
*/
}
$newpassword = generatePassword(10) ;
/*
$newpassword = $sql->esc($_POST['pass1']);
if ($_POST['pass1'] && !preg_match("#^([A-z0-9])+$#ui", $_POST['pass1'])) {
$err[] = 'Пароль должен содержать только английские буквы и цифры';
}
if ($_POST['pass1'] != $_POST['pass2']) {
$err[] = 'Пароли не совпадают';
}
if (strlen2($_POST['pass1']) > 20) {
$err[] = 'Пароль слишком длинный';
} elseif (strlen2($_POST['pass1']) < 6) {
$err[] = 'Пароль слишком короткий';
}
*/
if ($sql -> selectCount("SELECT COUNT(*) FROM `users` WHERE `token` = '$_SESSION[token]'") == 1) {
$login = $sql -> fetch("SELECT * FROM `users` WHERE `token` = '$_SESSION[token]' LIMIT 1");
} else {
$err[] = 'Сессия для восстановления доступа устарела';
}
if (!isset($err) && isset($login['id'])) {
$sql -> update("UPDATE `users` SET `password` = '" . md5($newpassword) . "', `token` = '0' WHERE `id` = '$login[id]' LIMIT 1");
if (function_exists('mail')) {
// в этом массиве то, что попадет в наш HTML шаблон письма
$array = array('hello' => 'Здравствуйте ' . $login['login'], // {hello} . Приветствие
'message' => 'Вы успешно восстановили доступ от Вашего аккаунта на сайте
<b>http://' . $_SERVER['HTTP_HOST'] . '</b>.<br />
Ваш логин: ' . $login['login'] . ' [ID ' . $login['id'] . ']<br />
Ваш пароль: <b>'.$newpassword.'</b>
', // обязательно текст письма, но само завизит от того что в шаблоне указано. у меня {message}
'linkbutton' => 'http://' . $_SERVER['HTTP_HOST'] . '/?func=user.auth', // у меня в шаблоне кнопка, это ссылка в ней {linkbutton}
'textbutton' => 'Авторизация' // а это название моей кнопки {textbutton}
);
$Subject = 'Доступ восстановлен'; // обязательно заголовок письма
$addAdress = $login['email']; // сверх важно!! кому письмо
$template = 'default'; // название шаблона и папки в которой он лежит. Если у вас свой шаблон, напишите название воего
// пробуем выслать наше письмо
$OutMailer = Mailer($array, $Subject, $addAdress, $template);
if ($OutMailer === false)
{
}
else echo $OutMailer; // если есть ошибки, их покажет
}
$sql -> insert("INSERT INTO `users_log` (`ua`, `ip`, `time`, `type`, `id_user`) VALUES ('" . $sql->esc($ua) . "', '" . $sql->esc($iplong) . "', '$time', 'recovery', '$login[id]')");
//$sql -> insert("INSERT INTO `users_log` (`ua`, `ip`, `time`, `type`, `id_user`) VALUES ('" . $sql->esc($ua) . "', '" . $sql->esc($ip) . "', '$time', 'recovery', '$login[id]')");
$_SESSION['id_user'] = $login['id'];
setcookie('id_user', $login['id'], time() + 60 * 60 * 24 * 365);
setcookie('pass', cookie_encrypt($newpassword, $login['id']), time() + 60 * 60 * 24 * 365);
}
}
if (isset($_POST['email']) && isset($_POST['captcha'])) {
$email = $sql->esc($_POST['email']);
$captcha = (int) $_POST['captcha'];
if ($captcha != $_SESSION['captcha']) {
$err[] = 'Неверный код с картинки';
}
if (!isset($err)) {
if ($sql -> selectCount("SELECT COUNT(*) FROM `users` WHERE `email` = '$email'") == 0) {
$err[] = 'Пользователя с таким Email не cуществует';
} else {
$_SESSION['recovery_step'] = '2';
$tmp_user = $sql -> fetch("SELECT * FROM `users` WHERE `email` = '$email' LIMIT 1");
}
}
if (isset($_POST['keyword'])) {
$keyword = $sql->esc($_POST['keyword']);
if (!isset($err)) {
if ($sql -> selectCount("SELECT COUNT(*) FROM `users` WHERE `email` = '$email' AND `keyword` = '$keyword'") == 0) {
$err[] = 'Неверное секретное слово';
} else {
$_SESSION['recovery_step'] = '3';
$tmp_user = $sql -> fetch("SELECT * FROM `users` WHERE `email` = '$email' AND `keyword` = '$keyword' LIMIT 1");
if (function_exists('mail')) {
$code = md5(date("d:m:Y") . $tmp_user['email'] . $tmp_user['password'] . $tmp_user['login']);
$sql -> update("UPDATE `users` SET `token` = '$code' WHERE `id` = '$tmp_user[id]' LIMIT 1");
// в этом массиве то, что попадет в наш HTML шаблон письма
$array = array('hello' => 'Здравствуйте Уважаемый, пользователь ' . $tmp_user['login'], // {hello} . Приветствие
'message' => 'Вы активировали восстановление пароля<br />
Для установки нового пароля нажмите на кнопку ниже или скопируйте в буфер ссылку и вставьте ее в адресную строку Вашего браузера:<br />
http://' . $_SERVER['HTTP_HOST'] . '/?func=recovery.password&code=' . $code . ' . <br />
Эта ссылка действительна до конца дня, поторопитесь завершить процедуру восстановления.',
'linkbutton' => 'http://' . $_SERVER['HTTP_HOST'] . '/?func=recovery.password&code='.$code,
'textbutton' => 'Восстановить пароль');
$Subject = 'Восстановление пароля'; // обязательно заголовок письма
$addAdress = $tmp_user['email']; // сверх важно!! кому письмо
$template = 'default'; // название шаблона и папки в которой он лежит. Если у вас свой шаблон, напишите название воего
// пробуем выслать наше письмо
$OutMailer = Mailer($array, $Subject, $addAdress, $template);
if ($OutMailer === false)
{
}
else echo $OutMailer; // если есть ошибки, их покажет
}
session_destroy();
}
}
}
}
if (!isset($_SESSION['recovery_step'])) {
$_SESSION['recovery_step'] = 1;
}
$system['title'] = 'Восстановление доступа';
require SYS . 'header.php';
if (isset($login['id'])) {
?>
<div class="alert alert-success">
<center>
<img src="<?= ICONS?>big_ok.png" /> <b>Доступ успешно восстановлен!</b><br />
Вы успешно восстановили пароль от нашего аккаунта, теперь Вы можете пользоваться своим аккаунтом как и прежде!<br />
Новый Пароль был отправлен к Вам на почту.<br />
<a href="?func=user.main&log" class="btn">Перейти в кабинет</a>
</center>
</div>
<?
} elseif (isset($_SESSION['token'])) {
?>
<div class="nav2">
Сессия для восстановления доступа устарела
</div>
<?
/*
?>
<div class="nav2">
<form class="form-horizontal" action="?func=recovery.password" method="POST">
<div class="control-group">
<label class="control-label" for="pass1">Новый пароль</label>
<div class="controls">
<input type="password" id="pass1" name="pass1" placeholder="Пароль..">
</div>
</div>
<div class="control-group">
<label class="control-label" for="pass2">Повторите пароль</label>
<div class="controls">
<input type="password" id="pass2" name="pass2" placeholder="Повторите пароль..">
</div>
</div>
<div class="control-group">
<div class="controls">
<button type="submit" class="btn">Изменить</button>
</div>
</div>
</form>
</div>
<?
*/
} elseif (isset($code)) {
?>
<div class="alert alert-success">
<center>
<img src="<?= ICONS?>big_ok.png" /> <b>Успешное завершение операции!</b><br />
Ссылка для восстановления пароля выслана вам на E-mail, который указан в вашем аккаунте.<br />
Если письмо не пришло на основной адрес - проверьте свои другие адреса.<br />
<a href="/?func=user.auth" class="btn">Перейти к авторизации</a>
</center>
</div>
<?
} else {
?>
<div class="nav2">
<form class="form-horizontal" action="?func=recovery.password" method="POST">
<div class="control-group">
<label class="control-label" for="email">Укажите свой Email</label>
<div class="controls">
<input type="text" id="email" name="email" placeholder="Email адрес.." value="<?= text($email)?>">
</div>
</div>
<? if (isset($tmp_user['id']) && $_SESSION['recovery_step'] == 2) { ?>
<div class="control-group">
<label class="control-label" for="keyword"><b>Вопрос:</b></label>
<div class="controls">
<?= $whats[$tmp_user['what_word']]?>
</div>
</div>
<div class="control-group">
<label class="control-label" for="keyword">Ответ</label>
<div class="controls">
<input type="keyword" id="keyword" name="keyword" placeholder="Ответ на вопрос..">
</div>
</div>
<? } ?>
<div class="control-group">
<label class="control-label" for="captcha">Код с картинки</label>
<div class="controls">
<img src="/_src/captcha.php?sid=<?= mt_rand(10000, 99999); ?>" id="captcha" class="captcha" /> <input type="text" id="captcha" class="captcha" name="captcha" placeholder="Введите код с картинки..">
</div>
</div>
<div class="control-group">
<div class="controls">
<button type="submit" class="btn">Продолжить</button>
</div>
</div>
</form>
</div>
<?
}
?>
<div class="foot">
« <a href="?func=user.auth">Авторизация</a>
</div>