SecurityManagement.jsx 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. import React, { Fragment } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { createSubscribedElement } from '../../UnstatedUtils';
  5. import AppContainer from '../../../services/AppContainer';
  6. import LdapSecuritySetting from './LdapSecuritySetting';
  7. import LocalSecuritySetting from './LocalSecuritySetting';
  8. import SamlSecuritySetting from './SamlSecuritySetting';
  9. import OidcSecuritySetting from './OidcSecuritySetting';
  10. import BasicSecuritySetting from './BasicSecuritySetting';
  11. import GoogleSecuritySetting from './GoogleSecuritySetting';
  12. import GithubSecuritySetting from './GithubSecuritySetting';
  13. import TwitterSecuritySetting from './TwitterSecuritySetting';
  14. class SecurityManagement extends React.Component {
  15. constructor(props) {
  16. super();
  17. }
  18. render() {
  19. const { t } = this.props;
  20. return (
  21. <Fragment>
  22. {/* TODO GW-582 reactify-admin */}
  23. <fieldset>
  24. <legend className="alert-anchor">{ t('security_settings') }</legend>
  25. <div className="form-group">
  26. <label htmlFor="settingForm[security:restrictGuestMode]" className="col-xs-3 control-label">{ t('security_setting.Guest Users Access') }</label>
  27. <div className="col-xs-6">
  28. <select
  29. className="form-control selectpicker"
  30. name="settingForm[security:restrictGuestMode]"
  31. value="{ getConfig('crowi', 'security:restrictGuestMode') }"
  32. >
  33. <option value="{ t(modeValue) }">{ t('modeLabel') }</option>
  34. </select>
  35. <p className="alert alert-warning mt-2">
  36. <i className="icon-exclamation icon-fw">
  37. </i><b>FIXED</b>
  38. { t('security_setting.Fixed by env var', 'FORCE_WIKI_MODE') }<br></br>
  39. </p>
  40. </div>
  41. </div>
  42. <div className="form-group">
  43. <label htmlFor="{{configName}}" className="col-xs-3 control-label">{ t('security_setting.page_listing_1') }</label>
  44. <div className="col-xs-9">
  45. <div className="btn-group btn-toggle" data-toggle="buttons">
  46. <label className="btn btn-default btn-rounded btn-outline {% if isEnabled %}active{% endif %}" data-active-class="primary">
  47. <input name="{{configName}}" value="false" type="radio"></input>
  48. </label>
  49. <label className="btn btn-default btn-rounded btn-outline {% if !isEnabled %}active{% endif %}" data-active-class="default">
  50. <input name="{{configName}}" value="true" type="radio"></input>
  51. </label>
  52. </div>
  53. <p className="help-block small">
  54. { t('security_setting.page_listing_1_desc') }
  55. </p>
  56. </div>
  57. </div>
  58. <div className="form-group">
  59. <label htmlFor="{{configName}}" className="col-xs-3 control-label">{ t('security_setting.page_listing_2') }</label>
  60. <div className="col-xs-9">
  61. <div className="btn-group btn-toggle" data-toggle="buttons">
  62. <label className="btn btn-default btn-rounded btn-outline {% if isEnabled %}active{% endif %}" data-active-class="primary">
  63. <input name="{{configName}}" value="false" type="radio" />
  64. </label>
  65. <label className="btn btn-default btn-rounded btn-outline {% if !isEnabled %}active{% endif %}" data-active-class="default">
  66. <input name="{{configName}}" value="true" type="radio" />
  67. </label>
  68. </div>
  69. <p className="help-block small">
  70. { t('security_setting.page_listing_2_desc') }
  71. </p>
  72. </div>
  73. </div>
  74. <div className="form-group">
  75. <label htmlFor="{{configName}}" className="col-xs-3 control-label">{ t('security_setting.complete_deletion') }</label>
  76. <div className="col-xs-6">
  77. <select className="form-control selectpicker" name="settingForm[security:pageCompleteDeletionAuthority]" value="{{ configValue }}">
  78. <option value="anyOne">{ t('security_setting.anyone') }</option>
  79. <option value="adminOnly">{ t('security_setting.admin_only') }</option>
  80. <option value="adminAndAuthor">{ t('security_setting.admin_and_author') }</option>
  81. </select>
  82. <p className="help-block small">
  83. { t('security_setting.complete_deletion_explain') }
  84. </p>
  85. </div>
  86. </div>
  87. {/* TODO GW-540 */}
  88. <div className="form-group">
  89. <div className="col-xs-offset-3 col-xs-6">
  90. <input type="hidden" name="_csrf" value={this.props.csrf} />
  91. </div>
  92. </div>
  93. </fieldset>
  94. {/* XSS configuration link */}
  95. <div className="mb-5">
  96. <h2 className="border-bottom">{ t('security_setting.xss_prevent_setting') }</h2>
  97. <div className="text-center">
  98. <a style={{ fontSize: 'large' }} href="/admin/markdown/#preventXSS">
  99. <i className="fa-fw icon-login"></i> { t('security_setting.xss_prevent_setting_link') }
  100. </a>
  101. </div>
  102. </div>
  103. {/* TODO 542~550 reactify-admin */}
  104. <div className="auth-mechanism-configurations m-t-10">
  105. <h2 className="border-bottom">{ t('security_setting.Authentication mechanism settings') }</h2>
  106. <div className="passport-settings">
  107. <ul className="nav nav-tabs" role="tablist">
  108. <li className="active">
  109. <a href="#passport-local" data-toggle="tab" role="tab"><i className="fa fa-users"></i> ID/Pass</a>
  110. </li>
  111. <li>
  112. <a href="#passport-ldap" data-toggle="tab" role="tab"><i className="fa fa-sitemap"></i> LDAP</a>
  113. </li>
  114. <li>
  115. <a href="#passport-saml" data-toggle="tab" role="tab"><i className="fa fa-key"></i> SAML</a>
  116. </li>
  117. <li>
  118. <a href="#passport-oidc" data-toggle="tab" role="tab"><i className="fa fa-openid"></i> OIDC</a>
  119. </li>
  120. <li>
  121. <a href="#passport-basic" data-toggle="tab" role="tab"><i className="fa fa-lock"></i> Basic</a>
  122. </li>
  123. <li>
  124. <a href="#passport-google-oauth" data-toggle="tab" role="tab"><i className="fa fa-google"></i> Google</a>
  125. </li>
  126. <li>
  127. <a href="#passport-github" data-toggle="tab" role="tab"><i className="fa fa-github"></i> GitHub</a>
  128. </li>
  129. <li>
  130. <a href="#passport-twitter" data-toggle="tab" role="tab"><i className="fa fa-twitter"></i> Twitter</a>
  131. </li>
  132. <li className="tbd">
  133. <a href="#passport-facebook" data-toggle="tab" role="tab"><i className="fa fa-facebook"></i> (TBD) Facebook</a>
  134. </li>
  135. </ul>
  136. <div className="tab-content p-t-10">
  137. <div id="passport-local" className="tab-pane active" role="tabpanel">
  138. <LocalSecuritySetting />
  139. </div>
  140. <div id="passport-ldap" className="tab-pane" role="tabpanel">
  141. <LdapSecuritySetting />
  142. </div>
  143. <div id="passport-saml" className="tab-pane" role="tabpanel">
  144. <SamlSecuritySetting />
  145. </div>
  146. <div id="passport-oidc" className="tab-pane" role="tabpanel">
  147. <OidcSecuritySetting />
  148. </div>
  149. <div id="passport-basic" className="tab-pane" role="tabpanel">
  150. <BasicSecuritySetting />
  151. </div>
  152. <div id="passport-google-oauth" className="tab-pane" role="tabpanel">
  153. <GoogleSecuritySetting />
  154. </div>
  155. <div id="passport-github" className="tab-pane" role="tabpanel">
  156. <GithubSecuritySetting />
  157. </div>
  158. <div id="passport-twitter" className="tab-pane" role="tabpanel">
  159. <TwitterSecuritySetting />
  160. </div>
  161. <div id="passport-facebook" className="tab-pane" role="tabpanel">
  162. {/* TODO GW-550 reactify facebook.html */}
  163. </div>
  164. </div>
  165. </div>
  166. </div>
  167. </Fragment>
  168. );
  169. }
  170. }
  171. SecurityManagement.propTypes = {
  172. t: PropTypes.func.isRequired, // i18next
  173. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  174. csrf: PropTypes.string,
  175. };
  176. const SecurityManagementWrapper = (props) => {
  177. return createSubscribedElement(SecurityManagement, props, [AppContainer]);
  178. };
  179. export default withTranslation()(SecurityManagementWrapper);