UnsupportedBrowserMiddleware.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. const Bowser = require('bowser')
  2. const Settings = require('@overleaf/settings')
  3. const Url = require('url')
  4. const { getSafeRedirectPath } = require('../Features/Helpers/UrlHelper')
  5. function unsupportedBrowserMiddleware(req, res, next) {
  6. if (!Settings.unsupportedBrowsers) return next()
  7. // Prevent redirect loop
  8. const path = req.path
  9. if (path === '/unsupported-browser') return next()
  10. const userAgent = req.headers['user-agent']
  11. if (!userAgent) return next()
  12. const parser = Bowser.getParser(userAgent)
  13. // Allow bots through by only ignoring bots or unrecognised UA strings
  14. const isBot = parser.isPlatform('bot') || !parser.getBrowserName()
  15. if (isBot) return next()
  16. const isUnsupported = parser.satisfies(Settings.unsupportedBrowsers)
  17. if (isUnsupported) {
  18. return res.redirect(
  19. Url.format({
  20. pathname: '/unsupported-browser',
  21. query: { fromURL: req.originalUrl },
  22. })
  23. )
  24. }
  25. next()
  26. }
  27. function renderUnsupportedBrowserPage(req, res) {
  28. let fromURL
  29. if (typeof req.query.fromURL === 'string') {
  30. try {
  31. fromURL =
  32. Settings.siteUrl + (getSafeRedirectPath(req.query.fromURL) || '/')
  33. } catch (e) {}
  34. }
  35. res.render('general/unsupported-browser', { fromURL })
  36. }
  37. module.exports = {
  38. renderUnsupportedBrowserPage,
  39. unsupportedBrowserMiddleware,
  40. }