Features.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. const _ = require('lodash')
  2. const Settings = require('@overleaf/settings')
  3. const supportModuleAvailable = Settings.moduleImportSequence.includes('support')
  4. const symbolPaletteModuleAvailable =
  5. Settings.moduleImportSequence.includes('symbol-palette')
  6. const trackChangesModuleAvailable =
  7. Settings.moduleImportSequence.includes('track-changes')
  8. /**
  9. * @typedef {Object} Settings
  10. * @property {Object | undefined} apis
  11. * @property {Object | undefined} apis.linkedUrlProxy
  12. * @property {string | undefined} apis.linkedUrlProxy.url
  13. * @property {Object | undefined} apis.references
  14. * @property {string | undefined} apis.references.url
  15. * @property {boolean | undefined} enableGithubSync
  16. * @property {boolean | undefined} enableGitBridge
  17. * @property {boolean | undefined} enableHomepage
  18. * @property {boolean | undefined} enableSaml
  19. * @property {boolean | undefined} ldap
  20. * @property {boolean | undefined} oauth
  21. * @property {Object | undefined} overleaf
  22. * @property {Object | undefined} overleaf.oauth
  23. * @property {boolean | undefined} saml
  24. */
  25. const Features = {
  26. /**
  27. * @returns {boolean}
  28. */
  29. externalAuthenticationSystemUsed() {
  30. return (
  31. (Boolean(Settings.ldap) && Boolean(Settings.ldap.enable)) ||
  32. (Boolean(Settings.saml) && Boolean(Settings.saml.enable)) ||
  33. Boolean(Settings.overleaf)
  34. )
  35. },
  36. /**
  37. * Whether a feature is enabled in the appliation's configuration
  38. *
  39. * @param {string} feature
  40. * @returns {boolean}
  41. */
  42. hasFeature(feature) {
  43. switch (feature) {
  44. case 'saas':
  45. return Boolean(Settings.overleaf)
  46. case 'homepage':
  47. return Boolean(Settings.enableHomepage)
  48. case 'registration-page':
  49. return (
  50. !Features.externalAuthenticationSystemUsed() ||
  51. Boolean(Settings.overleaf)
  52. )
  53. case 'registration':
  54. return Boolean(Settings.overleaf)
  55. case 'chat':
  56. return Boolean(Settings.disableChat) === false
  57. case 'github-sync':
  58. return Boolean(Settings.enableGithubSync)
  59. case 'git-bridge':
  60. return Boolean(Settings.enableGitBridge)
  61. case 'oauth':
  62. return Boolean(Settings.oauth)
  63. case 'templates-server-pro':
  64. return Boolean(Settings.templates?.user_id)
  65. case 'affiliations':
  66. case 'analytics':
  67. return Boolean(_.get(Settings, ['apis', 'v1', 'url']))
  68. case 'references':
  69. return Boolean(_.get(Settings, ['apis', 'references', 'url']))
  70. case 'saml':
  71. return Boolean(Settings.enableSaml)
  72. case 'linked-project-file':
  73. return Boolean(Settings.enabledLinkedFileTypes.includes('project_file'))
  74. case 'linked-project-output-file':
  75. return Boolean(
  76. Settings.enabledLinkedFileTypes.includes('project_output_file')
  77. )
  78. case 'link-url':
  79. return Boolean(
  80. _.get(Settings, ['apis', 'linkedUrlProxy', 'url']) &&
  81. Settings.enabledLinkedFileTypes.includes('url')
  82. )
  83. case 'support':
  84. return supportModuleAvailable
  85. case 'symbol-palette':
  86. return symbolPaletteModuleAvailable
  87. case 'track-changes':
  88. return trackChangesModuleAvailable
  89. default:
  90. throw new Error(`unknown feature: ${feature}`)
  91. }
  92. },
  93. }
  94. module.exports = Features