Features.js 2.9 KB

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