-
Notifications
You must be signed in to change notification settings - Fork 1
/
password.php
executable file
·136 lines (122 loc) · 4.93 KB
/
password.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php
session_start();
?>
<html>
<head>
<title>Восстановления пароля администратора</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
<meta http-equiv="Content-Language" content="ru" />
</head>
<style>
h1{font-size:26px; font-weight:normal}
p{font-size:19px;}
input{font-size:18px;}
p.error{color:red;}
div.maindiv{width: 600px; height: 300px; position: relative; left: 50%; top: 100px; margin-left: -300px; }
</style>
<body>
<div style='width:100%; height:100%;'>
<div class="maindiv">
<?php
require_once('api/Simpla.php');
$simpla = new Simpla();
// Если пришли по ссылке из письма
if($c = $simpla->request->get('code'))
{
// Код не совпадает - прекращяем работу
if(empty($_SESSION['admin_password_recovery_code']) || empty($c) || $_SESSION['admin_password_recovery_code'] !== $c)
{
header('Location:password.php');
exit();
}
// IP не совпадает - прекращяем работу
if(empty($_SESSION['admin_password_recovery_ip'])|| empty($_SERVER['REMOTE_ADDR']) || $_SESSION['admin_password_recovery_ip'] !== $_SERVER['REMOTE_ADDR'])
{
header('Location:password.php');
exit();
}
// Если запостили пароль
if($new_password = $simpla->request->post('new_password'))
{
// Файл с паролями
$passwd_file = $simpla->config->root_dir.'simpla/.passwd';
// Удаляем из сесси код, чтобы больше никто не воспользовался ссылкой
unset($_SESSION['admin_password_recovery_code']);
unset($_SESSION['admin_password_recovery_ip']);
// Если в файлы запрещена запись - предупреждаем об этом
if(!is_writable($passwd_file))
{
print "
<h1>Восстановление пароля администратора</h1>
<p class='error'>
Файл /simpla/.passwd недоступен для записи.
</p>
<p>Вам нужно зайти по FTP и изменить права доступа к этому файлу, после чего повторить процедуру восстановления пароля.</p>
";
}
else
{
// Новый логин и пароль
$new_login = $simpla->request->post('new_login');
$new_password = $simpla->request->post('new_password');
if(!$simpla->managers->update_manager($new_login, array('password'=>$new_password)))
$simpla->managers->add_manager(array('login'=>$new_login, 'password'=>$new_password));
print "
<h1>Восстановление пароля администратора</h1>
<p>
Новый пароль установлен
</p>
<p>
<a href='".$simpla->root_url."/simpla/index.php?module=ManagersAdmin'>Перейти в панель управления</a>
</p>
";
}
}
else
{
// Форма указалия нового логина и пароля
print "
<h1>Восстановление пароля администратора</h1>
<p>
<form method=post>
Новый логин:<br><input type='text' name='new_login'><br><br>
Новый пароль:<br><input type='password' name='new_password'><br><br>
<input type='submit' value='Сохранить логин и пароль'>
</form>
</p>
";
}
}
else
{
print "
<h1>Восстановление пароля администратора</h1>
<p>
Введите email администратора
<form method='post' action='".$simpla->root_url."/password.php'>
<input type='text' name='email'>
<input type='submit' value='Восстановить пароль'>
</form>
</p>
";
$admin_email = $simpla->settings->admin_email;
if(isset($_POST['email']))
{
if($_POST['email'] === $admin_email)
{
$code = $simpla->config->token(mt_rand(1, mt_getrandmax()).mt_rand(1, mt_getrandmax()).mt_rand(1, mt_getrandmax()));
$_SESSION['admin_password_recovery_code'] = $code;
$_SESSION['admin_password_recovery_ip'] = $_SERVER['REMOTE_ADDR'];
$message = 'Вы или кто-то другой запросил ссылку на восстановление пароля администратора.<br>';
$message .= 'Для смены пароля перейдите по ссылке '.$simpla->config->root_url.'/password.php?code='.$code.'<br>';
$message .= 'Если письмо пришло вам по ошибке, проигнорируйте его.';
$simpla->notify->email($admin_email, 'Восстановление пароля администратора '.$simpla->settings->site_name, $message, $simpla->settings->notify_from_email);
}
print "Вам отправлена ссылка для восстановления пароля. Если письмо вам не пришло, значит вы неверно указали email или что-то не так с хостингом";
}
}
?>
</div>
</div>
</body>
</html>