2023-08-23 16:16:36 +00:00
< ? php
const MESSAGE = 'Hallo %%NAME%%,<br/><br/>das Passwort für deinen 4Creative-Account wurde soeben über die Funktion "Passwort vergessen" geändert.<br/><br/>Solltest du diese Änderung nicht selbst durchgeführt haben, wende dich bitte umgehend per E-Mail (info@4creative.net) oder Discord (@ikeytan) an uns.' ;
2023-08-23 16:16:36 +00:00
const TOKEN_INVALID = 'Dieser Link zur Passwortzurücksetzung ist nicht gültig. Bitte klicke oder kopiere den Link aus der E-Mail, die du erhalten hast.' ;
const TOKEN_EXPIRED = 'Dein Link zur Passwortzurücksetzung ist abgelaufen. Klicke <a href="index.php?page=forgot">hier</a>, um eine neue Anfrage zu senden.' ;
2023-08-23 16:16:36 +00:00
2023-08-27 03:31:32 +00:00
function displayTokenError ( $message )
{
2023-08-23 16:16:36 +00:00
$HTML = new HTML ();
$HTML -> importHTML ( " error.html " );
2023-08-23 16:16:36 +00:00
$HTML -> ReplaceLayoutInhalt ( '%%MESSAGE%%' , $message );
2023-08-23 16:16:36 +00:00
$HTML -> build ();
2023-08-23 16:16:36 +00:00
echo $HTML -> ausgabe ();
2023-08-23 16:16:36 +00:00
exit ();
}
2023-08-27 03:31:32 +00:00
function displayPage ( $err )
{
if ( ! isset ( $_GET [ 'token' ]) || ! preg_match ( '/^[a-z0-9A-Z]{32}$/' , $_GET [ 'token' ])) {
2023-08-23 16:16:36 +00:00
displayTokenError ( TOKEN_INVALID );
}
2023-08-23 16:16:36 +00:00
$HTML = new HTML ();
$HTML -> setHTMLTitle ( " " );
$HTML -> importHTML ( " reset-password.html " );
$HTML -> ReplaceLayoutInhalt ( '%%MESSAGE%%' , $err );
2023-08-23 16:16:36 +00:00
$HTML -> ReplaceLayoutInhalt ( '%%RESET_TOKEN%%' , htmlspecialchars ( $_GET [ 'token' ]));
2023-08-23 16:16:36 +00:00
$HTML -> build ();
echo $HTML -> ausgabe ();
exit ();
}
2023-08-27 03:31:32 +00:00
if ( $_SERVER [ 'REQUEST_METHOD' ] == 'POST' ) {
2023-08-23 16:16:36 +00:00
include_once 'app/FormValidator.php' ;
2023-08-27 03:31:32 +00:00
$validator = new FormValidator ( array (
2023-08-23 16:16:36 +00:00
'password' => array ( 'required' => true , 'regex' => '/^.{1,1000}$/' ),
'passwordRepeat' => array ( 'required' => true , 'regex' => '/^.{1,1000}$/' ),
'resetToken' => array ( 'required' => true , 'regex' => '/^[a-zA-Z0-9]{32}$/' )
));
2023-08-27 03:31:32 +00:00
if ( $validator -> isValid ( $_POST )) {
if ( $_POST [ 'password' ] !== $_POST [ 'passwordRepeat' ]) {
2023-08-23 16:16:36 +00:00
displayPage ( 'Du musst in beiden Feldern das gleiche Passwort eingeben' );
}
2023-08-27 03:31:32 +00:00
if ( strlen ( $_POST [ 'password' ]) < $RUNTIME [ 'PASSWORD_MIN_LENGTH' ]) {
2023-08-23 16:16:36 +00:00
displayPage ( 'Dein Passwort muss mindestens ' . $RUNTIME [ 'PASSWORD_MIN_LENGTH' ] . ' Zeichen lang sein.' );
}
2023-08-23 16:16:36 +00:00
$getReq = $RUNTIME [ 'PDO' ] -> prepare ( 'SELECT UserAccounts.PrincipalID AS UUID,FirstName,LastName,Email,Token,RequestTime FROM PasswordResetTokens JOIN UserAccounts ON UserAccounts.PrincipalID = PasswordResetTokens.PrincipalID WHERE Token = ?' );
$getReq -> execute ([ $_POST [ 'resetToken' ]]);
2023-08-27 03:31:32 +00:00
if ( $getReq -> rowCount () == 0 ) {
2023-08-23 16:16:36 +00:00
displayTokenError ( TOKEN_INVALID );
}
$res = $getReq -> fetch ();
2023-08-27 03:31:32 +00:00
if ( ! hash_equals ( $res [ 'Token' ], $_POST [ 'resetToken' ])) {
2023-08-23 16:16:36 +00:00
displayTokenError ( TOKEN_INVALID );
2023-08-23 16:16:36 +00:00
}
2023-08-23 16:16:36 +00:00
$uuid = $res [ 'UUID' ];
2023-08-23 16:16:36 +00:00
$name = $res [ 'FirstName' ] . ' ' . $res [ 'LastName' ];
2023-08-23 16:16:36 +00:00
$getToken = $RUNTIME [ 'PDO' ] -> prepare ( 'DELETE FROM PasswordResetTokens WHERE PrincipalID = ? AND Token = ?' );
$getToken -> execute ([ $uuid , $_POST [ 'resetToken' ]]);
2023-08-27 03:31:32 +00:00
if ( $getToken -> rowCount () == 0 ) {
2023-08-23 16:16:36 +00:00
displayTokenError ( TOKEN_INVALID );
}
2023-08-27 03:31:32 +00:00
if ( time () - $res [ 'RequestTime' ] > 86400 ) {
2023-08-23 16:16:36 +00:00
displayTokenError ( TOKEN_EXPIRED );
}
2023-08-23 16:16:36 +00:00
$salt = bin2hex ( random_bytes ( 16 ));
$hash = md5 ( md5 ( trim ( $_POST [ 'password' ])) . ':' . $salt );
2023-08-27 03:31:32 +00:00
$statement = $RUNTIME [ 'PDO' ] -> prepare ( 'UPDATE auth SET passwordHash = :PasswordHash, passwordSalt = :PasswordSalt WHERE UUID = :PrincipalID' );
2023-08-23 16:16:36 +00:00
$statement -> execute ([ 'PasswordHash' => $hash , 'PasswordSalt' => $salt , 'PrincipalID' => $uuid ]);
session_unset ();
2023-08-23 16:16:36 +00:00
$_SESSION [ 'loginMessage' ] = 'Du kannst dich jetzt mit deinem neuen Passwort einloggen!' ;
$_SESSION [ 'loginMessageColor' ] = 'darkgreen' ;
2023-08-23 16:16:36 +00:00
require_once 'app/utils.php' ;
2023-08-23 16:16:36 +00:00
sendMail ( $res [ 'Email' ], str_replace ( '%%NAME%%' , $name , MESSAGE ), 'Passwort für ' . $name . ' zurückgesetzt' , 'Passwort geändert' , 'Das Passwort für deinen 4Creative-Account wurde soeben zurückgesetzt' );
2023-08-23 16:16:36 +00:00
header ( 'Location: index.php?page=login' );
exit ();
}
}
displayPage ( '' );