Features.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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 {number} filestoreMigrationLevel
  19. * @property {boolean | undefined} enableSaml
  20. * @property {boolean | undefined} ldap
  21. * @property {boolean | undefined} oauth
  22. * @property {Object | undefined} overleaf
  23. * @property {Object | undefined} overleaf.oauth
  24. * @property {boolean | undefined} saml
  25. */
  26. const Features = {
  27. validateSettings() {
  28. if (![0, 1, 2].includes(Settings.filestoreMigrationLevel)) {
  29. throw new Error(
  30. `invalid OVERLEAF_FILESTORE_MIGRATION_LEVEL=${Settings.filestoreMigrationLevel}, expected 0, 1 or 2`
  31. )
  32. }
  33. },
  34. /**
  35. * @returns {boolean}
  36. */
  37. externalAuthenticationSystemUsed() {
  38. return (
  39. (Boolean(Settings.ldap) && Boolean(Settings.ldap.enable)) ||
  40. (Boolean(Settings.saml) && Boolean(Settings.saml.enable)) ||
  41. Boolean(Settings.overleaf)
  42. )
  43. },
  44. /**
  45. * Whether a feature is enabled in the appliation's configuration
  46. *
  47. * @param {string} feature
  48. * @returns {boolean}
  49. */
  50. hasFeature(feature) {
  51. switch (feature) {
  52. case 'saas':
  53. return Boolean(Settings.overleaf)
  54. case 'homepage':
  55. return Boolean(Settings.enableHomepage)
  56. case 'registration-page':
  57. return (
  58. !Features.externalAuthenticationSystemUsed() ||
  59. Boolean(Settings.overleaf)
  60. )
  61. case 'registration':
  62. return Boolean(Settings.overleaf)
  63. case 'chat':
  64. return Boolean(Settings.disableChat) === false
  65. case 'github-sync':
  66. return Boolean(Settings.enableGithubSync)
  67. case 'git-bridge':
  68. return Boolean(Settings.enableGitBridge)
  69. case 'oauth':
  70. return Boolean(Settings.oauth)
  71. case 'templates-server-pro':
  72. return Boolean(Settings.templates?.user_id)
  73. case 'affiliations':
  74. case 'analytics':
  75. return Boolean(_.get(Settings, ['apis', 'v1', 'url']))
  76. case 'references':
  77. return Boolean(_.get(Settings, ['apis', 'references', 'url']))
  78. case 'saml':
  79. return Boolean(Settings.enableSaml)
  80. case 'linked-project-file':
  81. return Boolean(Settings.enabledLinkedFileTypes.includes('project_file'))
  82. case 'linked-project-output-file':
  83. return Boolean(
  84. Settings.enabledLinkedFileTypes.includes('project_output_file')
  85. )
  86. case 'link-url':
  87. return Boolean(
  88. _.get(Settings, ['apis', 'linkedUrlProxy', 'url']) &&
  89. Settings.enabledLinkedFileTypes.includes('url')
  90. )
  91. case 'project-history-blobs':
  92. return Settings.filestoreMigrationLevel > 0
  93. case 'filestore':
  94. return Settings.filestoreMigrationLevel < 2
  95. case 'support':
  96. return supportModuleAvailable
  97. case 'symbol-palette':
  98. return symbolPaletteModuleAvailable
  99. case 'track-changes':
  100. return trackChangesModuleAvailable
  101. default:
  102. throw new Error(`unknown feature: ${feature}`)
  103. }
  104. },
  105. }
  106. module.exports = Features