SamlSecuritySetting.jsx 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /* eslint-disable react/no-danger */
  2. import React from 'react';
  3. import PropTypes from 'prop-types';
  4. import { withTranslation } from 'react-i18next';
  5. import { createSubscribedElement } from '../../UnstatedUtils';
  6. import AppContainer from '../../../services/AppContainer';
  7. import AdminGeneralSecurityContainer from '../../../services/AdminGeneralSecurityContainer';
  8. import AdminSamlSecurityContainer from '../../../services/AdminSamlSecurityContainer';
  9. class SamlSecurityManagement extends React.Component {
  10. render() {
  11. const { t, adminGeneralSecurityContainer, adminSamlSecurityContainer } = this.props;
  12. const { useOnlyEnvVars } = adminSamlSecurityContainer.state;
  13. return (
  14. <React.Fragment>
  15. {useOnlyEnvVars && (
  16. <p
  17. className="alert alert-info"
  18. dangerouslySetInnerHTML={{ __html: t('security_setting.SAML.note for the only env option', { env: 'SAML_USES_ONLY_ENV_VARS_FOR_SOME_OPTIONS' }) }}
  19. />
  20. )}
  21. <div className="row mb-5">
  22. <strong className="col-xs-3 text-right">{ t('security_setting.SAML.name') }</strong>
  23. <div className="col-xs-6 text-left">
  24. <div className="checkbox checkbox-success">
  25. <input
  26. id="isSamlEnabled"
  27. type="checkbox"
  28. checked={adminGeneralSecurityContainer.state.isSamlEnabled}
  29. onChange={() => { adminGeneralSecurityContainer.switchIsSamlEnabled() }}
  30. />
  31. <label htmlFor="isSamlEnabled">
  32. { t('security_setting.SAML.enable_saml') }
  33. </label>
  34. </div>
  35. </div>
  36. </div>
  37. <div className="row mb-5">
  38. <label className="col-xs-3 text-right">{ t('security_setting.callback_URL') }</label>
  39. <div className="col-xs-6">
  40. <input
  41. className="form-control"
  42. type="text"
  43. value={adminSamlSecurityContainer.state.callbackUrl}
  44. readOnly
  45. />
  46. <p className="help-block small">{ t('security_setting.desc_of_callback_URL') }</p>
  47. {!adminSamlSecurityContainer.state.appSiteUrl && (
  48. <div className="alert alert-danger">
  49. <i
  50. className="icon-exclamation"
  51. // eslint-disable-next-line max-len
  52. dangerouslySetInnerHTML={{ __html: t('security_setting.alert_siteUrl_is_not_set', { link: `<a href="/admin/app">${t('App settings')}<i class="icon-login"></i></a>` }) }}
  53. />
  54. </div>
  55. )}
  56. </div>
  57. </div>
  58. {adminGeneralSecurityContainer.state.isSamlEnabled && (
  59. <React.Fragment>
  60. {(adminSamlSecurityContainer.state.missingMandatoryConfigKeys.length !== 0) && (
  61. <div className="alert alert-danger">
  62. { t('security_setting.missing mandatory configs') }
  63. <ul>
  64. {/* TODO GW-583 show li after fetch data */}
  65. {/* <li>{ t('security_setting.form_item_name.key') }</li> */}
  66. </ul>
  67. </div>
  68. )}
  69. <h3 className="alert-anchor border-bottom">
  70. Basic Settings
  71. </h3>
  72. <table className={`table settings-table ${adminSamlSecurityContainer.state.useOnlyEnvVars && 'use-only-env-vars'}`}>
  73. <colgroup>
  74. <col className="item-name" />
  75. <col className="from-db" />
  76. <col className="from-env-vars" />
  77. </colgroup>
  78. <thead>
  79. <tr><th></th><th>Database</th><th>Environment variables</th></tr>
  80. </thead>
  81. <tbody>
  82. <tr>
  83. <th>{ t('security_setting.form_item_name.entryPoint') }</th>
  84. <td>
  85. <input
  86. className="form-control"
  87. type="text"
  88. name="samlDbEntryPoint"
  89. readOnly={useOnlyEnvVars}
  90. value={adminSamlSecurityContainer.state.samlDbEntryPoint}
  91. onChange={e => adminSamlSecurityContainer.changeSamlDbEntryPoint(e.target.value)}
  92. />
  93. </td>
  94. <td>
  95. <input
  96. className="form-control"
  97. type="text"
  98. value={adminSamlSecurityContainer.state.samlEnvVarEntryPoint}
  99. readOnly
  100. />
  101. <p className="help-block">
  102. <small dangerouslySetInnerHTML={{ __html: t('security_setting.SAML.Use env var if empty', { env: 'SAML_ENTRY_POINT' }) }} />
  103. </p>
  104. </td>
  105. </tr>
  106. <tr>
  107. <th>{ t('security_setting.form_item_name.issuer') }</th>
  108. <td>
  109. <input
  110. className="form-control"
  111. type="text"
  112. name="samlEnvVarissuer"
  113. readOnly={useOnlyEnvVars}
  114. value={adminSamlSecurityContainer.state.samlDbIssuer}
  115. onChange={e => adminSamlSecurityContainer.changeSamlDbIssuer(e.target.value)}
  116. />
  117. </td>
  118. <td>
  119. <input
  120. className="form-control"
  121. type="text"
  122. value={adminSamlSecurityContainer.state.samlEnvVarIssuer}
  123. readOnly
  124. />
  125. <p className="help-block">
  126. <small dangerouslySetInnerHTML={{ __html: t('security_setting.SAML.Use env var if empty', { env: 'SAML_ISSUER' }) }} />
  127. </p>
  128. </td>
  129. </tr>
  130. <tr>
  131. <th>{ t('security_setting.form_item_name.cert') }</th>
  132. <td>
  133. <textarea
  134. className="form-control input-sm"
  135. type="text"
  136. rows="5"
  137. name="samlDbCert"
  138. readOnly={useOnlyEnvVars}
  139. value={adminSamlSecurityContainer.state.samlDbcert}
  140. onChange={e => adminSamlSecurityContainer.changeSamlDbCert(e.target.value)}
  141. />
  142. <p className="help-block">
  143. <small>
  144. { t('security_setting.SAML.cert_detail') }
  145. </small>
  146. </p>
  147. <div>
  148. <small>
  149. e.g.
  150. <pre>{`-----BEGIN CERTIFICATE-----
  151. MIICBzCCAXACCQD4US7+0A/b/zANBgkqhkiG9w0BAQsFADBIMQswCQYDVQQGEwJK
  152. UDEOMAwGA1UECAwFVG9reW8xFTATBgNVBAoMDFdFU0VFSywgSW5jLjESMBAGA1UE
  153. ...
  154. crmVwBzbloUO2l6k1ibwD2WVwpdxMKIF5z58HfKAvxZAzCHE7kMEZr1ge30WRXQA
  155. pWVdnzS1VCO8fKsJ7YYIr+JmHvseph3kFUOI5RqkCcMZlKUv83aUThsTHw==
  156. -----END CERTIFICATE-----
  157. `}
  158. </pre>
  159. </small>
  160. </div>
  161. </td>
  162. <td>
  163. <textarea
  164. className="form-control input-sm"
  165. type="text"
  166. rows="5"
  167. readOnly
  168. value={adminSamlSecurityContainer.state.samlEnvVarCert}
  169. />
  170. <p className="help-block">
  171. <small dangerouslySetInnerHTML={{ __html: t('security_setting.SAML.Use env var if empty', { env: 'SAML_CERT' }) }} />
  172. </p>
  173. </td>
  174. </tr>
  175. </tbody>
  176. </table>
  177. {/* TODO GW-635 Attribute Mapping */}
  178. </React.Fragment>
  179. )}
  180. </React.Fragment>
  181. );
  182. }
  183. }
  184. SamlSecurityManagement.propTypes = {
  185. t: PropTypes.func.isRequired, // i18next
  186. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  187. adminGeneralSecurityContainer: PropTypes.instanceOf(AdminGeneralSecurityContainer).isRequired,
  188. adminSamlSecurityContainer: PropTypes.instanceOf(AdminSamlSecurityContainer).isRequired,
  189. };
  190. const SamlSecurityManagementWrapper = (props) => {
  191. return createSubscribedElement(SamlSecurityManagement, props, [AppContainer, AdminGeneralSecurityContainer, AdminSamlSecurityContainer]);
  192. };
  193. export default withTranslation()(SamlSecurityManagementWrapper);