Spaces:
Runtime error
Runtime error
File size: 3,971 Bytes
add3ead d201b18 add3ead d201b18 add3ead | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | import {
Controller,
Post,
Body,
Req,
UseGuards,
Get,
HttpCode,
HttpStatus,
} from '@nestjs/common';
import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger';
import type { Request } from 'express';
import { TwoFactorAuthService } from './two-factor-auth.service';
import { SuperAdminAuthGuard } from '../auth/guards/super-admin-auth.guard';
import {
EnableEmail2FADto,
SendEmail2FACodeDto,
VerifyEmail2FADto,
} from './dto/email-2fa.dto';
import {
InitTotp2FADto,
VerifyTotpSetupDto,
VerifyTotp2FADto,
} from './dto/totp-2fa.dto';
import {
VerifyRecoveryCodeDto,
RegenerateRecoveryCodesDto,
} from './dto/recovery-code.dto';
import { LogToDiscord } from 'src/shared/decorators/log-to-discord.decorator';
@ApiTags('Super Admin - Two Factor Authentication')
@Controller('super-admin/2fa')
@LogToDiscord()
export class TwoFactorAuthController {
constructor(private readonly twoFactorAuthService: TwoFactorAuthService) {}
// ==================== EMAIL 2FA ====================
@Post('email/enable')
@UseGuards(SuperAdminAuthGuard)
@ApiBearerAuth()
@ApiOperation({ summary: 'Enable Email 2FA' })
async enableEmail2FA(@Body() dto: EnableEmail2FADto) {
return this.twoFactorAuthService.enableEmail2FA(dto.email);
}
@Post('email/send-code')
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: 'Send Email 2FA Code' })
async sendEmail2FACode(
@Body() dto: SendEmail2FACodeDto,
@Req() request: Request,
) {
return this.twoFactorAuthService.sendEmail2FACode(
dto.pending2faToken,
request,
);
}
@Post('email/verify')
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: 'Verify Email 2FA Code' })
async verifyEmail2FACode(
@Body() dto: VerifyEmail2FADto,
@Req() request: Request,
) {
return this.twoFactorAuthService.verifyEmail2FACode(
dto.pending2faToken,
dto.code,
dto.trustDevice || false,
request,
);
}
// ==================== TOTP/AUTHENTICATOR 2FA ====================
@Post('totp/init')
@UseGuards(SuperAdminAuthGuard)
@ApiBearerAuth()
@ApiOperation({ summary: 'Initialize TOTP Setup' })
async initTotp2FA(@Body() dto: InitTotp2FADto) {
return this.twoFactorAuthService.initTotp2FA(dto.email);
}
@Post('totp/verify-setup')
@UseGuards(SuperAdminAuthGuard)
@ApiBearerAuth()
@ApiOperation({ summary: 'Verify TOTP Setup' })
async verifyTotpSetup(@Body() dto: VerifyTotpSetupDto, @Req() request: any) {
return this.twoFactorAuthService.verifyTotpSetup(
request.user.email,
dto.code,
);
}
@Post('totp/verify')
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: 'Verify TOTP Code' })
async verifyTotp2FACode(
@Body() dto: VerifyTotp2FADto,
@Req() request: Request,
) {
return this.twoFactorAuthService.verifyTotp2FACode(
dto.pending2faToken,
dto.code,
dto.trustDevice || false,
request,
);
}
// ==================== RECOVERY CODES ====================
@Post('recovery/verify')
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: 'Verify Recovery Code' })
async verifyRecoveryCode(
@Body() dto: VerifyRecoveryCodeDto,
@Req() request: Request,
) {
return this.twoFactorAuthService.verifyRecoveryCode(
dto.pending2faToken,
dto.code,
dto.trustDevice || false,
request,
);
}
@Post('recovery/regenerate')
@UseGuards(SuperAdminAuthGuard)
@ApiBearerAuth()
@ApiOperation({ summary: 'Regenerate Recovery Codes' })
async regenerateRecoveryCodes(@Body() dto: RegenerateRecoveryCodesDto) {
return this.twoFactorAuthService.regenerateRecoveryCodes(dto.email);
}
// ==================== INFO/STATUS ====================
@Get('status')
@UseGuards(SuperAdminAuthGuard)
@ApiBearerAuth()
@ApiOperation({ summary: 'Get 2FA Status' })
async get2FAStatus(@Req() request: any) {
return this.twoFactorAuthService.get2FAStatus(request.user.email);
}
}
|