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 <noreply@anthropic.com>
This commit is contained in:
Milton Gonzalez
2026-09-06 14:28:51 -05:00
parent 97e9308438
commit 6a0b7e8769
+12 -7
View File
@@ -6,6 +6,11 @@ import { HttpError } from '../../utils/http.js';
const SMTP_KEYS = ['smtp_host', 'smtp_port', 'smtp_user', 'smtp_from', 'smtp_pass_enc']; 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() { export async function getSmtpConfig() {
const values = await repo.getAll(SMTP_KEYS); const values = await repo.getAll(SMTP_KEYS);
return { return {
@@ -31,9 +36,9 @@ export async function getSmtpConfigInternal() {
} }
export async function updateSmtpConfig(payload, actorId) { export async function updateSmtpConfig(payload, actorId) {
const host = (payload.host || '').trim(); const host = stripSpaces(payload.host);
const user = (payload.user || '').trim(); const user = stripSpaces(payload.user);
const from = (payload.from || '').trim(); const from = stripSpaces(payload.from);
if (!host || !user) throw new HttpError(400, 'Host y usuario son obligatorios'); if (!host || !user) throw new HttpError(400, 'Host y usuario son obligatorios');
const entries = { const entries = {
smtp_host: host, smtp_host: host,
@@ -53,10 +58,10 @@ export async function updateSmtpConfig(payload, actorId) {
// (credenciales invalidas, host inalcanzable, certificado vencido, etc.) — es una accion de // (credenciales invalidas, host inalcanzable, certificado vencido, etc.) — es una accion de
// diagnostico explicita del superadmin, no un envio "de negocio". // diagnostico explicita del superadmin, no un envio "de negocio".
export async function testSmtpConfig(payload, actorId) { export async function testSmtpConfig(payload, actorId) {
const to = (payload.to || '').trim(); const to = stripSpaces(payload.to);
const host = (payload.host || '').trim(); const host = stripSpaces(payload.host);
const user = (payload.user || '').trim(); const user = stripSpaces(payload.user);
const from = (payload.from || '').trim(); const from = stripSpaces(payload.from);
if (!to) throw new HttpError(400, 'Indica un correo destino para la prueba'); 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'); if (!host || !user) throw new HttpError(400, 'Host y usuario son obligatorios para probar');