import React from 'react'; import { connect } from 'react-redux'; import { Field, reduxForm, formValueSelector } from 'redux-form'; import { Trans, withTranslation } from 'react-i18next'; import flow from 'lodash/flow'; import { renderInputField, CheckboxField, renderRadioField, toNumber } from '../../../helpers/form'; import { validateServerName, validateIsSafePort, validatePort, validatePortQuic, validatePortTLS, validatePlainDns, } 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, ENCRYPTION_SOURCE, } from '../../../helpers/constants'; const validate = (values: any) => { const errors: { port_dns_over_tls?: string; port_https?: string } = {}; 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: any, setTlsConfig: any, validateTlsConfig: any, t: any) => { 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, private_key_saved: false, serve_plain_dns: true, }; // eslint-disable-next-line no-alert if (window.confirm(t('encryption_reset'))) { Object.keys(fields) .forEach((field) => change(field, fields[field])); setTlsConfig(fields); validateTlsConfig(fields); } }; const validationMessage = (warningValidation: any, isWarning: any) => { if (!warningValidation) { return null; } if (isWarning) { return (

encryption_warning: {warningValidation}

); } return (

{warningValidation}

); }; interface FormProps { handleSubmit: (...args: unknown[]) => string; handleChange?: (...args: unknown[]) => unknown; isEnabled: boolean; servePlainDns: boolean; certificateChain: string; privateKey: string; certificatePath: string; privateKeyPath: string; change: (...args: unknown[]) => unknown; submitting: boolean; invalid: boolean; initialValues: object; processingConfig: boolean; processingValidate: boolean; status_key?: string; not_after?: string; warning_validation?: string; valid_chain?: boolean; valid_key?: boolean; valid_cert?: boolean; valid_pair?: boolean; dns_names?: string[]; key_type?: string; issuer?: string; subject?: string; t: (...args: unknown[]) => string; setTlsConfig: (...args: unknown[]) => unknown; validateTlsConfig: (...args: unknown[]) => unknown; certificateSource?: string; privateKeySource?: string; privateKeySaved?: boolean; } let Form = (props: FormProps) => { const { t, handleSubmit, handleChange, isEnabled, servePlainDns, 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, validateTlsConfig, certificateSource, privateKeySource, privateKeySaved, } = props; const isSavingDisabled = () => { const processing = submitting || processingConfig || processingValidate; if (servePlainDns && !isEnabled) { return invalid || processing; } return invalid || processing || !valid_key || !valid_cert || !valid_pair; }; const isDisabled = isSavingDisabled(); const isWarning = valid_key && valid_cert && valid_pair; return (
encryption_enable_desc
encryption_plain_dns_desc

encryption_server_desc
encryption_redirect_desc
encryption_https_desc
encryption_dot_desc
encryption_doq_desc
link , ]}> encryption_certificates_desc
{certificateSource === ENCRYPTION_SOURCE.CONTENT && ( )} {certificateSource === ENCRYPTION_SOURCE.PATH && ( )}
{(certificateChain || certificatePath) && ( )}
{privateKeySource === ENCRYPTION_SOURCE.PATH && ( )} {privateKeySource === ENCRYPTION_SOURCE.CONTENT && [ { if (event.target.checked) { change('private_key', ''); } if (handleChange) { handleChange(event); } }} />, , ]}
{(privateKey || privateKeyPath) && }
{validationMessage(warning_validation, isWarning)}
); }; const selector = formValueSelector(FORM_NAME.ENCRYPTION); Form = connect((state) => { const isEnabled = selector(state, 'enabled'); const servePlainDns = selector(state, 'serve_plain_dns'); 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'); const privateKeySaved = selector(state, 'private_key_saved'); return { isEnabled, servePlainDns, certificateChain, privateKey, certificatePath, privateKeyPath, certificateSource, privateKeySource, privateKeySaved, }; })(Form); export default flow([ withTranslation(), reduxForm({ form: FORM_NAME.ENCRYPTION, validate, }), ])(Form);