You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.6 KiB
41 lines
1.6 KiB
/**
|
|
* Forma canonica de un correo, solo para contar limites.
|
|
*
|
|
* Sin esto, limitar por direccion no sirve de nada: `victima+1@gmail.com` y
|
|
* `victima+2@gmail.com` son cadenas distintas y el mismo buzon, asi que quien
|
|
* quisiera bombardear a alguien solo tendria que ir cambiando la etiqueta.
|
|
*
|
|
* IMPORTANTE: esto NO es la identidad de la cuenta. La cuenta se guarda con la
|
|
* direccion tal y como la escribio su duena, porque hay proveedores donde
|
|
* `+algo` o los puntos si distinguen buzones y fusionarlos crearia accesos
|
|
* cruzados entre cuentas ajenas. Aqui se canoniza a proposito de mas: para
|
|
* contar, pasarse de estricto solo puede hacer que un limite se comparta, que
|
|
* es el lado seguro del error.
|
|
*/
|
|
|
|
/** Proveedores en los que los puntos del usuario no distinguen buzon. */
|
|
const IGNORAN_PUNTOS = new Set(['gmail.com', 'googlemail.com']);
|
|
|
|
/**
|
|
* Clave con la que contar los envios a una direccion.
|
|
*
|
|
* Devuelve la direccion en minusculas, sin la etiqueta `+...` y, en los
|
|
* proveedores que los ignoran, sin puntos en la parte del usuario.
|
|
*/
|
|
export function claveDeCorreo(email: string): string {
|
|
const limpio = email.trim().toLowerCase();
|
|
const arroba = limpio.lastIndexOf('@');
|
|
if (arroba <= 0) return limpio;
|
|
|
|
let usuario = limpio.slice(0, arroba);
|
|
const dominio = limpio.slice(arroba + 1);
|
|
|
|
// La etiqueta `+algo` la ignoran practicamente todos los proveedores.
|
|
const mas = usuario.indexOf('+');
|
|
if (mas > 0) usuario = usuario.slice(0, mas);
|
|
|
|
if (IGNORAN_PUNTOS.has(dominio)) usuario = usuario.replaceAll('.', '');
|
|
|
|
return `${usuario}@${dominio}`;
|
|
}
|