From d08162fca81447ab51fb388e00b7740715b64ef8 Mon Sep 17 00:00:00 2001 From: enlineawork Date: Tue, 8 Sep 2026 07:32:39 -0300 Subject: [PATCH] fix(f4): restrict SMTP administration to system admin --- .../document-delivery.controller.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/api-v3/src/inspection-reports/document-delivery.controller.ts b/api-v3/src/inspection-reports/document-delivery.controller.ts index 5fe49ca..1724473 100644 --- a/api-v3/src/inspection-reports/document-delivery.controller.ts +++ b/api-v3/src/inspection-reports/document-delivery.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Get, Param, ParseUUIDPipe, Patch, Post, Put, Req } from '@nestjs/common'; +import { Body, Controller, ForbiddenException, Get, Param, ParseUUIDPipe, Patch, Post, Put, Req } from '@nestjs/common'; import { CurrentAuth } from '../auth/decorators/current-auth.decorator'; import { RequirePermissions } from '../authorization/decorators/require-permissions.decorator'; import type { AuthPrincipal, RequestWithContext } from '../common/http/request-context'; @@ -37,7 +37,8 @@ export class DocumentDeliveryController { @Get('smtp') @RequirePermissions('document_delivery.manage') - smtpSettings() { + smtpSettings(@CurrentAuth() principal: AuthPrincipal) { + this.assertSystemAdmin(principal); return this.smtp.publicSettings(); } @@ -48,6 +49,7 @@ export class DocumentDeliveryController { @CurrentAuth() principal: AuthPrincipal, @Req() request: RequestWithContext, ) { + this.assertSystemAdmin(principal); const before = await this.smtp.publicSettings(); const after = await this.smtp.saveSettings(dto, principal.userId); await this.audit.record({ @@ -57,7 +59,7 @@ export class DocumentDeliveryController { entityId: 'singleton', beforeData: before as Record, afterData: after as Record, - metadata: { passwordNeverReturned: true }, + metadata: { passwordNeverReturned: true, restrictedToRole: 'admin' }, }); return after; } @@ -69,6 +71,7 @@ export class DocumentDeliveryController { @CurrentAuth() principal: AuthPrincipal, @Req() request: RequestWithContext, ) { + this.assertSystemAdmin(principal); const sent = await this.smtp.send({ to: dto.email, subject: 'DH Inspección · Prueba SMTP', @@ -85,6 +88,7 @@ export class DocumentDeliveryController { entityType: 'system_smtp_settings', entityId: 'singleton', afterData: { recipient: dto.email, messageId: sent.messageId }, + metadata: { restrictedToRole: 'admin' }, }); return { ok: true, recipient: dto.email, messageId: sent.messageId }; } @@ -113,4 +117,12 @@ export class DocumentDeliveryController { ) { return this.delivery.retryPending(principal, request); } + + private assertSystemAdmin(principal: AuthPrincipal): void { + if (principal.roles.includes('admin')) return; + throw new ForbiddenException({ + code: 'SMTP_SUPERADMIN_REQUIRED', + message: 'La configuración SMTP está reservada al Superadmin del sistema', + }); + } }