-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathforgotten-password.php
113 lines (93 loc) · 4.23 KB
/
forgotten-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
<?php
//načteme připojení k databázi a inicializujeme session
require_once 'include/user.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
// Load Composer's autoloader
require './facebook/vendor/autoload.php';
if (!empty($_SESSION['user_id'])) {
//uživatel už je přihlášený, nemá smysl, aby se přihlašoval znovu
header('Location: index.php');
exit();
}
$errors = false;
if (!empty($_POST) && !empty($_POST['email'])) {
#region zpracování formuláře
$userQuery = $db->prepare('SELECT * FROM library_users WHERE email=:email LIMIT 1;');
$userQuery->execute([
':email' => trim($_POST['email'])
]);
if ($user = $userQuery->fetch(PDO::FETCH_ASSOC)) {
//zadaný e-mail byl nalezen
#region vygenerování kódu pro obnovu hesla
$code = 'xx' . rand(100000, 993952); //rozhodně by tu mohlo být i kreativnější generování náhodného kódu :)
//uložíme kód do databáze
$saveQuery = $db->prepare('INSERT INTO forgotten_passwords (user_id, code) VALUES (:user, :code)');
$saveQuery->execute([
':user' => $user['user_id'],
':code' => $code
]);
//načteme uložený záznam z databáze
$requestQuery = $db->prepare('SELECT * FROM forgotten_passwords WHERE user_id=:user AND code=:code ORDER BY forgotten_password_id DESC LIMIT 1;');
$requestQuery->execute([
':user' => $user['user_id'],
':code' => $code
]);
$request = $requestQuery->fetch(PDO::FETCH_ASSOC);
//sestavíme odkaz pro mail
$link = 'https://eso.vse.cz/~olim02/Knihovna/renew-password.php';
$link = $link.'?user=' . $request['user_id'] . '&code=' . $request['code'] . '&request=' . $request['forgotten_password_id'];
#endregion vygenerování kódu pro obnovu hesla
#region poslání mailu pro obnovu hesla
//inicializujeme PHPMailer pro poslání mailu přes sendmail
$mailer = new PHPMailer(false);
$mailer->isSendmail();
//nastavení adresy příjemce a odesílatele
$mailer->addAddress($user['email'], $user['name']); //příjemce mailu; POZOR: server eso.vse.cz umí posílat maily jen na školní e-maily!
$mailer->setFrom('[email protected]');
//nastavíme kódování a předmět e-mailu
$mailer->CharSet = 'utf-8';
$mailer->Subject = 'Obnova zapomenutého hesla';
$mailer->isHTML(true);
$mailer->Body = '<html>
<head><meta charset="utf-8" /></head>
<body>Pro obnovu hesla do Knihovny klikněte na následující odkaz: <a href="' . htmlspecialchars($link) . '">' . htmlspecialchars($link) . '</a></body>
</html>';
$mailer->AltBody = 'Pro obnovu hesla do Knihovny klikněte na následující odkaz: ' . $link;
$mailer->send();
#endregion poslání mailu pro obnovu hesla
//přesměrování pro potvrzení
header('Location: forgotten-password.php?mailed=ok');
} else {
//zadaný e-mail nebyl nalezen
$errors = true;
}
#endregion zpracování formuláře
}
//vložíme do stránek hlavičku
include 'include/header.php';
if (@$_GET['mailed'] == 'ok') {
echo '<p>Zkontrolujte svoji e-mailovou schránku a klikněte na odkaz, který vám byl zaslán mailem.</p>';
echo '<a href="login.php" class="btn btn-dark text-white">Zpět na přihlášení</a>';
} else {
?>
<div class="box">
<div class="btop">
<p class="topic">Zapomenuté heslo</p>
</div>
<div class="bbot">
<form method="post">
<label for="email">E-mail:</label>
<input type="email" class="py-1" name="email" id="email" required value="<?php echo htmlspecialchars(@$_POST['email']) ?>" />
<?php
echo ($errors ? '<div class="error">Neplatný e-mail.</div>' : '');
?>
<button type="submit" class="btn btn-dark">Zaslat e-mail k obnově hesla</button>
<a href="login.php" class="btn btn-secondary">Zrušit</a><br>
</form>
</div>
</div>
<?php
}
//vložíme do stránek patičku
include 'include/footer.php';