AuthenticationErrors.mjs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import Metrics from '@overleaf/metrics'
  2. import OError from '@overleaf/o-error'
  3. import Settings from '@overleaf/settings'
  4. import Errors from '../Errors/Errors.js'
  5. export class InvalidEmailError extends Errors.BackwardCompatibleError {}
  6. export class InvalidPasswordError extends Errors.BackwardCompatibleError {}
  7. export class ParallelLoginError extends Errors.BackwardCompatibleError {}
  8. export class PasswordMustBeDifferentError
  9. extends Errors.BackwardCompatibleError {}
  10. export class PasswordReusedError extends Errors.BackwardCompatibleError {}
  11. export function handleAuthenticateErrors(error, req) {
  12. if (error.message === 'password is too long') {
  13. Metrics.inc('login_failure_reason', 1, {
  14. status: 'password_is_too_long',
  15. })
  16. return {
  17. status: 422,
  18. type: 'error',
  19. key: 'password-too-long',
  20. text: req.i18n.translate('password_too_long_please_reset'),
  21. }
  22. }
  23. if (error instanceof ParallelLoginError) {
  24. Metrics.inc('login_failure_reason', 1, { status: 'parallel_login' })
  25. return { status: 429 }
  26. }
  27. if (error instanceof PasswordReusedError) {
  28. Metrics.inc('login_failure_reason', 1, {
  29. status: 'password_compromised',
  30. })
  31. const text = `${req.i18n
  32. .translate('password_compromised_try_again_or_use_known_device_or_reset')
  33. .replace('<0>', '')
  34. .replace('</0>', ' (https://haveibeenpwned.com/passwords)')
  35. .replace('<1>', '')
  36. .replace('</1>', ` (${Settings.siteUrl}/user/password/reset)`)}.`
  37. return {
  38. status: 400,
  39. type: 'error',
  40. key: 'password-compromised',
  41. text,
  42. }
  43. }
  44. Metrics.inc('login_failure_reason', 1, {
  45. status: error instanceof OError ? error.name : 'error',
  46. })
  47. throw error
  48. }
  49. export default {
  50. InvalidEmailError,
  51. InvalidPasswordError,
  52. ParallelLoginError,
  53. PasswordMustBeDifferentError,
  54. PasswordReusedError,
  55. handleAuthenticateErrors,
  56. }