Kunde: E-Mail Pflichtfeld + keine verwaltete Provider-Domain erlaubt

Die private Kunden-E-Mail (Customer.email) darf nicht auf einer der bei den
E-Mail-Providern konfigurierten Domains (bzw. Subdomains) liegen - sonst
traegt man versehentlich eine unserer verwalteten Weiterleitungs-/Mailbox-
Adressen als private Adresse ein. Zudem ist E-Mail jetzt Pflichtfeld.

Backend: createCustomer/updateCustomer pruefen Pflicht + Domain (neue Helper
getConfiguredEmailDomains/emailUsesDomain im emailProvider-Service);
email aus nullableFields entfernt. Frontend: E-Mail-Feld required + Hinweis.

Verifiziert: Provider-Domain + Subdomain (case-insensitiv) verboten,
Fremd-Domains erlaubt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-18 14:08:12 +02:00
co-authored by Claude Opus 4.8
parent db4b9edd13
commit b8128616f2
3 changed files with 61 additions and 6 deletions
@@ -74,6 +74,32 @@ export async function getActiveProviderConfig() {
});
}
/**
* Alle konfigurierten Provider-Domains (lowercase, dedupliziert). Das sind
* UNSERE verwalteten Mailbox-/Weiterleitungs-Domains (z.B. stressfrei-wechseln.de)
* eine private Kunden-E-Mail darf darauf NICHT liegen, sonst trägt man
* versehentlich eine unserer Weiterleitungsadressen als private Adresse ein.
*/
export async function getConfiguredEmailDomains(): Promise<string[]> {
const configs = await prisma.emailProviderConfig.findMany({ select: { domain: true } });
const domains = configs
.map((c) => (c.domain || '').trim().toLowerCase())
.filter((d) => d.length > 0);
return [...new Set(domains)];
}
/**
* true, wenn die E-Mail auf einer der übergebenen Domains (oder einer Subdomain
* davon) liegt. Vergleich case-insensitiv.
*/
export function emailUsesDomain(email: string, domains: string[]): boolean {
const at = email.lastIndexOf('@');
if (at < 0) return false;
const host = email.slice(at + 1).trim().toLowerCase();
if (!host) return false;
return domains.some((d) => host === d || host.endsWith('.' + d));
}
export interface CreateProviderConfigData {
name: string;
type: 'PLESK' | 'CPANEL' | 'DIRECTADMIN';