inject-reset-order-by-token-middleware.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import type { NextFunction, Request, Response } from 'express';
  2. import createError from 'http-errors';
  3. import { forgotPasswordErrorCode } from '~/interfaces/errors/forgot-password';
  4. import loggerFactory from '~/utils/logger';
  5. import type { IPasswordResetOrder } from '../models/password-reset-order';
  6. import PasswordResetOrder from '../models/password-reset-order';
  7. const logger = loggerFactory('growi:routes:forgot-password');
  8. export type ReqWithPasswordResetOrder = Request & {
  9. passwordResetOrder: IPasswordResetOrder;
  10. };
  11. // eslint-disable-next-line import/no-anonymous-default-export
  12. export default async (
  13. req: ReqWithPasswordResetOrder,
  14. res: Response,
  15. next: NextFunction,
  16. ): Promise<void> => {
  17. const token: string = req.params.token || req.body.token;
  18. if (token == null) {
  19. logger.error('Token not found');
  20. return next(
  21. createError(400, 'Token not found', {
  22. code: forgotPasswordErrorCode.TOKEN_NOT_FOUND,
  23. }),
  24. );
  25. }
  26. const passwordResetOrder = await PasswordResetOrder.findOne({
  27. token: { $eq: token },
  28. });
  29. // check if the token is valid
  30. if (
  31. passwordResetOrder == null ||
  32. passwordResetOrder.isExpired() ||
  33. passwordResetOrder.isRevoked
  34. ) {
  35. const message = 'passwordResetOrder is null or expired or revoked';
  36. logger.error(message);
  37. return next(
  38. createError(400, 'passwordResetOrder is null or expired or revoked', {
  39. code: forgotPasswordErrorCode.PASSWORD_RESET_ORDER_IS_NOT_APPROPRIATE,
  40. }),
  41. );
  42. }
  43. req.passwordResetOrder = passwordResetOrder;
  44. return next();
  45. };