user()->is($user), 403); if (! $user->pending_email) { return redirect()->route('me.security') ->with('security-status', __('Es liegt keine ausstehende E-Mail-Änderung vor. Möglicherweise wurde der Link bereits verwendet.')); } abort_unless(hash_equals(sha1($user->pending_email), $hash), 403); // Zwischenzeitlich vergeben? Dann Änderung verwerfen statt Konflikt anlegen. if (User::query()->where('email', $user->pending_email)->whereKeyNot($user->id)->exists()) { $user->forceFill(['pending_email' => null])->save(); return redirect()->route('me.security') ->with('security-error', __('Die neue E-Mail-Adresse wird inzwischen von einem anderen Konto verwendet. Die Änderung wurde verworfen.')); } $previousEmail = (string) $user->email; $user->forceFill([ 'email' => $user->pending_email, 'email_verified_at' => now(), 'pending_email' => null, ])->save(); // Die Firmenrechte hängen an der Adresse (Audit 7.1): automatische // Rechte der alten Adresse sofort zurücknehmen, passende der neuen // vergeben – nicht erst beim nächsten Login. $contactAccess->syncMembershipsForEmail($user); // Die bisherige Adresse erfährt von der Änderung (Sicherheitsaudit // 07.10.2026, S-06) — sonst bliebe eine Übernahme per fremder Session // für den Inhaber unsichtbar. $notifier->notify($user, SecurityChange::EmailChanged, recipient: $previousEmail, newEmail: (string) $user->email); return redirect()->route('me.security') ->with('security-status', __('Ihre E-Mail-Adresse wurde erfolgreich geändert.')); } }