SecurityManagement.jsx 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import React, { Fragment } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import {
  5. TabContent, TabPane, Nav, NavItem, NavLink,
  6. } from 'reactstrap';
  7. import { createSubscribedElement } from '../../UnstatedUtils';
  8. import AppContainer from '../../../services/AppContainer';
  9. import LdapSecuritySetting from './LdapSecuritySetting';
  10. import LocalSecuritySetting from './LocalSecuritySetting';
  11. import SamlSecuritySetting from './SamlSecuritySetting';
  12. import OidcSecuritySetting from './OidcSecuritySetting';
  13. import SecuritySetting from './SecuritySetting';
  14. import BasicSecuritySetting from './BasicSecuritySetting';
  15. import GoogleSecuritySetting from './GoogleSecuritySetting';
  16. import GitHubSecuritySetting from './GitHubSecuritySetting';
  17. import TwitterSecuritySetting from './TwitterSecuritySetting';
  18. import FacebookSecuritySetting from './FacebookSecuritySetting';
  19. class SecurityManagement extends React.Component {
  20. constructor() {
  21. super();
  22. this.state = {
  23. activeTab: 'passport-local',
  24. // Prevent unnecessary rendering
  25. activeComponents: new Set(['passport-local']),
  26. };
  27. this.toggleActiveTab = this.toggleActiveTab.bind(this);
  28. }
  29. toggleActiveTab(activeTab) {
  30. this.setState({
  31. activeTab, activeComponents: this.state.activeComponents.add(activeTab),
  32. });
  33. }
  34. render() {
  35. const { t } = this.props;
  36. const { activeTab, activeComponents } = this.state;
  37. return (
  38. <Fragment>
  39. <div>
  40. <SecuritySetting />
  41. </div>
  42. {/* XSS configuration link */}
  43. <div className="mb-5">
  44. <h2 className="border-bottom">{t('security_setting.xss_prevent_setting')}</h2>
  45. <div className="text-center">
  46. <a style={{ fontSize: 'large' }} href="/admin/markdown/#preventXSS">
  47. <i className="fa-fw icon-login"></i> {t('security_setting.xss_prevent_setting_link')}
  48. </a>
  49. </div>
  50. </div>
  51. <div className="auth-mechanism-configurations m-t-10">
  52. <h2 className="border-bottom">{t('security_setting.Authentication mechanism settings')}</h2>
  53. <Nav tabs>
  54. <NavItem>
  55. <NavLink
  56. className={`${activeTab === 'passport-local' && 'active'} `}
  57. onClick={() => { this.toggleActiveTab('passport-local') }}
  58. href="#passport-local"
  59. >
  60. <i className="fa fa-users" /> ID/Pass
  61. </NavLink>
  62. </NavItem>
  63. <NavItem>
  64. <NavLink
  65. className={`${activeTab === 'passport-ldap' && 'active'} `}
  66. onClick={() => { this.toggleActiveTab('passport-ldap') }}
  67. href="#passport-ldap"
  68. >
  69. <i className="fa fa-sitemap" /> LDAP
  70. </NavLink>
  71. </NavItem>
  72. <NavItem>
  73. <NavLink
  74. className={`${activeTab === 'passport-saml' && 'active'} `}
  75. onClick={() => { this.toggleActiveTab('passport-saml') }}
  76. href="#passport-saml"
  77. >
  78. <i className="fa fa-key" /> SAML
  79. </NavLink>
  80. </NavItem>
  81. <NavItem>
  82. <NavLink
  83. className={`${activeTab === 'passport-oidc' && 'active'} `}
  84. onClick={() => { this.toggleActiveTab('passport-oidc') }}
  85. href="#passport-oidc"
  86. >
  87. <i className="fa fa-openid" /> OIDC
  88. </NavLink>
  89. </NavItem>
  90. <NavItem>
  91. <NavLink
  92. className={`${activeTab === 'passport-basic' && 'active'} `}
  93. onClick={() => { this.toggleActiveTab('passport-basic') }}
  94. href="#passport-basic"
  95. >
  96. <i className="fa fa-lock" /> BASIC
  97. </NavLink>
  98. </NavItem>
  99. <NavItem>
  100. <NavLink
  101. className={`${activeTab === 'passport-google' && 'active'} `}
  102. onClick={() => { this.toggleActiveTab('passport-google') }}
  103. href="#passport-google"
  104. >
  105. <i className="fa fa-google" /> Google
  106. </NavLink>
  107. </NavItem>
  108. <NavItem>
  109. <NavLink
  110. className={`${activeTab === 'passport-github' && 'active'} `}
  111. onClick={() => { this.toggleActiveTab('passport-github') }}
  112. href="#passport-github"
  113. >
  114. <i className="fa fa-github" /> GitHub
  115. </NavLink>
  116. </NavItem>
  117. <NavItem>
  118. <NavLink
  119. className={`${activeTab === 'passport-twitter' && 'active'} `}
  120. onClick={() => { this.toggleActiveTab('passport-twitter') }}
  121. href="#passport-twitter"
  122. >
  123. <i className="fa fa-twitter" /> Twitter
  124. </NavLink>
  125. </NavItem>
  126. <NavItem>
  127. <NavLink
  128. className={`${activeTab === 'passport-facebook' && 'active'} `}
  129. onClick={() => { this.toggleActiveTab('passport-facebook') }}
  130. href="#passport-facebook"
  131. >
  132. <i className="fa fa-facebook" /> (TBD) Facebook
  133. </NavLink>
  134. </NavItem>
  135. </Nav>
  136. <TabContent activeTab={activeTab} className="mt-2">
  137. <TabPane tabId="passport-local">
  138. {activeComponents.has('passport-local') && <LocalSecuritySetting />}
  139. </TabPane>
  140. <TabPane tabId="passport-ldap">
  141. {activeComponents.has('passport-ldap') && <LdapSecuritySetting />}
  142. </TabPane>
  143. <TabPane tabId="passport-saml">
  144. {activeComponents.has('passport-saml') && <SamlSecuritySetting />}
  145. </TabPane>
  146. <TabPane tabId="passport-oidc">
  147. {activeComponents.has('passport-oidc') && <OidcSecuritySetting />}
  148. </TabPane>
  149. <TabPane tabId="passport-basic">
  150. {activeComponents.has('passport-basic') && <BasicSecuritySetting />}
  151. </TabPane>
  152. <TabPane tabId="passport-google">
  153. {activeComponents.has('passport-google') && <GoogleSecuritySetting />}
  154. </TabPane>
  155. <TabPane tabId="passport-github">
  156. {activeComponents.has('passport-github') && <GitHubSecuritySetting />}
  157. </TabPane>
  158. <TabPane tabId="passport-twitter">
  159. {activeComponents.has('passport-twitter') && <TwitterSecuritySetting />}
  160. </TabPane>
  161. <TabPane tabId="passport-facebook">
  162. {activeComponents.has('passport-facebook') && <FacebookSecuritySetting />}
  163. </TabPane>
  164. </TabContent>
  165. </div>
  166. </Fragment>
  167. );
  168. }
  169. }
  170. SecurityManagement.propTypes = {
  171. t: PropTypes.func.isRequired, // i18next
  172. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  173. csrf: PropTypes.string,
  174. };
  175. const SecurityManagementWrapper = (props) => {
  176. return createSubscribedElement(SecurityManagement, props, [AppContainer]);
  177. };
  178. export default withTranslation()(SecurityManagementWrapper);