@@ -115,4 +115,15 @@ export class RefreshTokenCountInvalidError extends NotAcceptableError {
 | 
			
		||||
 | 
			
		||||
	@IsString()
 | 
			
		||||
	message = "Refresh token count is invalid."
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Error to throw when someone tryes to refresh a user's password more than once in 15 minutes.
 | 
			
		||||
 */
 | 
			
		||||
export class ResetAlreadyRequestedError extends NotAcceptableError {
 | 
			
		||||
	@IsString()
 | 
			
		||||
	name = "ResetAlreadyRequestedError"
 | 
			
		||||
 | 
			
		||||
	@IsString()
 | 
			
		||||
	message = "You already requested a password reset in the last 15 minutes. \n Please wait until the old reset code expires before requesting a new one."
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
import { IsEmail, IsOptional, IsString } from 'class-validator';
 | 
			
		||||
import { getConnectionManager } from 'typeorm';
 | 
			
		||||
import { UserNotFoundError } from '../../errors/AuthError';
 | 
			
		||||
import { ResetAlreadyRequestedError, UserNotFoundError } from '../../errors/AuthError';
 | 
			
		||||
import { UsernameOrEmailNeededError } from '../../errors/UserErrors';
 | 
			
		||||
import { JwtCreator } from '../../jwtcreator';
 | 
			
		||||
import { User } from '../entities/User';
 | 
			
		||||
@@ -32,12 +32,15 @@ export class CreateResetToken {
 | 
			
		||||
        if (this.email === undefined && this.username === undefined) {
 | 
			
		||||
            throw new UsernameOrEmailNeededError();
 | 
			
		||||
        }
 | 
			
		||||
        let found_user = await getConnectionManager().get().getRepository(User).findOne({ relations: ['groups', 'permissions', 'actions'], where: [{ username: this.username }, { email: this.email }] });
 | 
			
		||||
        let found_user = await getConnectionManager().get().getRepository(User).findOne({ where: [{ username: this.username }, { email: this.email }] });
 | 
			
		||||
        if (!found_user) {
 | 
			
		||||
            throw new UserNotFoundError();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (found_user.resetRequestedTimestamp > (Math.floor(Date.now() / 1000) - 15 * 60)) { throw new ResetAlreadyRequestedError(); }
 | 
			
		||||
 | 
			
		||||
        found_user.refreshTokenCount = found_user.refreshTokenCount + 1;
 | 
			
		||||
        found_user.resetRequestedTimestamp = Math.floor(Date.now() / 1000);
 | 
			
		||||
        await getConnectionManager().get().getRepository(User).save(found_user);
 | 
			
		||||
 | 
			
		||||
        //Create the reset
 | 
			
		||||
 
 | 
			
		||||
@@ -111,6 +111,15 @@ export class User extends Principal {
 | 
			
		||||
  @IsOptional()
 | 
			
		||||
  profilePic?: string;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
  * The last time the user requested a password reset.
 | 
			
		||||
  * Used to prevent spamming of the password reset route.
 | 
			
		||||
  */
 | 
			
		||||
  @Column({ nullable: true, unique: true })
 | 
			
		||||
  @IsString()
 | 
			
		||||
  @IsOptional()
 | 
			
		||||
  resetRequestedTimestamp?: number;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * The actions performed by this user.
 | 
			
		||||
   * For documentation purposes only, will be implemented later.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user