import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import { Field, reduxForm, formValueSelector } from 'redux-form'; import { Trans, withTranslation } from 'react-i18next'; import flow from 'lodash/flow'; import { renderInputField, renderCheckboxField, renderRadioField, toNumber, } from '../../../helpers/form'; import { validateIsSafePort, validatePort, validatePortQuic, validatePortTLS, } from '../../../helpers/validators'; import i18n from '../../../i18n'; import KeyStatus from './KeyStatus'; import CertificateStatus from './CertificateStatus'; import { DNS_OVER_QUIC_PORT, DNS_OVER_TLS_PORT, FORM_NAME, STANDARD_HTTPS_PORT, } from '../../../helpers/constants'; const validate = (values) => { const errors = {}; if (values.port_dns_over_tls && values.port_https) { if (values.port_dns_over_tls === values.port_https) { errors.port_dns_over_tls = i18n.t('form_error_equal'); errors.port_https = i18n.t('form_error_equal'); } } return errors; }; const clearFields = (change, setTlsConfig, t) => { const fields = { private_key: '', certificate_chain: '', private_key_path: '', certificate_path: '', port_https: STANDARD_HTTPS_PORT, port_dns_over_tls: DNS_OVER_TLS_PORT, port_dns_over_quic: DNS_OVER_QUIC_PORT, server_name: '', force_https: false, enabled: false, }; // eslint-disable-next-line no-alert if (window.confirm(t('encryption_reset'))) { Object.keys(fields) .forEach((field) => change(field, fields[field])); setTlsConfig(fields); } }; let Form = (props) => { const { t, handleSubmit, handleChange, isEnabled, certificateChain, privateKey, certificatePath, privateKeyPath, change, invalid, submitting, processingConfig, processingValidate, not_after, valid_chain, valid_key, valid_cert, valid_pair, dns_names, key_type, issuer, subject, warning_validation, setTlsConfig, certificateSource, privateKeySource, } = props; const isSavingDisabled = invalid || submitting || processingConfig || processingValidate || !valid_key || !valid_cert || !valid_pair; return (
); }; Form.propTypes = { handleSubmit: PropTypes.func.isRequired, handleChange: PropTypes.func, isEnabled: PropTypes.bool.isRequired, certificateChain: PropTypes.string.isRequired, privateKey: PropTypes.string.isRequired, certificatePath: PropTypes.string.isRequired, privateKeyPath: PropTypes.string.isRequired, change: PropTypes.func.isRequired, submitting: PropTypes.bool.isRequired, invalid: PropTypes.bool.isRequired, initialValues: PropTypes.object.isRequired, processingConfig: PropTypes.bool.isRequired, processingValidate: PropTypes.bool.isRequired, status_key: PropTypes.string, not_after: PropTypes.string, warning_validation: PropTypes.string, valid_chain: PropTypes.bool, valid_key: PropTypes.bool, valid_cert: PropTypes.bool, valid_pair: PropTypes.bool, dns_names: PropTypes.string, key_type: PropTypes.string, issuer: PropTypes.string, subject: PropTypes.string, t: PropTypes.func.isRequired, setTlsConfig: PropTypes.func.isRequired, certificateSource: PropTypes.string, privateKeySource: PropTypes.string, }; const selector = formValueSelector(FORM_NAME.ENCRYPTION); Form = connect((state) => { const isEnabled = selector(state, 'enabled'); const certificateChain = selector(state, 'certificate_chain'); const privateKey = selector(state, 'private_key'); const certificatePath = selector(state, 'certificate_path'); const privateKeyPath = selector(state, 'private_key_path'); const certificateSource = selector(state, 'certificate_source'); const privateKeySource = selector(state, 'key_source'); return { isEnabled, certificateChain, privateKey, certificatePath, privateKeyPath, certificateSource, privateKeySource, }; })(Form); export default flow([ withTranslation(), reduxForm({ form: FORM_NAME.ENCRYPTION, validate, }), ])(Form);