UnsupportedBrowserMiddleware.mjs 1.3 KB

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