markdown-setting.js 9.6 KB

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