From 6a0b7e876902229b6bbfb171607e23fc445c3c2a Mon Sep 17 00:00:00 2001 From: Milton Gonzalez Date: Sun, 6 Sep 2026 14:28:51 -0500 Subject: [PATCH] fix: quita cualquier espacio (no solo bordes) de host/usuario/remitente/destino SMTP trim() no corregia un espacio colado a mitad del host (ej. "mail.linkedcorp. net"), que es exactamente el caso real que seguia fallando en produccion tras el fix anterior. Un dominio o correo nunca lleva espacios: ahora se remueven todos. Co-Authored-By: Claude Sonnet 5 --- backend/src/modules/settings/service.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/backend/src/modules/settings/service.js b/backend/src/modules/settings/service.js index 8768c7d..5852054 100644 --- a/backend/src/modules/settings/service.js +++ b/backend/src/modules/settings/service.js @@ -6,6 +6,11 @@ import { HttpError } from '../../utils/http.js'; const SMTP_KEYS = ['smtp_host', 'smtp_port', 'smtp_user', 'smtp_from', 'smtp_pass_enc']; +// Host/usuario/remitente/destino son identificadores tecnicos (dominio o correo): nunca llevan +// espacios, ni al borde ni en medio. trim() no alcanza para un espacio colado a mitad de un +// dominio (ej. "mail.linkedcorp. net" tecleado por error) — se quita CUALQUIER espacio. +const stripSpaces = (s) => (s || '').replace(/\s+/g, ''); + export async function getSmtpConfig() { const values = await repo.getAll(SMTP_KEYS); return { @@ -31,9 +36,9 @@ export async function getSmtpConfigInternal() { } export async function updateSmtpConfig(payload, actorId) { - const host = (payload.host || '').trim(); - const user = (payload.user || '').trim(); - const from = (payload.from || '').trim(); + const host = stripSpaces(payload.host); + const user = stripSpaces(payload.user); + const from = stripSpaces(payload.from); if (!host || !user) throw new HttpError(400, 'Host y usuario son obligatorios'); const entries = { smtp_host: host, @@ -53,10 +58,10 @@ export async function updateSmtpConfig(payload, actorId) { // (credenciales invalidas, host inalcanzable, certificado vencido, etc.) — es una accion de // diagnostico explicita del superadmin, no un envio "de negocio". export async function testSmtpConfig(payload, actorId) { - const to = (payload.to || '').trim(); - const host = (payload.host || '').trim(); - const user = (payload.user || '').trim(); - const from = (payload.from || '').trim(); + const to = stripSpaces(payload.to); + const host = stripSpaces(payload.host); + const user = stripSpaces(payload.user); + const from = stripSpaces(payload.from); if (!to) throw new HttpError(400, 'Indica un correo destino para la prueba'); if (!host || !user) throw new HttpError(400, 'Host y usuario son obligatorios para probar');