diff --git a/src/modules/access-tokens/access-tokens.module.ts b/src/modules/access-tokens/access-tokens.module.ts index 8cb805239..20500bde0 100644 --- a/src/modules/access-tokens/access-tokens.module.ts +++ b/src/modules/access-tokens/access-tokens.module.ts @@ -1,10 +1,11 @@ import { Module } from '@nestjs/common'; import { PrismaModule } from '../prisma/prisma.module'; +import { TokensModule } from '../tokens/tokens.module'; import { AccessTokenController } from './access-tokens.controller'; import { AccessTokensService } from './access-tokens.service'; @Module({ - imports: [PrismaModule], + imports: [PrismaModule, TokensModule], controllers: [AccessTokenController], providers: [AccessTokensService], }) diff --git a/src/modules/access-tokens/access-tokens.service.ts b/src/modules/access-tokens/access-tokens.service.ts index aa97f2ffe..ef28b36ec 100644 --- a/src/modules/access-tokens/access-tokens.service.ts +++ b/src/modules/access-tokens/access-tokens.service.ts @@ -4,7 +4,6 @@ import { Injectable, UnauthorizedException, } from '@nestjs/common'; -import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util'; import { accessTokens, accessTokensCreateInput, @@ -15,15 +14,20 @@ import { } from '@prisma/client'; import { Expose } from '../../modules/prisma/prisma.interface'; import { PrismaService } from '../prisma/prisma.service'; +import { TokensService } from '../tokens/tokens.service'; @Injectable() export class AccessTokensService { - constructor(private prisma: PrismaService) {} + constructor( + private prisma: PrismaService, + private tokensService: TokensService, + ) {} + async createAccessToken( userId: number, data: Omit, 'user'>, ): Promise { - const accessToken = randomStringGenerator(); + const accessToken = this.tokensService.generateUuid(); return this.prisma.accessTokens.create({ data: { ...data, accessToken, user: { connect: { id: userId } } }, }); diff --git a/src/modules/api-keys/api-keys.module.ts b/src/modules/api-keys/api-keys.module.ts index d6585263d..69d228d5e 100644 --- a/src/modules/api-keys/api-keys.module.ts +++ b/src/modules/api-keys/api-keys.module.ts @@ -1,10 +1,11 @@ import { Module } from '@nestjs/common'; import { PrismaModule } from '../prisma/prisma.module'; +import { TokensService } from '../tokens/tokens.service'; import { ApiKeyController } from './api-keys.controller'; import { ApiKeysService } from './api-keys.service'; @Module({ - imports: [PrismaModule], + imports: [PrismaModule, TokensService], controllers: [ApiKeyController], providers: [ApiKeysService], }) diff --git a/src/modules/api-keys/api-keys.service.ts b/src/modules/api-keys/api-keys.service.ts index 390ad4a01..83101a262 100644 --- a/src/modules/api-keys/api-keys.service.ts +++ b/src/modules/api-keys/api-keys.service.ts @@ -4,7 +4,6 @@ import { Injectable, UnauthorizedException, } from '@nestjs/common'; -import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util'; import { apiKeys, apiKeysCreateInput, @@ -15,16 +14,20 @@ import { } from '@prisma/client'; import { Expose } from '../../modules/prisma/prisma.interface'; import { PrismaService } from '../prisma/prisma.service'; +import { TokensService } from '../tokens/tokens.service'; @Injectable() export class ApiKeysService { - constructor(private prisma: PrismaService) {} + constructor( + private prisma: PrismaService, + private tokensService: TokensService, + ) {} async createApiKey( groupId: number, data: Omit, 'group'>, ): Promise { - const apiKey = randomStringGenerator(); + const apiKey = this.tokensService.generateUuid(); return this.prisma.apiKeys.create({ data: { ...data, apiKey, group: { connect: { id: groupId } } }, }); diff --git a/src/modules/auth/auth.service.ts b/src/modules/auth/auth.service.ts index b65d837fb..89b067a2d 100644 --- a/src/modules/auth/auth.service.ts +++ b/src/modules/auth/auth.service.ts @@ -7,7 +7,6 @@ import { UnauthorizedException, UnprocessableEntityException, } from '@nestjs/common'; -import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util'; import { ConfigService } from '@nestjs/config'; import { JwtService } from '@nestjs/jwt'; import { Authenticator } from '@otplib/core'; @@ -263,7 +262,7 @@ export class AuthService { * @returns Data URI string with QR code image */ async getTotpQrCode(userId: number): Promise { - const secret = randomStringGenerator() as string; + const secret = this.tokensService.generateUuid(); await this.prisma.users.update({ where: { id: userId }, data: { twoFactorSecret: secret }, @@ -292,7 +291,7 @@ export class AuthService { 'Two-factor authentication is already enabled', ); if (!user.twoFactorSecret) - user.twoFactorSecret = randomStringGenerator() as string; + user.twoFactorSecret = this.tokensService.generateUuid(); if (!this.authenticator.check(code, user.twoFactorSecret)) throw new UnauthorizedException( 'Two-factor authentication code is invalid', @@ -479,7 +478,7 @@ export class AuthService { userAgent: string, id: number, ): Promise { - const token = randomStringGenerator(); + const token = this.tokensService.generateUuid(); await this.prisma.sessions.create({ data: { token, ipAddress, userAgent, user: { connect: { id } } }, }); diff --git a/src/modules/multi-factor-authentication/multi-factor-authentication.module.ts b/src/modules/multi-factor-authentication/multi-factor-authentication.module.ts index fc69afed0..a43befc52 100644 --- a/src/modules/multi-factor-authentication/multi-factor-authentication.module.ts +++ b/src/modules/multi-factor-authentication/multi-factor-authentication.module.ts @@ -3,12 +3,20 @@ import { ConfigModule } from '@nestjs/config'; import { AuthModule } from '../auth/auth.module'; import { EmailModule } from '../email/email.module'; import { PrismaModule } from '../prisma/prisma.module'; +import { TokensModule } from '../tokens/tokens.module'; import { TwilioModule } from '../twilio/twilio.module'; import { MultiFactorAuthenticationController } from './multi-factor-authentication.controller'; import { MultiFactorAuthenticationService } from './multi-factor-authentication.service'; @Module({ - imports: [PrismaModule, AuthModule, TwilioModule, EmailModule, ConfigModule], + imports: [ + PrismaModule, + AuthModule, + TwilioModule, + EmailModule, + ConfigModule, + TokensModule, + ], controllers: [MultiFactorAuthenticationController], providers: [MultiFactorAuthenticationService], }) diff --git a/src/modules/multi-factor-authentication/multi-factor-authentication.service.ts b/src/modules/multi-factor-authentication/multi-factor-authentication.service.ts index 3d799c1aa..9bed8e1bb 100644 --- a/src/modules/multi-factor-authentication/multi-factor-authentication.service.ts +++ b/src/modules/multi-factor-authentication/multi-factor-authentication.service.ts @@ -3,7 +3,6 @@ import { Injectable, NotFoundException, } from '@nestjs/common'; -import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util'; import { ConfigService } from '@nestjs/config'; import { MfaMethod, users } from '@prisma/client'; import { hash } from 'bcrypt'; @@ -11,6 +10,7 @@ import { AuthService } from '../auth/auth.service'; import { EmailService } from '../email/email.service'; import { Expose } from '../prisma/prisma.interface'; import { PrismaService } from '../prisma/prisma.service'; +import { TokensService } from '../tokens/tokens.service'; import { TwilioService } from '../twilio/twilio.service'; @Injectable() @@ -21,6 +21,7 @@ export class MultiFactorAuthenticationService { private configService: ConfigService, private twilioService: TwilioService, private emailService: EmailService, + private tokensService: TokensService, ) {} async requestTotpMfa(userId: number): Promise { @@ -46,7 +47,7 @@ export class MultiFactorAuthenticationService { throw new BadRequestException( 'Two-factor authentication is already enabled', ); - const secret = randomStringGenerator() as string; + const secret = this.tokensService.generateUuid(); await this.prisma.users.update({ where: { id: userId }, data: { twoFactorSecret: secret, twoFactorPhone: phone }, @@ -74,7 +75,7 @@ export class MultiFactorAuthenticationService { throw new BadRequestException( 'Two-factor authentication is already enabled', ); - const secret = randomStringGenerator() as string; + const secret = this.tokensService.generateUuid(); await this.prisma.users.update({ where: { id: userId }, data: { twoFactorSecret: secret }, @@ -119,7 +120,7 @@ export class MultiFactorAuthenticationService { await this.prisma.backupCodes.deleteMany({ where: { user: { id } } }); const codes: string[] = []; for await (const _ of [...Array(10)]) { - const unsafeCode = randomStringGenerator(); + const unsafeCode = this.tokensService.generateUuid(); codes.push(unsafeCode); const code = await hash( unsafeCode,