mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: changing password will expire reset password tokens (#3451)
This commit is contained in:
		
							parent
							
								
									0491c08d5e
								
							
						
					
					
						commit
						80bea14d42
					
				| @ -61,6 +61,10 @@ export default class ResetTokenService { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     expireExistingTokensForUser = async (userId: number): Promise<void> => { | ||||
|         return this.store.expireExistingTokensForUser(userId); | ||||
|     }; | ||||
| 
 | ||||
|     async isValid(token: string): Promise<IResetToken> { | ||||
|         let t; | ||||
|         try { | ||||
| @ -109,7 +113,7 @@ export default class ResetTokenService { | ||||
|     ): Promise<IResetToken> { | ||||
|         const token = await this.generateToken(); | ||||
|         const expiry = new Date(Date.now() + expiryDelta); | ||||
|         await this.store.expireExistingTokensForUser(tokenUser); | ||||
|         await this.expireExistingTokensForUser(tokenUser); | ||||
|         return this.store.insert({ | ||||
|             reset_token: token, | ||||
|             user_id: tokenUser, | ||||
|  | ||||
| @ -351,6 +351,7 @@ class UserService { | ||||
|         const passwordHash = await bcrypt.hash(password, saltRounds); | ||||
|         await this.store.setPasswordHash(userId, passwordHash); | ||||
|         await this.sessionService.deleteSessionsForUser(userId); | ||||
|         await this.resetTokenService.expireExistingTokensForUser(userId); | ||||
|     } | ||||
| 
 | ||||
|     async getUserForToken(token: string): Promise<TokenUserSchema> { | ||||
| @ -388,7 +389,6 @@ class UserService { | ||||
|         }); | ||||
|         if (allowed) { | ||||
|             await this.changePassword(user.id, password); | ||||
|             await this.sessionService.deleteSessionsForUser(user.id); | ||||
|         } else { | ||||
|             throw new InvalidTokenError(); | ||||
|         } | ||||
|  | ||||
| @ -33,5 +33,5 @@ export interface IResetTokenStore extends Store<IResetToken, string> { | ||||
|     useToken(token: IResetQuery): Promise<boolean>; | ||||
|     deleteFromQuery(query: IResetTokenQuery): Promise<void>; | ||||
|     deleteExpired(): Promise<void>; | ||||
|     expireExistingTokensForUser(user_id: number): Promise<void>; | ||||
|     expireExistingTokensForUser(userId: number): Promise<void>; | ||||
| } | ||||
|  | ||||
| @ -168,7 +168,7 @@ test('Trying to reset password with same token twice does not work', async () => | ||||
|             token, | ||||
|             password, | ||||
|         }) | ||||
|         .expect(403) | ||||
|         .expect(401) | ||||
|         .expect((res) => { | ||||
|             expect(res.body.details[0].message).toBeTruthy(); | ||||
|         }); | ||||
| @ -191,7 +191,7 @@ test('Calling validate endpoint with already existing session should destroy ses | ||||
|     await request.get('/api/admin/features').expect(200); | ||||
|     const url = await resetTokenService.createResetPasswordUrl( | ||||
|         user.id, | ||||
|         adminUser.username, | ||||
|         adminUser.username!, | ||||
|     ); | ||||
|     const relative = getBackendResetUrl(url); | ||||
| 
 | ||||
| @ -267,3 +267,31 @@ test('Trying to change password to undefined should yield 400 without crashing t | ||||
|         }) | ||||
|         .expect(400); | ||||
| }); | ||||
| 
 | ||||
| test('changing password should expire all active tokens', async () => { | ||||
|     const url = await resetTokenService.createResetPasswordUrl( | ||||
|         user.id, | ||||
|         adminUser.username, | ||||
|     ); | ||||
|     const relative = getBackendResetUrl(url); | ||||
| 
 | ||||
|     const { | ||||
|         body: { token }, | ||||
|     } = await app.request | ||||
|         .get(relative) | ||||
|         .expect(200) | ||||
|         .expect('Content-Type', /json/); | ||||
| 
 | ||||
|     await app.request | ||||
|         .post(`/api/admin/user-admin/${user.id}/change-password`) | ||||
|         .send({ password: 'simple123-_ASsad' }) | ||||
|         .expect(200); | ||||
| 
 | ||||
|     await app.request | ||||
|         .post('/auth/reset/password') | ||||
|         .send({ | ||||
|             token, | ||||
|             password, | ||||
|         }) | ||||
|         .expect(401); | ||||
| }); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user