diff --git a/ui/src/i18n/locales/en/nls.workflow.nodes.json b/ui/src/i18n/locales/en/nls.workflow.nodes.json
index 611cb22f..90b602fb 100644
--- a/ui/src/i18n/locales/en/nls.workflow.nodes.json
+++ b/ui/src/i18n/locales/en/nls.workflow.nodes.json
@@ -22,7 +22,7 @@
"workflow_node.apply.default_name": "Application",
"workflow_node.apply.form_anchor.parameters.tab": "Parameters",
"workflow_node.apply.form_anchor.challenge.tab": "Challenge",
- "workflow_node.apply.form_anchor.challenge.title": "Challenge settings",
+ "workflow_node.apply.form_anchor.challenge.title": "Challenge validation",
"workflow_node.apply.form_anchor.certificate.tab": "Certificate",
"workflow_node.apply.form_anchor.certificate.title": "Certificate settings",
"workflow_node.apply.form_anchor.advanced.tab": "Advanced",
@@ -40,7 +40,7 @@
"workflow_node.apply.form.contact_email.tooltip": "Contact information required for SSL certificate application. Please pay attention to the rate limits.",
"workflow_node.apply.form.challenge_type.label": "Challenge type",
"workflow_node.apply.form.challenge_type.placeholder": "Please select challenge type",
- "workflow_node.apply.form.challenge_type.tooltip": "For more information, see https://letsencrypt.org/docs/challenge-types/",
+ "workflow_node.apply.form.challenge_type.tooltip": "It makes the CAs to validate that you control the domain names in the certificate. Click here to learn more.",
"workflow_node.apply.form.provider.label": "Provider",
"workflow_node.apply.form.provider.placeholder": "Please select provider",
"workflow_node.apply.form.provider_dns01.label": "DNS provider",
diff --git a/ui/src/i18n/locales/zh/nls.workflow.nodes.json b/ui/src/i18n/locales/zh/nls.workflow.nodes.json
index 100a84a2..98bddd2e 100644
--- a/ui/src/i18n/locales/zh/nls.workflow.nodes.json
+++ b/ui/src/i18n/locales/zh/nls.workflow.nodes.json
@@ -37,10 +37,10 @@
"workflow_node.apply.form.domains.multiple_input_modal.placeholder": "请输入域名",
"workflow_node.apply.form.contact_email.label": "联系邮箱",
"workflow_node.apply.form.contact_email.placeholder": "请输入联系邮箱",
- "workflow_node.apply.form.contact_email.tooltip": "申请签发 SSL 证书时所需的联系方式。请注意 Let's Encrypt 账户注册的速率限制。点此了解更多。",
+ "workflow_node.apply.form.contact_email.tooltip": "申请签发 SSL 证书时所需的联系方式。请注意 Let's Encrypt 账户注册的速率限制。",
"workflow_node.apply.form.challenge_type.label": "质询方式",
"workflow_node.apply.form.challenge_type.placeholder": "请选择质询方式",
- "workflow_node.apply.form.challenge_type.tooltip": "这是什么?请参阅 https://letsencrypt.org/zh-cn/docs/challenge-types/",
+ "workflow_node.apply.form.challenge_type.tooltip": "申请签发 SSL 证书时用于使证书颁发机构验证你对域名的控制权。点此了解更多。",
"workflow_node.apply.form.provider.label": "提供商",
"workflow_node.apply.form.provider.placeholder": "请选择提供商",
"workflow_node.apply.form.provider_dns01.label": "DNS 提供商",
diff --git a/ui/src/pages/settings/SettingsSSLProvider.tsx b/ui/src/pages/settings/SettingsSSLProvider.tsx
index 5d97aa49..2367c67b 100644
--- a/ui/src/pages/settings/SettingsSSLProvider.tsx
+++ b/ui/src/pages/settings/SettingsSSLProvider.tsx
@@ -14,501 +14,6 @@ import { get as getSettings, save as saveSettings } from "@/repository/settings"
import { mergeCls } from "@/utils/css";
import { getErrMsg } from "@/utils/error";
-const SSLProviderContext = createContext(
- {} as {
- pending: boolean;
- settings: SettingsModel;
- updateSettings: (settings: MaybeModelRecordWithId>) => Promise;
- }
-);
-
-const SSLProviderEditFormLetsEncryptConfig = () => {
- const { t } = useTranslation();
-
- const { pending, settings, updateSettings } = useContext(SSLProviderContext);
-
- const { form: formInst, formProps } = useAntdForm>({
- initialValues: settings?.content?.config?.[CA_PROVIDERS.LETSENCRYPT],
- onSubmit: async (values) => {
- const newSettings = produce(settings, (draft) => {
- draft.content ??= {} as SSLProviderSettingsContent;
- draft.content.provider = CA_PROVIDERS.LETSENCRYPT;
-
- draft.content.config ??= {} as SSLProviderSettingsContent["config"];
- draft.content.config[CA_PROVIDERS.LETSENCRYPT] = values;
- });
- await updateSettings(newSettings);
-
- setFormChanged(false);
- },
- });
-
- const [formChanged, setFormChanged] = useState(false);
- useEffect(() => {
- setFormChanged(settings?.content?.provider !== CA_PROVIDERS.LETSENCRYPT);
- }, [settings?.content?.provider]);
-
- const handleFormChange = () => {
- setFormChanged(true);
- };
-
- return (
-
-
-
-
- );
-};
-
-const SSLProviderEditFormLetsEncryptStagingConfig = () => {
- const { t } = useTranslation();
-
- const { pending, settings, updateSettings } = useContext(SSLProviderContext);
-
- const { form: formInst, formProps } = useAntdForm>({
- initialValues: settings?.content?.config?.[CA_PROVIDERS.LETSENCRYPTSTAGING],
- onSubmit: async (values) => {
- const newSettings = produce(settings, (draft) => {
- draft.content ??= {} as SSLProviderSettingsContent;
- draft.content.provider = CA_PROVIDERS.LETSENCRYPTSTAGING;
-
- draft.content.config ??= {} as SSLProviderSettingsContent["config"];
- draft.content.config[CA_PROVIDERS.LETSENCRYPTSTAGING] = values;
- });
- await updateSettings(newSettings);
-
- setFormChanged(false);
- },
- });
-
- const [formChanged, setFormChanged] = useState(false);
- useEffect(() => {
- setFormChanged(settings?.content?.provider !== CA_PROVIDERS.LETSENCRYPTSTAGING);
- }, [settings?.content?.provider]);
-
- const handleFormChange = () => {
- setFormChanged(true);
- };
-
- return (
-
- } />
-
-
-
-
-
-
- );
-};
-
-const SSLProviderEditFormActalisSSLConfig = () => {
- const { t } = useTranslation();
-
- const { pending, settings, updateSettings } = useContext(SSLProviderContext);
-
- const formSchema = z.object({
- eabKid: z
- .string(t("access.form.actalisssl_eab_kid.placeholder"))
- .min(1, t("access.form.actalisssl_eab_kid.placeholder"))
- .max(256, t("common.errmsg.string_max", { max: 256 })),
- eabHmacKey: z
- .string(t("access.form.actalisssl_eab_hmac_key.placeholder"))
- .min(1, t("access.form.actalisssl_eab_hmac_key.placeholder"))
- .max(256, t("common.errmsg.string_max", { max: 256 })),
- });
- const formRule = createSchemaFieldRule(formSchema);
- const { form: formInst, formProps } = useAntdForm>({
- initialValues: settings?.content?.config?.[CA_PROVIDERS.ACTALISSSL],
- onSubmit: async (values) => {
- const newSettings = produce(settings, (draft) => {
- draft.content ??= {} as SSLProviderSettingsContent;
- draft.content.provider = CA_PROVIDERS.ACTALISSSL;
-
- draft.content.config ??= {} as SSLProviderSettingsContent["config"];
- draft.content.config[CA_PROVIDERS.ACTALISSSL] = values;
- });
- await updateSettings(newSettings);
-
- setFormChanged(false);
- },
- });
-
- const [formChanged, setFormChanged] = useState(false);
- useEffect(() => {
- setFormChanged(settings?.content?.provider !== CA_PROVIDERS.ACTALISSSL);
- }, [settings?.content?.provider]);
-
- const handleFormChange = () => {
- setFormChanged(true);
- };
-
- return (
- }
- >
-
-
-
- }
- >
-
-
-
-
-
-
-
- );
-};
-
-const SSLProviderEditFormBuypassConfig = () => {
- const { t } = useTranslation();
-
- const { pending, settings, updateSettings } = useContext(SSLProviderContext);
-
- const { form: formInst, formProps } = useAntdForm>({
- initialValues: settings?.content?.config?.[CA_PROVIDERS.BUYPASS],
- onSubmit: async (values) => {
- const newSettings = produce(settings, (draft) => {
- draft.content ??= {} as SSLProviderSettingsContent;
- draft.content.provider = CA_PROVIDERS.BUYPASS;
-
- draft.content.config ??= {} as SSLProviderSettingsContent["config"];
- draft.content.config[CA_PROVIDERS.BUYPASS] = values;
- });
- await updateSettings(newSettings);
-
- setFormChanged(false);
- },
- });
-
- const [formChanged, setFormChanged] = useState(false);
- useEffect(() => {
- setFormChanged(settings?.content?.provider !== CA_PROVIDERS.LETSENCRYPTSTAGING);
- }, [settings?.content?.provider]);
-
- const handleFormChange = () => {
- setFormChanged(true);
- };
-
- return (
-
-
-
-
- );
-};
-
-const SSLProviderEditFormGoogleTrustServicesConfig = () => {
- const { t } = useTranslation();
-
- const { pending, settings, updateSettings } = useContext(SSLProviderContext);
-
- const formSchema = z.object({
- eabKid: z
- .string(t("access.form.googletrustservices_eab_kid.placeholder"))
- .min(1, t("access.form.googletrustservices_eab_kid.placeholder"))
- .max(256, t("common.errmsg.string_max", { max: 256 })),
- eabHmacKey: z
- .string(t("access.form.googletrustservices_eab_hmac_key.placeholder"))
- .min(1, t("access.form.googletrustservices_eab_hmac_key.placeholder"))
- .max(256, t("common.errmsg.string_max", { max: 256 })),
- });
- const formRule = createSchemaFieldRule(formSchema);
- const { form: formInst, formProps } = useAntdForm>({
- initialValues: settings?.content?.config?.[CA_PROVIDERS.GOOGLETRUSTSERVICES],
- onSubmit: async (values) => {
- const newSettings = produce(settings, (draft) => {
- draft.content ??= {} as SSLProviderSettingsContent;
- draft.content.provider = CA_PROVIDERS.GOOGLETRUSTSERVICES;
-
- draft.content.config ??= {} as SSLProviderSettingsContent["config"];
- draft.content.config[CA_PROVIDERS.GOOGLETRUSTSERVICES] = values;
- });
- await updateSettings(newSettings);
-
- setFormChanged(false);
- },
- });
-
- const [formChanged, setFormChanged] = useState(false);
- useEffect(() => {
- setFormChanged(settings?.content?.provider !== CA_PROVIDERS.GOOGLETRUSTSERVICES);
- }, [settings?.content?.provider]);
-
- const handleFormChange = () => {
- setFormChanged(true);
- };
-
- return (
- }
- >
-
-
-
- }
- >
-
-
-
-
-
-
-
- );
-};
-
-const SSLProviderEditFormSSLComConfig = () => {
- const { t } = useTranslation();
-
- const { pending, settings, updateSettings } = useContext(SSLProviderContext);
-
- const formSchema = z.object({
- eabKid: z
- .string(t("access.form.sslcom_eab_kid.placeholder"))
- .min(1, t("access.form.sslcom_eab_kid.placeholder"))
- .max(256, t("common.errmsg.string_max", { max: 256 })),
- eabHmacKey: z
- .string(t("access.form.sslcom_eab_hmac_key.placeholder"))
- .min(1, t("access.form.sslcom_eab_hmac_key.placeholder"))
- .max(256, t("common.errmsg.string_max", { max: 256 })),
- });
- const formRule = createSchemaFieldRule(formSchema);
- const { form: formInst, formProps } = useAntdForm>({
- initialValues: settings?.content?.config?.[CA_PROVIDERS.SSLCOM],
- onSubmit: async (values) => {
- const newSettings = produce(settings, (draft) => {
- draft.content ??= {} as SSLProviderSettingsContent;
- draft.content.provider = CA_PROVIDERS.SSLCOM;
-
- draft.content.config ??= {} as SSLProviderSettingsContent["config"];
- draft.content.config[CA_PROVIDERS.SSLCOM] = values;
- });
- await updateSettings(newSettings);
-
- setFormChanged(false);
- },
- });
-
- const [formChanged, setFormChanged] = useState(false);
- useEffect(() => {
- setFormChanged(settings?.content?.provider !== CA_PROVIDERS.SSLCOM);
- }, [settings?.content?.provider]);
-
- const handleFormChange = () => {
- setFormChanged(true);
- };
-
- return (
- }
- >
-
-
-
- }
- >
-
-
-
-
-
-
-
- );
-};
-
-const SSLProviderEditFormZeroSSLConfig = () => {
- const { t } = useTranslation();
-
- const { pending, settings, updateSettings } = useContext(SSLProviderContext);
-
- const formSchema = z.object({
- eabKid: z
- .string(t("access.form.zerossl_eab_kid.placeholder"))
- .min(1, t("access.form.zerossl_eab_kid.placeholder"))
- .max(256, t("common.errmsg.string_max", { max: 256 })),
- eabHmacKey: z
- .string(t("access.form.zerossl_eab_hmac_key.placeholder"))
- .min(1, t("access.form.zerossl_eab_hmac_key.placeholder"))
- .max(256, t("common.errmsg.string_max", { max: 256 })),
- });
- const formRule = createSchemaFieldRule(formSchema);
- const { form: formInst, formProps } = useAntdForm>({
- initialValues: settings?.content?.config?.[CA_PROVIDERS.ZEROSSL],
- onSubmit: async (values) => {
- const newSettings = produce(settings, (draft) => {
- draft.content ??= {} as SSLProviderSettingsContent;
- draft.content.provider = CA_PROVIDERS.ZEROSSL;
-
- draft.content.config ??= {} as SSLProviderSettingsContent["config"];
- draft.content.config[CA_PROVIDERS.ZEROSSL] = values;
- });
- await updateSettings(newSettings);
-
- setFormChanged(false);
- },
- });
-
- const [formChanged, setFormChanged] = useState(false);
- useEffect(() => {
- setFormChanged(settings?.content?.provider !== CA_PROVIDERS.ZEROSSL);
- }, [settings?.content?.provider]);
-
- const handleFormChange = () => {
- setFormChanged(true);
- };
-
- return (
- }
- >
-
-
-
- }
- >
-
-
-
-
-
-
-
- );
-};
-
-const SSLProviderEditFormACMECAConfig = () => {
- const { t } = useTranslation();
-
- const { pending, settings, updateSettings } = useContext(SSLProviderContext);
-
- const formSchema = z.object({
- endpoint: z.url(t("common.errmsg.url_invalid")),
- eabKid: z
- .string(t("access.form.acmeca_eab_kid.placeholder"))
- .min(1, t("access.form.acmeca_eab_kid.placeholder"))
- .max(256, t("common.errmsg.string_max", { max: 256 })),
- eabHmacKey: z
- .string(t("access.form.acmeca_eab_hmac_key.placeholder"))
- .min(1, t("access.form.acmeca_eab_hmac_key.placeholder"))
- .max(256, t("common.errmsg.string_max", { max: 256 })),
- });
- const formRule = createSchemaFieldRule(formSchema);
- const { form: formInst, formProps } = useAntdForm>({
- initialValues: settings?.content?.config?.[CA_PROVIDERS.ACMECA],
- onSubmit: async (values) => {
- const newSettings = produce(settings, (draft) => {
- draft.content ??= {} as SSLProviderSettingsContent;
- draft.content.provider = CA_PROVIDERS.ACMECA;
-
- draft.content.config ??= {} as SSLProviderSettingsContent["config"];
- draft.content.config[CA_PROVIDERS.ACMECA] = values;
- });
- await updateSettings(newSettings);
-
- setFormChanged(false);
- },
- });
-
- const [formChanged, setFormChanged] = useState(false);
- useEffect(() => {
- setFormChanged(settings?.content?.provider !== CA_PROVIDERS.ACMECA);
- }, [settings?.content?.provider]);
-
- const handleFormChange = () => {
- setFormChanged(true);
- };
-
- return (
- }
- >
-
-
-
- }
- >
-
-
-
- }
- >
-
-
-
-
-
-
-
- );
-};
-
const SettingsSSLProvider = () => {
const { t } = useTranslation();
@@ -554,21 +59,21 @@ const SettingsSSLProvider = () => {
const providerFormEl = useMemo(() => {
switch (providerValue) {
case CA_PROVIDERS.LETSENCRYPT:
- return ;
+ return ;
case CA_PROVIDERS.LETSENCRYPTSTAGING:
- return ;
+ return ;
case CA_PROVIDERS.ACTALISSSL:
- return ;
+ return ;
case CA_PROVIDERS.BUYPASS:
- return ;
+ return ;
case CA_PROVIDERS.GOOGLETRUSTSERVICES:
- return ;
+ return ;
case CA_PROVIDERS.SSLCOM:
- return ;
+ return ;
case CA_PROVIDERS.ZEROSSL:
- return ;
+ return ;
case CA_PROVIDERS.ACMECA:
- return ;
+ return ;
}
}, [providerValue]);
@@ -589,7 +94,7 @@ const SettingsSSLProvider = () => {
};
return (
- {
{providerFormEl}
-
+
+ );
+};
+
+const InternalSettingsContext = createContext(
+ {} as {
+ pending: boolean;
+ settings: SettingsModel;
+ updateSettings: (settings: MaybeModelRecordWithId>) => Promise;
+ }
+);
+
+const InternalSharedForm = ({ children, provider }: { children?: React.ReactNode; provider: CAProviderType }) => {
+ const { t } = useTranslation();
+
+ const { pending, settings, updateSettings } = useContext(InternalSettingsContext);
+
+ const { form: formInst, formProps } = useAntdForm>({
+ initialValues: settings?.content?.config?.[provider],
+ onSubmit: async (values) => {
+ const newSettings = produce(settings, (draft) => {
+ draft.content ??= {} as SSLProviderSettingsContent;
+ draft.content.provider = provider;
+
+ draft.content.config ??= {} as SSLProviderSettingsContent["config"];
+ draft.content.config[provider] = values;
+ });
+ await updateSettings(newSettings);
+
+ setFormChanged(false);
+ },
+ });
+
+ const [formChanged, setFormChanged] = useState(false);
+ useEffect(() => {
+ setFormChanged(provider !== settings?.content?.provider);
+ }, [provider, settings?.content?.provider]);
+
+ const handleFormChange = () => {
+ setFormChanged(true);
+ };
+
+ return (
+
+
+
+
+ );
+};
+
+const InternalSharedFormEabFields = ({ i18nKey }: { i18nKey: string }) => {
+ const { t } = useTranslation();
+
+ const formSchema = z.object({
+ endpoint: z.url(t("common.errmsg.url_invalid")),
+ eabKid: z
+ .string(t(`access.form.${i18nKey}_eab_kid.label`))
+ .min(1, t(`access.form.${i18nKey}_eab_kid.label`))
+ .max(256, t("common.errmsg.string_max", { max: 256 })),
+ eabHmacKey: z
+ .string(t(`access.form.${i18nKey}_eab_hmac_key.label`))
+ .min(1, t(`access.form.${i18nKey}_eab_hmac_key.label`))
+ .max(256, t("common.errmsg.string_max", { max: 256 })),
+ });
+ const formRule = createSchemaFieldRule(formSchema);
+
+ return (
+ <>
+ }
+ >
+
+
+
+ }
+ >
+
+
+ >
+ );
+};
+
+const InternalSettingsFormProviderLetsEncrypt = () => {
+ return ;
+};
+
+const InternalSettingsFormProviderLetsEncryptStaging = () => {
+ const { t } = useTranslation();
+
+ return (
+
+
+ } />
+
+
+ );
+};
+
+const InternalSettingsFormProviderActalisSSL = () => {
+ return (
+
+
+
+ );
+};
+
+const InternalSettingsFormProviderBuypass = () => {
+ return ;
+};
+
+const InternalSettingsFormProviderGoogleTrustServices = () => {
+ return (
+
+
+
+ );
+};
+
+const InternalSettingsFormProviderSSLCom = () => {
+ return (
+
+
+
+ );
+};
+
+const InternalSettingsFormProviderZeroSSL = () => {
+ return (
+
+
+
+ );
+};
+
+const InternalSettingsFormProviderACMECA = () => {
+ const { t } = useTranslation();
+
+ const formSchema = z.object({
+ endpoint: z.url(t("common.errmsg.url_invalid")),
+ eabKid: z
+ .string(t("access.form.acmeca_eab_kid.placeholder"))
+ .max(256, t("common.errmsg.string_max", { max: 256 }))
+ .nullish(),
+ eabHmacKey: z
+ .string(t("access.form.acmeca_eab_hmac_key.placeholder"))
+ .max(256, t("common.errmsg.string_max", { max: 256 }))
+ .nullish(),
+ });
+ const formRule = createSchemaFieldRule(formSchema);
+
+ return (
+
+ }
+ >
+
+
+
+ }
+ >
+
+
+
+ }
+ >
+
+
+
);
};