Zugang E: Passwort

Erstellt am 08.03.2022 Lesedauer ≤ 1 Min.

Setzt ein neues Passwort für den Benutzer oder bietet die Anforderung eines neuen (generischen) Passworts an.

Es wird im Verzeichnis /user/ erwartet, in dem alle Daten für die Zugangskontrolle abgelegt werden.

Das Skript

Stand: 21.10.2022

<?php
// Passwort ändern
if (isset($_POST["reset"])) {
  $lname  = $_SESSION["benutzername"]; 
  $lpalt  = trim($_POST["palt"]);
  $lpneu1 = trim($_POST["pneu1"]);  
  $lpneu2 = trim($_POST["pneu2"]);
 
  if ($lpneu1 <> $lpneu2) {
?>
      <blockquote><blockquote><blockquote>
      <p>Das neue Passwort muss zwei Mal <em>identisch</em> eingegeben werden!</p>
      <p>Änderung wiederholen, ansonsten gilt das <em>alte</em> Passwort.</p>
      </blockquote></blockquote></blockquote><br/>
<?php   
  }
  else if (pw_strength($lpneu1)) {
?>
      <blockquote><blockquote><blockquote>
      <p>Minimale Passwort-Anforderungen:</p>
      <ul>
      <li>mindestens einen Großbuchstaben</li>
      <li>mindestens einen Kleinbuchstaben</li>
      <li>mindestens eine Zahl</li>
      <li>mindestens acht Zeichen</li>
      </ul>
      <p>Das neu gewählte Passwort verstößt gegen mindestens eine dieser Anforderungen.</p>
      </blockquote></blockquote></blockquote><br/>
<?php    
  }    
  else {
    $zeilen =explode("\n",file_get_contents($thefile));
    $nomatch = "<blockquote><blockquote><blockquote>ALTES Passwort falsch.</blockquote></blockquote></blockquote>";
    foreach($zeilen as &$zeile) {  // &$zeile → referenziert Inhalt → änderbar
      //$zeile = preg_replace('/\s+/','',$zeile); // Leerzeichen weg
      if (strlen($zeile)<4) continue;
      list($rname,$rpass) = explode(":", $zeile, 2);    
      if ($rname <> $lname) continue;
      if (($lname === $rname) && (password_verify($lpalt,$rpass))) {
        $rpass = password_hash($lpneu1,PASSWORD_DEFAULT);
        $zeile = $rname . ":" . $rpass;
        $nomatch = "<blockquote><p>Die Änderung war erfolgreich.<br/>Das neue Passwort ist SOFORT gültig.</p></blockquote>";
        If (!file_put_contents($thefile,implode("\n",$zeilen), LOCK_EX)) {
          sleep(1);    
          If (!file_put_contents($thefile,$zeilen, LOCK_EX)) {
           ?>   
           <blockquote><blockquote><blockquote>
           <h2>Entschuldigung</h2>
           <p>Beim Speichern des Passworts ist ein Fehler aufgetreten. Bitte nach einmal versuchen.<br/>
           Sollte der Fehler mehrfach hintereinander auftreten, bitte das [Kontaktformular](/kontakt)  für eine Rückmeldung nutzen.</p>
           </blockquote></blockquote></blockquote><br/>
           <?php
          }
        }
        break;
      }  
    }
    echo $nomatch;    
  }    
}
 
// Neues Passwort anfordern
if (isset($_POST["new"])) {
  $lname  = $_POST["name"];
    $zeilen =explode("\n",file_get_contents($thefile));
    $nomatch = "<blockquote><blockquote><blockquote><p>Der angegebene Benutzer ist unbekannt.</p></blockquote></blockquote></blockquote><br/>";
    foreach($zeilen as &$zeile) {  // &$zeile → referenziert Inhalt → änderbar
      //$zeile = preg_replace('/\s+/','',$zeile); // Leerzeichen weg
      if (strlen($zeile)<4) continue;
      list($rname,$rpass) = explode(":", $zeile, 2);    
      if ($rname <> $lname) continue;
      if ($lname === $rname) {
        $lpneu1 = random_str(10);  
        $rpass = password_hash($lpneu1,PASSWORD_DEFAULT);
        $zeile = $rname . ":" . $rpass;
        $nomatch = '';
        If (file_put_contents($thefile,implode("\n",$zeilen), LOCK_EX)) { 
          $msg = str_replace("??email??", $lname, $msg);                   
          $msg = str_replace("??pword??", $lpneu1, $msg); 
          if (mail($lname,$betreff,$msg,implode("\r\n",$headers))) {  
             echo '<blockquote><h2>„Sie haben Post!“</h2><p>Bitte im E-Mail-Postfach nachsehen, dort sollte eine Nachricht zum weiteren Vorgehen vorliegen.</p></blockquote><br/>';
          }
          else {
?>              
            <blockquote><blockquote><blockquote>
            <h2>Entschuldigung</h2>
            <p>Aus technischen Gründen kann momentant leider keine Nachricht übermittelt werden.<br/>
            Bitte in ca. 1 Stunde noch einmal versuchen.</p>
            </blockquote></blockquote></blockquote><br/>';  	 
<?php
          }
 
        }
        else {
?> 
           <blockquote><blockquote><blockquote>           
           <p>Bitte Anfrage wiederholen.<br/>
           Sollte diese Meldung mehrfach kommen, bitte das [Kontaktformular](/kontakt) für Rückmeldung nutzen.</p>
           </blockquote></blockquote></blockquote><br/>
<?php
          }
        }
        break;
      }  
     echo $nomatch;     
    }
if (isset($_SESSION["benutzername"])) {
?>
    <form method="post">
      <legend>Neues Passwort für</legend>
      <div>
          <label>E-Mail-Adresse (keine Änderung möglich!):</label/>
          <input type="text" name="xxx" readonly value="<?php echo $_SESSION["benutzername"] ?>"/>
          <label>ALTES Passwort:</label>
          <input type="password" name="palt" required="required">
          <label>NEUES Passwort:</label><input type="password" name="pneu1" required="required">
          <label>NEUES Passwort wiederholen:</label><input type="password" name="pneu2" required="required">
      </div>
      <div>
          <input type="submit" name="reset" value="Passwort ändern">
      </div>
    </form>
<?php
}
if (!isset($_SESSION["benutzername"])) {
?>
    <form method="post">
      <legend>Ich habe mein Passwort vergessen:</legend>
      <div>
        <label>E-Mail-Adresse:</label>
        <input type="text" name="name" required="required" autocomplete="username" autofocus="autofocus">
      </div>
      <div>
        <input type="submit" name="new" value="Neues Passwort anfordern">
      </div>
    </form>
<?php
}
?>