diff --git a/ui/public/imgs/providers/acmedns.svg b/ui/public/imgs/providers/acmedns.svg new file mode 100644 index 00000000..936ca077 --- /dev/null +++ b/ui/public/imgs/providers/acmedns.svg @@ -0,0 +1,2 @@ + + diff --git a/ui/src/components/access/AccessForm.tsx b/ui/src/components/access/AccessForm.tsx index ba9e1318..204eb6e2 100644 --- a/ui/src/components/access/AccessForm.tsx +++ b/ui/src/components/access/AccessForm.tsx @@ -13,6 +13,7 @@ import { useAntdForm, useAntdFormName } from "@/hooks"; import AccessForm1PanelConfig from "./AccessForm1PanelConfig"; import AccessFormACMECAConfig from "./AccessFormACMECAConfig"; +import AccessFormACMEDNSConfig from "./AccessFormACMEDNSConfig"; import AccessFormACMEHttpReqConfig from "./AccessFormACMEHttpReqConfig"; import AccessFormAliyunConfig from "./AccessFormAliyunConfig"; import AccessFormAPISIXConfig from "./AccessFormAPISIXConfig"; @@ -193,6 +194,8 @@ const AccessForm = forwardRef(({ className, return ; case ACCESS_PROVIDERS.ACMECA: return ; + case ACCESS_PROVIDERS.ACMEDNS: + return ; case ACCESS_PROVIDERS.ACMEHTTPREQ: return ; case ACCESS_PROVIDERS.ALIYUN: diff --git a/ui/src/components/access/AccessFormACMEDNSConfig.tsx b/ui/src/components/access/AccessFormACMEDNSConfig.tsx new file mode 100644 index 00000000..c842d97f --- /dev/null +++ b/ui/src/components/access/AccessFormACMEDNSConfig.tsx @@ -0,0 +1,85 @@ +import { useTranslation } from "react-i18next"; +import { Form, type FormInstance, Input } from "antd"; +import { createSchemaFieldRule } from "antd-zod"; +import { z } from "zod/v4"; + +import { type AccessConfigForACMEDNS } from "@/domain/access"; + +type AccessFormACMEDNSConfigFieldValues = Nullish; + +export interface AccessFormACMEDNSConfigProps { + form: FormInstance; + formName: string; + disabled?: boolean; + initialValues?: AccessFormACMEDNSConfigFieldValues; + onValuesChange?: (values: AccessFormACMEDNSConfigFieldValues) => void; +} + +const initFormModel = (): AccessFormACMEDNSConfigFieldValues => { + return { + apiBase: "https://auth.acme-dns.io/", + storageBaseUrl: "", + storagePath: "", + }; +}; + +const AccessFormACMEDNSConfig = ({ form: formInst, formName, disabled, initialValues, onValuesChange }: AccessFormACMEDNSConfigProps) => { + const { t } = useTranslation(); + + const formSchema = z.object({ + apiBase: z.url(t("common.errmsg.url_invalid")), + storageBaseUrl: z + .string() + .max(256, t("common.errmsg.string_max", { max: 256 })) + .nullish(), + storagePath: z + .string() + .max(256, t("common.errmsg.string_max", { max: 256 })) + .nullish(), + }); + const formRule = createSchemaFieldRule(formSchema); + + const handleFormChange = (_: unknown, values: z.infer) => { + onValuesChange?.(values); + }; + + return ( +
+ } + > + + + + } + > + + + + } + > + + +
+ ); +}; + +export default AccessFormACMEDNSConfig; diff --git a/ui/src/domain/access.ts b/ui/src/domain/access.ts index 51555f07..fcf5ebaf 100644 --- a/ui/src/domain/access.ts +++ b/ui/src/domain/access.ts @@ -8,6 +8,7 @@ export interface AccessModel extends BaseModel { ( | AccessConfigFor1Panel | AccessConfigForACMECA + | AccessConfigForACMEDNS | AccessConfigForACMEHttpReq | AccessConfigForAliyun | AccessConfigForAPISIX @@ -96,6 +97,12 @@ export type AccessConfigForACMECA = { eabHmacKey?: string; }; +export type AccessConfigForACMEDNS = { + apiBase: string; + storageBaseUrl?: string; + storagePath?: string; +}; + export type AccessConfigForACMEHttpReq = { endpoint: string; mode?: string; diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts index 9c098fc5..37525536 100644 --- a/ui/src/domain/provider.ts +++ b/ui/src/domain/provider.ts @@ -6,6 +6,7 @@ export const ACCESS_PROVIDERS = Object.freeze({ ["1PANEL"]: "1panel", ACMECA: "acmeca", + ACMEDNS: "acmedns", ACMEHTTPREQ: "acmehttpreq", ALIYUN: "aliyun", APISIX: "apisix", @@ -173,6 +174,7 @@ export const accessProvidersMap: Map = new NOTICE: If you add new constant, please keep ASCII order. */ export const ACME_DNS01_PROVIDERS = Object.freeze({ + ACMEDNS: `${ACCESS_PROVIDERS.ACMEDNS}`, ACMEHTTPREQ: `${ACCESS_PROVIDERS.ACMEHTTPREQ}`, ALIYUN: `${ACCESS_PROVIDERS.ALIYUN}`, // 兼容旧值,等同于 `ALIYUN_DNS` ALIYUN_DNS: `${ACCESS_PROVIDERS.ALIYUN}-dns`, @@ -365,6 +368,7 @@ export const acmeDns01ProvidersMap: Map [ type, { diff --git a/ui/src/i18n/locales/en/nls.access.json b/ui/src/i18n/locales/en/nls.access.json index 0dd233d6..efcf44f6 100644 --- a/ui/src/i18n/locales/en/nls.access.json +++ b/ui/src/i18n/locales/en/nls.access.json @@ -51,6 +51,15 @@ "access.form.acmeca_eab_kid.placeholder": "Please enter ACME EAB KID", "access.form.acmeca_eab_hmac_key.label": "ACME EAB HMAC key (Optional)", "access.form.acmeca_eab_hmac_key.placeholder": "Please enter ACME EAB HMAC key", + "access.form.acmedns_api_base.label": "ACME-DNS API URL", + "access.form.acmedns_api_base.placeholder": "Please enter ACME-DNS API URL", + "access.form.acmedns_api_base.tooltip": "For more information, see https://go-acme.github.io/lego/dns/acme-dns/", + "access.form.acmedns_storage_base_url.label": "ACME-DNS Credentials URL PATH", + "access.form.acmedns_storage_base_url.placeholder": "Enter the URL path to the ACME-DNS JSON credentials JSON file. Each credentials are stored in a separate JSON file. This file will be used for TXT record updates.", + "access.form.acmedns_storage_base_url.tooltip": "For more information, see https://go-acme.github.io/lego/dns/acme-dns/", + "access.form.acmedns_storage_path.label": "ACME-DNS Credentials Local Path", + "access.form.acmedns_storage_path.placeholder": "Please enter the ACME-DNS JSON Credentials JSON File Path. Each credentials are in a separate JSON file. It will be used for TXT record updates.", + "access.form.acmedns_storage_path.tooltip": "For more information, see https://go-acme.github.io/lego/dns/acme-dns/", "access.form.acmehttpreq_endpoint.label": "Endpoint", "access.form.acmehttpreq_endpoint.placeholder": "Please enter endpoint", "access.form.acmehttpreq_endpoint.tooltip": "For more information, see https://go-acme.github.io/lego/dns/httpreq/", diff --git a/ui/src/i18n/locales/en/nls.provider.json b/ui/src/i18n/locales/en/nls.provider.json index 9c7d0053..c227be35 100644 --- a/ui/src/i18n/locales/en/nls.provider.json +++ b/ui/src/i18n/locales/en/nls.provider.json @@ -3,6 +3,7 @@ "provider.1panel.console": "1Panel - Console", "provider.1panel.site": "1Panel - Website", "provider.acmeca": "ACME Custom CA Endpoint", + "provider.acmedns": "ACME DNS", "provider.acmehttpreq": "ACME Custom HTTP Endpoint", "provider.aliyun": "Alibaba Cloud", "provider.aliyun.alb": "Alibaba Cloud - ALB (Application Load Balancer)", diff --git a/ui/src/i18n/locales/zh/nls.access.json b/ui/src/i18n/locales/zh/nls.access.json index b6a4a0be..1a310773 100644 --- a/ui/src/i18n/locales/zh/nls.access.json +++ b/ui/src/i18n/locales/zh/nls.access.json @@ -51,6 +51,15 @@ "access.form.acmeca_eab_kid.placeholder": "请输入 ACME EAB KID", "access.form.acmeca_eab_hmac_key.label": "ACME EAB HMAC Key(可选)", "access.form.acmeca_eab_hmac_key.placeholder": "请输入 ACME EAB HMAC Key", + "access.form.acmedns_api_base.label": "ACME-DNS API 地址", + "access.form.acmedns_api_base.placeholder": "请输入 ACME-DNS API 地址", + "access.form.acmedns_api_base.tooltip": "这是什么?请参阅 https://go-acme.github.io/lego/dns/acme-dns/", + "access.form.acmedns_storage_base_url.label": "ACME-DNS JSON 帐户数据服务器", + "access.form.acmedns_storage_base_url.placeholder": "请输入 ACME-DNS JSON 帐户数据服务器地址", + "access.form.acmedns_storage_base_url.tooltip": "这是什么?请参阅 https://go-acme.github.io/lego/dns/acme-dns/", + "access.form.acmedns_storage_path.label": "ACME-DNS JSON 帐户数据文件", + "access.form.acmedns_storage_path.placeholder": "ACME-DNS JSON 帐户数据文件。每个域的帐户都将注册/保存到此文件,并用于 TXT 更新。", + "access.form.acmedns_storage_path.tooltip": "这是什么?请参阅 https://go-acme.github.io/lego/dns/acme-dns/", "access.form.acmehttpreq_endpoint.label": "服务端点", "access.form.acmehttpreq_endpoint.placeholder": "请输入服务端点", "access.form.acmehttpreq_endpoint.tooltip": "这是什么?请参阅 https://go-acme.github.io/lego/dns/httpreq/", diff --git a/ui/src/i18n/locales/zh/nls.provider.json b/ui/src/i18n/locales/zh/nls.provider.json index 73a3b63c..d9baa7d7 100644 --- a/ui/src/i18n/locales/zh/nls.provider.json +++ b/ui/src/i18n/locales/zh/nls.provider.json @@ -3,6 +3,7 @@ "provider.1panel.console": "1Panel - 控制台", "provider.1panel.site": "1Panel - 网站", "provider.acmeca": "ACME 自定义 CA 端点", + "provider.acmedns": "ACME DNS", "provider.acmehttpreq": "ACME 自定义 HTTP 端点", "provider.aliyun": "阿里云", "provider.aliyun.alb": "阿里云 - 应用型负载均衡 ALB",