diff --git a/docsfera.json b/docsfera.json index b256567..1b92192 100644 --- a/docsfera.json +++ b/docsfera.json @@ -5473,6 +5473,57 @@ ] } }, + "/customers/{id}/mfa": { + "post": { + "operationId": "CustomersController_enableMfaEnforce", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EnforceMfa" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + } + }, + "tags": [ + "Customers" + ], + "security": [ + { + "access-token": [] + }, + { + "access-token": [] + }, + { + "access-token": [] + } + ] + } + }, "/customers/{id}/links": { "get": { "operationId": "CustomersController_getCustomerLinks", @@ -5620,6 +5671,34 @@ "Customers" ], "security": [ + { + "access-token": [] + }, + { + "access-token": [] + }, + { + "access-token": [] + } + ] + } + }, + "/customers/access-dashboard": { + "get": { + "operationId": "CustomersController_getAccessDashboard", + "parameters": [], + "responses": { + "200": { + "description": "" + } + }, + "tags": [ + "Customers" + ], + "security": [ + { + "access-token": [] + }, { "access-token": [] }, @@ -5921,6 +6000,9 @@ }, "themeEnabled": { "type": "boolean" + }, + "enforceMfa": { + "type": "boolean" } }, "required": [ @@ -5931,7 +6013,8 @@ "tier", "scheduleLimit", "links", - "themeEnabled" + "themeEnabled", + "enforceMfa" ] }, "AuthUser": { @@ -8600,6 +8683,17 @@ "tags" ] }, + "EnforceMfa": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + } + }, + "required": [ + "enabled" + ] + }, "CustomerLink": { "type": "object", "properties": { diff --git a/package-lock.json b/package-lock.json index 3776d14..898117c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@aws-sdk/client-secrets-manager": "^3.414.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", "@dadosfera/protospack": "2.5.3", - "@dadosfera/protospack-v2": "3.37.0-alpha.20", + "@dadosfera/protospack-v2": "3.37.0-beta.22", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -1397,9 +1397,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.37.0-alpha.20", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.37.0-alpha.20.tgz", - "integrity": "sha512-rs8YUgnwA8dTohzSEAeilU7WAscodf26/yrsqC/lq0Dz2s3Hi09TXItnLJ5ktv5xWaBQ/eZjyc5zPjpcWL3myQ==", + "version": "3.37.0-beta.22", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.37.0-beta.22.tgz", + "integrity": "sha512-SOu+Z5qc3ms6JjtWpHFYEgYq7Q8Y2GHBewDQj5/Evv4yxpzuANw9Eecd6zzCttV47ceM75A8rnomTj9gGkoTTg==", "license": "ISC", "dependencies": { "@grpc/grpc-js": "^1.9.3", diff --git a/package.json b/package.json index d2c3b74..643821b 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@aws-sdk/client-secrets-manager": "^3.414.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", "@dadosfera/protospack": "2.5.3", - "@dadosfera/protospack-v2": "3.37.0-alpha.20", + "@dadosfera/protospack-v2": "3.37.0-beta.22", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", diff --git a/src/authentication/permissions.enum.ts b/src/authentication/permissions.enum.ts index 1e01531..95a313f 100644 --- a/src/authentication/permissions.enum.ts +++ b/src/authentication/permissions.enum.ts @@ -612,7 +612,8 @@ export interface DadosferaModule { export const DADOSFERA_MODULES_KEYS = { LOG_DASHBOARD: 'logs-dashboard', - ACCESS_DASHBOARD: 'access-dashboard' + ACCESS_DASHBOARD: 'access-dashboard', + DANGER_ZONE: 'danger-zone' } export const DADOSFERA_MODULES: Array = [ diff --git a/src/modules/auth/dtos/login.ts b/src/modules/auth/dtos/login.ts index b3890fe..0cd90ae 100644 --- a/src/modules/auth/dtos/login.ts +++ b/src/modules/auth/dtos/login.ts @@ -87,6 +87,8 @@ export class AuthCustomer { @ApiProperty() themeEnabled: boolean; + @ApiProperty() + enforceMfa: boolean; } export class AuthSignInReq implements AuthSignInRequest { diff --git a/src/modules/customers/customers.controller.ts b/src/modules/customers/customers.controller.ts index 280dce3..bcab557 100644 --- a/src/modules/customers/customers.controller.ts +++ b/src/modules/customers/customers.controller.ts @@ -7,6 +7,7 @@ import { HttpStatus, Inject, Param, + Post, Put, Query, UseFilters, @@ -17,6 +18,7 @@ import { Authenticated, RequireAllPermissions, RequireModule, + RequireSomePermission, } from 'src/decorators/authentication.decorator'; import { GrpcToHttpExceptionFilter } from 'src/error/grpc-to-http-exception.filter'; import { CustomersService } from './customers.service'; @@ -24,6 +26,7 @@ import { CustomerLinkRequest, CustomerLinksResponse } from './dtos/customers'; import { RequestUser, User } from 'src/decorators/user.decorator'; import type { StringValue } from 'ms'; import { PackTheMetadata } from 'src/utils/ PackTheMetadata'; +import { EnforceMfa } from './dtos/enforce-mfa'; @ApiTags('Customers') @Controller('customers') @@ -39,6 +42,15 @@ export class CustomersController { this.logger = dadosferaLogger.logger; } + @Post(':id/mfa') + @Authenticated() + @RequireSomePermission(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) + @RequireModule(DADOSFERA_MODULES_KEYS.DANGER_ZONE) + async enableMfaEnforce(@Param('id') id: string, @Body() data: EnforceMfa) { + this.logger.info('enableMfaEnforce', { id }); + return await this.customersService.enableEnforceMfa(id, data.enabled); + } + @Get(':id/links') @Authenticated() @ApiOkResponse({ type: CustomerLinksResponse }) diff --git a/src/modules/customers/customers.service.ts b/src/modules/customers/customers.service.ts index ed302fd..056c5fb 100644 --- a/src/modules/customers/customers.service.ts +++ b/src/modules/customers/customers.service.ts @@ -34,6 +34,7 @@ import DadosferaLogger from '@dadosfera/dadosfera-logs'; // This function will accept any string, which may result in a bug. @Injectable() export class CustomersService implements OnModuleInit { + private customerService: CustomersProtoService; private logger: DadosferaLogger; private pipelineReadService: ReadService.PipelineV2ReadService; @@ -203,4 +204,13 @@ export class CustomersService implements OnModuleInit { ) ); } + + async enableEnforceMfa(id: string, enabled: boolean) { + return await lastValueFrom( + this.customerService.CustomerUpdateEnforceMfa({ + customerId: id, + enforceMfa: enabled + }) + ) + } } diff --git a/src/modules/customers/dtos/enforce-mfa.ts b/src/modules/customers/dtos/enforce-mfa.ts new file mode 100644 index 0000000..4709579 --- /dev/null +++ b/src/modules/customers/dtos/enforce-mfa.ts @@ -0,0 +1,6 @@ +import { ApiProperty } from "@nestjs/swagger"; + +export class EnforceMfa { + @ApiProperty() + enabled: boolean +} \ No newline at end of file