AdminOidcSecurityContainer.js 8.2 KB

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