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);
  }
}