Browse Source

introduce the RADAR scope token

Sven Czarnian 2 years ago
parent
commit
912a8e7509
4 changed files with 34 additions and 0 deletions
  1. 9 0
      src/auth/auth.controller.ts
  2. 13 0
      src/auth/auth.service.ts
  3. 7 0
      src/auth/dto/user.dto.ts
  4. 5 0
      src/auth/models/user.model.ts

+ 9 - 0
src/auth/auth.controller.ts

@@ -3,6 +3,7 @@ import {
   Get,
   HttpException,
   HttpStatus,
+  Patch,
   Query,
   Redirect,
   Req,
@@ -68,9 +69,17 @@ export class AuthController {
       return {
         vatsimId: user.vatsimId,
         fullName: user.fullName,
+        radarScopeKey: user.radarScopeKey,
         administrator: user.administrator,
         airportConfigurationAccess: user.airportConfigurationAccess,
       };
     });
   }
+
+  @UseGuards(JwtGuard)
+  @Patch('/refreshRadarScopeKey')
+  async refreshRadarScopeKey(@Req() request: Request): Promise<void> {
+    const token = request.headers.authorization.replace('Bearer ', '');
+    return this.authService.resetRadarScopeKey(token);
+  }
 }

+ 13 - 0
src/auth/auth.service.ts

@@ -4,6 +4,7 @@ import { ConfigService } from '@nestjs/config';
 import { JwtService } from '@nestjs/jwt';
 import { InjectModel } from '@nestjs/mongoose';
 import { Model } from 'mongoose';
+import { v4 as uuid } from 'uuid';
 import { catchError, lastValueFrom, map } from 'rxjs';
 
 import { User, UserDocument } from './models/user.model';
@@ -76,6 +77,7 @@ export class AuthService {
           this.userModel.create({
             vatsimId: userdata.cid,
             fullName,
+            radarScopeKey: uuid(),
             vatsimToken: token,
             vatsimRefreshToken: refreshToken,
           });
@@ -110,4 +112,15 @@ export class AuthService {
         return user;
       });
   }
+
+  async resetRadarScopeKey(token: string): Promise<void> {
+    const payload = this.jwtService.verify(token, {
+      secret: this.config.get<string>('server.jwt-secret'),
+    });
+
+    await this.userModel.findOneAndUpdate(
+      { vatsimId: payload.vatsimId },
+      { radarScopeKey: uuid() },
+    );
+  }
 }

+ 7 - 0
src/auth/dto/user.dto.ts

@@ -16,6 +16,13 @@ export class UserDto {
   })
   fullName: string;
 
+  @IsNotEmpty()
+  @ApiProperty({
+    description: 'The unique logon code for the radar scope plugins',
+    example: 'SECRET',
+  })
+  radarScopeKey: string;
+
   @IsNotEmpty()
   @ApiProperty({
     description: 'Indicates if the user has administrator access',

+ 5 - 0
src/auth/models/user.model.ts

@@ -17,6 +17,11 @@ export class User {
   })
   fullName: string;
 
+  @Prop({
+    type: String,
+  })
+  radarScopeKey: string;
+
   @Prop({
     required: true,
     type: String,