markdown-setting.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. const loggerFactory = require('@alias/logger');
  2. // eslint-disable-next-line no-unused-vars
  3. const logger = loggerFactory('growi:routes:apiv3:user-group');
  4. const express = require('express');
  5. const router = express.Router();
  6. const { body } = require('express-validator/check');
  7. const ErrorV3 = require('../../models/vo/error-apiv3');
  8. const validator = {
  9. lineBreak: [
  10. body('isEnabledLinebreaks').isBoolean(),
  11. body('isEnabledLinebreaksInComments').isBoolean(),
  12. ],
  13. presentationSetting: [
  14. body('pageBreakSeparator').isInt().not().isEmpty(),
  15. ],
  16. xssSetting: [
  17. body('isEnabledXss').isBoolean(),
  18. body('tagWhiteList').toArray(),
  19. body('attrWhiteList').toArray(),
  20. ],
  21. };
  22. /**
  23. * @swagger
  24. * tags:
  25. * name: MarkDownSetting
  26. */
  27. /**
  28. * @swagger
  29. *
  30. * components:
  31. * schemas:
  32. * CustomizeParams:
  33. * type: object
  34. * LineBreakParams:
  35. * type: object
  36. * properties:
  37. * isEnabledLinebreaks:
  38. * type: boolean
  39. * description: enable lineBreak
  40. * isEnabledLinebreaksInComments:
  41. * type: boolean
  42. * description: enable lineBreak in comment
  43. * PresentationParams:
  44. * type: object
  45. * properties:
  46. * pageBreakSeparator:
  47. * type: number
  48. * description: number of pageBreakSeparator
  49. * pageBreakCustomSeparator:
  50. * type: string
  51. * description: string of pageBreakCustomSeparator
  52. * XssParams:
  53. * type: object
  54. * properties:
  55. * isEnabledPrevention:
  56. * type: boolean
  57. * description: enable xss
  58. * xssOption:
  59. * type: number
  60. * description: number of xss option
  61. * tagWhiteList:
  62. * type: array
  63. * description: array of tag whiteList
  64. * items:
  65. * type: string
  66. * description: tag whitelist
  67. * attrWhiteList:
  68. * type: array
  69. * description: array of attr whiteList
  70. * items:
  71. * type: string
  72. * description: attr whitelist
  73. */
  74. module.exports = (crowi) => {
  75. const loginRequiredStrictly = require('../../middleware/login-required')(crowi);
  76. const adminRequired = require('../../middleware/admin-required')(crowi);
  77. const csrf = require('../../middleware/csrf')(crowi);
  78. const { ApiV3FormValidator } = crowi.middlewares;
  79. /**
  80. * @swagger
  81. *
  82. * /markdown-setting/:
  83. * get:
  84. * tags: [MarkDownSettind]
  85. * description: Get markdown paramators
  86. * responses:
  87. * 200:
  88. * description: params of markdown
  89. * content:
  90. * application/json:
  91. * schema:
  92. * properties:
  93. * markdonwParams:
  94. * $ref: '#/components/schemas/CustomizeParams'
  95. */
  96. router.get('/', loginRequiredStrictly, adminRequired, async(req, res) => {
  97. const markdownParams = {
  98. isEnabledLinebreaks: await crowi.configManager.getConfig('markdown', 'markdown:isEnabledLinebreaks'),
  99. isEnabledLinebreaksInComments: await crowi.configManager.getConfig('markdown', 'markdown:isEnabledLinebreaksInComments'),
  100. pageBreakSeparator: await crowi.configManager.getConfig('markdown', 'markdown:presentation:pageBreakSeparator'),
  101. pageBreakCustomSeparator: await crowi.configManager.getConfig('markdown', 'markdown:presentation:pageBreakCustomSeparator'),
  102. isEnabledXss: await crowi.configManager.getConfig('markdown', 'markdown:xss:isEnabledPrevention'),
  103. xssOption: await crowi.configManager.getConfig('markdown', 'markdown:xss:option'),
  104. tagWhiteList: await crowi.configManager.getConfig('markdown', 'markdown:xss:tagWhiteList'),
  105. attrWhiteList: await crowi.configManager.getConfig('markdown', 'markdown:xss:attrWhiteList'),
  106. };
  107. return res.apiv3({ markdownParams });
  108. });
  109. /**
  110. * @swagger
  111. *
  112. * /markdown-setting/lineBreak:
  113. * put:
  114. * tags: [MarkDownSetting]
  115. * description: Update lineBreak setting
  116. * requestBody:
  117. * required: true
  118. * content:
  119. * application/json:
  120. * schema:
  121. * $ref: '#/components/schemas/LineBreakParams'
  122. * responses:
  123. * 200:
  124. * description: Succeeded to update lineBreak setting
  125. * content:
  126. * application/json:
  127. * schema:
  128. * $ref: '#/components/schemas/LineBreakParams'
  129. */
  130. router.put('/lineBreak', loginRequiredStrictly, adminRequired, csrf, validator.lineBreak, ApiV3FormValidator, async(req, res) => {
  131. const requestLineBreakParams = {
  132. 'markdown:isEnabledLinebreaks': req.body.isEnabledLinebreaks,
  133. 'markdown:isEnabledLinebreaksInComments': req.body.isEnabledLinebreaksInComments,
  134. };
  135. try {
  136. await crowi.configManager.updateConfigsInTheSameNamespace('markdown', requestLineBreakParams);
  137. const lineBreaksParams = {
  138. isEnabledLinebreaks: await crowi.configManager.getConfig('markdown', 'markdown:isEnabledLinebreaks'),
  139. isEnabledLinebreaksInComments: await crowi.configManager.getConfig('markdown', 'markdown:isEnabledLinebreaksInComments'),
  140. };
  141. return res.apiv3({ lineBreaksParams });
  142. }
  143. catch (err) {
  144. const msg = 'Error occurred in updating lineBreak';
  145. logger.error('Error', err);
  146. return res.apiv3Err(new ErrorV3(msg, 'update-lineBreak-failed'));
  147. }
  148. });
  149. /**
  150. * @swagger
  151. *
  152. * /markdown-setting/presentation:
  153. * put:
  154. * tags: [MarkDownSetting]
  155. * description: Update presentation
  156. * requestBody:
  157. * required: true
  158. * content:
  159. * application/json:
  160. * schema:
  161. * $ref: '#/components/schemas/PresentationParams'
  162. * responses:
  163. * 200:
  164. * description: Succeeded to update presentation setting
  165. * content:
  166. * application/json:
  167. * schema:
  168. * $ref: '#/components/schemas/PresentationParams'
  169. */
  170. router.put('/presentation', loginRequiredStrictly, adminRequired, csrf, validator.presentationSetting, ApiV3FormValidator, async(req, res) => {
  171. if (req.body.pageBreakSeparator === 3 && req.body.pageBreakCustomSeparator === '') {
  172. return res.apiv3Err(new ErrorV3('customRegularExpression is required'));
  173. }
  174. const requestPresentationParams = {
  175. 'markdown:presentation:pageBreakSeparator': req.body.pageBreakSeparator,
  176. 'markdown:presentation:pageBreakCustomSeparator': req.body.pageBreakCustomSeparator,
  177. };
  178. try {
  179. await crowi.configManager.updateConfigsInTheSameNamespace('markdown', requestPresentationParams);
  180. const presentationParams = {
  181. pageBreakSeparator: await crowi.configManager.getConfig('markdown', 'markdown:presentation:pageBreakSeparator'),
  182. pageBreakCustomSeparator: await crowi.configManager.getConfig('markdown', 'markdown:presentation:pageBreakCustomSeparator') || '',
  183. };
  184. return res.apiv3({ presentationParams });
  185. }
  186. catch (err) {
  187. const msg = 'Error occurred in updating presentation';
  188. logger.error('Error', err);
  189. return res.apiv3Err(new ErrorV3(msg, 'update-presentation-failed'));
  190. }
  191. });
  192. /**
  193. * @swagger
  194. *
  195. * /markdown-setting/xss:
  196. * put:
  197. * tags: [MarkDownSetting]
  198. * description: Update xss
  199. * requestBody:
  200. * required: true
  201. * content:
  202. * application/json:
  203. * schema:
  204. * $ref: '#/components/schemas/XssParams'
  205. * responses:
  206. * 200:
  207. * description: Succeeded to update xss setting
  208. * content:
  209. * application/json:
  210. * schema:
  211. * $ref: '#/components/schemas/XssParams'
  212. */
  213. router.put('/xss', loginRequiredStrictly, adminRequired, csrf, validator.xssSetting, ApiV3FormValidator, async(req, res) => {
  214. if (req.body.isEnabledXss && req.body.xssOption == null) {
  215. return res.apiv3Err(new ErrorV3('xss option is required'));
  216. }
  217. const reqestXssParams = {
  218. 'markdown:xss:isEnabledPrevention': req.body.isEnabledXss,
  219. 'markdown:xss:option': req.body.xssOption,
  220. 'markdown:xss:tagWhiteList': req.body.tagWhiteList,
  221. 'markdown:xss:attrWhiteList': req.body.attrWhiteList,
  222. };
  223. try {
  224. await crowi.configManager.updateConfigsInTheSameNamespace('markdown', reqestXssParams);
  225. const xssParams = {
  226. isEnabledXss: await crowi.configManager.getConfig('markdown', 'markdown:xss:isEnabledPrevention'),
  227. xssOption: await crowi.configManager.getConfig('markdown', 'markdown:xss:option'),
  228. tagWhiteList: await crowi.configManager.getConfig('markdown', 'markdown:xss:tagWhiteList'),
  229. attrWhiteList: await crowi.configManager.getConfig('markdown', 'markdown:xss:attrWhiteList'),
  230. };
  231. return res.apiv3({ xssParams });
  232. }
  233. catch (err) {
  234. const msg = 'Error occurred in updating xss';
  235. logger.error('Error', err);
  236. return res.apiv3Err(new ErrorV3(msg, 'update-xss-failed'));
  237. }
  238. });
  239. return router;
  240. };