-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathpasswordreset.php
More file actions
171 lines (152 loc) · 6.62 KB
/
passwordreset.php
File metadata and controls
171 lines (152 loc) · 6.62 KB
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
<?php
usleep(rand(80, 150) * 1000); // Make automation more painfull.
#Datafile:
#0-Tom
#1-Navn
#2-E-mail
#&3-URL
#&4-Tittel
#&5-Startdato
#6-Password
#Variable
require "lib/SiteGenerator/SiteGenerator.php";
require "lib/SiteContext.php";
require "lib/authenticate.php";
require "Stier.php";
require "Html.php";
require "view.php";
//Program
$stier = new Stier();
//$ind = Html::setPostOrGetVars($_POST, $_GET);
$ind = $_GET;
if (isset($ind['username'])) {
$lib = new Html($ind, $datafil);
} else {
$nop = '';
$lib = new Html($ind, $nop);
}
$siteContext = new SiteContext($lib, $stier, $ind, 'da');
if (isset($ind['token'])) {
$token = $ind['token'];
$authFactory = new AuthenticationFactory($stier);
$auth = $authFactory->create();
$username = $auth->isPasswordResetTokenValid($token);
if ($username !== null and $username !== "") {
if (isset($ind['pwd1'])) {
if (! isset($ind['pwd2'])) {
$message = "Du skal indtaste kodeordet i begge felter. Tryk på browserens tilbageknap og prø igen.";
} else if ($ind['pwd1'] !== $ind['pwd2']) {
$message = "Du skal indtaste det samme kodeord i begge felter. Tryk på browserens tilbageknap og prø igen.";
} else if ($ind['pwd1'] == "") {
$message = "Kodeordet må ikke være tomt. Tryk på browserens tilbageknap og prø igen.";
} else {
$auth->updatePasswordHash($username, $ind['pwd1']);
$auth->invalidateToken($token);
$datafil = DataSource::createInstance($username,$stier);
$res = $datafil->hentFil();
$datafil->dataArray[6] = ""; // Remove old cleartext password
$datafil->gemFil();
}
$side = new HtmlSite($siteContext, "Opdater kodeord");
$message = "Dit kodeord er opdateret.";
$side->addHtml($message);
echo $side->getSite();
exit;
} else {
showResetForm($siteContext, $username, $token);
}
exit;
} else {
$message = "Linket til at nulstille dit kodeord er ikke gyldigt mere. Det fungere i en time fra det tidspunkt det bliver oprettet. Du er nød til at bede om at nulstille dit kodeord igen.";
$side = new HtmlSite($siteContext, "Link ikke gyldigt mere");
$side->addHtml($message);
echo $side->getSite();
exit;
}
} else if (! isset($ind['type']) or ! isset($ind['username'])) {
if (isset($ind['username'])) {
$username = $ind['username'];
} else {
$username = "";
}
$side = new HtmlSite($siteContext, "Glemt kodeord");
$html = "<div class=forside>\n";
$html = "<p>Hvis du har glemt dit kodeord kan du få det tilsendt en e-mail med instruktioner i at nulstille det. Fordi kodeordet opbevares sikkert, er det ikke muligt at sende det.</p>";
$html .= " <form action='".htmlentities(getenv("SCRIPT_NAME"))."' method='POST'>\n";
$html .= " <p><label>Brugernavn <input type='text' name='username' value='".htmlentities($username)."'/></label></p>\n";
$html .= " <p><input type='submit' value='Nulstil kodeord' /></p>\n";
$html .= " <input type='hidden' name='type' value='mailpwd' />\n";
$html .= " </form>\n";
$html .= " <h2>Glemt brugernavn</h2>\n";
$html .= " <p>Du kan let finde dit brugernavn:</p>\n";
$html .= " <ol>\n";
$html .= " <li>Åben en side på din webside, som har ZIP Stats kode.</li>\n";
$html .= " <li>Højreklik og vælg "Vis kilde".</li>\n";
$html .= " <li>Find ZIP Stats kode: Dit brugernavn sår der flere steder lige efter teksten <code>brugernavn=</code></li>\n";
$html .= " </ol>\n";
$html .= "</div>\n";
$side->addHtml($html);
echo $side->getSite();
exit;
}
$username = $ind['username'];
$datafil = DataSource::createInstance($username,$stier);
$res = $datafil->hentFil();
if ($res === -2 or ! $res) {
$message = "Det opstod en intern fejl. Kontakt ".$stier->getOption('name_of_service')."'s administrator via e-mail-adressen nederst på siden.";
$side = new HtmlSite($siteContext, "Der opstod en fejl");
$side->addHtml($message);
echo $side->getSite();
exit;
}
$b = openssl_random_pseudo_bytes(128);
$token = base64_encode($b);
$authFactory = new AuthenticationFactory($stier);
$auth = $authFactory->create();
$auth->createPwResetRequest($username, $token);
$email = $datafil->getLine(2);
mailReset($email, $stier, $token, $siteContext);
function showResetForm($siteContext, $username, $token) {
$message = '
<p>Vælg et nyt kodeord til kontoen med brugernavn '.htmlentities($username).'. Et godt tip: Brug kodeord på mindst 8 tegn, men gerne 10. Brug både store og små bogstaver samt tal og specialtegn. Æ, ø og å kan give problemer hvis du skifter computer eller browser.</p>
<p>Indtast det samme kodeord i begge felter:</p>
<form action="passwordreset.php" method="POST">
<input type="hidden" name="token" value="'.htmlentities($token).'">
<table>
<tr><td>Første gang:</td><td><input type="password" name="pwd1"></td></tr>
<tr><td>Anden gang</td><td><input type="password" name="pwd2"></td></tr>
<tr><td></td><td><input type="submit" value="Gem nyt kodeord"></td></tr>
</table>
</form>';
$side = new HtmlSite($siteContext, "Vælg nyt kodeord");
$side->addHtml($message);
echo $side->getSite();
exit;
}
function mailReset($email, $settings, $resetToken, $siteContext)
{
if (Html::okmail($email)) {
$resetUrl = $settings->getOption('urlMain')."/passwordreset.php?token=".urlencode($resetToken);
$mail='Hej
Du, eller muligvis en anden, har bedt om at få kodeordet nulstillet til en ZIP Stat konto.
For at nulstille kodeordet skal du benytte dette link:
'.$resetUrl.'
Linket vil virke 1 time efter denne mail blev sendt, hvorefter det er n�dvendigt at bede
om en ny mail.
Hvis du ikke har bedt om at f� nulstillet dit kodeord, såse venligst bort fra denne mail.
Det er kun dig som har mulighed for at nulstille kodeordet.
--
Mvh. '.$settings->getOption('adminName').', '.$settings->getOption('name_of_service').'
';
mail($email, "Nulstil kodeord til ".$settings->getOption('name_of_service'), $mail,
"From: ".$settings->getOption('adminEMail')."\nReply-To: ".$settings->getOption('adminEMail')."\n");
} else {
usleep(rand(80, 300) * 1000); // Make timing attacks harder.
}
$message = "Der er sendt en e-mail til indehaveren af brugernavnet, med instruktioner i at nulstille kodeordet. Hvis du ikke modtager en e-mail kan det være, at brugernavnet ikke findes eller at det er registreret med en anden e-mail-adresse. Indtil nulstilningen er gennemført vil det gamle kodeord fortsat virke.";
$side = new HtmlSite($siteContext, "Der er sendt en mail");
$side->addHtml($message);
echo $side->getSite();
exit;
}
?>