security-setting.js 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121
  1. const loggerFactory = require('@alias/logger');
  2. const logger = loggerFactory('growi:routes:apiv3:security-setting');
  3. const express = require('express');
  4. const router = express.Router();
  5. const { body } = require('express-validator');
  6. const ErrorV3 = require('../../models/vo/error-apiv3');
  7. const removeNullPropertyFromObject = require('../../../lib/util/removeNullPropertyFromObject');
  8. const validator = {
  9. generalSetting: [
  10. body('restrictGuestMode').if(value => value != null).isString().isIn([
  11. 'Deny', 'Readonly',
  12. ]),
  13. body('pageCompleteDeletionAuthority').if(value => value != null).isString().isIn([
  14. 'anyOne', 'adminOnly', 'adminAndAuthor',
  15. ]),
  16. body('hideRestrictedByOwner').if(value => value != null).isBoolean(),
  17. body('hideRestrictedByGroup').if(value => value != null).isBoolean(),
  18. ],
  19. authenticationSetting: [
  20. body('isEnabled').if(value => value != null).isBoolean(),
  21. body('authId').isString().isIn([
  22. 'local', 'ldap', 'saml', 'oidc', 'basic', 'google', 'github', 'twitter',
  23. ]),
  24. ],
  25. localSetting: [
  26. body('registrationMode').isString().isIn([
  27. 'Open', 'Restricted', 'Closed',
  28. ]),
  29. body('registrationWhiteList').if(value => value != null).isArray().customSanitizer((value, { req }) => {
  30. return value.filter(email => email !== '');
  31. }),
  32. ],
  33. ldapAuth: [
  34. body('serverUrl').if(value => value != null).isString(),
  35. body('isUserBind').if(value => value != null).isBoolean(),
  36. body('ldapBindDN').if(value => value != null).isString(),
  37. body('ldapBindDNPassword').if(value => value != null).isString(),
  38. body('ldapSearchFilter').if(value => value != null).isString(),
  39. body('ldapAttrMapUsername').if(value => value != null).isString(),
  40. body('isSameUsernameTreatedAsIdenticalUser').if(value => value != null).isBoolean(),
  41. body('ldapAttrMapMail').if(value => value != null).isString(),
  42. body('ldapAttrMapName').if(value => value != null).isString(),
  43. body('ldapGroupSearchBase').if(value => value != null).isString(),
  44. body('ldapGroupSearchFilter').if(value => value != null).isString(),
  45. body('ldapGroupDnProperty').if(value => value != null).isString(),
  46. ],
  47. samlAuth: [
  48. body('entryPoint').if(value => value != null).isString(),
  49. body('issuer').if(value => value != null).isString(),
  50. body('cert').if(value => value != null).isString(),
  51. body('attrMapId').if(value => value != null).isString(),
  52. body('attrMapUsername').if(value => value != null).isString(),
  53. body('attrMapMail').if(value => value != null).isString(),
  54. body('attrMapFirstName').if(value => value != null).isString(),
  55. body('attrMapLastName').if(value => value != null).isString(),
  56. body('isSameUsernameTreatedAsIdenticalUser').if(value => value != null).isBoolean(),
  57. body('isSameEmailTreatedAsIdenticalUser').if(value => value != null).isBoolean(),
  58. body('ABLCRule').if(value => value != null).isString(),
  59. ],
  60. oidcAuth: [
  61. body('oidcProviderName').if(value => value != null).isString(),
  62. body('oidcIssuerHost').if(value => value != null).isString(),
  63. body('oidcAuthorizationEndpoint').if(value => value != null).isString(),
  64. body('oidcTokenEndpoint').if(value => value != null).isString(),
  65. body('oidcRevocationEndpoint').if(value => value != null).isString(),
  66. body('oidcIntrospectionEndpoint').if(value => value != null).isString(),
  67. body('oidcUserInfoEndpoint').if(value => value != null).isString(),
  68. body('oidcEndSessionEndpoint').if(value => value != null).isString(),
  69. body('oidcRegistrationEndpoint').if(value => value != null).isString(),
  70. body('oidcJWKSUri').if(value => value != null).isString(),
  71. body('oidcClientId').if(value => value != null).isString(),
  72. body('oidcClientSecret').if(value => value != null).isString(),
  73. body('oidcAttrMapId').if(value => value != null).isString(),
  74. body('oidcAttrMapUserName').if(value => value != null).isString(),
  75. body('oidcAttrMapEmail').if(value => value != null).isString(),
  76. body('isSameUsernameTreatedAsIdenticalUser').if(value => value != null).isBoolean(),
  77. body('isSameEmailTreatedAsIdenticalUser').if(value => value != null).isBoolean(),
  78. ],
  79. basicAuth: [
  80. body('isSameUsernameTreatedAsIdenticalUser').if(value => value != null).isBoolean(),
  81. ],
  82. googleOAuth: [
  83. body('googleClientId').if(value => value != null).isString(),
  84. body('googleClientSecret').if(value => value != null).isString(),
  85. body('isSameUsernameTreatedAsIdenticalUser').if(value => value != null).isBoolean(),
  86. ],
  87. githubOAuth: [
  88. body('githubClientId').if(value => value != null).isString(),
  89. body('githubClientSecret').if(value => value != null).isString(),
  90. body('isSameUsernameTreatedAsIdenticalUser').if(value => value != null).isBoolean(),
  91. ],
  92. twitterOAuth: [
  93. body('twitterConsumerKey').if(value => value != null).isString(),
  94. body('twitterConsumerSecret').if(value => value != null).isString(),
  95. body('isSameUsernameTreatedAsIdenticalUser').if(value => value != null).isBoolean(),
  96. ],
  97. };
  98. /**
  99. * @swagger
  100. * tags:
  101. * name: SecuritySetting
  102. */
  103. /**
  104. * @swagger
  105. *
  106. * components:
  107. * schemas:
  108. * GeneralSetting:
  109. * type: object
  110. * properties:
  111. * restrictGuestMode:
  112. * type: string
  113. * description: type of restrictGuestMode
  114. * pageCompleteDeletionAuthority:
  115. * type: string
  116. * description: type of pageDeletionAuthority
  117. * hideRestrictedByOwner:
  118. * type: boolean
  119. * description: enable hide by owner
  120. * hideRestrictedByGroup:
  121. * type: boolean
  122. * description: enable hide by group
  123. * LocalSetting:
  124. * type: object
  125. * properties:
  126. * isLocalEnabled:
  127. * type: boolean
  128. * description: local setting mode
  129. * registrationMode:
  130. * type: string
  131. * description: type of registrationMode
  132. * registrationWhiteList:
  133. * type: array
  134. * description: array of regsitrationList
  135. * items:
  136. * type: string
  137. * description: registration whiteList
  138. * LdapAuthSetting:
  139. * type: object
  140. * properties:
  141. * serverUrl:
  142. * type: string
  143. * description: server url for ldap
  144. * isUserBind:
  145. * type: boolean
  146. * description: enable user bind
  147. * ldapBindDN:
  148. * type: string
  149. * description: the query used to bind with the directory service
  150. * ldapBindDNPassword:
  151. * type: string
  152. * description: the password that is entered in the login page will be used to bind
  153. * ldapSearchFilter:
  154. * type: string
  155. * description: the query used to locate the authenticated user
  156. * ldapAttrMapUsername:
  157. * type: string
  158. * description: specification of mappings for username when creating new users
  159. * isSameUsernameTreatedAsIdenticalUser:
  160. * type: boolean
  161. * description: local account automatically linked the user name matched
  162. * ldapAttrMapMail:
  163. * type: string
  164. * description: specification of mappings for mail address when creating new users
  165. * ldapAttrMapName:
  166. * type: string
  167. * description: Specification of mappings for full name address when creating new users
  168. * ldapGroupSearchBase:
  169. * type: string
  170. * description: the base DN from which to search for groups.
  171. * ldapGroupSearchFilter:
  172. * type: string
  173. * description: the query used to filter for groups
  174. * ldapGroupDnProperty:
  175. * type: string
  176. * description: The property of user object to use in dn interpolation of Group Search Filter
  177. * SamlAuthSetting:
  178. * type: object
  179. * properties:
  180. * samlEntryPoint:
  181. * type: string
  182. * description: entry point for saml
  183. * samlIssuer:
  184. * type: string
  185. * description: issuer for saml
  186. * samlCert:
  187. * type: string
  188. * description: certificate for saml
  189. * samlAttrMapId:
  190. * type: string
  191. * description: attribute mapping id for saml
  192. * samlAttrMapUserName:
  193. * type: string
  194. * description: attribute mapping user name for saml
  195. * samlAttrMapMail:
  196. * type: string
  197. * description: attribute mapping mail for saml
  198. * samlAttrMapFirstName:
  199. * type: string
  200. * description: attribute mapping first name for saml
  201. * samlAttrMapLastName:
  202. * type: string
  203. * description: attribute mapping last name for saml
  204. * isSameUsernameTreatedAsIdenticalUser:
  205. * type: boolean
  206. * description: local account automatically linked the user name matched
  207. * isSameEmailTreatedAsIdenticalUser:
  208. * type: boolean
  209. * description: local account automatically linked the email matched
  210. * samlABLCRule:
  211. * type: string
  212. * description: ABLCRule for saml
  213. * OidcAuthSetting:
  214. * type: object
  215. * properties:
  216. * oidcProviderName:
  217. * type: string
  218. * description: provider name for oidc
  219. * oidcIssuerHost:
  220. * type: string
  221. * description: issuer host for oidc
  222. * oidcAuthorizationEndpoint:
  223. * type: string
  224. * description: authorization endpoint for oidc
  225. * oidcTokenEndpoint:
  226. * type: string
  227. * description: token endpoint for oidc
  228. * oidcRevocationEndpoint:
  229. * type: string
  230. * description: revocation endpoint for oidc
  231. * oidcIntrospectionEndpoint:
  232. * type: string
  233. * description: introspection endpoint for oidc
  234. * oidcUserInfoEndpoint:
  235. * type: string
  236. * description: userinfo endpoint for oidc
  237. * oidcEndSessionEndpoint:
  238. * type: string
  239. * description: end session endpoint for oidc
  240. * oidcRegistrationEndpoint:
  241. * type: string
  242. * description: registration endpoint for oidc
  243. * oidcJWKSUri:
  244. * type: string
  245. * description: JSON Web Key Set URI for oidc
  246. * oidcClientId:
  247. * type: string
  248. * description: client id for oidc
  249. * oidcClientSecret:
  250. * type: string
  251. * description: client secret for oidc
  252. * oidcAttrMapId:
  253. * type: string
  254. * description: attr map id for oidc
  255. * oidcAttrMapUserName:
  256. * type: string
  257. * description: attr map username for oidc
  258. * oidcAttrMapName:
  259. * type: string
  260. * description: attr map name for oidc
  261. * oidcAttrMapMail:
  262. * type: string
  263. * description: attr map mail for oidc
  264. * isSameUsernameTreatedAsIdenticalUser:
  265. * type: boolean
  266. * description: local account automatically linked the user name matched
  267. * isSameEmailTreatedAsIdenticalUser:
  268. * type: boolean
  269. * description: local account automatically linked the email matched
  270. * BasicAuthSetting:
  271. * type: object
  272. * properties:
  273. * isSameUsernameTreatedAsIdenticalUser:
  274. * type: boolean
  275. * description: local account automatically linked the email matched
  276. * GitHubOAuthSetting:
  277. * type: object
  278. * properties:
  279. * githubClientId:
  280. * type: string
  281. * description: key of comsumer
  282. * githubClientSecret:
  283. * type: string
  284. * description: password of comsumer
  285. * isSameUsernameTreatedAsIdenticalUser:
  286. * type: boolean
  287. * description: local account automatically linked the email matched
  288. * GoogleOAuthSetting:
  289. * type: object
  290. * properties:
  291. * googleClientId:
  292. * type: string
  293. * description: key of comsumer
  294. * googleClientSecret:
  295. * type: string
  296. * description: password of comsumer
  297. * isSameUsernameTreatedAsIdenticalUser:
  298. * type: boolean
  299. * description: local account automatically linked the email matched
  300. * TwitterOAuthSetting:
  301. * type: object
  302. * properties:
  303. * twitterConsumerKey:
  304. * type: string
  305. * description: key of comsumer
  306. * twitterConsumerSecret:
  307. * type: string
  308. * description: password of comsumer
  309. * isSameUsernameTreatedAsIdenticalUser:
  310. * type: boolean
  311. * description: local account automatically linked the email matched
  312. */
  313. module.exports = (crowi) => {
  314. const loginRequiredStrictly = require('../../middlewares/login-required')(crowi);
  315. const adminRequired = require('../../middlewares/admin-required')(crowi);
  316. const csrf = require('../../middlewares/csrf')(crowi);
  317. const apiV3FormValidator = require('../../middlewares/apiv3-form-validator')(crowi);
  318. async function updateAndReloadStrategySettings(authId, params) {
  319. const { configManager, passportService } = crowi;
  320. // update config without publishing S2sMessage
  321. await configManager.updateConfigsInTheSameNamespace('crowi', params, true);
  322. await passportService.setupStrategyById(authId);
  323. passportService.publishUpdatedMessage(authId);
  324. }
  325. /**
  326. * @swagger
  327. *
  328. * /_api/v3/security-setting/:
  329. * get:
  330. * tags: [SecuritySetting, apiv3]
  331. * description: Get security paramators
  332. * responses:
  333. * 200:
  334. * description: params of security
  335. * content:
  336. * application/json:
  337. * schema:
  338. * properties:
  339. * securityParams:
  340. * type: object
  341. * description: security params
  342. */
  343. router.get('/', loginRequiredStrictly, adminRequired, async(req, res) => {
  344. const securityParams = {
  345. generalSetting: {
  346. restrictGuestMode: await crowi.configManager.getConfig('crowi', 'security:restrictGuestMode'),
  347. pageCompleteDeletionAuthority: await crowi.configManager.getConfig('crowi', 'security:pageCompleteDeletionAuthority'),
  348. hideRestrictedByOwner: await crowi.configManager.getConfig('crowi', 'security:list-policy:hideRestrictedByOwner'),
  349. hideRestrictedByGroup: await crowi.configManager.getConfig('crowi', 'security:list-policy:hideRestrictedByGroup'),
  350. wikiMode: await crowi.configManager.getConfig('crowi', 'security:wikiMode'),
  351. },
  352. localSetting: {
  353. useOnlyEnvVarsForSomeOptions: await crowi.configManager.getConfig('crowi', 'security:passport-local:useOnlyEnvVarsForSomeOptions'),
  354. registrationMode: await crowi.configManager.getConfig('crowi', 'security:registrationMode'),
  355. registrationWhiteList: await crowi.configManager.getConfig('crowi', 'security:registrationWhiteList'),
  356. },
  357. generalAuth: {
  358. isLocalEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-local:isEnabled'),
  359. isLdapEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isEnabled'),
  360. isSamlEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isEnabled'),
  361. isOidcEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isEnabled'),
  362. isBasicEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-basic:isEnabled'),
  363. isGoogleEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-google:isEnabled'),
  364. isGitHubEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-github:isEnabled'),
  365. isTwitterEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:isEnabled'),
  366. },
  367. ldapAuth: {
  368. serverUrl: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:serverUrl'),
  369. isUserBind: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isUserBind'),
  370. ldapBindDN: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:bindDN'),
  371. ldapBindDNPassword: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:bindDNPassword'),
  372. ldapSearchFilter: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:searchFilter'),
  373. ldapAttrMapUsername: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapUsername'),
  374. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isSameUsernameTreatedAsIdenticalUser'),
  375. ldapAttrMapMail: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapMail'),
  376. ldapAttrMapName: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapName'),
  377. ldapGroupSearchBase: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupSearchBase'),
  378. ldapGroupSearchFilter: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupSearchFilter'),
  379. ldapGroupDnProperty: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupDnProperty'),
  380. },
  381. samlAuth: {
  382. missingMandatoryConfigKeys: await crowi.passportService.getSamlMissingMandatoryConfigKeys(),
  383. useOnlyEnvVarsForSomeOptions: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:useOnlyEnvVarsForSomeOptions'),
  384. samlEntryPoint: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:entryPoint'),
  385. samlEnvVarEntryPoint: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:entryPoint'),
  386. samlIssuer: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:issuer'),
  387. samlEnvVarIssuer: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:issuer'),
  388. samlCert: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:cert'),
  389. samlEnvVarCert: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:cert'),
  390. samlAttrMapId: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapId'),
  391. samlEnvVarAttrMapId: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapId'),
  392. samlAttrMapUsername: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapUsername'),
  393. samlEnvVarAttrMapUsername: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapUsername'),
  394. samlAttrMapMail: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapMail'),
  395. samlEnvVarAttrMapMail: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapMail'),
  396. samlAttrMapFirstName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapFirstName'),
  397. samlEnvVarAttrMapFirstName: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapFirstName'),
  398. samlAttrMapLastName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapLastName'),
  399. samlEnvVarAttrMapLastName: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:attrMapLastName'),
  400. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isSameUsernameTreatedAsIdenticalUser'),
  401. isSameEmailTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isSameEmailTreatedAsIdenticalUser'),
  402. samlABLCRule: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:ABLCRule'),
  403. samlEnvVarABLCRule: await crowi.configManager.getConfigFromEnvVars('crowi', 'security:passport-saml:ABLCRule'),
  404. },
  405. oidcAuth: {
  406. oidcProviderName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:providerName'),
  407. oidcIssuerHost: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:issuerHost'),
  408. oidcAuthorizationEndpoint: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:authorizationEndpoint'),
  409. oidcTokenEndpoint: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:tokenEndpoint'),
  410. oidcRevocationEndpoint: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:revocationEndpoint'),
  411. oidcIntrospectionEndpoint: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:introspectionEndpoint'),
  412. oidcUserInfoEndpoint: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:userInfoEndpoint'),
  413. oidcEndSessionEndpoint: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:endSessionEndpoint'),
  414. oidcRegistrationEndpoint: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:registrationEndpoint'),
  415. oidcJWKSUri: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:jwksUri'),
  416. oidcClientId: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:clientId'),
  417. oidcClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:clientSecret'),
  418. oidcAttrMapId: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapId'),
  419. oidcAttrMapUserName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapUserName'),
  420. oidcAttrMapName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapName'),
  421. oidcAttrMapEmail: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapMail'),
  422. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isSameUsernameTreatedAsIdenticalUser'),
  423. isSameEmailTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isSameEmailTreatedAsIdenticalUser'),
  424. },
  425. basicAuth: {
  426. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-basic:isSameUsernameTreatedAsIdenticalUser'),
  427. },
  428. googleOAuth: {
  429. googleClientId: await crowi.configManager.getConfig('crowi', 'security:passport-google:clientId'),
  430. googleClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-google:clientSecret'),
  431. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-google:isSameUsernameTreatedAsIdenticalUser'),
  432. },
  433. githubOAuth: {
  434. githubClientId: await crowi.configManager.getConfig('crowi', 'security:passport-github:clientId'),
  435. githubClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-github:clientSecret'),
  436. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-github:isSameUsernameTreatedAsIdenticalUser'),
  437. },
  438. twitterOAuth: {
  439. twitterConsumerKey: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:consumerKey'),
  440. twitterConsumerSecret: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:consumerSecret'),
  441. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:isSameUsernameTreatedAsIdenticalUser'),
  442. },
  443. };
  444. return res.apiv3({ securityParams });
  445. });
  446. /**
  447. * @swagger
  448. *
  449. * /_api/v3/security-setting/authentication/enabled:
  450. * put:
  451. * tags: [SecuritySetting, apiv3]
  452. * description: Update authentication isEnabled
  453. * requestBody:
  454. * required: true
  455. * content:
  456. * application/json:
  457. * schema:
  458. * type: object
  459. * properties:
  460. * isEnabled:
  461. * type: boolean
  462. * target:
  463. * type: string
  464. * responses:
  465. * 200:
  466. * description: Succeeded to enable authentication
  467. * content:
  468. * application/json:
  469. * schema:
  470. * type: object
  471. * description: updated param
  472. */
  473. router.put('/authentication/enabled', loginRequiredStrictly, adminRequired, csrf, validator.authenticationSetting, apiV3FormValidator, async(req, res) => {
  474. const { isEnabled, authId } = req.body;
  475. let setupStrategies = await crowi.passportService.getSetupStrategies();
  476. // Reflect request param
  477. setupStrategies = setupStrategies.filter(strategy => strategy !== authId);
  478. if (setupStrategies.length === 0) {
  479. return res.apiv3Err(new ErrorV3('Can not turn everything off'), 405);
  480. }
  481. const enableParams = { [`security:passport-${authId}:isEnabled`]: isEnabled };
  482. try {
  483. await updateAndReloadStrategySettings(authId, enableParams);
  484. const responseParams = {
  485. [`security:passport-${authId}:isEnabled`]: await crowi.configManager.getConfig('crowi', `security:passport-${authId}:isEnabled`),
  486. };
  487. return res.apiv3({ responseParams });
  488. }
  489. catch (err) {
  490. const msg = 'Error occurred in updating enable setting';
  491. logger.error('Error', err);
  492. return res.apiv3Err(new ErrorV3(msg, 'update-enable-setting failed'));
  493. }
  494. });
  495. /**
  496. * @swagger
  497. *
  498. * /_api/v3/security-setting/authentication:
  499. * get:
  500. * tags: [SecuritySetting, apiv3]
  501. * description: Get setup strategies for passport
  502. * responses:
  503. * 200:
  504. * description: params of setup strategies
  505. * content:
  506. * application/json:
  507. * schema:
  508. * properties:
  509. * setupStrategies:
  510. * type: array
  511. * description: setup strategies list
  512. * items:
  513. * type: string
  514. * description: setup strategie
  515. * example: ["local"]
  516. */
  517. router.get('/authentication/', loginRequiredStrictly, adminRequired, async(req, res) => {
  518. const setupStrategies = await crowi.passportService.getSetupStrategies();
  519. return res.apiv3({ setupStrategies });
  520. });
  521. /**
  522. * @swagger
  523. *
  524. * /_api/v3/security-setting/general-setting:
  525. * put:
  526. * tags: [SecuritySetting, apiv3]
  527. * description: Update GeneralSetting
  528. * requestBody:
  529. * required: true
  530. * content:
  531. * application/json:
  532. * schema:
  533. * $ref: '#/components/schemas/GeneralSetting'
  534. * responses:
  535. * 200:
  536. * description: Succeeded to update general Setting
  537. * content:
  538. * application/json:
  539. * schema:
  540. * $ref: '#/components/schemas/GeneralSetting'
  541. */
  542. router.put('/general-setting', loginRequiredStrictly, adminRequired, csrf, validator.generalSetting, apiV3FormValidator, async(req, res) => {
  543. const requestParams = {
  544. 'security:restrictGuestMode': req.body.restrictGuestMode,
  545. 'security:pageCompleteDeletionAuthority': req.body.pageCompleteDeletionAuthority,
  546. 'security:list-policy:hideRestrictedByOwner': req.body.hideRestrictedByOwner,
  547. 'security:list-policy:hideRestrictedByGroup': req.body.hideRestrictedByGroup,
  548. };
  549. const wikiMode = await crowi.configManager.getConfig('crowi', 'security:wikiMode');
  550. if (wikiMode === 'private' || wikiMode === 'public') {
  551. logger.debug('security:restrictGuestMode will not be changed because wiki mode is forced to set');
  552. delete requestParams['security:restrictGuestMode'];
  553. }
  554. try {
  555. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
  556. const securitySettingParams = {
  557. restrictGuestMode: await crowi.configManager.getConfig('crowi', 'security:restrictGuestMode'),
  558. pageCompleteDeletionAuthority: await crowi.configManager.getConfig('crowi', 'security:pageCompleteDeletionAuthority'),
  559. hideRestrictedByOwner: await crowi.configManager.getConfig('crowi', 'security:list-policy:hideRestrictedByOwner'),
  560. hideRestrictedByGroup: await crowi.configManager.getConfig('crowi', 'security:list-policy:hideRestrictedByGroup'),
  561. };
  562. return res.apiv3({ securitySettingParams });
  563. }
  564. catch (err) {
  565. const msg = 'Error occurred in updating security setting';
  566. logger.error('Error', err);
  567. return res.apiv3Err(new ErrorV3(msg, 'update-secuirty-setting failed'));
  568. }
  569. });
  570. /**
  571. * @swagger
  572. *
  573. * /_api/v3/security-setting/all-share-links:
  574. * get:
  575. * tags: [ShareLinkSettings, apiv3]
  576. * description: Get All ShareLinks at Share Link Setting
  577. * responses:
  578. * 200:
  579. * description: all share links
  580. * content:
  581. * application/json:
  582. * schema:
  583. * properties:
  584. * securityParams:
  585. * type: object
  586. * description: suceed to get all share links
  587. */
  588. router.get('/all-share-links/', loginRequiredStrictly, adminRequired, async(req, res) => {
  589. const ShareLink = crowi.model('ShareLink');
  590. const page = parseInt(req.query.page) || 1;
  591. const limit = 10;
  592. const linkQuery = {};
  593. try {
  594. const paginateResult = await ShareLink.paginate(
  595. linkQuery,
  596. {
  597. page,
  598. limit,
  599. populate: {
  600. path: 'relatedPage',
  601. select: 'path',
  602. },
  603. },
  604. );
  605. return res.apiv3({ paginateResult });
  606. }
  607. catch (err) {
  608. const msg = 'Error occured in get share link';
  609. logger.error('Error', err);
  610. return res.apiv3Err(new ErrorV3(msg, 'get-all-share-links-failed'));
  611. }
  612. });
  613. /**
  614. * @swagger
  615. *
  616. * /_api/v3/security-setting/all-share-links:
  617. * delete:
  618. * tags: [ShareLinkSettings, apiv3]
  619. * description: Delete All ShareLinks at Share Link Setting
  620. * responses:
  621. * 200:
  622. * description: succeed to delete all share links
  623. */
  624. router.delete('/all-share-links/', loginRequiredStrictly, adminRequired, async(req, res) => {
  625. const ShareLink = crowi.model('ShareLink');
  626. try {
  627. const removedAct = await ShareLink.remove({});
  628. const removeTotal = await removedAct.n;
  629. return res.apiv3({ removeTotal });
  630. }
  631. catch (err) {
  632. const msg = 'Error occured in delete all share links';
  633. logger.error('Error', err);
  634. return res.apiv3Err(new ErrorV3(msg, 'failed-to-delete-all-share-links'));
  635. }
  636. });
  637. /**
  638. * @swagger
  639. *
  640. * /_api/v3/security-setting/local-setting:
  641. * put:
  642. * tags: [LocalSetting, apiv3]
  643. * description: Update LocalSetting
  644. * requestBody:
  645. * required: true
  646. * content:
  647. * application/json:
  648. * schema:
  649. * $ref: '#/components/schemas/LocalSetting'
  650. * responses:
  651. * 200:
  652. * description: Succeeded to update local Setting
  653. * content:
  654. * application/json:
  655. * schema:
  656. * $ref: '#/components/schemas/LocalSetting'
  657. */
  658. router.put('/local-setting', loginRequiredStrictly, adminRequired, csrf, validator.localSetting, apiV3FormValidator, async(req, res) => {
  659. const requestParams = {
  660. 'security:registrationMode': req.body.registrationMode,
  661. 'security:registrationWhiteList': req.body.registrationWhiteList,
  662. };
  663. try {
  664. await updateAndReloadStrategySettings('local', requestParams);
  665. const localSettingParams = {
  666. registrationMode: await crowi.configManager.getConfig('crowi', 'security:registrationMode'),
  667. registrationWhiteList: await crowi.configManager.getConfig('crowi', 'security:registrationWhiteList'),
  668. };
  669. return res.apiv3({ localSettingParams });
  670. }
  671. catch (err) {
  672. const msg = 'Error occurred in updating local setting';
  673. logger.error('Error', err);
  674. return res.apiv3Err(new ErrorV3(msg, 'update-local-setting failed'));
  675. }
  676. });
  677. /**
  678. * @swagger
  679. *
  680. * /_api/v3/security-setting/ldap:
  681. * put:
  682. * tags: [SecuritySetting, apiv3]
  683. * description: Update LDAP setting
  684. * requestBody:
  685. * required: true
  686. * content:
  687. * application/json:
  688. * schema:
  689. * $ref: '#/components/schemas/LdapAuthSetting'
  690. * responses:
  691. * 200:
  692. * description: Succeeded to update LDAP setting
  693. * content:
  694. * application/json:
  695. * schema:
  696. * $ref: '#/components/schemas/LdapAuthSetting'
  697. */
  698. router.put('/ldap', loginRequiredStrictly, adminRequired, csrf, validator.ldapAuth, apiV3FormValidator, async(req, res) => {
  699. const requestParams = {
  700. 'security:passport-ldap:serverUrl': req.body.serverUrl,
  701. 'security:passport-ldap:isUserBind': req.body.isUserBind,
  702. 'security:passport-ldap:bindDN': req.body.ldapBindDN,
  703. 'security:passport-ldap:bindDNPassword': req.body.ldapBindDNPassword,
  704. 'security:passport-ldap:searchFilter': req.body.ldapSearchFilter,
  705. 'security:passport-ldap:attrMapUsername': req.body.ldapAttrMapUsername,
  706. 'security:passport-ldap:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  707. 'security:passport-ldap:attrMapMail': req.body.ldapAttrMapMail,
  708. 'security:passport-ldap:attrMapName': req.body.ldapAttrMapName,
  709. 'security:passport-ldap:groupSearchBase': req.body.ldapGroupSearchBase,
  710. 'security:passport-ldap:groupSearchFilter': req.body.ldapGroupSearchFilter,
  711. 'security:passport-ldap:groupDnProperty': req.body.ldapGroupDnProperty,
  712. };
  713. try {
  714. await updateAndReloadStrategySettings('ldap', requestParams);
  715. const securitySettingParams = {
  716. serverUrl: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:serverUrl'),
  717. isUserBind: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isUserBind'),
  718. ldapBindDN: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:bindDN'),
  719. ldapBindDNPassword: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:bindDNPassword'),
  720. ldapSearchFilter: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:searchFilter'),
  721. ldapAttrMapUsername: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapUsername'),
  722. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isSameUsernameTreatedAsIdenticalUser'),
  723. ldapAttrMapMail: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapMail'),
  724. ldapAttrMapName: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:attrMapName'),
  725. ldapGroupSearchBase: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupSearchBase'),
  726. ldapGroupSearchFilter: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupSearchFilter'),
  727. ldapGroupDnProperty: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:groupDnProperty'),
  728. };
  729. return res.apiv3({ securitySettingParams });
  730. }
  731. catch (err) {
  732. const msg = 'Error occurred in updating SAML setting';
  733. logger.error('Error', err);
  734. return res.apiv3Err(new ErrorV3(msg, 'update-SAML-failed'));
  735. }
  736. });
  737. /**
  738. * @swagger
  739. *
  740. * /_api/v3/security-setting/saml:
  741. * put:
  742. * tags: [SecuritySetting, apiv3]
  743. * description: Update SAML setting
  744. * requestBody:
  745. * required: true
  746. * content:
  747. * application/json:
  748. * schema:
  749. * $ref: '#/components/schemas/SamlAuthSetting'
  750. * responses:
  751. * 200:
  752. * description: Succeeded to update SAML setting
  753. * content:
  754. * application/json:
  755. * schema:
  756. * $ref: '#/components/schemas/SamlAuthSetting'
  757. */
  758. router.put('/saml', loginRequiredStrictly, adminRequired, csrf, validator.samlAuth, apiV3FormValidator, async(req, res) => {
  759. // For the value of each mandatory items,
  760. // check whether it from the environment variables is empty and form value to update it is empty
  761. // validate the syntax of a attribute - based login control rule
  762. const invalidValues = [];
  763. for (const configKey of crowi.passportService.mandatoryConfigKeysForSaml) {
  764. const key = configKey.replace('security:passport-saml:', '');
  765. const formValue = req.body[key];
  766. if (crowi.configManager.getConfigFromEnvVars('crowi', configKey) === null && formValue == null) {
  767. const formItemName = req.t(`security_setting.form_item_name.${key}`);
  768. invalidValues.push(req.t('form_validation.required', formItemName));
  769. }
  770. }
  771. if (invalidValues.length !== 0) {
  772. return res.apiv3Err(req.t('form_validation.error_message'), 400, invalidValues);
  773. }
  774. const rule = req.body.ABLCRule;
  775. // Empty string disables attribute-based login control.
  776. // So, when rule is empty string, validation is passed.
  777. if (rule != null) {
  778. try {
  779. crowi.passportService.parseABLCRule(rule);
  780. }
  781. catch (err) {
  782. return res.apiv3Err(req.t('form_validation.invalid_syntax', req.t('security_setting.form_item_name.ABLCRule')), 400);
  783. }
  784. }
  785. const requestParams = {
  786. 'security:passport-saml:entryPoint': req.body.entryPoint,
  787. 'security:passport-saml:issuer': req.body.issuer,
  788. 'security:passport-saml:cert': req.body.cert,
  789. 'security:passport-saml:attrMapId': req.body.attrMapId,
  790. 'security:passport-saml:attrMapUsername': req.body.attrMapUsername,
  791. 'security:passport-saml:attrMapMail': req.body.attrMapMail,
  792. 'security:passport-saml:attrMapFirstName': req.body.attrMapFirstName,
  793. 'security:passport-saml:attrMapLastName': req.body.attrMapLastName,
  794. 'security:passport-saml:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  795. 'security:passport-saml:isSameEmailTreatedAsIdenticalUser': req.body.isSameEmailTreatedAsIdenticalUser,
  796. 'security:passport-saml:ABLCRule': req.body.ABLCRule,
  797. };
  798. try {
  799. await updateAndReloadStrategySettings('saml', requestParams);
  800. const securitySettingParams = {
  801. missingMandatoryConfigKeys: await crowi.passportService.getSamlMissingMandatoryConfigKeys(),
  802. samlEntryPoint: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:entryPoint'),
  803. samlIssuer: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:issuer'),
  804. samlCert: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:cert'),
  805. samlAttrMapId: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapId'),
  806. samlAttrMapUsername: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapUsername'),
  807. samlAttrMapMail: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapMail'),
  808. samlAttrMapFirstName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapFirstName'),
  809. samlAttrMapLastName: await crowi.configManager.getConfigFromDB('crowi', 'security:passport-saml:attrMapLastName'),
  810. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isSameUsernameTreatedAsIdenticalUser'),
  811. isSameEmailTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isSameEmailTreatedAsIdenticalUser'),
  812. samlABLCRule: await crowi.configManager.getConfig('crowi', 'security:passport-saml:ABLCRule'),
  813. };
  814. return res.apiv3({ securitySettingParams });
  815. }
  816. catch (err) {
  817. const msg = 'Error occurred in updating SAML setting';
  818. logger.error('Error', err);
  819. return res.apiv3Err(new ErrorV3(msg, 'update-SAML-failed'));
  820. }
  821. });
  822. /**
  823. * @swagger
  824. *
  825. * /_api/v3/security-setting/oidc:
  826. * put:
  827. * tags: [SecuritySetting, apiv3]
  828. * description: Update OpenID Connect setting
  829. * requestBody:
  830. * required: true
  831. * content:
  832. * application/json:
  833. * schema:
  834. * $ref: '#/components/schemas/OidcAuthSetting'
  835. * responses:
  836. * 200:
  837. * description: Succeeded to update OpenID Connect setting
  838. * content:
  839. * application/json:
  840. * schema:
  841. * $ref: '#/components/schemas/OidcAuthSetting'
  842. */
  843. router.put('/oidc', loginRequiredStrictly, adminRequired, csrf, validator.oidcAuth, apiV3FormValidator, async(req, res) => {
  844. const requestParams = {
  845. 'security:passport-oidc:providerName': req.body.oidcProviderName,
  846. 'security:passport-oidc:issuerHost': req.body.oidcIssuerHost,
  847. 'security:passport-oidc:authorizationEndpoint': req.body.oidcAuthorizationEndpoint,
  848. 'security:passport-oidc:tokenEndpoint': req.body.oidcTokenEndpoint,
  849. 'security:passport-oidc:revocationEndpoint': req.body.oidcRevocationEndpoint,
  850. 'security:passport-oidc:introspectionEndpoint': req.body.oidcIntrospectionEndpoint,
  851. 'security:passport-oidc:userInfoEndpoint': req.body.oidcUserInfoEndpoint,
  852. 'security:passport-oidc:endSessionEndpoint': req.body.oidcEndSessionEndpoint,
  853. 'security:passport-oidc:registrationEndpoint': req.body.oidcRegistrationEndpoint,
  854. 'security:passport-oidc:jwksUri': req.body.oidcJWKSUri,
  855. 'security:passport-oidc:clientId': req.body.oidcClientId,
  856. 'security:passport-oidc:clientSecret': req.body.oidcClientSecret,
  857. 'security:passport-oidc:attrMapId': req.body.oidcAttrMapId,
  858. 'security:passport-oidc:attrMapUserName': req.body.oidcAttrMapUserName,
  859. 'security:passport-oidc:attrMapName': req.body.oidcAttrMapName,
  860. 'security:passport-oidc:attrMapMail': req.body.oidcAttrMapEmail,
  861. 'security:passport-oidc:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  862. 'security:passport-oidc:isSameEmailTreatedAsIdenticalUser': req.body.isSameEmailTreatedAsIdenticalUser,
  863. };
  864. try {
  865. await updateAndReloadStrategySettings('oidc', requestParams);
  866. const securitySettingParams = {
  867. oidcProviderName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:providerName'),
  868. oidcIssuerHost: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:issuerHost'),
  869. oidcAuthorizationEndpoint: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:authorizationEndpoint'),
  870. oidcTokenEndpoint: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:tokenEndpoint'),
  871. oidcRevocationEndpoint: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:revocationEndpoint'),
  872. oidcIntrospectionEndpoint: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:introspectionEndpoint'),
  873. oidcUserInfoEndpoint: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:userInfoEndpoint'),
  874. oidcEndSessionEndpoint: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:endSessionEndpoint'),
  875. oidcRegistrationEndpoint: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:registrationEndpoint'),
  876. oidcJWKSUri: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:jwksUri'),
  877. oidcClientId: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:clientId'),
  878. oidcClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:clientSecret'),
  879. oidcAttrMapId: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapId'),
  880. oidcAttrMapUserName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapUserName'),
  881. oidcAttrMapName: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapName'),
  882. oidcAttrMapEmail: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:attrMapMail'),
  883. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isSameUsernameTreatedAsIdenticalUser'),
  884. isSameEmailTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-oidc:isSameEmailTreatedAsIdenticalUser'),
  885. };
  886. return res.apiv3({ securitySettingParams });
  887. }
  888. catch (err) {
  889. const msg = 'Error occurred in updating OpenIDConnect';
  890. logger.error('Error', err);
  891. return res.apiv3Err(new ErrorV3(msg, 'update-OpenIDConnect-failed'));
  892. }
  893. });
  894. /**
  895. * @swagger
  896. *
  897. * /_api/v3/security-setting/basic:
  898. * put:
  899. * tags: [SecuritySetting, apiv3]
  900. * description: Update basic
  901. * requestBody:
  902. * required: true
  903. * content:
  904. * application/json:
  905. * schema:
  906. * $ref: '#/components/schemas/BasicAuthSetting'
  907. * responses:
  908. * 200:
  909. * description: Succeeded to update basic
  910. * content:
  911. * application/json:
  912. * schema:
  913. * $ref: '#/components/schemas/BasicAuthSetting'
  914. */
  915. router.put('/basic', loginRequiredStrictly, adminRequired, csrf, validator.basicAuth, apiV3FormValidator, async(req, res) => {
  916. const requestParams = {
  917. 'security:passport-basic:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  918. };
  919. try {
  920. await updateAndReloadStrategySettings('basic', requestParams);
  921. const securitySettingParams = {
  922. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-basic:isSameUsernameTreatedAsIdenticalUser'),
  923. };
  924. return res.apiv3({ securitySettingParams });
  925. }
  926. catch (err) {
  927. const msg = 'Error occurred in updating basicAuth';
  928. logger.error('Error', err);
  929. return res.apiv3Err(new ErrorV3(msg, 'update-basicOAuth-failed'));
  930. }
  931. });
  932. /**
  933. * @swagger
  934. *
  935. * /_api/v3/security-setting/google-oauth:
  936. * put:
  937. * tags: [SecuritySetting, apiv3]
  938. * description: Update google OAuth
  939. * requestBody:
  940. * required: true
  941. * content:
  942. * application/json:
  943. * schema:
  944. * $ref: '#/components/schemas/GoogleOAuthSetting'
  945. * responses:
  946. * 200:
  947. * description: Succeeded to google OAuth
  948. * content:
  949. * application/json:
  950. * schema:
  951. * $ref: '#/components/schemas/GoogleOAuthSetting'
  952. */
  953. router.put('/google-oauth', loginRequiredStrictly, adminRequired, csrf, validator.googleOAuth, apiV3FormValidator, async(req, res) => {
  954. const requestParams = {
  955. 'security:passport-google:clientId': req.body.googleClientId,
  956. 'security:passport-google:clientSecret': req.body.googleClientSecret,
  957. 'security:passport-google:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  958. };
  959. try {
  960. await updateAndReloadStrategySettings('google', requestParams);
  961. const securitySettingParams = {
  962. googleClientId: await crowi.configManager.getConfig('crowi', 'security:passport-google:clientId'),
  963. googleClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-google:clientSecret'),
  964. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-google:isSameUsernameTreatedAsIdenticalUser'),
  965. };
  966. return res.apiv3({ securitySettingParams });
  967. }
  968. catch (err) {
  969. const msg = 'Error occurred in updating googleOAuth';
  970. logger.error('Error', err);
  971. return res.apiv3Err(new ErrorV3(msg, 'update-googleOAuth-failed'));
  972. }
  973. });
  974. /**
  975. * @swagger
  976. *
  977. * /_api/v3/security-setting/github-oauth:
  978. * put:
  979. * tags: [SecuritySetting, apiv3]
  980. * description: Update github OAuth
  981. * requestBody:
  982. * required: true
  983. * content:
  984. * application/json:
  985. * schema:
  986. * $ref: '#/components/schemas/GitHubOAuthSetting'
  987. * responses:
  988. * 200:
  989. * description: Succeeded to github OAuth
  990. * content:
  991. * application/json:
  992. * schema:
  993. * $ref: '#/components/schemas/GitHubOAuthSetting'
  994. */
  995. router.put('/github-oauth', loginRequiredStrictly, adminRequired, csrf, validator.githubOAuth, apiV3FormValidator, async(req, res) => {
  996. const requestParams = {
  997. 'security:passport-github:clientId': req.body.githubClientId,
  998. 'security:passport-github:clientSecret': req.body.githubClientSecret,
  999. 'security:passport-github:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  1000. };
  1001. try {
  1002. await updateAndReloadStrategySettings('github', requestParams);
  1003. const securitySettingParams = {
  1004. githubClientId: await crowi.configManager.getConfig('crowi', 'security:passport-github:clientId'),
  1005. githubClientSecret: await crowi.configManager.getConfig('crowi', 'security:passport-github:clientSecret'),
  1006. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-github:isSameUsernameTreatedAsIdenticalUser'),
  1007. };
  1008. return res.apiv3({ securitySettingParams });
  1009. }
  1010. catch (err) {
  1011. // reset strategy
  1012. await crowi.passportService.resetGitHubStrategy();
  1013. const msg = 'Error occurred in updating githubOAuth';
  1014. logger.error('Error', err);
  1015. return res.apiv3Err(new ErrorV3(msg, 'update-githubOAuth-failed'));
  1016. }
  1017. });
  1018. /**
  1019. * @swagger
  1020. *
  1021. * /_api/v3/security-setting/twitter-oauth:
  1022. * put:
  1023. * tags: [SecuritySetting, apiv3]
  1024. * description: Update twitter OAuth
  1025. * requestBody:
  1026. * required: true
  1027. * content:
  1028. * application/json:
  1029. * schema:
  1030. * $ref: '#/components/schemas/TwitterOAuthSetting'
  1031. * responses:
  1032. * 200:
  1033. * description: Succeeded to update twitter OAuth
  1034. * content:
  1035. * application/json:
  1036. * schema:
  1037. * $ref: '#/components/schemas/TwitterOAuthSetting'
  1038. */
  1039. router.put('/twitter-oauth', loginRequiredStrictly, adminRequired, csrf, validator.twitterOAuth, apiV3FormValidator, async(req, res) => {
  1040. let requestParams = {
  1041. 'security:passport-twitter:consumerKey': req.body.twitterConsumerKey,
  1042. 'security:passport-twitter:consumerSecret': req.body.twitterConsumerSecret,
  1043. 'security:passport-twitter:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
  1044. };
  1045. requestParams = removeNullPropertyFromObject(requestParams);
  1046. try {
  1047. await updateAndReloadStrategySettings('twitter', requestParams);
  1048. const securitySettingParams = {
  1049. twitterConsumerId: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:consumerKey'),
  1050. twitterConsumerSecret: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:consumerSecret'),
  1051. isSameUsernameTreatedAsIdenticalUser: await crowi.configManager.getConfig('crowi', 'security:passport-twitter:isSameUsernameTreatedAsIdenticalUser'),
  1052. };
  1053. return res.apiv3({ securitySettingParams });
  1054. }
  1055. catch (err) {
  1056. const msg = 'Error occurred in updating twitterOAuth';
  1057. logger.error('Error', err);
  1058. return res.apiv3Err(new ErrorV3(msg, 'update-twitterOAuth-failed'));
  1059. }
  1060. });
  1061. return router;
  1062. };