ErrorController.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. let ErrorController
  2. const Errors = require('./Errors')
  3. const logger = require('logger-sharelatex')
  4. const AuthenticationController = require('../Authentication/AuthenticationController')
  5. const SamlLogHandler = require('../SamlLog/SamlLogHandler')
  6. const HttpErrorHandler = require('./HttpErrorHandler')
  7. module.exports = ErrorController = {
  8. notFound(req, res) {
  9. res.status(404)
  10. res.render('general/404', { title: 'page_not_found' })
  11. },
  12. forbidden(req, res) {
  13. res.status(403)
  14. res.render('user/restricted')
  15. },
  16. serverError(req, res) {
  17. res.status(500)
  18. res.render('general/500', { title: 'Server Error' })
  19. },
  20. handleError(error, req, res, next) {
  21. const user = AuthenticationController.getSessionUser(req)
  22. // log errors related to SAML flow
  23. if (req.session && req.session.saml) {
  24. SamlLogHandler.log(req.session.saml.universityId, req.sessionID, {
  25. error: {
  26. message: error && error.message,
  27. stack: error && error.stack,
  28. },
  29. body: req.body,
  30. path: req.path,
  31. query: req.query,
  32. saml: req.session.saml,
  33. user_id: user && user._id,
  34. })
  35. }
  36. if (error.code === 'EBADCSRFTOKEN') {
  37. logger.warn(
  38. { err: error, url: req.url, method: req.method, user },
  39. 'invalid csrf'
  40. )
  41. res.sendStatus(403)
  42. } else if (error instanceof Errors.NotFoundError) {
  43. logger.warn({ err: error, url: req.url }, 'not found error')
  44. ErrorController.notFound(req, res)
  45. } else if (
  46. error instanceof URIError &&
  47. error.message.match(/^Failed to decode param/)
  48. ) {
  49. logger.warn({ err: error, url: req.url }, 'Express URIError')
  50. res.status(400)
  51. res.render('general/500', { title: 'Invalid Error' })
  52. } else if (error instanceof Errors.ForbiddenError) {
  53. logger.error({ err: error }, 'forbidden error')
  54. ErrorController.forbidden(req, res)
  55. } else if (error instanceof Errors.TooManyRequestsError) {
  56. logger.warn({ err: error, url: req.url }, 'too many requests error')
  57. res.sendStatus(429)
  58. } else if (error instanceof Errors.InvalidError) {
  59. logger.warn({ err: error, url: req.url }, 'invalid error')
  60. res.status(400)
  61. res.send(error.message)
  62. } else if (error instanceof Errors.InvalidNameError) {
  63. logger.warn({ err: error, url: req.url }, 'invalid name error')
  64. res.status(400)
  65. res.send(error.message)
  66. } else if (error instanceof Errors.SAMLSessionDataMissing) {
  67. logger.warn(
  68. { err: error, url: req.url },
  69. 'missing SAML session data error'
  70. )
  71. HttpErrorHandler.badRequest(req, res, error.message)
  72. } else {
  73. logger.error(
  74. { err: error, url: req.url, method: req.method, user },
  75. 'error passed to top level next middleware'
  76. )
  77. ErrorController.serverError(req, res)
  78. }
  79. },
  80. handleApiError(error, req, res, next) {
  81. if (error instanceof Errors.NotFoundError) {
  82. logger.warn({ err: error, url: req.url }, 'not found error')
  83. res.sendStatus(404)
  84. } else if (
  85. error instanceof URIError &&
  86. error.message.match(/^Failed to decode param/)
  87. ) {
  88. logger.warn({ err: error, url: req.url }, 'Express URIError')
  89. res.sendStatus(400)
  90. } else {
  91. logger.error(
  92. { err: error, url: req.url, method: req.method },
  93. 'error passed to top level next middleware'
  94. )
  95. res.sendStatus(500)
  96. }
  97. },
  98. }