60
									
								
								src/models/actions/ResetPassword.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/models/actions/ResetPassword.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| import * as argon2 from "argon2"; | ||||
| import { IsNotEmpty, IsOptional, IsString } from 'class-validator'; | ||||
| import * as jsonwebtoken from 'jsonwebtoken'; | ||||
| import { getConnectionManager } from 'typeorm'; | ||||
| import { config } from '../../config'; | ||||
| import { IllegalJWTError, JwtNotProvidedError, PasswordNeededError, RefreshTokenCountInvalidError, UserNotFoundError } from '../../errors/AuthError'; | ||||
| import { User } from '../entities/User'; | ||||
|  | ||||
| /** | ||||
|  * TODO: | ||||
|  */ | ||||
| export class ResetPassword { | ||||
|     /** | ||||
|      * The reset token on which the password reset will be based. | ||||
|      */ | ||||
|     @IsOptional() | ||||
|     @IsString() | ||||
|     resetToken?: string; | ||||
|  | ||||
|     /** | ||||
|      * The user's new password | ||||
|      */ | ||||
|     @IsNotEmpty() | ||||
|     @IsString() | ||||
|     password: string; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Create a password reset token based on this. | ||||
|      */ | ||||
|     public async resetPassword(): Promise<any> { | ||||
|         if (!this.resetToken || this.resetToken === undefined) { | ||||
|             throw new JwtNotProvidedError() | ||||
|         } | ||||
|         if (!this.password || this.password === undefined) { | ||||
|             throw new PasswordNeededError() | ||||
|         } | ||||
|  | ||||
|         let decoded; | ||||
|         try { | ||||
|             decoded = jsonwebtoken.verify(this.resetToken, config.jwt_secret) | ||||
|         } catch (error) { | ||||
|             throw new IllegalJWTError() | ||||
|         } | ||||
|  | ||||
|         const found_user = await getConnectionManager().get().getRepository(User).findOne({ id: decoded["id"] }); | ||||
|         if (!found_user) { | ||||
|             throw new UserNotFoundError() | ||||
|         } | ||||
|         if (found_user.refreshTokenCount !== decoded["refreshTokenCount"]) { | ||||
|             throw new RefreshTokenCountInvalidError() | ||||
|         } | ||||
|  | ||||
|         found_user.refreshTokenCount = found_user.refreshTokenCount + 1; | ||||
|         found_user.password = await argon2.hash(this.password + found_user.uuid); | ||||
|         await getConnectionManager().get().getRepository(User).save(found_user); | ||||
|  | ||||
|         return "password reset successfull"; | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user