Features.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. const _ = require('lodash')
  2. const Settings = require('@overleaf/settings')
  3. const publicRegistrationModuleAvailable =
  4. Settings.moduleImportSequence.includes('public-registration')
  5. const supportModuleAvailable = Settings.moduleImportSequence.includes('support')
  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(_.get(Settings, ['overleaf', 'oauth']))
  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 publicRegistrationModuleAvailable || Boolean(Settings.overleaf)
  55. case 'github-sync':
  56. return Boolean(Settings.enableGithubSync)
  57. case 'git-bridge':
  58. return Boolean(Settings.enableGitBridge)
  59. case 'custom-togglers':
  60. return Boolean(Settings.overleaf)
  61. case 'oauth':
  62. return Boolean(Settings.oauth)
  63. case 'templates-server-pro':
  64. return !Settings.overleaf
  65. case 'affiliations':
  66. case 'analytics':
  67. return Boolean(_.get(Settings, ['apis', 'v1', 'url']))
  68. case 'overleaf-integration':
  69. return Boolean(Settings.overleaf)
  70. case 'references':
  71. return Boolean(_.get(Settings, ['apis', 'references', 'url']))
  72. case 'saml':
  73. return Boolean(Settings.enableSaml)
  74. case 'linked-project-file':
  75. return Boolean(Settings.enabledLinkedFileTypes.includes('project_file'))
  76. case 'linked-project-output-file':
  77. return Boolean(
  78. Settings.enabledLinkedFileTypes.includes('project_output_file')
  79. )
  80. case 'link-url':
  81. return Boolean(
  82. _.get(Settings, ['apis', 'linkedUrlProxy', 'url']) &&
  83. Settings.enabledLinkedFileTypes.includes('url')
  84. )
  85. case 'public-registration':
  86. return publicRegistrationModuleAvailable
  87. case 'support':
  88. return supportModuleAvailable
  89. case 'track-changes':
  90. return trackChangesModuleAvailable
  91. default:
  92. throw new Error(`unknown feature: ${feature}`)
  93. }
  94. },
  95. }
  96. module.exports = Features