Files
kaffeekasse-saas/konto.php
T
clemensandClaude Opus 5 39f662d541 Kontofunktionen vor dem Go-Live und Landingpage-Kuerzung
Vier Luecken geschlossen, die im Alltag sofort aufgefallen waeren:

- Passwort aendern war im eingeloggten Zustand gar nicht moeglich; es gab
  nur den Reset per Mail-Link. saas_change_password() prueft das aktuelle
  Passwort, verlangt ein tatsaechlich anderes und erneuert danach die
  Session-ID. Formular in konto.php.
- mandant-auswahl.php war nur direkt nach dem Login erreichbar. Wer bei
  mehreren Mandanten Mitglied ist, musste sich zum Wechseln abmelden. Die
  Seite bedient jetzt beide Wege, die Mandantenpruefung bleibt unveraendert
  ueber saas_identity_for_user_tenant(). Menuepunkt ab zwei Mitgliedschaften.
- email_verified_at wurde nirgends geprueft, nur angezeigt - bei offener
  Selbstregistrierung konnte sich jemand mit fremder Adresse anmelden und
  alles nutzen. Erzwungen wird jetzt gezielt dort, wo eine Aktion nach
  aussen wirkt: Einladung, Info-Mail, Jahresabschluss. Der Login selbst
  bleibt bewusst frei, sonst waeren alle migrierten Bestandsnutzer mit
  NULL-Verifikation ausgesperrt. Zusaetzlich setzt der Passwort-Reset die
  Verifikation mit, weil der Mail-Link den Postfachzugriff nachweist -
  sonst blieben eingeladene Mitglieder dauerhaft unbestaetigt.
- Login landete auf konto.php statt auf dem Dashboard.

Landingpage: die gruene Vertrauenszeile auf "DSGVO-konform" gekuerzt, die
Eintraege zu Paragraf 19 UStG und "Bestehende Ablaeufe bleiben" entfernt.

Geprueft: neues scripts/check-konto-und-mandantenwechsel.php mit 18
Assertions gruen, Passwortformular zusaetzlich manuell inkl. CSRF (419).
Bestehende Suiten unveraendert gruen: HTTP-Smoke 34 Seiten, Rollenmatrix
55, Mandanten-Isolation 12, M3-Auth 9, M3-Settings 15.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 17:03:50 +02:00

142 lines
5.1 KiB
PHP

<?php
require_once __DIR__ . '/functions.php';
$user = saas_require_login();
$devVerificationToken = null;
if (saas_should_show_auth_links() && !empty($_SESSION['saas_dev_email_verification_token'])) {
$devVerificationToken = (string)$_SESSION['saas_dev_email_verification_token'];
unset($_SESSION['saas_dev_email_verification_token']);
}
$passwortFehler = [];
$passwortGeaendert = false;
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['aktion'] ?? '') === 'passwort_aendern') {
app_require_csrf();
$pdo = app_db_pdo();
$ergebnis = saas_change_password(
$pdo,
(int)$user['user_id'],
(string)($_POST['aktuelles_passwort'] ?? ''),
(string)($_POST['neues_passwort'] ?? ''),
(string)($_POST['neues_passwort_confirm'] ?? '')
);
if ($ergebnis['ok']) {
$passwortGeaendert = true;
} else {
$passwortFehler = $ergebnis['errors'];
}
}
include 'header.php';
include 'headerline.php';
include 'nav.php';
?>
<section id="banner">
<div class="content">
<h2>Kundenkonto</h2>
<?php if (isset($_GET['registered'])): ?>
<div class="hint-box success"><p>Das Kundenkonto wurde angelegt.</p></div>
<?php endif; ?>
<?php if ($devVerificationToken !== null): ?>
<div class="hint-box success">
<p>Der Verifizierungslink wurde vorbereitet.</p>
<p><a href="email-verifizieren.php?token=<?php echo saas_html($devVerificationToken); ?>">Dev-Link zur E-Mail-Verifizierung</a></p>
</div>
<?php endif; ?>
<table>
<tr>
<th>Name</th>
<td><?php echo saas_html($user['display_name']); ?></td>
</tr>
<tr>
<th>E-Mail</th>
<td><?php echo saas_html($user['email']); ?></td>
</tr>
<tr>
<th>Kunde</th>
<td><?php echo saas_html($user['tenant_name']); ?></td>
</tr>
<tr>
<th>Kundenkürzel</th>
<td><?php echo saas_html($user['tenant_slug']); ?></td>
</tr>
<tr>
<th>Rolle</th>
<td><?php echo saas_html($user['role']); ?></td>
</tr>
<tr>
<th>E-Mail bestätigt</th>
<td><?php echo $user['email_verified_at'] !== null ? 'ja' : 'nein'; ?></td>
</tr>
</table>
<?php if ($user['email_verified_at'] === null): ?>
<form method="post" action="email-verifikation-senden.php">
<?php echo app_csrf_field(); ?>
<button type="submit">E-Mail-Verifizierung vorbereiten</button>
</form>
<?php endif; ?>
<h3>Passwort ändern</h3>
<?php if ($passwortGeaendert): ?>
<div class="hint-box success"><p>Das Passwort wurde geändert.</p></div>
<?php endif; ?>
<?php if ($passwortFehler !== []): ?>
<div class="hint-box error">
<?php foreach ($passwortFehler as $fehler): ?>
<p><?php echo saas_html($fehler); ?></p>
<?php endforeach; ?>
</div>
<?php endif; ?>
<form method="post" action="konto.php">
<?php echo app_csrf_field(); ?>
<input type="hidden" name="aktion" value="passwort_aendern">
<div class="row">
<div class="col-12">
<label for="aktuelles_passwort">Aktuelles Passwort</label>
<input type="password" name="aktuelles_passwort" id="aktuelles_passwort" autocomplete="current-password" required>
</div>
<div class="col-12">
<label for="neues_passwort">Neues Passwort (mindestens 8 Zeichen)</label>
<input type="password" name="neues_passwort" id="neues_passwort" autocomplete="new-password" required>
</div>
<div class="col-12">
<label for="neues_passwort_confirm">Neues Passwort wiederholen</label>
<input type="password" name="neues_passwort_confirm" id="neues_passwort_confirm" autocomplete="new-password" required>
</div>
</div>
<ul class="actions">
<li><button type="submit">Passwort ändern</button></li>
</ul>
</form>
<?php if (saas_can_manage_tenant_settings($user)): ?>
<ul class="actions">
<li><a href="mandant-einstellungen.php" class="button">Mandant-Einstellungen</a></li>
<li><a href="datenexport.php" class="button">Datenexport</a></li>
<?php if (saas_user_has_role('owner', $user)): ?>
<li><a href="mandant-loeschen.php" class="button">Mandant löschen</a></li>
<?php endif; ?>
</ul>
<?php endif; ?>
<form method="post" action="logout.php">
<?php echo app_csrf_field(); ?>
<button type="submit">Abmelden</button>
</form>
</div>
</section>
<?php include 'footer.php'; ?>