app-settings.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. const loggerFactory = require('@alias/logger');
  2. const logger = loggerFactory('growi:routes:apiv3:app-settings');
  3. const debug = require('debug')('growi:routes:admin');
  4. const express = require('express');
  5. const { listLocaleIds } = require('@commons/util/locale-utils');
  6. const router = express.Router();
  7. const { body } = require('express-validator');
  8. const ErrorV3 = require('../../models/vo/error-apiv3');
  9. /**
  10. * @swagger
  11. * tags:
  12. * name: AppSettings
  13. */
  14. /**
  15. * @swagger
  16. *
  17. * components:
  18. * schemas:
  19. * AppSettingParams:
  20. * description: AppSettingParams
  21. * type: object
  22. * properties:
  23. * title:
  24. * type: string
  25. * description: site name show on page header and tilte of HTML
  26. * confidential:
  27. * type: string
  28. * description: confidential show on page header
  29. * globalLang:
  30. * type: string
  31. * description: language set when create user
  32. * fileUpload:
  33. * type: boolean
  34. * description: enable upload file except image file
  35. * SiteUrlSettingParams:
  36. * description: SiteUrlSettingParams
  37. * type: object
  38. * properties:
  39. * siteUrl:
  40. * type: string
  41. * description: Site URL. e.g. https://example.com, https://example.com:8080
  42. * envSiteUrl:
  43. * type: string
  44. * description: environment variable 'APP_SITE_URL'
  45. * MailSetting:
  46. * description: MailSettingParams
  47. * type: object
  48. * properties:
  49. * fromAddress:
  50. * type: string
  51. * description: e-mail address used as from address of mail which sent from GROWI app
  52. * transmissionMethod:
  53. * type: string
  54. * description: transmission method
  55. * SmtpSettingParams:
  56. * description: SmtpSettingParams
  57. * type: object
  58. * properties:
  59. * smtpHost:
  60. * type: string
  61. * description: host name of client's smtp server
  62. * smtpPort:
  63. * type: string
  64. * description: port of client's smtp server
  65. * smtpUser:
  66. * type: string
  67. * description: user name of client's smtp server
  68. * smtpPassword:
  69. * type: string
  70. * description: password of client's smtp server
  71. * SesSettingParams:
  72. * description: SesSettingParams
  73. * type: object
  74. * properties:
  75. * accessKeyId:
  76. * type: string
  77. * description: accesskey id for authentification of AWS
  78. * secretAccessKey:
  79. * type: string
  80. * description: secret key for authentification of AWS
  81. * FileUploadSettingParams:
  82. * description: FileUploadTypeParams
  83. * type: object
  84. * properties:
  85. * fileUploadType:
  86. * type: string
  87. * description: fileUploadType
  88. * region:
  89. * type: string
  90. * description: region of AWS S3
  91. * customEndpoint:
  92. * type: string
  93. * description: custom endpoint of AWS S3
  94. * bucket:
  95. * type: string
  96. * description: AWS S3 bucket name
  97. * accessKeyId:
  98. * type: string
  99. * description: accesskey id for authentification of AWS
  100. * secretAccessKey:
  101. * type: string
  102. * description: secret key for authentification of AWS
  103. * gcsApiKeyJsonPath:
  104. * type: string
  105. * description: apiKeyJsonPath of gcp
  106. * gcsBucket:
  107. * type: string
  108. * description: bucket name of gcs
  109. * gcsUploadNamespace:
  110. * type: string
  111. * description: name space of gcs
  112. * envGcsApiKeyJsonPath:
  113. * type: string
  114. * description: Path of the JSON file that contains service account key to authenticate to GCP API
  115. * envGcsBucket:
  116. * type: string
  117. * description: Name of the GCS bucket
  118. * envGcsUploadNamespace:
  119. * type: string
  120. * description: Directory name to create in the bucket
  121. * PluginSettingParams:
  122. * description: PluginSettingParams
  123. * type: object
  124. * properties:
  125. * isEnabledPlugins:
  126. * type: string
  127. * description: enable use plugins
  128. */
  129. module.exports = (crowi) => {
  130. const accessTokenParser = require('../../middlewares/access-token-parser')(crowi);
  131. const loginRequiredStrictly = require('../../middlewares/login-required')(crowi);
  132. const adminRequired = require('../../middlewares/admin-required')(crowi);
  133. const csrf = require('../../middlewares/csrf')(crowi);
  134. const apiV3FormValidator = require('../../middlewares/apiv3-form-validator')(crowi);
  135. const validator = {
  136. appSetting: [
  137. body('title').trim(),
  138. body('confidential'),
  139. body('globalLang').isIn(listLocaleIds()),
  140. body('fileUpload').isBoolean(),
  141. ],
  142. siteUrlSetting: [
  143. body('siteUrl').trim().matches(/^(https?:\/\/[^/]+|)$/).isURL({ require_tld: false }),
  144. ],
  145. mailSetting: [
  146. body('fromAddress').trim().if(value => value !== '').isEmail(),
  147. body('transmissionMethod').isIn(['smtp', 'ses']),
  148. ],
  149. smtpSetting: [
  150. body('smtpHost').trim(),
  151. body('smtpPort').trim().if(value => value !== '').isPort(),
  152. body('smtpUser').trim(),
  153. body('smtpPassword').trim(),
  154. ],
  155. sesSetting: [
  156. body('sesAccessKeyId').trim().if(value => value !== '').matches(/^[\da-zA-Z]+$/),
  157. body('sesSecretAccessKey').trim(),
  158. ],
  159. fileUploadSetting: [
  160. body('fileUploadType').isIn(['aws', 'gcs', 'local', 'gridfs']),
  161. body('gcsApiKeyJsonPath').trim(),
  162. body('gcsBucket').trim(),
  163. body('gcsUploadNamespace').trim(),
  164. body('s3Region').trim().if(value => value !== '').matches(/^[a-z]+-[a-z]+-\d+$/)
  165. .withMessage((value, { req }) => req.t('validation.aws_region')),
  166. body('s3CustomEndpoint').trim().if(value => value !== '').matches(/^(https?:\/\/[^/]+|)$/)
  167. .withMessage((value, { req }) => req.t('validation.aws_custom_endpoint')),
  168. body('s3Bucket').trim(),
  169. body('s3AccessKeyId').trim().if(value => value !== '').matches(/^[\da-zA-Z]+$/),
  170. body('s3SecretAccessKey').trim(),
  171. ],
  172. pluginSetting: [
  173. body('isEnabledPlugins').isBoolean(),
  174. ],
  175. };
  176. /**
  177. * @swagger
  178. *
  179. * /app-settings:
  180. * get:
  181. * tags: [AppSettings]
  182. * operationId: getAppSettings
  183. * summary: /app-settings
  184. * description: get app setting params
  185. * responses:
  186. * 200:
  187. * description: Resources are available
  188. * content:
  189. * application/json:
  190. * schema:
  191. * properties:
  192. * appSettingsParams:
  193. * type: object
  194. * description: app settings params
  195. */
  196. router.get('/', accessTokenParser, loginRequiredStrictly, adminRequired, async(req, res) => {
  197. const appSettingsParams = {
  198. title: crowi.configManager.getConfig('crowi', 'app:title'),
  199. confidential: crowi.configManager.getConfig('crowi', 'app:confidential'),
  200. globalLang: crowi.configManager.getConfig('crowi', 'app:globalLang'),
  201. fileUpload: crowi.configManager.getConfig('crowi', 'app:fileUpload'),
  202. siteUrl: crowi.configManager.getConfig('crowi', 'app:siteUrl'),
  203. envSiteUrl: crowi.configManager.getConfigFromEnvVars('crowi', 'app:siteUrl'),
  204. isMailerSetup: crowi.mailService.isMailerSetup,
  205. fromAddress: crowi.configManager.getConfig('crowi', 'mail:from'),
  206. transmissionMethod: crowi.configManager.getConfig('crowi', 'mail:transmissionMethod'),
  207. smtpHost: crowi.configManager.getConfig('crowi', 'mail:smtpHost'),
  208. smtpPort: crowi.configManager.getConfig('crowi', 'mail:smtpPort'),
  209. smtpUser: crowi.configManager.getConfig('crowi', 'mail:smtpUser'),
  210. smtpPassword: crowi.configManager.getConfig('crowi', 'mail:smtpPassword'),
  211. sesAccessKeyId: crowi.configManager.getConfig('crowi', 'mail:sesAccessKeyId'),
  212. sesSecretAccessKey: crowi.configManager.getConfig('crowi', 'mail:sesSecretAccessKey'),
  213. fileUploadType: crowi.configManager.getConfig('crowi', 'app:fileUploadType'),
  214. envFileUploadType: crowi.configManager.getConfigFromEnvVars('crowi', 'app:fileUploadType'),
  215. useOnlyEnvVarForFileUploadType: crowi.configManager.getConfig('crowi', 'app:useOnlyEnvVarForFileUploadType'),
  216. s3Region: crowi.configManager.getConfig('crowi', 'aws:s3Region'),
  217. s3CustomEndpoint: crowi.configManager.getConfig('crowi', 'aws:s3CustomEndpoint'),
  218. s3Bucket: crowi.configManager.getConfig('crowi', 'aws:s3Bucket'),
  219. s3AccessKeyId: crowi.configManager.getConfig('crowi', 'aws:s3AccessKeyId'),
  220. s3SecretAccessKey: crowi.configManager.getConfig('crowi', 'aws:s3SecretAccessKey'),
  221. gcsUseOnlyEnvVars: crowi.configManager.getConfig('crowi', 'gcs:useOnlyEnvVarsForSomeOptions'),
  222. gcsApiKeyJsonPath: crowi.configManager.getConfig('crowi', 'gcs:apiKeyJsonPath'),
  223. gcsBucket: crowi.configManager.getConfig('crowi', 'gcs:bucket'),
  224. gcsUploadNamespace: crowi.configManager.getConfig('crowi', 'gcs:uploadNamespace'),
  225. envGcsApiKeyJsonPath: crowi.configManager.getConfigFromEnvVars('crowi', 'gcs:apiKeyJsonPath'),
  226. envGcsBucket: crowi.configManager.getConfigFromEnvVars('crowi', 'gcs:bucket'),
  227. envGcsUploadNamespace: crowi.configManager.getConfigFromEnvVars('crowi', 'gcs:uploadNamespace'),
  228. isEnabledPlugins: crowi.configManager.getConfig('crowi', 'plugin:isEnabledPlugins'),
  229. };
  230. return res.apiv3({ appSettingsParams });
  231. });
  232. /**
  233. * @swagger
  234. *
  235. * /app-settings/app-setting:
  236. * put:
  237. * tags: [AppSettings]
  238. * summary: /app-settings/app-setting
  239. * operationId: updateAppSettings
  240. * description: Update app setting
  241. * requestBody:
  242. * required: true
  243. * content:
  244. * application/json:
  245. * schema:
  246. * $ref: '#/components/schemas/AppSettingParams'
  247. * responses:
  248. * 200:
  249. * description: Succeeded to update app setting
  250. * content:
  251. * application/json:
  252. * schema:
  253. * $ref: '#/components/schemas/AppSettingParams'
  254. */
  255. router.put('/app-setting', loginRequiredStrictly, adminRequired, csrf, validator.appSetting, apiV3FormValidator, async(req, res) => {
  256. const requestAppSettingParams = {
  257. 'app:title': req.body.title,
  258. 'app:confidential': req.body.confidential,
  259. 'app:globalLang': req.body.globalLang,
  260. 'app:fileUpload': req.body.fileUpload,
  261. };
  262. try {
  263. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestAppSettingParams);
  264. const appSettingParams = {
  265. title: crowi.configManager.getConfig('crowi', 'app:title'),
  266. confidential: crowi.configManager.getConfig('crowi', 'app:confidential'),
  267. globalLang: crowi.configManager.getConfig('crowi', 'app:globalLang'),
  268. fileUpload: crowi.configManager.getConfig('crowi', 'app:fileUpload'),
  269. };
  270. return res.apiv3({ appSettingParams });
  271. }
  272. catch (err) {
  273. const msg = 'Error occurred in updating app setting';
  274. logger.error('Error', err);
  275. return res.apiv3Err(new ErrorV3(msg, 'update-appSetting-failed'));
  276. }
  277. });
  278. /**
  279. * @swagger
  280. *
  281. * /app-settings/site-url-setting:
  282. * put:
  283. * tags: [AppSettings]
  284. * operationId: updateAppSettingSiteUrlSetting
  285. * summary: /app-settings/site-url-setting
  286. * description: Update site url setting
  287. * requestBody:
  288. * required: true
  289. * content:
  290. * application/json:
  291. * schema:
  292. * $ref: '#/components/schemas/SiteUrlSettingParams'
  293. * responses:
  294. * 200:
  295. * description: Succeeded to update site url setting
  296. * content:
  297. * application/json:
  298. * schema:
  299. * $ref: '#/components/schemas/SiteUrlSettingParams'
  300. */
  301. router.put('/site-url-setting', loginRequiredStrictly, adminRequired, csrf, validator.siteUrlSetting, apiV3FormValidator, async(req, res) => {
  302. const requestSiteUrlSettingParams = {
  303. 'app:siteUrl': req.body.siteUrl,
  304. };
  305. try {
  306. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestSiteUrlSettingParams);
  307. const siteUrlSettingParams = {
  308. siteUrl: crowi.configManager.getConfig('crowi', 'app:siteUrl'),
  309. };
  310. return res.apiv3({ siteUrlSettingParams });
  311. }
  312. catch (err) {
  313. const msg = 'Error occurred in updating site url setting';
  314. logger.error('Error', err);
  315. return res.apiv3Err(new ErrorV3(msg, 'update-siteUrlSetting-failed'));
  316. }
  317. });
  318. /**
  319. * send mail (Promise wrapper)
  320. */
  321. async function sendMailPromiseWrapper(smtpClient, options) {
  322. return new Promise((resolve, reject) => {
  323. smtpClient.sendMail(options, (err, res) => {
  324. if (err) {
  325. reject(err);
  326. }
  327. else {
  328. resolve(res);
  329. }
  330. });
  331. });
  332. }
  333. /**
  334. * validate mail setting send test mail
  335. */
  336. async function sendTestEmail(destinationAddress) {
  337. const { configManager, mailService } = crowi;
  338. if (!mailService.isMailerSetup) {
  339. throw Error('mailService is not setup');
  340. }
  341. const fromAddress = configManager.getConfig('crowi', 'mail:from');
  342. if (fromAddress == null) {
  343. throw Error('fromAddress is not setup');
  344. }
  345. const smtpHost = configManager.getConfig('crowi', 'mail:smtpHost');
  346. const smtpPort = configManager.getConfig('crowi', 'mail:smtpPort');
  347. const smtpUser = configManager.getConfig('crowi', 'mail:smtpUser');
  348. const smtpPassword = configManager.getConfig('crowi', 'mail:smtpPassword');
  349. const option = {
  350. host: smtpHost,
  351. port: smtpPort,
  352. };
  353. if (smtpUser && smtpPassword) {
  354. option.auth = {
  355. user: smtpUser,
  356. pass: smtpPassword,
  357. };
  358. }
  359. if (option.port === 465) {
  360. option.secure = true;
  361. }
  362. const smtpClient = mailService.createSMTPClient(option);
  363. debug('mailer setup for validate SMTP setting', smtpClient);
  364. const mailOptions = {
  365. from: fromAddress,
  366. to: destinationAddress,
  367. subject: 'Wiki管理設定のアップデートによるメール通知',
  368. text: 'このメールは、WikiのSMTP設定のアップデートにより送信されています。',
  369. };
  370. await sendMailPromiseWrapper(smtpClient, mailOptions);
  371. }
  372. const updateMailSettinConfig = async function(requestMailSettingParams) {
  373. const {
  374. configManager,
  375. mailService,
  376. } = crowi;
  377. // update config without publishing S2sMessage
  378. await configManager.updateConfigsInTheSameNamespace('crowi', requestMailSettingParams, true);
  379. await mailService.initialize();
  380. mailService.publishUpdatedMessage();
  381. return {
  382. isMailerSetup: mailService.isMailerSetup,
  383. fromAddress: configManager.getConfig('crowi', 'mail:from'),
  384. smtpHost: configManager.getConfig('crowi', 'mail:smtpHost'),
  385. smtpPort: configManager.getConfig('crowi', 'mail:smtpPort'),
  386. smtpUser: configManager.getConfig('crowi', 'mail:smtpUser'),
  387. smtpPassword: configManager.getConfig('crowi', 'mail:smtpPassword'),
  388. sesAccessKeyId: configManager.getConfig('crowi', 'mail:sesAccessKeyId'),
  389. sesSecretAccessKey: configManager.getConfig('crowi', 'mail:sesSecretAccessKey'),
  390. };
  391. };
  392. /**
  393. * @swagger
  394. *
  395. * /app-settings/smtp-setting:
  396. * put:
  397. * tags: [AppSettings]
  398. * operationId: updateAppSettingSmtpSetting
  399. * summary: /app-settings/smtp-setting
  400. * description: Update smtp setting
  401. * requestBody:
  402. * required: true
  403. * content:
  404. * application/json:
  405. * schema:
  406. * $ref: '#/components/schemas/SmtpSettingParams'
  407. * responses:
  408. * 200:
  409. * description: Succeeded to update smtp setting
  410. * content:
  411. * application/json:
  412. * schema:
  413. * $ref: '#/components/schemas/SmtpSettingParams'
  414. */
  415. router.put('/smtp-setting', loginRequiredStrictly, adminRequired, csrf, validator.smtpSetting, apiV3FormValidator, async(req, res) => {
  416. const requestMailSettingParams = {
  417. 'mail:from': req.body.fromAddress,
  418. 'mail:transmissionMethod': req.body.transmissionMethod,
  419. 'mail:smtpHost': req.body.smtpHost,
  420. 'mail:smtpPort': req.body.smtpPort,
  421. 'mail:smtpUser': req.body.smtpUser,
  422. 'mail:smtpPassword': req.body.smtpPassword,
  423. };
  424. try {
  425. const mailSettingParams = await updateMailSettinConfig(requestMailSettingParams);
  426. return res.apiv3({ mailSettingParams });
  427. }
  428. catch (err) {
  429. const msg = 'Error occurred in updating smtp setting';
  430. logger.error('Error', err);
  431. return res.apiv3Err(new ErrorV3(msg, 'update-smtpSetting-failed'));
  432. }
  433. });
  434. /**
  435. * @swagger
  436. *
  437. * /app-settings/smtp-test:
  438. * post:
  439. * tags: [AppSettings]
  440. * operationId: postSmtpTest
  441. * summary: /app-settings/smtp-setting
  442. * description: Send test mail for smtp
  443. * responses:
  444. * 200:
  445. * description: Succeeded to send test mail for smtp
  446. */
  447. router.post('/smtp-test', loginRequiredStrictly, adminRequired, async(req, res) => {
  448. try {
  449. await sendTestEmail(req.user.email);
  450. return res.apiv3({});
  451. }
  452. catch (err) {
  453. const msg = req.t('validation.failed_to_send_a_test_email');
  454. logger.error('Error', err);
  455. debug('Error validate mail setting: ', err);
  456. return res.apiv3Err(new ErrorV3(msg, 'send-email-with-smtp-failed'));
  457. }
  458. });
  459. /**
  460. * @swagger
  461. *
  462. * /app-settings/ses-setting:
  463. * put:
  464. * tags: [AppSettings]
  465. * operationId: updateAppSettingSesSetting
  466. * summary: /app-settings/ses-setting
  467. * description: Update ses setting
  468. * requestBody:
  469. * required: true
  470. * content:
  471. * application/json:
  472. * schema:
  473. * $ref: '#/components/schemas/SesSettingParams'
  474. * responses:
  475. * 200:
  476. * description: Succeeded to update ses setting
  477. * content:
  478. * application/json:
  479. * schema:
  480. * $ref: '#/components/schemas/SesSettingParams'
  481. */
  482. router.put('/ses-setting', loginRequiredStrictly, adminRequired, csrf, validator.sesSetting, apiV3FormValidator, async(req, res) => {
  483. const { mailService } = crowi;
  484. const requestSesSettingParams = {
  485. 'mail:from': req.body.fromAddress,
  486. 'mail:transmissionMethod': req.body.transmissionMethod,
  487. 'mail:sesAccessKeyId': req.body.sesAccessKeyId,
  488. 'mail:sesSecretAccessKey': req.body.sesSecretAccessKey,
  489. };
  490. let mailSettingParams;
  491. try {
  492. mailSettingParams = await updateMailSettinConfig(requestSesSettingParams);
  493. }
  494. catch (err) {
  495. const msg = 'Error occurred in updating ses setting';
  496. logger.error('Error', err);
  497. return res.apiv3Err(new ErrorV3(msg, 'update-ses-setting-failed'));
  498. }
  499. await mailService.initialize();
  500. mailService.publishUpdatedMessage();
  501. return res.apiv3({ mailSettingParams });
  502. });
  503. /**
  504. * @swagger
  505. *
  506. * /app-settings/file-upload-settings:
  507. * put:
  508. * tags: [AppSettings]
  509. * operationId: updateAppSettingFileUploadSetting
  510. * summary: /app-settings/file-upload-setting
  511. * description: Update fileUploadSetting
  512. * requestBody:
  513. * required: true
  514. * content:
  515. * application/json:
  516. * schema:
  517. * $ref: '#/components/schemas/FileUploadSettingParams'
  518. * responses:
  519. * 200:
  520. * description: Succeeded to update fileUploadSetting
  521. * content:
  522. * application/json:
  523. * schema:
  524. * $ref: '#/components/schemas/FileUploadSettingParams'
  525. */
  526. router.put('/file-upload-setting', loginRequiredStrictly, adminRequired, csrf, validator.fileUploadSetting, apiV3FormValidator, async(req, res) => {
  527. const { fileUploadType } = req.body;
  528. const requestParams = {
  529. 'app:fileUploadType': fileUploadType,
  530. };
  531. if (fileUploadType === 'gcs') {
  532. requestParams['gcs:apiKeyJsonPath'] = req.body.gcsApiKeyJsonPath;
  533. requestParams['gcs:bucket'] = req.body.gcsBucket;
  534. requestParams['gcs:uploadNamespace'] = req.body.gcsUploadNamespace;
  535. }
  536. if (fileUploadType === 'aws') {
  537. requestParams['aws:s3Region'] = req.body.s3Region;
  538. requestParams['aws:s3CustomEndpoint'] = req.body.s3CustomEndpoint;
  539. requestParams['aws:s3Bucket'] = req.body.s3Bucket;
  540. requestParams['aws:s3AccessKeyId'] = req.body.s3AccessKeyId;
  541. requestParams['aws:s3SecretAccessKey'] = req.body.s3SecretAccessKey;
  542. }
  543. try {
  544. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams, true);
  545. await crowi.setUpFileUpload(true);
  546. crowi.fileUploaderSwitchService.publishUpdatedMessage();
  547. const responseParams = {
  548. fileUploadType: crowi.configManager.getConfig('crowi', 'app:fileUploadType'),
  549. };
  550. if (fileUploadType === 'gcs') {
  551. responseParams.gcsApiKeyJsonPath = crowi.configManager.getConfig('crowi', 'gcs:apiKeyJsonPath');
  552. responseParams.gcsBucket = crowi.configManager.getConfig('crowi', 'gcs:bucket');
  553. responseParams.gcsUploadNamespace = crowi.configManager.getConfig('crowi', 'gcs:uploadNamespace');
  554. }
  555. if (fileUploadType === 'aws') {
  556. responseParams.s3Region = crowi.configManager.getConfig('crowi', 'aws:s3Region');
  557. responseParams.s3CustomEndpoint = crowi.configManager.getConfig('crowi', 'aws:s3CustomEndpoint');
  558. responseParams.s3Bucket = crowi.configManager.getConfig('crowi', 'aws:s3Bucket');
  559. responseParams.s3AccessKeyId = crowi.configManager.getConfig('crowi', 'aws:s3AccessKeyId');
  560. responseParams.s3SecretAccessKey = crowi.configManager.getConfig('crowi', 'aws:s3SecretAccessKey');
  561. }
  562. return res.apiv3({ responseParams });
  563. }
  564. catch (err) {
  565. const msg = 'Error occurred in updating fileUploadType';
  566. logger.error('Error', err);
  567. return res.apiv3Err(new ErrorV3(msg, 'update-fileUploadType-failed'));
  568. }
  569. });
  570. /**
  571. * @swagger
  572. *
  573. * /app-settings/plugin-setting:
  574. * put:
  575. * tags: [AppSettings]
  576. * operationId: updateAppSettingPluginSetting
  577. * summary: /app-settings/plugin-setting
  578. * description: Update plugin setting
  579. * requestBody:
  580. * required: true
  581. * content:
  582. * application/json:
  583. * schema:
  584. * $ref: '#/components/schemas/PluginSettingParams'
  585. * responses:
  586. * 200:
  587. * description: Succeeded to update plugin setting
  588. * content:
  589. * application/json:
  590. * schema:
  591. * $ref: '#/components/schemas/PluginSettingParams'
  592. */
  593. router.put('/plugin-setting', loginRequiredStrictly, adminRequired, csrf, validator.pluginSetting, apiV3FormValidator, async(req, res) => {
  594. const requestPluginSettingParams = {
  595. 'plugin:isEnabledPlugins': req.body.isEnabledPlugins,
  596. };
  597. try {
  598. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestPluginSettingParams);
  599. const pluginSettingParams = {
  600. isEnabledPlugins: crowi.configManager.getConfig('crowi', 'plugin:isEnabledPlugins'),
  601. };
  602. return res.apiv3({ pluginSettingParams });
  603. }
  604. catch (err) {
  605. const msg = 'Error occurred in updating plugin setting';
  606. logger.error('Error', err);
  607. return res.apiv3Err(new ErrorV3(msg, 'update-pluginSetting-failed'));
  608. }
  609. });
  610. return router;
  611. };