160 lines
7.0 KiB
PHP
160 lines
7.0 KiB
PHP
<?php /* Name: reset-password.php
|
|
Beschreibung: Passwort-Reset per SMS OTP (3 Schritte)
|
|
- Schritt 1: E-Mail eingeben → OTP per SMS
|
|
- Schritt 2: OTP-Code verifizieren
|
|
- Schritt 3: Neues Passwort setzen */
|
|
|
|
if (session_status() == PHP_SESSION_NONE) {
|
|
session_start();
|
|
}
|
|
require_once $_SERVER['DOCUMENT_ROOT'].'/intranet_repo/general_files/ini/parameters.php';
|
|
require_once $_SERVER['DOCUMENT_ROOT'].'/intranet_repo/general_files/ini/functions.php';
|
|
|
|
$step = $_GET["step"] ?? "email";
|
|
?>
|
|
|
|
<!DOCTYPE html>
|
|
<html lang="de" dir="ltr">
|
|
<head>
|
|
<?php require_once $_SERVER['DOCUMENT_ROOT'].'/intranet_repo/projects/_central/php/html_head.php'; ?>
|
|
<style>
|
|
.login_button { position: relative; }
|
|
.login_button.is-loading {
|
|
color: transparent !important;
|
|
pointer-events: none;
|
|
}
|
|
.login_button.is-loading::after {
|
|
content: '';
|
|
position: absolute;
|
|
top: 50%;
|
|
left: 50%;
|
|
width: 22px;
|
|
height: 22px;
|
|
margin: -11px 0 0 -11px;
|
|
border: 3px solid rgba(255,255,255,0.35);
|
|
border-top-color: #FFFFFF;
|
|
border-radius: 50%;
|
|
animation: spin 0.7s linear infinite;
|
|
}
|
|
@keyframes spin {
|
|
to { transform: rotate(360deg); }
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="login_panel">
|
|
|
|
<?php if (isset($_GET["error"])): ?>
|
|
<?php
|
|
$errorMessages = [
|
|
1 => "E-Mail-Adresse nicht gefunden oder nicht registriert.",
|
|
2 => "Keine Telefonnummer hinterlegt. Bitte wenden Sie sich an den Administrator.",
|
|
3 => "Ungültiger oder abgelaufener Code.",
|
|
4 => "SMS konnte nicht gesendet werden. Bitte versuchen Sie es erneut.",
|
|
5 => "Passwort muss mindestens 8 Zeichen, einen Buchstaben und eine Zahl enthalten.",
|
|
6 => "Passwörter stimmen nicht überein.",
|
|
7 => "Sitzung abgelaufen. Bitte starten Sie den Vorgang erneut."
|
|
];
|
|
$errorNum = (int)$_GET["error"];
|
|
$errorText = $errorMessages[$errorNum] ?? "Unbekannter Fehler.";
|
|
?>
|
|
<div class="nak-toast nak-toast--error nak-toast--inline" id="nakToastErr">
|
|
<div class="nak-toast__icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="square" stroke-linejoin="miter"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg></div>
|
|
<span class="nak-toast__text"><?= htmlspecialchars($errorText) ?></span>
|
|
</div>
|
|
<script>requestAnimationFrame(function(){document.getElementById('nakToastErr').classList.add('nak-toast--visible');});</script>
|
|
<?php endif; ?>
|
|
|
|
<?php if (isset($_GET["success"]) && $_GET["success"] == 1): ?>
|
|
<div class="nak-toast nak-toast--success nak-toast--inline" id="nakToastOk">
|
|
<div class="nak-toast__icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="square" stroke-linejoin="miter"><path d="M20 6L9 17l-5-5"/></svg></div>
|
|
<span class="nak-toast__text">Passwort erfolgreich geändert. Sie können sich jetzt anmelden.</span>
|
|
</div>
|
|
<script>requestAnimationFrame(function(){document.getElementById('nakToastOk').classList.add('nak-toast--visible');});</script>
|
|
<?php endif; ?>
|
|
|
|
<div class="login_content">
|
|
<div class="nak-logo-link auth-logo">
|
|
<img class="auth-logo__icon" src="/intranet_repo/projects/_central/img/nak-logo.svg" alt="NAK Logo">
|
|
<div class="auth-logo__text">
|
|
<div class="auth-logo__name">Neuapostolische Kirche</div>
|
|
<div class="auth-logo__gemeinde">Berlin-Reinickendorf</div>
|
|
</div>
|
|
</div>
|
|
<h2>Passwort zurücksetzen</h2>
|
|
|
|
<?php if ($step === "email"): ?>
|
|
<!-- SCHRITT 1: E-Mail eingeben -->
|
|
<p style="text-align:center;color:var(--gray-600);font-size:var(--font-size-sm);margin-bottom:var(--space-sm);">Geben Sie Ihre E-Mail-Adresse ein. Ein Bestätigungscode wird an Ihre hinterlegte Telefonnummer und per Mail gesendet.</p>
|
|
|
|
<form action="reset-password-process.php" method="post" id="otpRequestForm">
|
|
<input type="hidden" name="action" value="request_otp">
|
|
<label for="email">E-Mailadresse</label>
|
|
<div class="item">
|
|
<input class="login_field" type="email" id="email" name="email" required>
|
|
</div>
|
|
<button class="login_button" type="submit" id="requestBtn">Code anfordern</button>
|
|
</form>
|
|
<script>
|
|
document.getElementById('otpRequestForm').addEventListener('submit', function() {
|
|
var btn = document.getElementById('requestBtn');
|
|
btn.classList.add('is-loading');
|
|
btn.disabled = true;
|
|
});
|
|
</script>
|
|
|
|
<?php elseif ($step === "verify"): ?>
|
|
<!-- SCHRITT 2: Nur OTP-Code eingeben -->
|
|
<?php $phone_masked = htmlspecialchars($_GET["phone"] ?? "***"); ?>
|
|
<p style="text-align:center;color:var(--gray-600);font-size:var(--font-size-sm);margin-bottom:var(--space-sm);">Ein 6-stelliger Code wurde an die Nummer +49 <?= $phone_masked ?> und an Ihre E-Mail-Adresse gesendet.</p>
|
|
|
|
<form action="reset-password-process.php" method="post">
|
|
<input type="hidden" name="action" value="verify_otp">
|
|
<input type="hidden" name="user_id" value="<?= (int)($_GET["uid"] ?? 0) ?>">
|
|
|
|
<label for="otp_code">Bestätigungscode</label>
|
|
<div class="item">
|
|
<input class="login_field" type="text" id="otp_code" name="otp_code" maxlength="6" inputmode="numeric" pattern="[0-9]{6}" placeholder="000000" required autocomplete="one-time-code" style="text-align:center;font-size:1.4em;letter-spacing:8px;">
|
|
</div>
|
|
|
|
<input class="login_button" type="submit" value="Code bestätigen">
|
|
</form>
|
|
|
|
<?php elseif ($step === "newpassword"): ?>
|
|
<!-- SCHRITT 3: Neues Passwort setzen (nur nach verifiziertem OTP) -->
|
|
<p style="text-align:center;color:var(--gray-600);font-size:var(--font-size-sm);margin-bottom:var(--space-sm);">Ihr Code wurde bestätigt. Geben Sie nun Ihr neues Passwort ein.</p>
|
|
|
|
<form action="reset-password-process.php" method="post">
|
|
<input type="hidden" name="action" value="set_password">
|
|
<input type="hidden" name="reset_token" value="<?= htmlspecialchars($_GET["token"] ?? '') ?>">
|
|
|
|
<label for="new_password">Neues Passwort</label>
|
|
<div class="item">
|
|
<input class="login_field" type="password" id="new_password" name="new_password" required>
|
|
</div>
|
|
|
|
<label for="new_password_confirm">Neues Passwort wiederholen</label>
|
|
<div class="item">
|
|
<input class="login_field" type="password" id="new_password_confirm" name="new_password_confirm" required>
|
|
</div>
|
|
|
|
<input class="login_button" type="submit" value="Passwort ändern">
|
|
</form>
|
|
|
|
<?php endif; ?>
|
|
|
|
<div class="small_text" align="center">
|
|
<br>
|
|
<a href="login.php">Zurück zur Anmeldung</a><br>
|
|
<br>
|
|
Probleme beim Zurücksetzen?<br>
|
|
<a href="#" onclick="openContactModal(); return false;">Admin kontaktieren</a>
|
|
</div>
|
|
</div><!-- EOD: login_content -->
|
|
</div><!-- EOD: login_panel -->
|
|
|
|
<?php require_once $_SERVER['DOCUMENT_ROOT'].'/intranet_repo/projects/_central/php/footer.php'; ?>
|
|
|
|
</body>
|
|
</html>
|