config.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. import { PresetThemes } from '@growi/preset-themes';
  2. import { Types, Schema } from 'mongoose';
  3. import uniqueValidator from 'mongoose-unique-validator';
  4. import { RehypeSanitizeOption } from '../../interfaces/rehype';
  5. import { getOrCreateModel } from '../util/mongoose-utils';
  6. export interface Config {
  7. _id: Types.ObjectId;
  8. ns: string;
  9. key: string;
  10. value: string;
  11. }
  12. /*
  13. * define methods type
  14. */
  15. interface ModelMethods { any }
  16. const schema = new Schema<Config>({
  17. ns: { type: String, required: true },
  18. key: { type: String, required: true },
  19. value: { type: String, required: true },
  20. });
  21. // define unique compound index
  22. schema.index({ ns: 1, key: 1 }, { unique: true });
  23. schema.plugin(uniqueValidator);
  24. /**
  25. * default values when GROWI is cleanly installed
  26. */
  27. export const generateConfigsForInstalling = (): { [key: string]: any } => {
  28. // eslint-disable-next-line no-use-before-define
  29. const config = defaultCrowiConfigs;
  30. // overwrite
  31. config['app:installed'] = true;
  32. config['app:fileUpload'] = true;
  33. config['app:isV5Compatible'] = true;
  34. return config;
  35. };
  36. /**
  37. * default values when migrated from Official Crowi
  38. */
  39. export const defaultCrowiConfigs: { [key: string]: any } = {
  40. /* eslint-disable key-spacing */
  41. 'app:installed' : false,
  42. 'app:confidential' : undefined,
  43. 'app:fileUpload' : false,
  44. 'app:globalLang' : 'en_US',
  45. 'security:restrictGuestMode' : 'Deny',
  46. 'security:registrationMode' : 'Open',
  47. 'security:registrationWhiteList' : [],
  48. 'security:list-policy:hideRestrictedByOwner' : false,
  49. 'security:list-policy:hideRestrictedByGroup' : false,
  50. // DEPRECATED: 'security:pageCompleteDeletionAuthority' : undefined,
  51. 'security:pageDeletionAuthority' : undefined,
  52. 'security:pageCompleteDeletionAuthority' : undefined,
  53. 'security:pageRecursiveDeletionAuthority' : undefined,
  54. 'security:pageRecursiveCompleteDeletionAuthority' : undefined,
  55. 'security:disableLinkSharing' : false,
  56. 'security:passport-local:isEnabled' : true,
  57. 'security:passport-ldap:isEnabled' : false,
  58. 'security:passport-ldap:serverUrl' : undefined,
  59. 'security:passport-ldap:isUserBind' : undefined,
  60. 'security:passport-ldap:bindDN' : undefined,
  61. 'security:passport-ldap:bindDNPassword' : undefined,
  62. 'security:passport-ldap:searchFilter' : undefined,
  63. 'security:passport-ldap:attrMapUsername' : undefined,
  64. 'security:passport-ldap:attrMapName' : undefined,
  65. 'security:passport-ldap:attrMapMail' : undefined,
  66. 'security:passport-ldap:groupSearchBase' : undefined,
  67. 'security:passport-ldap:groupSearchFilter' : undefined,
  68. 'security:passport-ldap:groupDnProperty' : undefined,
  69. 'security:passport-ldap:isSameUsernameTreatedAsIdenticalUser': false,
  70. 'security:passport-saml:isEnabled' : false,
  71. 'security:passport-saml:isSameEmailTreatedAsIdenticalUser': false,
  72. 'security:passport-google:isEnabled' : false,
  73. 'security:passport-google:clientId': undefined,
  74. 'security:passport-google:clientSecret': undefined,
  75. 'security:passport-google:isSameUsernameTreatedAsIdenticalUser': false,
  76. 'security:passport-github:isEnabled' : false,
  77. 'security:passport-github:clientId': undefined,
  78. 'security:passport-github:clientSecret': undefined,
  79. 'security:passport-github:isSameUsernameTreatedAsIdenticalUser': false,
  80. 'security:passport-twitter:isEnabled' : false,
  81. 'security:passport-twitter:consumerKey': undefined,
  82. 'security:passport-twitter:consumerSecret': undefined,
  83. 'security:passport-twitter:isSameUsernameTreatedAsIdenticalUser': false,
  84. 'security:passport-oidc:isEnabled' : false,
  85. 'security:passport-basic:isEnabled' : false,
  86. 'security:passport-basic:isSameUsernameTreatedAsIdenticalUser': false,
  87. 'aws:s3Bucket' : 'growi',
  88. 'aws:s3Region' : 'ap-northeast-1',
  89. 'aws:s3AccessKeyId' : undefined,
  90. 'aws:s3SecretAccessKey' : undefined,
  91. 'aws:s3CustomEndpoint' : undefined,
  92. 'mail:from' : undefined,
  93. 'mail:smtpHost' : undefined,
  94. 'mail:smtpPort' : undefined,
  95. 'mail:smtpUser' : undefined,
  96. 'mail:smtpPassword' : undefined,
  97. 'plugin:isEnabledPlugins' : true,
  98. 'customize:css' : undefined,
  99. 'customize:script' : undefined,
  100. 'customize:header' : undefined,
  101. 'customize:title' : undefined,
  102. 'customize:highlightJsStyle' : 'github',
  103. 'customize:highlightJsStyleBorder' : false,
  104. 'customize:theme' : PresetThemes.DEFAULT,
  105. 'customize:isContainerFluid' : false,
  106. 'customize:isEnabledTimeline' : true,
  107. 'customize:isEnabledAttachTitleHeader' : false,
  108. 'customize:showPageLimitationS' : 20,
  109. 'customize:showPageLimitationM' : 10,
  110. 'customize:showPageLimitationL' : 50,
  111. 'customize:showPageLimitationXL' : 20,
  112. 'customize:isEnabledStaleNotification': false,
  113. 'customize:isAllReplyShown': false,
  114. 'customize:isSearchScopeChildrenAsDefault': false,
  115. 'customize:isSidebarDrawerMode': false,
  116. 'customize:isSidebarClosedAtDockMode': false,
  117. 'notification:owner-page:isEnabled': false,
  118. 'notification:group-page:isEnabled': false,
  119. 'importer:esa:team_name': undefined,
  120. 'importer:esa:access_token': undefined,
  121. 'importer:qiita:team_name': undefined,
  122. 'importer:qiita:access_token': undefined,
  123. /* eslint-enable key-spacing */
  124. };
  125. export const defaultMarkdownConfigs: { [key: string]: any } = {
  126. 'markdown:xss:isEnabledPrevention': true,
  127. 'markdown:xss:option': 2,
  128. 'markdown:xss:tagWhiteList': [],
  129. 'markdown:xss:attrWhiteList': [],
  130. 'markdown:rehypeSanitize:isEnabledPrevention': true,
  131. 'markdown:rehypeSanitize:option': RehypeSanitizeOption.RECOMMENDED,
  132. 'markdown:rehypeSanitize:tagNames': [],
  133. 'markdown:rehypeSanitize:attributes': {},
  134. 'markdown:isEnabledLinebreaks': false,
  135. 'markdown:isEnabledLinebreaksInComments': true,
  136. 'markdown:adminPreferredIndentSize': 4,
  137. 'markdown:isIndentSizeForced': false,
  138. 'markdown:presentation:pageBreakSeparator': 1,
  139. 'markdown:presentation:pageBreakCustomSeparator': undefined,
  140. };
  141. export const defaultNotificationConfigs: { [key: string]: any } = {
  142. 'slack:isIncomingWebhookPrioritized': false,
  143. 'slack:incomingWebhookUrl': undefined,
  144. 'slack:token': undefined,
  145. };
  146. /**
  147. * It is deprecated to use this for anything other than ConfigLoader#load.
  148. */
  149. // configSchema.statics.getDefaultCrowiConfigsObject = function() {
  150. // return getDefaultCrowiConfigs();
  151. // };
  152. /**
  153. * It is deprecated to use this for anything other than ConfigLoader#load.
  154. */
  155. // configSchema.statics.getDefaultMarkdownConfigsObject = function() {
  156. // return getDefaultMarkdownConfigs();
  157. // };
  158. /**
  159. * It is deprecated to use this for anything other than ConfigLoader#load.
  160. */
  161. // configSchema.statics.getDefaultNotificationConfigsObject = function() {
  162. // return getDefaultNotificationConfigs();
  163. // };
  164. schema.statics.getLocalconfig = function(crowi) {
  165. const env = process.env;
  166. const isDefaultLogo = crowi.configManager.getConfig('crowi', 'customize:isDefaultLogo');
  167. const localConfig = {
  168. crowi: {
  169. title: crowi.appService.getAppTitle(),
  170. url: crowi.appService.getSiteUrl(),
  171. confidential: crowi.appService.getAppConfidential(),
  172. version: crowi.version,
  173. },
  174. upload: {
  175. image: crowi.fileUploadService.getIsUploadable(),
  176. file: crowi.fileUploadService.getFileUploadEnabled(),
  177. },
  178. registrationWhiteList: crowi.configManager.getConfig('crowi', 'security:registrationWhiteList'),
  179. disableLinkSharing: crowi.configManager.getConfig('crowi', 'security:disableLinkSharing'),
  180. themeType: crowi.configManager.getConfig('crowi', 'customize:theme'),
  181. isEnabledLinebreaks: crowi.configManager.getConfig('markdown', 'markdown:isEnabledLinebreaks'),
  182. isEnabledLinebreaksInComments: crowi.configManager.getConfig('markdown', 'markdown:isEnabledLinebreaksInComments'),
  183. adminPreferredIndentSize: crowi.configManager.getConfig('markdown', 'markdown:adminPreferredIndentSize'),
  184. isIndentSizeForced: crowi.configManager.getConfig('markdown', 'markdown:isIndentSizeForced'),
  185. pageBreakSeparator: crowi.configManager.getConfig('markdown', 'markdown:presentation:pageBreakSeparator'),
  186. pageBreakCustomSeparator: crowi.configManager.getConfig('markdown', 'markdown:presentation:pageBreakCustomSeparator'),
  187. isEnabledXssPrevention: crowi.configManager.getConfig('markdown', 'markdown:xss:isEnabledPrevention'),
  188. isEnabledTimeline: crowi.configManager.getConfig('crowi', 'customize:isEnabledTimeline'),
  189. isAllReplyShown: crowi.configManager.getConfig('crowi', 'customize:isAllReplyShown'),
  190. isSearchScopeChildrenAsDefault: crowi.configManager.getConfig('crowi', 'customize:isSearchScopeChildrenAsDefault'),
  191. xssOption: crowi.configManager.getConfig('markdown', 'markdown:xss:option'),
  192. tagWhiteList: crowi.xssService.getTagWhiteList(),
  193. attrWhiteList: crowi.xssService.getAttrWhiteList(),
  194. highlightJsStyle: crowi.configManager.getConfig('crowi', 'customize:highlightJsStyle'),
  195. highlightJsStyleBorder: crowi.configManager.getConfig('crowi', 'customize:highlightJsStyleBorder'),
  196. customizeTitle: crowi.configManager.getConfig('crowi', 'customize:title'),
  197. customizeHeader: crowi.configManager.getConfig('crowi', 'customize:header'),
  198. customizeCss: crowi.configManager.getConfig('crowi', 'customize:css'),
  199. isEnabledAttachTitleHeader: crowi.configManager.getConfig('crowi', 'customize:isEnabledAttachTitleHeader'),
  200. customizeScript: crowi.configManager.getConfig('crowi', 'customize:script'),
  201. isSlackConfigured: crowi.slackIntegrationService.isSlackConfigured,
  202. env: {
  203. PLANTUML_URI: env.PLANTUML_URI || null,
  204. BLOCKDIAG_URI: env.BLOCKDIAG_URI || null,
  205. DRAWIO_URI: env.DRAWIO_URI || null,
  206. HACKMD_URI: env.HACKMD_URI || null,
  207. MATHJAX: env.MATHJAX || null,
  208. NO_CDN: env.NO_CDN || null,
  209. GROWI_CLOUD_URI: env.GROWI_CLOUD_URI || null,
  210. GROWI_APP_ID_FOR_GROWI_CLOUD: env.GROWI_APP_ID_FOR_GROWI_CLOUD || null,
  211. },
  212. isEnabledStaleNotification: crowi.configManager.getConfig('crowi', 'customize:isEnabledStaleNotification'),
  213. isAclEnabled: crowi.aclService.isAclEnabled(),
  214. isSearchServiceConfigured: crowi.searchService.isConfigured,
  215. isSearchServiceReachable: crowi.searchService.isReachable,
  216. isMailerSetup: crowi.mailService.isMailerSetup,
  217. globalLang: crowi.configManager.getConfig('crowi', 'app:globalLang'),
  218. pageLimitationL: crowi.configManager.getConfig('crowi', 'customize:showPageLimitationL'),
  219. pageLimitationXL: crowi.configManager.getConfig('crowi', 'customize:showPageLimitationXL'),
  220. customizedLogoSrc: isDefaultLogo != null && !isDefaultLogo
  221. ? crowi.configManager.getConfig('crowi', 'customize:customizedLogoSrc')
  222. : null,
  223. auditLogEnabled: crowi.configManager.getConfig('crowi', 'app:auditLogEnabled'),
  224. activityExpirationSeconds: crowi.configManager.getConfig('crowi', 'app:activityExpirationSeconds'),
  225. auditLogAvailableActions: crowi.activityService.getAvailableActions(false),
  226. isSidebarDrawerMode: crowi.configManager.getConfig('crowi', 'customize:isSidebarDrawerMode'),
  227. isSidebarClosedAtDockMode: crowi.configManager.getConfig('crowi', 'customize:isSidebarClosedAtDockMode'),
  228. };
  229. return localConfig;
  230. };
  231. export default getOrCreateModel<Config, ModelMethods>('Config', schema);