Просмотр исходного кода

Merge pull request #1533 from weseek/call-api-local-security-setting

Call api local security setting
itizawa 6 лет назад
Родитель
Сommit
85d61c550e

+ 42 - 3
src/client/js/components/Admin/Security/LocalSecuritySetting.jsx

@@ -4,18 +4,56 @@ import PropTypes from 'prop-types';
 import { withTranslation } from 'react-i18next';
 
 import { createSubscribedElement } from '../../UnstatedUtils';
+import { toastSuccess, toastError } from '../../../util/apiNotification';
 
 import AppContainer from '../../../services/AppContainer';
 import AdminGeneralSecurityContainer from '../../../services/AdminGeneralSecurityContainer';
 
 class LocalSecuritySetting extends React.Component {
 
+  constructor(props) {
+    super(props);
+
+    this.state = {
+      retrieveError: null,
+    };
+    this.putLocalSecuritySetting = this.putLocalSecuritySetting.bind(this);
+  }
+
+  async componentDidMount() {
+    const { adminGeneralSecurityContainer } = this.props;
+
+    try {
+      await adminGeneralSecurityContainer.retrieveSecurityData();
+    }
+    catch (err) {
+      toastError(err);
+      this.setState({ retrieveError: err });
+    }
+  }
+
+
+  async putLocalSecuritySetting() {
+    const { t, adminGeneralSecurityContainer } = this.props;
+    try {
+      await adminGeneralSecurityContainer.updateLocalSecuritySetting();
+      toastSuccess(t('security_setting.updated_general_security_setting'));
+    }
+    catch (err) {
+      toastError(err);
+    }
+  }
+
   render() {
     const { t, adminGeneralSecurityContainer } = this.props;
 
     return (
       <React.Fragment>
-
+        {this.state.retrieveError != null && (
+          <div className="alert alert-danger">
+            <p>{t('Error occurred')} : {this.state.err}</p>
+          </div>
+        )}
         <h2 className="alert-anchor border-bottom">
           { t('security_setting.Local.name') } { t('security_setting.configuration') }
         </h2>
@@ -100,7 +138,8 @@ class LocalSecuritySetting extends React.Component {
                     className="form-control"
                     type="textarea"
                     name="registrationWhiteList"
-                    placeholder={adminGeneralSecurityContainer.state.registrationWhiteList}
+                    value={adminGeneralSecurityContainer.state.registrationWhiteList}
+                    onChange={e => adminGeneralSecurityContainer.changeRegistrationWhiteList(e.target.value)}
                   />
                   <p className="help-block small">{ t('security_setting.restrict_emails') }<br />{ t('security_setting.for_instance') }
                     <code>@growi.org</code>{ t('security_setting.only_those') }<br />
@@ -114,7 +153,7 @@ class LocalSecuritySetting extends React.Component {
 
         {/*  TODO replace component */}
         <div className="col-xs-offset-3 col-xs-6 mb-5">
-          <button type="submit" className="btn btn-primary">{ t('Update') }</button>
+          <button type="submit" className="btn btn-primary" onClick={this.putLocalSecuritySetting}>{ t('Update') }</button>
         </div>
 
       </React.Fragment>

+ 26 - 0
src/client/js/services/AdminGeneralSecurityContainer.js

@@ -43,6 +43,7 @@ export default class AdminGeneralSecurityContainer extends Container {
   async retrieveSecurityData() {
     const response = await this.appContainer.apiv3.get('/security-setting/');
     const { generalSetting } = response.data.securityParams;
+    const { localSetting } = response.data.securityParams;
     this.onIsWikiModeForced(generalSetting.wikiMode);
     this.setState({
       currentRestrictGuestMode: generalSetting.restrictGuestMode || 'deny',
@@ -50,6 +51,9 @@ export default class AdminGeneralSecurityContainer extends Container {
       isHideRestrictedByOwner: generalSetting.hideRestrictedByOwner || false,
       isHideRestrictedByGroup: generalSetting.hideRestrictedByGroup || false,
       wikiMode: generalSetting.wikiMode || '',
+      isLocalEnabled: localSetting.isLocalEnabled || false,
+      registrationMode: localSetting.registrationMode || 'open',
+      registrationWhiteList: localSetting.registrationWhiteList.join('\n') || '',
     });
   }
 
@@ -129,6 +133,28 @@ export default class AdminGeneralSecurityContainer extends Container {
     this.setState({ registrationMode: value });
   }
 
+  /**
+   * Change registration white list
+   */
+  changeRegistrationWhiteList(value) {
+    this.setState({ registrationWhiteList: value });
+  }
+
+  /**
+  * update local security setting
+  */
+  async updateLocalSecuritySetting() {
+    let { registrationWhiteList } = this.state;
+    registrationWhiteList = Array.isArray(registrationWhiteList) ? registrationWhiteList : registrationWhiteList.split('\n');
+    const response = await this.appContainer.apiv3.put('/security-setting/local-setting', {
+      isLocalEnabled: this.state.isLocalEnabled,
+      registrationMode: this.state.registrationMode,
+      registrationWhiteList,
+    });
+    const { localSecuritySettingParams } = response.data;
+    return localSecuritySettingParams;
+  }
+
   /**
    * Switch LDAP enabled
    */

+ 69 - 0
src/server/routes/apiv3/security-setting.js

@@ -1,3 +1,4 @@
+
 /* eslint-disable max-len */
 /* eslint-disable no-unused-vars */
 const loggerFactory = require('@alias/logger');
@@ -19,6 +20,11 @@ const validator = {
     body('hideRestrictedByOwner').isBoolean(),
     body('hideRestrictedByGroup').isBoolean(),
   ],
+  localSetting: [
+    body('isLocalEnabled').isBoolean(),
+    body('registrationMode').isString(),
+    body('registrationWhiteList').isArray(),
+  ],
   ldapAuth: [
     body('serverUrl').isString(),
     body('isUserBind').isBoolean(),
@@ -103,6 +109,21 @@ const validator = {
  *          hideRestrictedByGroup:
  *            type: boolean
  *            description: enable hide by group
+ *      LocalSetting:
+ *        type: object
+ *        properties:
+ *          isLocalEnabled:
+ *            type: boolean
+ *            description: local setting mode
+ *          registrationMode:
+ *            type: string
+ *            description: type of registrationMode
+ *          registrationWhiteList:
+ *            type: array
+ *            description: array of regsitrationList
+ *            items:
+ *              type: string
+ *              description: registration whiteList
  *      LdapAuthSetting:
  *        type: object
  *        properties:
@@ -286,6 +307,11 @@ module.exports = (crowi) => {
         hideRestrictedByGroup: await crowi.configManager.getConfig('crowi', 'security:list-policy:hideRestrictedByGroup'),
         wikiMode: await crowi.configManager.getConfig('crowi', 'security:wikiMode'),
       },
+      localSetting: {
+        isLocalEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-local:isEnabled'),
+        registrationMode: await crowi.configManager.getConfig('crowi', 'security:registrationMode'),
+        registrationWhiteList: await crowi.configManager.getConfig('crowi', 'security:registrationWhiteList'),
+      },
       generalAuth: {
         isLdapEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-ldap:isEnabled'),
         isSamlEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-saml:isEnabled'),
@@ -417,6 +443,49 @@ module.exports = (crowi) => {
     }
   });
 
+  /**
+   * @swagger
+   *
+   *    /_api/v3/security-setting/local-setting:
+   *      put:
+   *        tags: [LocalSetting]
+   *        description: Update LocalSetting
+   *        requestBody:
+   *          required: true
+   *          content:
+   *            application/json:
+   *              schema:
+   *                $ref: '#/components/schemas/LocalSetting'
+   *        responses:
+   *          200:
+   *            description: Succeeded to update local Setting
+   *            content:
+   *              application/json:
+   *                schema:
+   *                  $ref: '#/components/schemas/LocalSetting'
+   */
+  router.put('/local-setting', loginRequiredStrictly, adminRequired, csrf, validator.localSetting, ApiV3FormValidator, async(req, res) => {
+    const requestParams = {
+      'security:passport-local:isEnabled': req.body.isLocalEnabled,
+      'security:registrationMode': req.body.registrationMode,
+      'security:registrationWhiteList': req.body.registrationWhiteList,
+    };
+    try {
+      await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
+      const localSettingParams = {
+        isLocalEnabled: await crowi.configManager.getConfig('crowi', 'security:passport-local:isEnabled'),
+        registrationMode: await crowi.configManager.getConfig('crowi', 'security:registrationMode'),
+        registrationWhiteList: await crowi.configManager.getConfig('crowi', 'security:registrationWhiteList'),
+      };
+      return res.apiv3({ localSettingParams });
+    }
+    catch (err) {
+      const msg = 'Error occurred in updating local setting';
+      logger.error('Error', err);
+      return res.apiv3Err(new ErrorV3(msg, 'update-local-setting failed'));
+    }
+  });
+
   /**
    * @swagger
    *