AdminOidcSecurityContainer.js 8.4 KB

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