security-setting.js 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  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. ldapAuth: [
  18. body('serverUrl').isString(),
  19. body('isUserBind').isBoolean(),
  20. body('ldapBindDN').isString(),
  21. body('ldapBindDNPassword').isString(),
  22. body('ldapSearchFilter').isString(),
  23. body('ldapAttrMapUsername').isString(),
  24. body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
  25. body('ldapAttrMapMail').isString(),
  26. body('ldapAttrMapName').isString(),
  27. body('ldapGroupSearchBase').isString(),
  28. body('ldapGroupSearchFilter').isString(),
  29. body('ldapGroupDnProperty').isString(),
  30. ],
  31. samlAuth: [
  32. body('samlEntryPoint').isString(),
  33. body('samlIssuer').isString(),
  34. body('samlCert').isString(),
  35. body('samlAttrMapId').isString(),
  36. body('samlAttrMapUserName').isString(),
  37. body('samlAttrMapMail').isString(),
  38. body('samlAttrMapFirstName').isString(),
  39. body('samlAttrMapLastName').isString(),
  40. body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
  41. body('isSameEmailTreatedAsIdenticalUser').isBoolean(),
  42. ],
  43. oidcAuth: [
  44. body('oidcProviderName').isString(),
  45. body('oidcIssuerHost').isString(),
  46. body('oidcClientId').isString(),
  47. body('oidcClientSecret').isString(),
  48. body('oidcAttrMapId').isString(),
  49. body('oidcAttrMapUserName').isString(),
  50. body('oidcAttrMapEmail').isString(),
  51. body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
  52. body('isSameEmailTreatedAsIdenticalUser').isBoolean(),
  53. ],
  54. basicAuth: [
  55. body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
  56. ],
  57. googleOAuth: [
  58. body('googleClientId').isString(),
  59. body('googleClientSecret').isString(),
  60. body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
  61. ],
  62. githubOAuth: [
  63. body('githubClientId').isString(),
  64. body('githubClientSecret').isString(),
  65. body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
  66. ],
  67. twitterOAuth: [
  68. body('twitterConsumerKey').isString(),
  69. body('twitterConsumerSecret').isString(),
  70. body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
  71. ],
  72. };
  73. /**
  74. * @swagger
  75. * tags:
  76. * name: SecuritySetting
  77. */
  78. /**
  79. * @swagger
  80. *
  81. * components:
  82. * schemas:
  83. * GeneralSetting:
  84. * type:object
  85. * GuestModeParams:
  86. * type: object
  87. * properties:
  88. * restrictGuestMode:
  89. * type: string
  90. * description: type of restrictGuestMode
  91. * PageDeletionParams:
  92. * type: object
  93. * properties:
  94. * pageCompleteDeletionAuthority:
  95. * type: string
  96. * description: type of pageDeletionAuthority
  97. * Function:
  98. * type: object
  99. * properties:
  100. * hideRestrictedByOwner:
  101. * type: boolean
  102. * description: enable hide by owner
  103. * hideRestrictedByGroup:
  104. * type: boolean
  105. * description: enable hide by group
  106. * LdapAuthSetting:
  107. * type:object
  108. * serverUrl:
  109. * type: string
  110. * description: server url for ldap
  111. * isUserBind:
  112. * type: boolean
  113. * description: enable user bind
  114. * ldapBindDN:
  115. * type: string
  116. * description: the query used to bind with the directory service
  117. * ldapBindDNPassword:
  118. * type: string
  119. * description: the password that is entered in the login page will be used to bind
  120. * ldapSearchFilter:
  121. * type: string
  122. * description: the query used to locate the authenticated user
  123. * ldapAttrMapUsername:
  124. * type: string
  125. * description: specification of mappings for username when creating new users
  126. * isSameUsernameTreatedAsIdenticalUser:
  127. * type: boolean
  128. * description: local account automatically linked the user name matched
  129. * ldapAttrMapMail:
  130. * type: string
  131. * description: specification of mappings for mail address when creating new users
  132. * ldapAttrMapName:
  133. * type: string
  134. * description: Specification of mappings for full name address when creating new users
  135. * ldapGroupSearchBase:
  136. * type: string
  137. * description: the base DN from which to search for groups.
  138. * ldapGroupSearchFilter:
  139. * type: string
  140. * description: the query used to filter for groups
  141. * ldapGroupDnProperty:
  142. * type: string
  143. * description: The property of user object to use in dn interpolation of Group Search Filter
  144. * SamlAuthSetting:
  145. * type:object
  146. * samlEntryPoint:
  147. * type: string
  148. * description: entry point for saml
  149. * samlIssuer:
  150. * type: string
  151. * description: issuer for saml
  152. * samlCert:
  153. * type: string
  154. * description: certificate for saml
  155. * samlAttrMapId:
  156. * type: string
  157. * description: attribute mapping id for saml
  158. * samlAttrMapUserName:
  159. * type: string
  160. * description: attribute mapping user name for saml
  161. * samlAttrMapMail:
  162. * type: string
  163. * description: attribute mapping mail for saml
  164. * samlAttrMapFirstName:
  165. * type: string
  166. * description: attribute mapping first name for saml
  167. * samlAttrMapLastName:
  168. * type: string
  169. * description: attribute mapping last name for saml
  170. * isSameUsernameTreatedAsIdenticalUser
  171. * type: boolean
  172. * description: local account automatically linked the user name matched
  173. * isSameEmailTreatedAsIdenticalUser
  174. * type: boolean
  175. * description: local account automatically linked the email matched
  176. * OidcAuthSetting:
  177. * type:object
  178. * oidcProviderName:
  179. * type: string
  180. * description: provider name for oidc
  181. * oidcIssuerHost:
  182. * type: string
  183. * description: issuer host for oidc
  184. * oidcClientId:
  185. * type: string
  186. * description: client id for oidc
  187. * oidcClientSecret:
  188. * type: string
  189. * description: client secret for oidc
  190. * oidcAttrMapId:
  191. * type: string
  192. * description: attr map id for oidc
  193. * oidcAttrMapUserName:
  194. * type: string
  195. * description: attr map username for oidc
  196. * oidcAttrMapName:
  197. * type: string
  198. * description: attr map name for oidc
  199. * oidcAttrMapMail:
  200. * type: string
  201. * description: attr map mail for oidc
  202. * isSameUsernameTreatedAsIdenticalUser
  203. * type: boolean
  204. * description: local account automatically linked the user name matched
  205. * isSameEmailTreatedAsIdenticalUser
  206. * type: boolean
  207. * description: local account automatically linked the email matched
  208. * BasicAuthSetting:
  209. * type:object
  210. * isSameUsernameTreatedAsIdenticalUser
  211. * type: boolean
  212. * description: local account automatically linked the email matched
  213. * GitHubOAuthSetting:
  214. * type:object
  215. * githubClientId:
  216. * type: string
  217. * description: key of comsumer
  218. * githubClientSecret:
  219. * type: string
  220. * description: password of comsumer
  221. * isSameUsernameTreatedAsIdenticalUser
  222. * type: boolean
  223. * description: local account automatically linked the email matched
  224. * GoogleOAuthSetting:
  225. * type:object
  226. * googleClientId:
  227. * type: string
  228. * description: key of comsumer
  229. * googleClientSecret:
  230. * type: string
  231. * description: password of comsumer
  232. * isSameUsernameTreatedAsIdenticalUser
  233. * type: boolean
  234. * description: local account automatically linked the email matched
  235. * TwitterOAuthSetting:
  236. * type:object
  237. * twitterConsumerKey:
  238. * type: string
  239. * description: key of comsumer
  240. * twitterConsumerSecret:
  241. * type: string
  242. * description: password of comsumer
  243. * isSameUsernameTreatedAsIdenticalUser
  244. * type: boolean
  245. * description: local account automatically linked the email matched
  246. */
  247. module.exports = (crowi) => {
  248. const loginRequiredStrictly = require('../../middleware/login-required')(crowi);
  249. const adminRequired = require('../../middleware/admin-required')(crowi);
  250. const csrf = require('../../middleware/csrf')(crowi);
  251. const { ApiV3FormValidator } = crowi.middlewares;
  252. /**
  253. * @swagger
  254. *
  255. * /security-setting/:
  256. * get:
  257. * tags: [SecuritySetting]
  258. * description: Get security paramators
  259. * responses:
  260. * 200:
  261. * description: params of security
  262. * content:
  263. * application/json:
  264. * schema:
  265. * $ref: '#/components/schemas/GeneralSetting'
  266. * $ref: '#/components/schemas/LdapAuthSetting'
  267. * $ref: '#/components/schemas/SamlAuthSetting'
  268. * $ref: '#/components/schemas/OidcAuthSetting'
  269. * $ref: '#/components/schemas/BasicAuthSetting'
  270. * $ref: '#/components/schemas/GitHubOAuthSetting'
  271. * $ref: '#/components/schemas/GoogleOAuthSetting'
  272. * $ref: '#/components/schemas/TwitterOAuthSetting'
  273. */
  274. router.get('/', loginRequiredStrictly, adminRequired, async(req, res) => {
  275. const securityParams = {
  276. generalAuth: {
  277. isLdapEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isEnabled'),
  278. isSamlEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isEnabled'),
  279. isOidcEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isEnabled'),
  280. isBasicEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-basic:isEnabled'),
  281. isGoogleOAuthEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-google:isEnabled'),
  282. isGithubOAuthEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-github:isEnabled'),
  283. isTwitterOAuthEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:isEnabled'),
  284. },
  285. ldapAuth: {
  286. serverUrl: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:serverUrl'),
  287. isUserBind: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isUserBind'),
  288. ldapBindDN: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:bindDN'),
  289. ldapBindDNPassword: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:bindDNPassword'),
  290. ldapSearchFilter: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:searchFilter'),
  291. ldapAttrMapUsername: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapUsername'),
  292. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isSameUsernameTreatedAsIdenticalUser'),
  293. ldapAttrMapMail: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapMail'),
  294. ldapAttrMapName: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapName'),
  295. ldapGroupSearchBase: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupSearchBase'),
  296. ldapGroupSearchFilter: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupSearchFilter'),
  297. ldapGroupDnProperty: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupDnProperty'),
  298. },
  299. samlAuth: {
  300. missingMandatoryConfigKeys: await crowi.passportService.getSamlMissingMandatoryConfigKeys(),
  301. samlEntryPoint: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:entryPoint'),
  302. samlEnvVarEntryPoint: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:entryPoint'),
  303. samlIssuer: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:issuer'),
  304. samlEnvVarIssuer: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:issuer'),
  305. samlCert: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:cert'),
  306. samlEnvVarCert: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:cert'),
  307. samlAttrMapId: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapId'),
  308. samlEnvVarAttrMapId: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapId'),
  309. samlAttrMapUserName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapUsername'),
  310. samlEnvVarAttrMapUserName: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapUsername'),
  311. samlAttrMapMail: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapMail'),
  312. samlEnvVarAttrMapMail: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapMail'),
  313. samlAttrMapFirstName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapFirstName'),
  314. samlEnvVarAttrMapFirstName: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapFirstName'),
  315. samlAttrMapLastName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapLastName'),
  316. samlEnvVarAttrMapLastName: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapLastName'),
  317. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isSameUsernameTreatedAsIdenticalUser'),
  318. isSameEmailTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isSameEmailTreatedAsIdenticalUser'),
  319. },
  320. oidcAuth: {
  321. oidcProviderName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:providerName'),
  322. oidcIssuerHost: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:issuerHost'),
  323. oidcClientId: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:clientId'),
  324. oidcClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:clientSecret'),
  325. oidcAttrMapId: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapId'),
  326. oidcAttrMapUserName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapUserName'),
  327. oidcAttrMapName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapName'),
  328. oidcAttrMapEmail: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapMail'),
  329. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isSameUsernameTreatedAsIdenticalUser'),
  330. isSameEmailTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isSameEmailTreatedAsIdenticalUser'),
  331. },
  332. basicAuth: {
  333. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-basic:isSameUsernameTreatedAsIdenticalUser'),
  334. },
  335. googleOAuth: {
  336. isGoogleStrategySetup: await crowi.passportService.isGoogleStrategySetup,
  337. googleClientId: await crowi.configManager.getConfig('crowi', 'security:passport-google:clientId'),
  338. googleClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-google:clientSecret'),
  339. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-google:isSameUsernameTreatedAsIdenticalUser'),
  340. },
  341. githubOAuth: {
  342. isGitHubStrategySetup: await crowi.passportService.isGitHubStrategySetup,
  343. githubClientId: await crowi.configManager.getConfig('crowi', 'security:passport-github:clientId'),
  344. githubClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-github:clientSecret'),
  345. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-github:isSameUsernameTreatedAsIdenticalUser'),
  346. },
  347. twitterOAuth: {
  348. isTwitterStrategySetup: await crowi.passportService.isTwitterStrategySetup,
  349. twitterConsumerKey: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:consumerKey'),
  350. twitterConsumerSecret: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:consumerSecret'),
  351. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:isSameUsernameTreatedAsIdenticalUser'),
  352. },
  353. };
  354. return res.apiv3({ securityParams });
  355. });
  356. /**
  357. * @swagger
  358. *
  359. * /security-setting/general-setting:
  360. * put:
  361. * tags: [SecuritySetting]
  362. * description: Update GeneralSetting
  363. * requestBody:
  364. * required: true
  365. * content:
  366. * application/json:
  367. * schema:
  368. * $ref: '#/components/schemas/GeneralSetting'
  369. * responses:
  370. * 200:
  371. * description: Succeeded to update general Setting
  372. * content:
  373. * application/json:
  374. * schema:
  375. * $ref: '#/components/schemas/GeneralSetting'
  376. */
  377. router.put('/general-setting', loginRequiredStrictly, adminRequired, csrf, validator.generalSetting, ApiV3FormValidator, async(req, res) => {
  378. const requestParams = {
  379. 'security:restrictGuestMode': req.body.restrictGuestMode,
  380. 'security:pageCompleteDeletionAuthority': req.body.pageCompleteDeletionAuthority,
  381. 'security:list-policy:hideRestrictedByOwner': req.body.hideRestrictedByOwner,
  382. 'security:list-policy:hideRestrictedByGroup': req.body.hideRestrictedByGroup,
  383. };
  384. try {
  385. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  386. const securitySettingParams = {
  387. restrictGuestMode: await crowi.configManager.getConfig('crowi', 'security:restrictGuestMode'),
  388. pageCompleteDeletionAuthority: await crowi.configManager.getConfig('crowi', 'security:pageCompleteDeletionAuthority'),
  389. hideRestrictedByOwner: await crowi.configManager.getConfig('crowi', 'security:list-policy:hideRestrictedByOwner'),
  390. hideRestrictedByGroup: await crowi.configManager.getConfig('crowi', 'security:list-policy:hideRestrictedByGroup'),
  391. };
  392. return res.apiv3({ securitySettingParams });
  393. }
  394. catch (err) {
  395. const msg = 'Error occurred in updating security setting';
  396. logger.error('Error', err);
  397. return res.apiv3Err(new ErrorV3(msg, 'update-secuirty-setting failed'));
  398. }
  399. });
  400. /**
  401. * @swagger
  402. *
  403. * /security-setting/ldap:
  404. * put:
  405. * tags: [SecuritySetting]
  406. * description: Update LDAP setting
  407. * requestBody:
  408. * required: true
  409. * content:
  410. * application/json:
  411. * schema:
  412. * $ref: '#/components/schemas/LdapAuthSetting'
  413. * responses:
  414. * 200:
  415. * description: Succeeded to update LDAP setting
  416. * content:
  417. * application/json:
  418. * schema:
  419. * $ref: '#/components/schemas/LdapAuthSetting'
  420. */
  421. router.put('/ldap', loginRequiredStrictly, adminRequired, csrf, validator.ldapAuth, ApiV3FormValidator, async(req, res) => {
  422. const requestParams = {
  423. 'security:passport-ldap:serverUrl': req.body.serverUrl,
  424. 'security:passport-ldap:isUserBind': req.body.isUserBind,
  425. 'security:passport-ldap:bindDN': req.body.ldapBindDN,
  426. 'security:passport-ldap:bindDNPassword': req.body.ldapBindDNPassword,
  427. 'security:passport-ldap:searchFilter': req.body.ldapSearchFilter,
  428. 'security:passport-ldap:attrMapUsername': req.body.ldapAttrMapUserName,
  429. 'security:passport-ldap:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  430. 'security:passport-ldap:attrMapMail': req.body.ldapAttrMapMail,
  431. 'security:passport-ldap:attrMapName': req.body.ldapAttrMapName,
  432. 'security:passport-ldap:groupSearchBase': req.body.ldapGroupSearchBase,
  433. 'security:passport-ldap:groupSearchFilter': req.body.ldapGroupSearchFilter,
  434. 'security:passport-ldap:groupDnProperty': req.body.ldapGroupDnProperty,
  435. };
  436. try {
  437. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  438. const securitySettingParams = {
  439. serverUrl: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:serverUrl'),
  440. isUserBind: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isUserBind'),
  441. ldapBindDN: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:bindDN'),
  442. ldapBindDNPassword: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:bindDNPassword'),
  443. ldapSearchFilter: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:searchFilter'),
  444. ldapAttrMapUsername: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapUsername'),
  445. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isSameUsernameTreatedAsIdenticalUser'),
  446. ldapAttrMapMail: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapMail'),
  447. ldapAttrMapName: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapName'),
  448. ldapGroupSearchBase: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupSearchBase'),
  449. ldapGroupSearchFilter: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupSearchFilter'),
  450. ldapGroupDnProperty: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupDnProperty'),
  451. };
  452. return res.apiv3({ securitySettingParams });
  453. }
  454. catch (err) {
  455. const msg = 'Error occurred in updating SAML setting';
  456. logger.error('Error', err);
  457. return res.apiv3Err(new ErrorV3(msg, 'update-SAML-failed'));
  458. }
  459. });
  460. /**
  461. * @swagger
  462. *
  463. * /security-setting/saml:
  464. * put:
  465. * tags: [SecuritySetting]
  466. * description: Update SAML setting
  467. * requestBody:
  468. * required: true
  469. * content:
  470. * application/json:
  471. * schema:
  472. * $ref: '#/components/schemas/SamlAuthSetting'
  473. * responses:
  474. * 200:
  475. * description: Succeeded to update SAML setting
  476. * content:
  477. * application/json:
  478. * schema:
  479. * $ref: '#/components/schemas/SamlAuthSetting'
  480. */
  481. router.put('/saml', loginRequiredStrictly, adminRequired, csrf, validator.samlAuth, ApiV3FormValidator, async(req, res) => {
  482. const requestParams = {
  483. 'security:passport-saml:entryPoint': req.body.samlEntryPoint,
  484. 'security:passport-saml:issuer': req.body.samlIssuer,
  485. 'security:passport-saml:cert': req.body.samlCert,
  486. 'security:passport-saml:attrMapId': req.body.samlAttrMapId,
  487. 'security:passport-saml:attrMapUsername': req.body.samlAttrMapUserName,
  488. 'security:passport-saml:attrMapMail': req.body.samlAttrMapMail,
  489. 'security:passport-saml:attrMapFirstName': req.body.samlAttrMapFirstName,
  490. 'security:passport-saml:attrMapLastName': req.body.samlAttrMapLastName,
  491. 'security:passport-saml:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  492. 'security:passport-saml:isSameEmailTreatedAsIdenticalUser': req.body.isSameEmailTreatedAsIdenticalUser,
  493. };
  494. try {
  495. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  496. const securitySettingParams = {
  497. missingMandatoryConfigKeys: await crowi.passportService.getSamlMissingMandatoryConfigKeys(),
  498. samlEntryPoint: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:entryPoint'),
  499. samlIssuer: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:issuer'),
  500. samlCert: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:cert'),
  501. samlAttrMapId: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapId'),
  502. samlAttrMapUserName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapUsername'),
  503. samlAttrMapMail: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapMail'),
  504. samlAttrMapFirstName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapFirstName'),
  505. samlAttrMapLastName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapLastName'),
  506. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isSameUsernameTreatedAsIdenticalUser'),
  507. isSameEmailTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isSameEmailTreatedAsIdenticalUser'),
  508. };
  509. return res.apiv3({ securitySettingParams });
  510. }
  511. catch (err) {
  512. const msg = 'Error occurred in updating SAML setting';
  513. logger.error('Error', err);
  514. return res.apiv3Err(new ErrorV3(msg, 'update-SAML-failed'));
  515. }
  516. });
  517. /**
  518. * @swagger
  519. *
  520. * /security-setting/oidc:
  521. * put:
  522. * tags: [SecuritySetting]
  523. * description: Update OpenID Connect setting
  524. * requestBody:
  525. * required: true
  526. * content:
  527. * application/json:
  528. * schema:
  529. * $ref: '#/components/schemas/OidcAuthSetting'
  530. * responses:
  531. * 200:
  532. * description: Succeeded to update OpenID Connect setting
  533. * content:
  534. * application/json:
  535. * schema:
  536. * $ref: '#/components/schemas/OidcAuthSetting'
  537. */
  538. router.put('/oidc', loginRequiredStrictly, adminRequired, csrf, validator.oidcAuth, ApiV3FormValidator, async(req, res) => {
  539. const requestParams = {
  540. 'security:passport-oidc:providerName': req.body.oidcProviderName,
  541. 'security:passport-oidc:issuerHost': req.body.oidcIssuerHost,
  542. 'security:passport-oidc:clientId': req.body.oidcClientId,
  543. 'security:passport-oidc:clientSecret': req.body.oidcClientSecret,
  544. 'security:passport-oidc:attrMapId': req.body.oidcAttrMapId,
  545. 'security:passport-oidc:attrMapUserName': req.body.oidcAttrMapUserName,
  546. 'security:passport-oidc:attrMapName': req.body.oidcAttrMapName,
  547. 'security:passport-oidc:attrMapMail': req.body.oidcAttrMapEmail,
  548. 'security:passport-oidc:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  549. 'security:passport-oidc:isSameEmailTreatedAsIdenticalUser': req.body.isSameEmailTreatedAsIdenticalUser,
  550. };
  551. try {
  552. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  553. const securitySettingParams = {
  554. oidcProviderName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:providerName'),
  555. oidcIssuerHost: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:issuerHost'),
  556. oidcClientId: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:clientId'),
  557. oidcClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:clientSecret'),
  558. oidcAttrMapId: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapId'),
  559. oidcAttrMapUserName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapUserName'),
  560. oidcAttrMapName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapName'),
  561. oidcAttrMapEmail: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapMail'),
  562. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isSameUsernameTreatedAsIdenticalUser'),
  563. isSameEmailTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isSameEmailTreatedAsIdenticalUser'),
  564. };
  565. return res.apiv3({ securitySettingParams });
  566. }
  567. catch (err) {
  568. const msg = 'Error occurred in updating OpenIDConnect';
  569. logger.error('Error', err);
  570. return res.apiv3Err(new ErrorV3(msg, 'update-OpenIDConnect-failed'));
  571. }
  572. });
  573. /**
  574. * @swagger
  575. *
  576. * /security-setting/basic:
  577. * put:
  578. * tags: [SecuritySetting]
  579. * description: Update basic
  580. * requestBody:
  581. * required: true
  582. * content:
  583. * application/json:
  584. * schema:
  585. * $ref: '#/components/schemas/BasicAuthSetting'
  586. * responses:
  587. * 200:
  588. * description: Succeeded to update basic
  589. * content:
  590. * application/json:
  591. * schema:
  592. * $ref: '#/components/schemas/BasicAuthSetting'
  593. */
  594. router.put('/basic', loginRequiredStrictly, adminRequired, csrf, validator.basicAuth, ApiV3FormValidator, async(req, res) => {
  595. const requestParams = {
  596. 'security:passport-basic:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  597. };
  598. try {
  599. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  600. const securitySettingParams = {
  601. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-basic:isSameUsernameTreatedAsIdenticalUser'),
  602. };
  603. return res.apiv3({ securitySettingParams });
  604. }
  605. catch (err) {
  606. const msg = 'Error occurred in updating basicAuth';
  607. logger.error('Error', err);
  608. return res.apiv3Err(new ErrorV3(msg, 'update-basicOAuth-failed'));
  609. }
  610. });
  611. /**
  612. * @swagger
  613. *
  614. * /security-setting/google-oauth:
  615. * put:
  616. * tags: [SecuritySetting]
  617. * description: Update google OAuth
  618. * requestBody:
  619. * required: true
  620. * content:
  621. * application/json:
  622. * schema:
  623. * $ref: '#/components/schemas/GoogleOAuthSetting'
  624. * responses:
  625. * 200:
  626. * description: Succeeded to google OAuth
  627. * content:
  628. * application/json:
  629. * schema:
  630. * $ref: '#/components/schemas/GoogleOAuthSetting'
  631. */
  632. router.put('/google-oauth', loginRequiredStrictly, adminRequired, csrf, validator.googleOAuth, ApiV3FormValidator, async(req, res) => {
  633. const requestParams = {
  634. 'security:passport-google:clientId': req.body.googleClientId,
  635. 'security:passport-google:clientSecret': req.body.googleClientSecret,
  636. 'security:passport-google:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  637. };
  638. try {
  639. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  640. const securitySettingParams = {
  641. isGoogleOAuthEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-google:isEnabled'),
  642. googleClientId: await crowi.configManager.getConfig('crowi', 'security:passport-google:clientId'),
  643. googleClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-google:clientSecret'),
  644. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-google:isSameUsernameTreatedAsIdenticalUser'),
  645. };
  646. // reset strategy
  647. await crowi.passportService.resetGoogleStrategy();
  648. // setup strategy
  649. if (crowi.configManager.getConfig('crowi', 'security:passport-google:isEnabled')) {
  650. await crowi.passportService.setupGoogleStrategy(true);
  651. }
  652. return res.apiv3({ securitySettingParams });
  653. }
  654. catch (err) {
  655. // reset strategy
  656. await crowi.passportService.resetGoogleStrategy();
  657. const msg = 'Error occurred in updating googleOAuth';
  658. logger.error('Error', err);
  659. return res.apiv3Err(new ErrorV3(msg, 'update-googleOAuth-failed'));
  660. }
  661. });
  662. /**
  663. * @swagger
  664. *
  665. * /security-setting/github-oauth:
  666. * put:
  667. * tags: [SecuritySetting]
  668. * description: Update github OAuth
  669. * requestBody:
  670. * required: true
  671. * content:
  672. * application/json:
  673. * schema:
  674. * $ref: '#/components/schemas/GitHubOAuthSetting'
  675. * responses:
  676. * 200:
  677. * description: Succeeded to github OAuth
  678. * content:
  679. * application/json:
  680. * schema:
  681. * $ref: '#/components/schemas/GitHubOAuthSetting'
  682. */
  683. router.put('/github-oauth', loginRequiredStrictly, adminRequired, csrf, validator.githubOAuth, ApiV3FormValidator, async(req, res) => {
  684. const requestParams = {
  685. 'security:passport-github:clientId': req.body.githubClientId,
  686. 'security:passport-github:clientSecret': req.body.githubClientSecret,
  687. 'security:passport-github:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  688. };
  689. try {
  690. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  691. const securitySettingParams = {
  692. isGitHubStrategySetup: await crowi.passportService.isGitHubStrategySetup,
  693. githubClientId: await crowi.configManager.getConfig('crowi', 'security:passport-github:clientId'),
  694. githubClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-github:clientSecret'),
  695. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-github:isSameUsernameTreatedAsIdenticalUser'),
  696. };
  697. // reset strategy
  698. await crowi.passportService.resetGitHubStrategy();
  699. // setup strategy
  700. if (crowi.configManager.getConfig('crowi', 'security:passport-github:isEnabled')) {
  701. await crowi.passportService.setupGitHubStrategy(true);
  702. }
  703. return res.apiv3({ securitySettingParams });
  704. }
  705. catch (err) {
  706. // reset strategy
  707. await crowi.passportService.resetGitHubStrategy();
  708. const msg = 'Error occurred in updating githubOAuth';
  709. logger.error('Error', err);
  710. return res.apiv3Err(new ErrorV3(msg, 'update-githubOAuth-failed'));
  711. }
  712. });
  713. /**
  714. * @swagger
  715. *
  716. * /security-setting/twitter-oauth:
  717. * put:
  718. * tags: [SecuritySetting]
  719. * description: Update twitter OAuth
  720. * requestBody:
  721. * required: true
  722. * content:
  723. * application/json:
  724. * schema:
  725. * $ref: '#/components/schemas/TwitterOAuthSetting'
  726. * responses:
  727. * 200:
  728. * description: Succeeded to update twitter OAuth
  729. * content:
  730. * application/json:
  731. * schema:
  732. * $ref: '#/components/schemas/TwitterOAuthSetting'
  733. */
  734. router.put('/twitter-oauth', loginRequiredStrictly, adminRequired, csrf, validator.twitterOAuth, ApiV3FormValidator, async(req, res) => {
  735. const requestParams = {
  736. 'security:passport-twitter:consumerKey': req.body.twitterConsumerKey,
  737. 'security:passport-twitter:consumerSecret': req.body.twitterConsumerSecret,
  738. 'security:passport-twitter:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  739. };
  740. try {
  741. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  742. const securitySettingParams = {
  743. isTwitterStrategySetup: await crowi.passportService.isTwitterStrategySetup,
  744. twitterConsumerId: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:consumerKey'),
  745. twitterConsumerSecret: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:consumerSecret'),
  746. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:isSameUsernameTreatedAsIdenticalUser'),
  747. };
  748. // reset strategy
  749. await crowi.passportService.resetTwitterStrategy();
  750. // setup strategy
  751. if (crowi.configManager.getConfig('crowi', 'security:passport-twitter:isEnabled')) {
  752. await crowi.passportService.setupTwitterStrategy(true);
  753. }
  754. return res.apiv3({ securitySettingParams });
  755. }
  756. catch (err) {
  757. // reset strategy
  758. await crowi.passportService.resetTwitterStrategy();
  759. const msg = 'Error occurred in updating twitterOAuth';
  760. logger.error('Error', err);
  761. return res.apiv3Err(new ErrorV3(msg, 'update-twitterOAuth-failed'));
  762. }
  763. });
  764. return router;
  765. };