markdown-setting.js 9.7 KB

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