From edf1feedf67c4b9048d83be6f1fdb7ebe67cc1fd Mon Sep 17 00:00:00 2001 From: adevopg Date: Wed, 15 Jul 2026 18:40:33 +0000 Subject: [PATCH] =?UTF-8?q?El=20correo=20sale=20en=20MAY=C3=9ASCULAS=20en?= =?UTF-8?q?=20los=20correos=20de=20token=20y=20activaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Token: el asunto era «Token de seguridad - NightSpire» a secas. El original decía «Token de seguridad de la cuenta {username} - {NOMBRE_SERVIDOR}»; la reescritura se dejó la cuenta por el camino. Ese correo sale de `session.bnetEmail`, que ya va normalizado, así que las MAYÚSCULAS son gratis. - Activación: asunto y cuerpo pasan a normalizar el correo, para que se vea igual que en el del token. El DESTINATARIO va sin normalizar: es la dirección tal cual la escribió el usuario. El correo de activación se manda desde DOS sitios: `registerAccount` y `recover.ts` (el reenvío del enlace, «no me llegó»). Se cambian los dos o saldría distinto según por dónde lo pidieras. Lo delató el build: /api/auth/activate cargaba un chunk y /api/auth/recover otro con la versión vieja. Co-Authored-By: Claude Opus 4.8 (1M context) --- web-next/lib/recover.ts | 6 ++++-- web-next/lib/register.ts | 9 ++++++++- web-next/lib/security-token.ts | 9 ++++++++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/web-next/lib/recover.ts b/web-next/lib/recover.ts index b0c1ee8..19ef89b 100644 --- a/web-next/lib/recover.ts +++ b/web-next/lib/recover.ts @@ -137,10 +137,12 @@ export async function requestRecovery(type: string, value: string): Promise { ) const link = `${process.env.SITE_URL}/activate-account?act=${hash}` - await sendMail(email, `Activación de la cuenta ${email} - NightSpire`, activationEmailHtml(email, link)) + // El correo se muestra normalizado (MAYÚSCULAS) en el asunto y en el cuerpo, igual + // que en el del token de seguridad, que lo saca de `session.bnetEmail` (ya normalizado). + // El DESTINATARIO va sin normalizar: es la dirección tal cual la escribió el usuario. + await sendMail( + email, + `Activación de la cuenta ${normalizeEmail(email)} - NightSpire`, + activationEmailHtml(normalizeEmail(email), link), + ) return { success: true } } diff --git a/web-next/lib/security-token.ts b/web-next/lib/security-token.ts index ab1f583..bcfe07b 100644 --- a/web-next/lib/security-token.ts +++ b/web-next/lib/security-token.ts @@ -47,7 +47,14 @@ export async function requestSecurityToken(session: SessionData, ip: string): Pr ) // La cuenta es el correo: con Battle.net se entra con él, no con un usuario. - await sendMail(email, 'Token de seguridad - NightSpire', securityTokenEmailHtml(email, token, ip || '0.0.0.0')) + // Con la cuenta en el asunto, como el original: `email` es `session.bnetEmail`, + // que va normalizado en MAYÚSCULAS (lo exige el SRP6 de bnet). Mismo patrón que + // el asunto del correo de activación. + await sendMail( + email, + `Token de seguridad de la cuenta ${email} - NightSpire`, + securityTokenEmailHtml(email, token, ip || '0.0.0.0'), + ) const [created] = await db(DB.default).query( 'SELECT created_at FROM securitytoken WHERE user_id = ? ORDER BY created_at DESC LIMIT 1',