AdminOidcSecurityContainer.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. import { Container } from 'unstated';
  2. import loggerFactory from '@alias/logger';
  3. import { pathUtils } from 'growi-commons';
  4. import urljoin from 'url-join';
  5. import removeNullPropertyFromObject from '../../../lib/util/removeNullPropertyFromObject';
  6. const logger = loggerFactory('growi:services:AdminLdapSecurityContainer');
  7. /**
  8. * Service container for admin security page (OidcSecurityManagement.jsx)
  9. * @extends {Container} unstated Container
  10. */
  11. export default class AdminOidcSecurityContainer extends Container {
  12. constructor(appContainer) {
  13. super();
  14. this.appContainer = appContainer;
  15. this.dummyOidcProviderName = 0;
  16. this.state = {
  17. retrieveError: null,
  18. callbackUrl: urljoin(pathUtils.removeTrailingSlash(appContainer.config.crowi.url), '/passport/oidc/callback'),
  19. // set dummy value tile for using suspense
  20. oidcProviderName: this.dummyOidcProviderName,
  21. oidcIssuerHost: '',
  22. oidcAuthorizationEndpoint: '',
  23. oidcTokenEndpoint: '',
  24. oidcRevocationEndpoint: '',
  25. oidcIntrospectionEndpoint: '',
  26. oidcUserInfoEndpoint: '',
  27. oidcEndSessionEndpoint: '',
  28. oidcRegistrationEndpoint: '',
  29. oidcJWKSUri: '',
  30. oidcClientId: '',
  31. oidcClientSecret: '',
  32. oidcAttrMapId: '',
  33. oidcAttrMapUserName: '',
  34. oidcAttrMapName: '',
  35. oidcAttrMapEmail: '',
  36. isSameUsernameTreatedAsIdenticalUser: false,
  37. isSameEmailTreatedAsIdenticalUser: false,
  38. };
  39. }
  40. /**
  41. * retrieve security data
  42. */
  43. async retrieveSecurityData() {
  44. try {
  45. const response = await this.appContainer.apiv3.get('/security-setting/');
  46. const { oidcAuth } = response.data.securityParams;
  47. this.setState({
  48. oidcProviderName: oidcAuth.oidcProviderName,
  49. oidcIssuerHost: oidcAuth.oidcIssuerHost,
  50. oidcAuthorizationEndpoint: oidcAuth.oidcAuthorizationEndpoint,
  51. oidcTokenEndpoint: oidcAuth.oidcTokenEndpoint,
  52. oidcRevocationEndpoint: oidcAuth.oidcRevocationEndpoint,
  53. oidcIntrospectionEndpoint: oidcAuth.oidcIntrospectionEndpoint,
  54. oidcUserInfoEndpoint: oidcAuth.oidcUserInfoEndpoint,
  55. oidcEndSessionEndpoint: oidcAuth.oidcEndSessionEndpoint,
  56. oidcRegistrationEndpoint: oidcAuth.oidcRegistrationEndpoint,
  57. oidcJWKSUri: oidcAuth.oidcJWKSUri,
  58. oidcClientId: oidcAuth.oidcClientId,
  59. oidcClientSecret: oidcAuth.oidcClientSecret,
  60. oidcAttrMapId: oidcAuth.oidcAttrMapId,
  61. oidcAttrMapUserName: oidcAuth.oidcAttrMapUserName,
  62. oidcAttrMapName: oidcAuth.oidcAttrMapName,
  63. oidcAttrMapEmail: oidcAuth.oidcAttrMapEmail,
  64. isSameUsernameTreatedAsIdenticalUser: oidcAuth.isSameUsernameTreatedAsIdenticalUser,
  65. isSameEmailTreatedAsIdenticalUser: oidcAuth.isSameEmailTreatedAsIdenticalUser,
  66. });
  67. }
  68. catch (err) {
  69. this.setState({ retrieveError: err });
  70. logger.error(err);
  71. throw new Error('Failed to fetch data');
  72. }
  73. }
  74. /**
  75. * Workaround for the mangling in production build to break constructor.name
  76. */
  77. static getClassName() {
  78. return 'AdminOidcSecurityContainer';
  79. }
  80. /**
  81. * Change oidcProviderName
  82. */
  83. changeOidcProviderName(inputValue) {
  84. this.setState({ oidcProviderName: inputValue });
  85. }
  86. /**
  87. * Change oidcIssuerHost
  88. */
  89. changeOidcIssuerHost(inputValue) {
  90. this.setState({ oidcIssuerHost: inputValue });
  91. }
  92. /**
  93. * Change oidcAuthorizationEndpoint
  94. */
  95. changeOidcAuthorizationEndpoint(inputValue) {
  96. this.setState({ oidcAuthorizationEndpoint: inputValue });
  97. }
  98. /**
  99. * Change oidcTokenEndpoint
  100. */
  101. changeOidcTokenEndpoint(inputValue) {
  102. this.setState({ oidcTokenEndpoint: inputValue });
  103. }
  104. /**
  105. * Change oidcRevocationEndpoint
  106. */
  107. changeOidcRevocationEndpoint(inputValue) {
  108. this.setState({ oidcRevocationEndpoint: inputValue });
  109. }
  110. /**
  111. * Change oidcIntrospectionEndpoint
  112. */
  113. changeOidcIntrospectionEndpoint(inputValue) {
  114. this.setState({ oidcIntrospectionEndpoint: inputValue });
  115. }
  116. /**
  117. * Change oidcUserInfoEndpoint
  118. */
  119. changeOidcUserInfoEndpoint(inputValue) {
  120. this.setState({ oidcUserInfoEndpoint: inputValue });
  121. }
  122. /**
  123. * Change oidcEndSessionEndpoint
  124. */
  125. changeOidcEndSessionEndpoint(inputValue) {
  126. this.setState({ oidcEndSessionEndpoint: inputValue });
  127. }
  128. /**
  129. * Change oidcRegistrationEndpoint
  130. */
  131. changeOidcRegistrationEndpoint(inputValue) {
  132. this.setState({ oidcRegistrationEndpoint: inputValue });
  133. }
  134. /**
  135. * Change oidcJWKSUri
  136. */
  137. changeOidcJWKSUri(inputValue) {
  138. this.setState({ oidcJWKSUri: inputValue });
  139. }
  140. /**
  141. * Change oidcClientId
  142. */
  143. changeOidcClientId(inputValue) {
  144. this.setState({ oidcClientId: inputValue });
  145. }
  146. /**
  147. * Change oidcClientSecret
  148. */
  149. changeOidcClientSecret(inputValue) {
  150. this.setState({ oidcClientSecret: inputValue });
  151. }
  152. /**
  153. * Change oidcAttrMapId
  154. */
  155. changeOidcAttrMapId(inputValue) {
  156. this.setState({ oidcAttrMapId: inputValue });
  157. }
  158. /**
  159. * Change oidcAttrMapUserName
  160. */
  161. changeOidcAttrMapUserName(inputValue) {
  162. this.setState({ oidcAttrMapUserName: inputValue });
  163. }
  164. /**
  165. * Change oidcAttrMapName
  166. */
  167. changeOidcAttrMapName(inputValue) {
  168. this.setState({ oidcAttrMapName: inputValue });
  169. }
  170. /**
  171. * Change oidcAttrMapEmail
  172. */
  173. changeOidcAttrMapEmail(inputValue) {
  174. this.setState({ oidcAttrMapEmail: inputValue });
  175. }
  176. /**
  177. * Switch sameUsernameTreatedAsIdenticalUser
  178. */
  179. switchIsSameUsernameTreatedAsIdenticalUser() {
  180. this.setState({ isSameUsernameTreatedAsIdenticalUser: !this.state.isSameUsernameTreatedAsIdenticalUser });
  181. }
  182. /**
  183. * Switch sameEmailTreatedAsIdenticalUser
  184. */
  185. switchIsSameEmailTreatedAsIdenticalUser() {
  186. this.setState({ isSameEmailTreatedAsIdenticalUser: !this.state.isSameEmailTreatedAsIdenticalUser });
  187. }
  188. /**
  189. * Update OpenID Connect
  190. */
  191. async updateOidcSetting() {
  192. const {
  193. oidcProviderName,
  194. oidcIssuerHost,
  195. oidcAuthorizationEndpoint,
  196. oidcTokenEndpoint,
  197. oidcRevocationEndpoint,
  198. oidcIntrospectionEndpoint,
  199. oidcUserInfoEndpoint,
  200. oidcEndSessionEndpoint,
  201. oidcRegistrationEndpoint,
  202. oidcJWKSUri,
  203. oidcClientId,
  204. oidcClientSecret,
  205. oidcAttrMapId,
  206. oidcAttrMapUserName,
  207. oidcAttrMapName,
  208. oidcAttrMapEmail,
  209. isSameUsernameTreatedAsIdenticalUser,
  210. isSameEmailTreatedAsIdenticalUser,
  211. } = this.state;
  212. let requestParams = {
  213. oidcProviderName,
  214. oidcIssuerHost,
  215. oidcAuthorizationEndpoint,
  216. oidcTokenEndpoint,
  217. oidcRevocationEndpoint,
  218. oidcIntrospectionEndpoint,
  219. oidcUserInfoEndpoint,
  220. oidcEndSessionEndpoint,
  221. oidcRegistrationEndpoint,
  222. oidcJWKSUri,
  223. oidcClientId,
  224. oidcClientSecret,
  225. oidcAttrMapId,
  226. oidcAttrMapUserName,
  227. oidcAttrMapName,
  228. oidcAttrMapEmail,
  229. isSameUsernameTreatedAsIdenticalUser,
  230. isSameEmailTreatedAsIdenticalUser,
  231. };
  232. requestParams = await removeNullPropertyFromObject(requestParams);
  233. const response = await this.appContainer.apiv3.put('/security-setting/oidc', requestParams);
  234. const { securitySettingParams } = response.data;
  235. this.setState({
  236. oidcProviderName: securitySettingParams.oidcProviderName,
  237. oidcIssuerHost: securitySettingParams.oidcIssuerHost,
  238. oidcAuthorizationEndpoint: securitySettingParams.oidcAuthorizationEndpoint,
  239. oidcTokenEndpoint: securitySettingParams.oidcTokenEndpoint,
  240. oidcRevocationEndpoint: securitySettingParams.oidcRevocationEndpoint,
  241. oidcIntrospectionEndpoint: securitySettingParams.oidcIntrospectionEndpoint,
  242. oidcUserInfoEndpoint: securitySettingParams.oidcUserInfoEndpoint,
  243. oidcEndSessionEndpoint: securitySettingParams.oidcEndSessionEndpoint,
  244. oidcRegistrationEndpoint: securitySettingParams.oidcRegistrationEndpoint,
  245. oidcJWKSUri: securitySettingParams.oidcJWKSUri,
  246. oidcClientId: securitySettingParams.oidcClientId,
  247. oidcClientSecret: securitySettingParams.oidcClientSecret,
  248. oidcAttrMapId: securitySettingParams.oidcAttrMapId,
  249. oidcAttrMapUserName: securitySettingParams.oidcAttrMapUserName,
  250. oidcAttrMapName: securitySettingParams.oidcAttrMapName,
  251. oidcAttrMapEmail: securitySettingParams.oidcAttrMapEmail,
  252. isSameUsernameTreatedAsIdenticalUser: securitySettingParams.isSameUsernameTreatedAsIdenticalUser,
  253. isSameEmailTreatedAsIdenticalUser: securitySettingParams.isSameEmailTreatedAsIdenticalUser,
  254. });
  255. return response;
  256. }
  257. }