security-setting.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. /* eslint-disable max-len */
  2. /* eslint-disable no-unused-vars */
  3. const loggerFactory = require('@alias/logger');
  4. const logger = loggerFactory('growi:routes:apiv3:security-setting');
  5. const express = require('express');
  6. const router = express.Router();
  7. const { body } = require('express-validator/check');
  8. const ErrorV3 = require('../../models/vo/error-apiv3');
  9. const validator = {
  10. // TODO correct validator
  11. generalSetting: [
  12. body('restrictGuestMode').isString(),
  13. body('pageCompleteDeletionAuthority').isString(),
  14. body('hideRestrictedByOwner').isBoolean(),
  15. body('hideRestrictedByGroup').isBoolean(),
  16. ],
  17. samlAuth: [
  18. body('samlEntryPoint').isString(),
  19. body('samlIssuer').isString(),
  20. body('samlCert').isString(),
  21. body('samlAttrMapId').isString(),
  22. body('samlAttrMapUserName').isString(),
  23. body('samlAttrMapMail').isString(),
  24. body('samlAttrMapFirstName').isString(),
  25. body('samlAttrMapLastName').isString(),
  26. body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
  27. body('isSameEmailTreatedAsIdenticalUser').isBoolean(),
  28. ],
  29. oidcAuth: [
  30. body('oidcProviderName').isString(),
  31. body('oidcIssuerHost').isString(),
  32. body('oidcClientId').isString(),
  33. body('oidcClientSecret').isString(),
  34. body('oidcAttrMapId').isString(),
  35. body('oidcAttrMapUserName').isString(),
  36. body('oidcAttrMapEmail').isString(),
  37. body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
  38. body('isSameEmailTreatedAsIdenticalUser').isBoolean(),
  39. ],
  40. basicAuth: [
  41. body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
  42. ],
  43. googleOAuth: [
  44. body('googleClientId').isString(),
  45. body('googleClientSecret').isString(),
  46. body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
  47. ],
  48. githubOAuth: [
  49. body('githubClientId').isString(),
  50. body('githubClientSecret').isString(),
  51. body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
  52. ],
  53. twitterOAuth: [
  54. body('twitterConsumerKey').isString(),
  55. body('twitterConsumerSecret').isString(),
  56. body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
  57. ],
  58. };
  59. /**
  60. * @swagger
  61. * tags:
  62. * name: SecuritySetting
  63. */
  64. /**
  65. * @swagger
  66. *
  67. * components:
  68. * schemas:
  69. * GeneralSetting:
  70. * type:object
  71. * GuestModeParams:
  72. * type: object
  73. * properties:
  74. * restrictGuestMode:
  75. * type: string
  76. * description: type of restrictGuestMode
  77. * PageDeletionParams:
  78. * type: object
  79. * properties:
  80. * pageCompleteDeletionAuthority:
  81. * type: string
  82. * description: type of pageDeletionAuthority
  83. * Function:
  84. * type: object
  85. * properties:
  86. * hideRestrictedByOwner:
  87. * type: boolean
  88. * description: enable hide by owner
  89. * hideRestrictedByGroup:
  90. * type: boolean
  91. * description: enable hide by group
  92. * SamlAuthSetting:
  93. * type:object
  94. * samlEntryPoint:
  95. * type: string
  96. * description: entry point for saml
  97. * samlIssuer:
  98. * type: string
  99. * description: issuer for saml
  100. * samlCert:
  101. * type: string
  102. * description: certificate for saml
  103. * samlAttrMapId:
  104. * type: string
  105. * description: attribute mapping id for saml
  106. * samlAttrMapUserName:
  107. * type: string
  108. * description: attribute mapping user name for saml
  109. * samlAttrMapMail:
  110. * type: string
  111. * description: attribute mapping mail for saml
  112. * samlAttrMapFirstName:
  113. * type: string
  114. * description: attribute mapping first name for saml
  115. * samlAttrMapLastName:
  116. * type: string
  117. * description: attribute mapping last name for saml
  118. * isSameUsernameTreatedAsIdenticalUser
  119. * type: boolean
  120. * description: local account automatically linked the user name matched
  121. * isSameEmailTreatedAsIdenticalUser
  122. * type: boolean
  123. * description: local account automatically linked the email matched
  124. * OidcAuthSetting:
  125. * type:object
  126. * oidcProviderName:
  127. * type: string
  128. * description: provider name for oidc
  129. * oidcIssuerHost:
  130. * type: string
  131. * description: issuer host for oidc
  132. * oidcClientId:
  133. * type: string
  134. * description: client id for oidc
  135. * oidcClientSecret:
  136. * type: string
  137. * description: client secret for oidc
  138. * oidcAttrMapId:
  139. * type: string
  140. * description: attr map id for oidc
  141. * oidcAttrMapUserName:
  142. * type: string
  143. * description: attr map username for oidc
  144. * oidcAttrMapName:
  145. * type: string
  146. * description: attr map name for oidc
  147. * oidcAttrMapMail:
  148. * type: string
  149. * description: attr map mail for oidc
  150. * isSameUsernameTreatedAsIdenticalUser
  151. * type: boolean
  152. * description: local account automatically linked the user name matched
  153. * isSameEmailTreatedAsIdenticalUser
  154. * type: boolean
  155. * description: local account automatically linked the email matched
  156. * BasicAuthSetting:
  157. * type:object
  158. * isSameUsernameTreatedAsIdenticalUser
  159. * type: boolean
  160. * description: local account automatically linked the email matched
  161. * GitHubOAuthSetting:
  162. * type:object
  163. * githubClientId:
  164. * type: string
  165. * description: key of comsumer
  166. * githubClientSecret:
  167. * type: string
  168. * description: password of comsumer
  169. * isSameUsernameTreatedAsIdenticalUser
  170. * type: boolean
  171. * description: local account automatically linked the email matched
  172. * GoogleOAuthSetting:
  173. * type:object
  174. * googleClientId:
  175. * type: string
  176. * description: key of comsumer
  177. * googleClientSecret:
  178. * type: string
  179. * description: password of comsumer
  180. * isSameUsernameTreatedAsIdenticalUser
  181. * type: boolean
  182. * description: local account automatically linked the email matched
  183. * TwitterOAuthSetting:
  184. * type:object
  185. * twitterConsumerKey:
  186. * type: string
  187. * description: key of comsumer
  188. * twitterConsumerSecret:
  189. * type: string
  190. * description: password of comsumer
  191. * isSameUsernameTreatedAsIdenticalUser
  192. * type: boolean
  193. * description: local account automatically linked the email matched
  194. */
  195. module.exports = (crowi) => {
  196. const loginRequiredStrictly = require('../../middleware/login-required')(crowi);
  197. const adminRequired = require('../../middleware/admin-required')(crowi);
  198. const csrf = require('../../middleware/csrf')(crowi);
  199. const { ApiV3FormValidator } = crowi.middlewares;
  200. /**
  201. * @swagger
  202. *
  203. * /security-setting/:
  204. * get:
  205. * tags: [SecuritySetting]
  206. * description: Get security paramators
  207. * responses:
  208. * 200:
  209. * description: params of security
  210. * content:
  211. * application/json:
  212. * schema:
  213. * $ref: '#/components/schemas/GeneralSetting'
  214. * $ref: '#/components/schemas/SamlAuthSetting'
  215. * $ref: '#/components/schemas/OidcAuthSetting'
  216. * $ref: '#/components/schemas/BasicAuthSetting'
  217. * $ref: '#/components/schemas/GitHubOAuthSetting'
  218. * $ref: '#/components/schemas/GoogleOAuthSetting'
  219. * $ref: '#/components/schemas/TwitterOAuthSetting'
  220. */
  221. router.get('/', loginRequiredStrictly, adminRequired, async(req, res) => {
  222. const securityParams = {
  223. generalAuth: {
  224. isLdapEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isEnabled'),
  225. isSamlEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isEnabled'),
  226. isOidcEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isEnabled'),
  227. isBasicEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-basic:isEnabled'),
  228. isGoogleOAuthEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-google:isEnabled'),
  229. isGithubOAuthEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-github:isEnabled'),
  230. isTwitterOAuthEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:isEnabled'),
  231. },
  232. ldapAuth: {
  233. isUserBind: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isUserBind'),
  234. ldapBindDN: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:bindDN'),
  235. ldapBindDNPassword: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:bindDNPassword'),
  236. ldapSearchFilter: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isEnabled'),
  237. ldapAttrMapUsername: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapUsername'),
  238. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isSameUsernameTreatedAsIdenticalUser'),
  239. ldapAttrMapMail: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapMail'),
  240. ldapAttrMapName: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapName'),
  241. ldapGroupSearchBase: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupSearchBase'),
  242. ldapGroupSearchFilter: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupSearchFilter'),
  243. ldapGroupDnProperty: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupDnProperty'),
  244. },
  245. samlAuth: {
  246. samlEntryPoint: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:entryPoint'),
  247. samlEnvVarEntryPoint: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:entryPoint'),
  248. samlIssuer: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:issuer'),
  249. samlEnvVarIssuer: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:issuer'),
  250. samlCert: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:cert'),
  251. samlEnvVarCert: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:cert'),
  252. samlAttrMapId: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapId'),
  253. samlEnvVarAttrMapId: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapId'),
  254. samlAttrMapUserName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapUsername'),
  255. samlEnvVarAttrMapUserName: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapUsername'),
  256. samlAttrMapMail: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapMail'),
  257. samlEnvVarAttrMapMail: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapMail'),
  258. samlAttrMapFirstName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapFirstName'),
  259. samlEnvVarAttrMapFirstName: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapFirstName'),
  260. samlAttrMapLastName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapLastName'),
  261. samlEnvVarAttrMapLastName: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapLastName'),
  262. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isSameUsernameTreatedAsIdenticalUser'),
  263. isSameEmailTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isSameEmailTreatedAsIdenticalUser'),
  264. },
  265. oidcAuth: {
  266. oidcProviderName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:providerName'),
  267. oidcIssuerHost: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:issuerHost'),
  268. oidcClientId: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:clientId'),
  269. oidcClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:clientSecret'),
  270. oidcAttrMapId: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapId'),
  271. oidcAttrMapUserName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapUserName'),
  272. oidcAttrMapName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapName'),
  273. oidcAttrMapEmail: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapMail'),
  274. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isSameUsernameTreatedAsIdenticalUser'),
  275. isSameEmailTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isSameEmailTreatedAsIdenticalUser'),
  276. },
  277. basicAuth: {
  278. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-basic:isSameUsernameTreatedAsIdenticalUser'),
  279. },
  280. googleOAuth: {
  281. googleClientId: await crowi.configManager.getConfig('crowi', 'security:passport-google:clientId'),
  282. googleClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-google:clientSecret'),
  283. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-google:isSameUsernameTreatedAsIdenticalUser'),
  284. },
  285. githubOAuth: {
  286. githubClientId: await crowi.configManager.getConfig('crowi', 'security:passport-github:clientId'),
  287. githubClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-github:clientSecret'),
  288. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-github:isSameUsernameTreatedAsIdenticalUser'),
  289. },
  290. twitterOAuth: {
  291. twitterConsumerKey: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:consumerKey'),
  292. twitterConsumerSecret: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:consumerSecret'),
  293. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:isSameUsernameTreatedAsIdenticalUser'),
  294. },
  295. };
  296. return res.apiv3({ securityParams });
  297. });
  298. /**
  299. * @swagger
  300. *
  301. * /security-setting/general-setting:
  302. * put:
  303. * tags: [SecuritySetting]
  304. * description: Update GeneralSetting
  305. * requestBody:
  306. * required: true
  307. * content:
  308. * application/json:
  309. * schema:
  310. * $ref: '#/components/schemas/GeneralSetting'
  311. * responses:
  312. * 200:
  313. * description: Succeeded to update general Setting
  314. * content:
  315. * application/json:
  316. * schema:
  317. * $ref: '#/components/schemas/GeneralSetting'
  318. */
  319. router.put('/general-setting', loginRequiredStrictly, adminRequired, csrf, validator.generalSetting, ApiV3FormValidator, async(req, res) => {
  320. const requestParams = {
  321. 'security:restrictGuestMode': req.body.restrictGuestMode,
  322. 'security:pageCompleteDeletionAuthority': req.body.pageCompleteDeletionAuthority,
  323. 'security:list-policy:hideRestrictedByOwner': req.body.hideRestrictedByOwner,
  324. 'security:list-policy:hideRestrictedByGroup': req.body.hideRestrictedByGroup,
  325. };
  326. try {
  327. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  328. const securitySettingParams = {
  329. restrictGuestMode: await crowi.configManager.getConfig('crowi', 'security:restrictGuestMode'),
  330. pageCompleteDeletionAuthority: await crowi.configManager.getConfig('crowi', 'security:pageCompleteDeletionAuthority'),
  331. hideRestrictedByOwner: await crowi.configManager.getConfig('crowi', 'security:list-policy:hideRestrictedByOwner'),
  332. hideRestrictedByGroup: await crowi.configManager.getConfig('crowi', 'security:list-policy:hideRestrictedByGroup'),
  333. };
  334. return res.apiv3({ securitySettingParams });
  335. }
  336. catch (err) {
  337. const msg = 'Error occurred in updating security setting';
  338. logger.error('Error', err);
  339. return res.apiv3Err(new ErrorV3(msg, 'update-secuirty-setting failed'));
  340. }
  341. });
  342. /**
  343. * @swagger
  344. *
  345. * /security-setting/saml:
  346. * put:
  347. * tags: [SecuritySetting]
  348. * description: Update SAML setting
  349. * requestBody:
  350. * required: true
  351. * content:
  352. * application/json:
  353. * schema:
  354. * $ref: '#/components/schemas/SamlAuthSetting'
  355. * responses:
  356. * 200:
  357. * description: Succeeded to update SAML setting
  358. * content:
  359. * application/json:
  360. * schema:
  361. * $ref: '#/components/schemas/SamlAuthSetting'
  362. */
  363. router.put('/saml', loginRequiredStrictly, adminRequired, csrf, validator.samlAuth, ApiV3FormValidator, async(req, res) => {
  364. const requestParams = {
  365. 'security:passport-saml:entryPoint': req.body.samlEntryPoint,
  366. 'security:passport-saml:issuer': req.body.samlIssuer,
  367. 'security:passport-saml:cert': req.body.samlCert,
  368. 'security:passport-saml:attrMapId': req.body.samlAttrMapId,
  369. 'security:passport-saml:attrMapUsername': req.body.samlAttrMapUserName,
  370. 'security:passport-saml:attrMapMail': req.body.samlAttrMapMail,
  371. 'security:passport-saml:attrMapFirstName': req.body.samlAttrMapFirstName,
  372. 'security:passport-saml:attrMapLastName': req.body.samlAttrMapLastName,
  373. 'security:passport-saml:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  374. 'security:passport-saml:isSameEmailTreatedAsIdenticalUser': req.body.isSameEmailTreatedAsIdenticalUser,
  375. };
  376. try {
  377. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  378. const securitySettingParams = {
  379. samlEntryPoint: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:entryPoint'),
  380. samlIssuer: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:issuer'),
  381. samlCert: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:cert'),
  382. samlAttrMapId: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapId'),
  383. samlAttrMapUserName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapUsername'),
  384. samlAttrMapMail: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapMail'),
  385. samlAttrMapFirstName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapFirstName'),
  386. samlAttrMapLastName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapLastName'),
  387. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isSameUsernameTreatedAsIdenticalUser'),
  388. isSameEmailTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isSameEmailTreatedAsIdenticalUser'),
  389. };
  390. return res.apiv3({ securitySettingParams });
  391. }
  392. catch (err) {
  393. const msg = 'Error occurred in updating SAML setting';
  394. logger.error('Error', err);
  395. return res.apiv3Err(new ErrorV3(msg, 'update-SAML-failed'));
  396. }
  397. });
  398. /**
  399. * @swagger
  400. *
  401. * /security-setting/oidc:
  402. * put:
  403. * tags: [SecuritySetting]
  404. * description: Update OpenID Connect setting
  405. * requestBody:
  406. * required: true
  407. * content:
  408. * application/json:
  409. * schema:
  410. * $ref: '#/components/schemas/OidcAuthSetting'
  411. * responses:
  412. * 200:
  413. * description: Succeeded to update OpenID Connect setting
  414. * content:
  415. * application/json:
  416. * schema:
  417. * $ref: '#/components/schemas/OidcAuthSetting'
  418. */
  419. router.put('/oidc', loginRequiredStrictly, adminRequired, csrf, validator.oidcAuth, ApiV3FormValidator, async(req, res) => {
  420. const requestParams = {
  421. 'security:passport-oidc:providerName': req.body.oidcProviderName,
  422. 'security:passport-oidc:issuerHost': req.body.oidcIssuerHost,
  423. 'security:passport-oidc:clientId': req.body.oidcClientId,
  424. 'security:passport-oidc:clientSecret': req.body.oidcClientSecret,
  425. 'security:passport-oidc:attrMapId': req.body.oidcAttrMapId,
  426. 'security:passport-oidc:attrMapUserName': req.body.oidcAttrMapUserName,
  427. 'security:passport-oidc:attrMapName': req.body.oidcAttrMapName,
  428. 'security:passport-oidc:attrMapMail': req.body.oidcAttrMapEmail,
  429. 'security:passport-oidc:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  430. 'security:passport-oidc:isSameEmailTreatedAsIdenticalUser': req.body.isSameEmailTreatedAsIdenticalUser,
  431. };
  432. try {
  433. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  434. const securitySettingParams = {
  435. oidcProviderName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:providerName'),
  436. oidcIssuerHost: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:issuerHost'),
  437. oidcClientId: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:clientId'),
  438. oidcClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:clientSecret'),
  439. oidcAttrMapId: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapId'),
  440. oidcAttrMapUserName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapUserName'),
  441. oidcAttrMapName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapName'),
  442. oidcAttrMapEmail: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapMail'),
  443. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isSameUsernameTreatedAsIdenticalUser'),
  444. isSameEmailTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isSameEmailTreatedAsIdenticalUser'),
  445. };
  446. return res.apiv3({ securitySettingParams });
  447. }
  448. catch (err) {
  449. const msg = 'Error occurred in updating OpenIDConnect';
  450. logger.error('Error', err);
  451. return res.apiv3Err(new ErrorV3(msg, 'update-OpenIDConnect-failed'));
  452. }
  453. });
  454. /**
  455. * @swagger
  456. *
  457. * /security-setting/basic:
  458. * put:
  459. * tags: [SecuritySetting]
  460. * description: Update basic
  461. * requestBody:
  462. * required: true
  463. * content:
  464. * application/json:
  465. * schema:
  466. * $ref: '#/components/schemas/BasicAuthSetting'
  467. * responses:
  468. * 200:
  469. * description: Succeeded to update basic
  470. * content:
  471. * application/json:
  472. * schema:
  473. * $ref: '#/components/schemas/BasicAuthSetting'
  474. */
  475. router.put('/basic', loginRequiredStrictly, adminRequired, csrf, validator.basicAuth, ApiV3FormValidator, async(req, res) => {
  476. const requestParams = {
  477. 'security:passport-basic:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  478. };
  479. try {
  480. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  481. const securitySettingParams = {
  482. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-basic:isSameUsernameTreatedAsIdenticalUser'),
  483. };
  484. return res.apiv3({ securitySettingParams });
  485. }
  486. catch (err) {
  487. const msg = 'Error occurred in updating basicAuth';
  488. logger.error('Error', err);
  489. return res.apiv3Err(new ErrorV3(msg, 'update-basicOAuth-failed'));
  490. }
  491. });
  492. /**
  493. * @swagger
  494. *
  495. * /security-setting/google-oauth:
  496. * put:
  497. * tags: [SecuritySetting]
  498. * description: Update google OAuth
  499. * requestBody:
  500. * required: true
  501. * content:
  502. * application/json:
  503. * schema:
  504. * $ref: '#/components/schemas/GoogleOAuthSetting'
  505. * responses:
  506. * 200:
  507. * description: Succeeded to google OAuth
  508. * content:
  509. * application/json:
  510. * schema:
  511. * $ref: '#/components/schemas/GoogleOAuthSetting'
  512. */
  513. router.put('/google-oauth', loginRequiredStrictly, adminRequired, csrf, validator.googleOAuth, ApiV3FormValidator, async(req, res) => {
  514. const requestParams = {
  515. 'security:passport-google:clientId': req.body.googleClientId,
  516. 'security:passport-google:clientSecret': req.body.googleClientSecret,
  517. 'security:passport-google:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  518. };
  519. try {
  520. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  521. const securitySettingParams = {
  522. googleClientId: await crowi.configManager.getConfig('crowi', 'security:passport-google:clientId'),
  523. googleClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-google:clientSecret'),
  524. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-google:isSameUsernameTreatedAsIdenticalUser'),
  525. };
  526. return res.apiv3({ securitySettingParams });
  527. }
  528. catch (err) {
  529. const msg = 'Error occurred in updating googleOAuth';
  530. logger.error('Error', err);
  531. return res.apiv3Err(new ErrorV3(msg, 'update-googleOAuth-failed'));
  532. }
  533. });
  534. /**
  535. * @swagger
  536. *
  537. * /security-setting/github-oauth:
  538. * put:
  539. * tags: [SecuritySetting]
  540. * description: Update github OAuth
  541. * requestBody:
  542. * required: true
  543. * content:
  544. * application/json:
  545. * schema:
  546. * $ref: '#/components/schemas/GitHubOAuthSetting'
  547. * responses:
  548. * 200:
  549. * description: Succeeded to github OAuth
  550. * content:
  551. * application/json:
  552. * schema:
  553. * $ref: '#/components/schemas/GitHubOAuthSetting'
  554. */
  555. router.put('/github-oauth', loginRequiredStrictly, adminRequired, csrf, validator.githubOAuth, ApiV3FormValidator, async(req, res) => {
  556. const requestParams = {
  557. 'security:passport-github:clientId': req.body.githubClientId,
  558. 'security:passport-github:clientSecret': req.body.githubClientSecret,
  559. 'security:passport-github:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  560. };
  561. try {
  562. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  563. const securitySettingParams = {
  564. githubClientId: await crowi.configManager.getConfig('crowi', 'security:passport-github:clientId'),
  565. githubClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-github:clientSecret'),
  566. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-github:isSameUsernameTreatedAsIdenticalUser'),
  567. };
  568. return res.apiv3({ securitySettingParams });
  569. }
  570. catch (err) {
  571. const msg = 'Error occurred in updating githubOAuth';
  572. logger.error('Error', err);
  573. return res.apiv3Err(new ErrorV3(msg, 'update-githubOAuth-failed'));
  574. }
  575. });
  576. /**
  577. * @swagger
  578. *
  579. * /security-setting/twitter-oauth:
  580. * put:
  581. * tags: [SecuritySetting]
  582. * description: Update twitter OAuth
  583. * requestBody:
  584. * required: true
  585. * content:
  586. * application/json:
  587. * schema:
  588. * $ref: '#/components/schemas/TwitterOAuthSetting'
  589. * responses:
  590. * 200:
  591. * description: Succeeded to update twitter OAuth
  592. * content:
  593. * application/json:
  594. * schema:
  595. * $ref: '#/components/schemas/TwitterOAuthSetting'
  596. */
  597. router.put('/twitter-oauth', loginRequiredStrictly, adminRequired, csrf, validator.twitterOAuth, ApiV3FormValidator, async(req, res) => {
  598. const requestParams = {
  599. 'security:passport-twitter:consumerKey': req.body.twitterConsumerKey,
  600. 'security:passport-twitter:consumerSecret': req.body.twitterConsumerSecret,
  601. 'security:passport-twitter:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  602. };
  603. try {
  604. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  605. const securitySettingParams = {
  606. twitterConsumerId: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:consumerKey'),
  607. twitterConsumerSecret: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:consumerSecret'),
  608. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:isSameUsernameTreatedAsIdenticalUser'),
  609. };
  610. return res.apiv3({ securitySettingParams });
  611. }
  612. catch (err) {
  613. const msg = 'Error occurred in updating twitterOAuth';
  614. logger.error('Error', err);
  615. return res.apiv3Err(new ErrorV3(msg, 'update-twitterOAuth-failed'));
  616. }
  617. });
  618. return router;
  619. };