login/pass: allow token instead of login
authorMischa POSLAWSKY <perl@shiar.org>
Tue, 24 Apr 2018 22:07:18 +0000 (00:07 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Wed, 25 Apr 2018 01:45:19 +0000 (03:45 +0200)
Only on this page a code can be used instead of valid user
in case password was forgotten.

login/pass.php

index 829aff43713868597789cf218a22b070aa3851f9..1494e37415057395692d9fa77d39e2764e3104d2 100644 (file)
@@ -1,4 +1,27 @@
 <?php
+if (isset($_GET['token'])) {
+       @list ($username, $token) = explode(':', $_GET['token']);
+       $userdir = strtolower("profile/$username");
+       if ($verify = @file_get_contents("$userdir/.token")
+       and $verify == $token) {
+               $User = [
+                       'name' => $username,
+                       'dir'  => $userdir,
+                       'pass' => NULL,
+               ];
+       }
+       else {
+               print "<p class=warn>Code onjuist, geen toestemming om wachtwoord in te stellen.</p>\n";
+               return TRUE;
+       }
+}
+elseif (!$User) {
+       http_response_code(303);
+       $target = urlencode($_SERVER['REQUEST_URI']);
+       header("Location: /login?goto=$target");
+       exit;
+}
+
 if ($_POST) {
        $error = passform($_POST);
        if (empty($error)) {
@@ -21,12 +44,18 @@ function passform($input = [])
                return "Het wachtwoord kan niet worden aangepast voor deze gebruiker.";
        }
 
-       if (empty($_POST['oldpass'])) {
-               return "Als extra beveiliging tegen ongewenste aanpassingen moet het bestaande wachtwoord worden ingevoerd.";
+       if (!empty($User['pass'])) {
+               if (empty($_POST['oldpass'])) {
+                       return "Als extra beveiliging tegen ongewenste aanpassingen moet het bestaande wachtwoord worden ingevoerd.";
+               }
+
+               if (!login_password_verify($_POST['oldpass'], $User['pass'])) {
+                       return "Het bestaande wachtwoord is onjuist ingevoerd; niet aangepast.";
+               }
        }
 
        if (empty($_POST['newpass'])) {
-               return "Geef ook een nieuw wachtwoord op.";
+               return "Geef een nieuw wachtwoord op.";
        }
 
        if (strlen($_POST['newpass']) < 4) {
@@ -37,14 +66,12 @@ function passform($input = [])
                return "De loginnaam is wel heel makkelijk raadbaar als wachtwoord.";
        }
 
-       if (!login_password_verify($_POST['oldpass'], $User['pass'])) {
-               return "Het bestaande wachtwoord is onjuist ingevoerd; niet aangepast.";
-       }
-
        if (!file_put_contents($pwfile, $_POST['newpass'])) {
                return "Het nieuwe wachtwoord kon niet worden opgeslagen. Het oude wachtwoord is behouden.";
        }
 
+       @unlink("{$User['dir']}/.token"); # invalidate reset token
+
        $authhash = md5($_POST['newpass']);
        $User['auth'] = "{$User['name']}:$authhash";
        login_setcookie();
@@ -54,7 +81,9 @@ function passform($input = [])
 ?>
 <form method="post">
 <p>
+<?php if (!empty($User['pass'])) { ?>
 <input type="password" name="oldpass" value="" placeholder="Huidig wachtwoord" />
+<?php } ?>
 <input type="password" name="newpass" value="" placeholder="Nieuw wachtwoord" />
 <input type="submit" value="Wijzig" />
 </p>