40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
/**
|
|
* Datenschutz-Helfer fuer die Anzeige von Benutzerbezügen.
|
|
*
|
|
* E-Mail-Adressen sind personenbezogene Daten. In Kalender- und
|
|
* Reservierungslisten sehen normale Mitglieder nur einen maskierten
|
|
* Kuerzel statt der vollstaendigen Adresse; wer einen Username gesetzt
|
|
* hat, erscheint unter diesem. Vollstaendige E-Mails sind der
|
|
* Admin-Verwaltung vorbehalten.
|
|
*/
|
|
|
|
/**
|
|
* Maskiert eine E-Mail: "max.mustermann@example.com" -> "m***@e***.com".
|
|
* Fuer ungueltige/leere Eingaben wird ein neutraler Platzhalter
|
|
* zurueckgegeben.
|
|
*/
|
|
export function maskEmail(email: string | null | undefined): string {
|
|
if (!email) {
|
|
return 'Unbekannt';
|
|
}
|
|
const at = email.indexOf('@');
|
|
if (at <= 0 || at === email.length - 1) {
|
|
return 'Unbekannt';
|
|
}
|
|
const local = email.slice(0, 1);
|
|
const domain = email.slice(at + 1);
|
|
const lastDot = domain.lastIndexOf('.');
|
|
const domainMasked =
|
|
lastDot > 0
|
|
? `${domain.slice(0, 1)}***${domain.slice(lastDot)}`
|
|
: `${domain.slice(0, 1)}***`;
|
|
return `${local}***@${domainMasked}`;
|
|
}
|
|
|
|
/** Anzeigename: Username bevorzugt, sonst maskierte E-Mail. */
|
|
export function displayName(
|
|
username: string | null | undefined,
|
|
email: string | null | undefined,
|
|
): string {
|
|
return username ?? maskEmail(email);
|
|
} |