import React, { Fragment, Component } from 'react'; import { Row, Col, Label, Button } from 'reactstrap'; import MainPanelTopbar from './main-panel-topbar'; import toaster from '../../components/toast'; import Loading from '../../components/loading'; import { gettext, orgID, serviceURL } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import Section from './section'; import InputItem from './input-item'; import FileItem from './file-item'; class OrgSAMLConfig extends Component { constructor(props) { super(props); this.state = { loading: true, errorMsg: '', samlConfigID: '', newUrlPrefix: '', orgUrlPrefix: '', metadataUrl: '', isBtnsShown: false, }; } toggleBtns = () => { this.setState({isBtnsShown: !this.state.isBtnsShown}); } hideBtns = () => { if (!this.state.isBtnsShown) return; if (this.state.newUrlPrefix !== this.state.orgUrlPrefix) { this.setState({newUrlPrefix: this.state.orgUrlPrefix}); } this.toggleBtns(); } onSubmit = () => { const newUrlPrefix = this.state.newUrlPrefix.trim(); if (newUrlPrefix !== this.state.orgUrlPrefix) { this.updateUrlPrefix(newUrlPrefix); } this.toggleBtns(); } inputOrgUrlPrefix = (e) => { this.setState({newUrlPrefix: e.target.value}); } inputMetadataUrl = (e) => { this.setState({metadataUrl: e.target.value}); } inputSingleSignOnService = (e) => { this.setState({singleSignOnService: e.target.value}); } inputSingleLogoutService = (e) => { this.setState({singleLogoutService: e.target.value}); } componentDidMount() { seafileAPI.orgAdminGetUrlPrefix(orgID).then((res) => { this.setState({ newUrlPrefix: res.data.org_url_prefix, orgUrlPrefix: res.data.org_url_prefix, }); seafileAPI.orgAdminGetSamlConfig(orgID).then((res) => { this.setState({ loading: false, samlConfigID: res.data.saml_config.id || '', metadataUrl: res.data.saml_config.metadata_url || '', }); }).catch(error => { this.setState({ loading: false, errorMsg: Utils.getErrorMsg(error, true), }); }); }).catch(error => { this.setState({ loading: false, errorMsg: Utils.getErrorMsg(error, true), }); }); } updateUrlPrefix = (newUrlPrefix) => { seafileAPI.orgAdminUpdateUrlPrefix(orgID, newUrlPrefix).then((res) => { this.setState({ newUrlPrefix: res.data.org_url_prefix, orgUrlPrefix: res.data.org_url_prefix, }); toaster.success(gettext('Success')); }).catch((error) => { this.setState({newUrlPrefix: this.state.orgUrlPrefix}); let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } postIdpCertificate = (file) => { seafileAPI.orgAdminUploadIdpCertificate(orgID, file).then(() => { toaster.success(gettext('Success')); }).catch((error) => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } addSamlConfig = () => { const { metadataUrl } = this.state; seafileAPI.orgAdminAddSamlConfig(orgID, metadataUrl).then((res) => { this.setState({ samlConfigID: res.data.saml_config.id, metadataUrl: res.data.saml_config.metadata_url, }); toaster.success(gettext('Success')); }).catch((error) => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } updateSamlConfig = () => { const { metadataUrl } = this.state; seafileAPI.orgAdminUpdateSamlConfig(orgID, metadataUrl).then((res) => { this.setState({ samlConfigID: res.data.saml_config.id, metadataUrl: res.data.saml_config.metadata_url, }); toaster.success(gettext('Success')); }).catch((error) => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } deleteSamlConfig = () => { seafileAPI.orgAdminDeleteSamlConfig(orgID).then(() => { this.setState({ samlConfigID: '', metadataUrl: '', }); toaster.success(gettext('Success')); }).catch((error) => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } render() { const { loading, errorMsg, samlConfigID, newUrlPrefix, metadataUrl, isBtnsShown } = this.state; return (

{gettext('SAML config')}

{loading && } {errorMsg &&

{errorMsg}

} {(!loading && !errorMsg) &&
{`${serviceURL}/org/custom/`} {this.newInput = input;}} value={newUrlPrefix} onChange={this.inputOrgUrlPrefix} onFocus={this.toggleBtns} onBlur={this.hideBtns}>

{gettext('The custom part of the URL should be 6 to 20 characters, and can only contain alphanumeric characters and hyphens.')}

{isBtnsShown && }
{samlConfigID ? : }
}
); } } export default OrgSAMLConfig;