rebreak-monorepo/backend/server/utils/public-email-domains.ts
chahinebrini 38811820e6 feat(backend): Public-Domain-Guard + Mail-Detection (spins/%-Pattern)
Public-Domain-Guard (icloud.com/gmail.com etc. nie blockbar/veröffentlichbar):
- neue utils/public-email-domains.ts (shared Freemail-Liste)
- custom-domains/index.post + custom-domains/suggest + curated-domains/suggest
  lehnen Public-Domains mit 400 PUBLIC_DOMAIN ab (defense-in-depth)

Mail-Detection (mo): "spins" zu GAMBLING_KEYWORDS + Subject-%-Pattern (Score 10)
→ fängt "Spins + 400% Bonus"-Spam von Freemail-Absendern. 61/61 Tests grün.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 01:06:06 +02:00

54 lines
2.2 KiB
TypeScript

/**
* Public-/Freemail-Provider-Domains.
*
* Diese Domains dürfen NIEMALS als Custom-Domain (web ODER mail) geblockt oder
* in die kuratierte Country-Liste vorgeschlagen werden:
* - web: icloud.com/gmail.com blocken würde die Webmail des Users sperren
* - mail: würde JEDE Mail von diesem Provider löschen (Kontakte, Banken, alles)
*
* Realer Vorfall: User hat eine Casino-Spam-Mail von `xyz@icloud.com` geöffnet,
* die komplette Adresse kopiert + ins Add-Feld gepackt → wir extrahierten
* `icloud.com` und hätten es geblockt/veröffentlicht. Das muss hart verhindert
* werden — auf JEDER Ebene (Frontend-Hinweis + Backend-Reject).
*
* Spiegel-Liste im Frontend: `apps/rebreak-native/hooks/useCustomDomains.ts`
* (PUBLIC_EMAIL_DOMAINS) — bei Änderungen beide synchron halten.
*/
export const PUBLIC_EMAIL_DOMAINS: ReadonlySet<string> = new Set([
// Google
"gmail.com", "googlemail.com",
// Apple
"icloud.com", "me.com", "mac.com",
// Microsoft
"outlook.com", "outlook.de", "hotmail.com", "hotmail.de", "hotmail.co.uk",
"hotmail.fr", "live.com", "live.de", "msn.com",
// Yahoo
"yahoo.com", "yahoo.de", "yahoo.co.uk", "yahoo.fr", "ymail.com", "rocketmail.com",
// GMX / United Internet (DACH)
"gmx.de", "gmx.net", "gmx.at", "gmx.ch", "gmx.com", "web.de",
// AOL
"aol.com", "aim.com",
// Proton / Tutanota / Posteo / Mailbox (privacy)
"proton.me", "protonmail.com", "pm.me", "tutanota.com", "tutanota.de",
"tuta.io", "posteo.de", "posteo.net", "mailbox.org", "hey.com",
// Deutsche ISP-Freemail
"t-online.de", "freenet.de", "arcor.de",
// Generische Freemail
"mail.com", "mail.de", "email.de", "zoho.com", "fastmail.com", "fastmail.fm",
"hushmail.com",
// Yandex / Mail.ru
"yandex.com", "yandex.ru", "mail.ru",
// Frankreich (FR-Markt)
"laposte.net", "orange.fr", "free.fr", "sfr.fr", "wanadoo.fr",
// Asien
"qq.com", "163.com", "126.com", "naver.com", "daum.net",
]);
/**
* True wenn die (bereits normalisierte, lowercase) Domain ein
* Public-/Freemail-Provider ist und daher nicht blockbar/vorschlagbar.
*/
export function isPublicEmailDomain(domain: string): boolean {
return PUBLIC_EMAIL_DOMAINS.has(domain.trim().toLowerCase());
}