mirror of
https://github.com/certimate-go/certimate.git
synced 2026-06-22 21:05:48 +08:00
support Provider ACME DNS in UI.
This commit is contained in:
parent
7e9fa34135
commit
43acea2e77
2
ui/public/imgs/providers/acmedns.svg
Normal file
2
ui/public/imgs/providers/acmedns.svg
Normal file
@ -0,0 +1,2 @@
|
||||
<svg viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" height="200" width="200">
|
||||
<circle style="fill:#32BEA6;" cx="256" cy="256" r="256"/><g><path style="fill:#FFFFFF;" d="M58.016,202.296h18.168v42.48h0.296c2.192-3.368,5.128-6.152,8.936-8.2 c3.512-2.056,7.76-3.224,12.304-3.224c12.16,0,24.896,8.064,24.896,30.912v42.04H104.6v-39.992c0-10.4-3.808-18.168-13.776-18.168 c-7.032,0-12.008,4.688-13.912,10.112c-0.584,1.472-0.728,3.368-0.728,5.424v42.624H58.016V202.296z"/><path style="fill:#FFFFFF;" d="M161.76,214.6v20.368h17.144v13.48H161.76v31.496c0,8.64,2.344,13.176,9.224,13.176 c3.08,0,5.424-0.44,7.032-0.872l0.296,13.768c-2.64,1.032-7.328,1.768-13.04,1.768c-6.584,0-12.16-2.2-15.52-5.856 c-3.816-4.112-5.568-10.544-5.568-19.92v-33.544h-10.248V234.96h10.248v-16.12L161.76,214.6z"/><path style="fill:#FFFFFF;" d="M213.192,214.6v20.368h17.144v13.48h-17.144v31.496c0,8.64,2.344,13.176,9.224,13.176 c3.08,0,5.424-0.44,7.032-0.872l0.296,13.768c-2.64,1.032-7.328,1.768-13.04,1.768c-6.584,0-12.16-2.2-15.52-5.856 c-3.816-4.112-5.568-10.544-5.568-19.92v-33.544h-10.248V234.96h10.248v-16.12L213.192,214.6z"/><path style="fill:#FFFFFF;" d="M243.984,258.688c0-9.376-0.296-16.992-0.592-23.728h15.832l0.872,10.984h0.296 c5.264-8.056,13.616-12.6,24.464-12.6c16.408,0,30.024,14.064,30.024,36.328c0,25.784-16.256,38.232-32.512,38.232 c-8.936,0-16.408-3.808-20.072-9.512H262v36.904h-18.016V258.688z M262,276.416c0,1.76,0.144,3.368,0.584,4.976 c1.76,7.328,8.2,12.6,15.824,12.6c11.424,0,18.168-9.52,18.168-23.584c0-12.592-6.16-22.848-17.728-22.848 c-7.472,0-14.36,5.424-16.112,13.336c-0.448,1.464-0.736,3.072-0.736,4.536L262,276.416L262,276.416z"/><path style="fill:#FFFFFF;" d="M327.504,247.12c0-6.744,4.688-11.568,11.136-11.568c6.592,0,10.984,4.832,11.136,11.568 c0,6.592-4.392,11.432-11.136,11.432C332.048,258.552,327.504,253.712,327.504,247.12z M327.504,296.488 c0-6.744,4.688-11.576,11.136-11.576c6.592,0,10.984,4.688,11.136,11.576c0,6.448-4.392,11.424-11.136,11.424 C332.048,307.912,327.504,302.936,327.504,296.488z"/><path style="fill:#FFFFFF;" d="M355.8,312.16l35.744-106.2h12.6l-35.752,106.2H355.8z"/><path style="fill:#FFFFFF;" d="M405.176,312.16l35.744-106.2h12.592l-35.728,106.2H405.176z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
@ -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<AccessFormInstance, AccessFormProps>(({ className,
|
||||
return <AccessForm1PanelConfig {...nestedFormProps} />;
|
||||
case ACCESS_PROVIDERS.ACMECA:
|
||||
return <AccessFormACMECAConfig {...nestedFormProps} />;
|
||||
case ACCESS_PROVIDERS.ACMEDNS:
|
||||
return <AccessFormACMEDNSConfig {...nestedFormProps} />;
|
||||
case ACCESS_PROVIDERS.ACMEHTTPREQ:
|
||||
return <AccessFormACMEHttpReqConfig {...nestedFormProps} />;
|
||||
case ACCESS_PROVIDERS.ALIYUN:
|
||||
|
||||
85
ui/src/components/access/AccessFormACMEDNSConfig.tsx
Normal file
85
ui/src/components/access/AccessFormACMEDNSConfig.tsx
Normal file
@ -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<AccessConfigForACMEDNS>;
|
||||
|
||||
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<typeof formSchema>) => {
|
||||
onValuesChange?.(values);
|
||||
};
|
||||
|
||||
return (
|
||||
<Form
|
||||
form={formInst}
|
||||
disabled={disabled}
|
||||
initialValues={initialValues ?? initFormModel()}
|
||||
layout="vertical"
|
||||
name={formName}
|
||||
onValuesChange={handleFormChange}
|
||||
>
|
||||
<Form.Item
|
||||
name="apiBase"
|
||||
label={t("access.form.acmedns_api_base.label")}
|
||||
rules={[formRule]}
|
||||
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.acmedns_api_base.tooltip") }}></span>}
|
||||
>
|
||||
<Input placeholder={t("access.form.acmedns_api_base.placeholder")} />
|
||||
</Form.Item>
|
||||
|
||||
<Form.Item
|
||||
name="storageBaseUrl"
|
||||
label={t("access.form.acmedns_storage_base_url.label")}
|
||||
rules={[formRule]}
|
||||
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.acmedns_storage_base_url.tooltip") }}></span>}
|
||||
>
|
||||
<Input allowClear placeholder={t("access.form.acmedns_storage_base_url.placeholder")} />
|
||||
</Form.Item>
|
||||
|
||||
<Form.Item
|
||||
name="storagePath"
|
||||
label={t("access.form.acmedns_storage_path.label")}
|
||||
rules={[formRule]}
|
||||
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.acmedns_storage_path.tooltip") }}></span>}
|
||||
>
|
||||
<Input allowClear placeholder={t("access.form.acmedns_storage_path.placeholder")} />
|
||||
</Form.Item>
|
||||
</Form>
|
||||
);
|
||||
};
|
||||
|
||||
export default AccessFormACMEDNSConfig;
|
||||
@ -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;
|
||||
|
||||
@ -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<AccessProvider["type"] | string, AccessProv
|
||||
[ACCESS_PROVIDERS.WESTCN, "provider.westcn", "/imgs/providers/westcn.svg", [ACCESS_USAGES.DNS]],
|
||||
[ACCESS_PROVIDERS.POWERDNS, "provider.powerdns", "/imgs/providers/powerdns.svg", [ACCESS_USAGES.DNS]],
|
||||
[ACCESS_PROVIDERS.ACMEHTTPREQ, "provider.acmehttpreq", "/imgs/providers/acmehttpreq.svg", [ACCESS_USAGES.DNS]],
|
||||
[ACCESS_PROVIDERS.ACMEDNS, "provider.acmedns", "/imgs/providers/acmedns.svg", [ACCESS_USAGES.DNS]],
|
||||
|
||||
[ACCESS_PROVIDERS.LETSENCRYPT, "provider.letsencrypt", "/imgs/providers/letsencrypt.svg", [ACCESS_USAGES.CA]],
|
||||
[ACCESS_PROVIDERS.LETSENCRYPTSTAGING, "provider.letsencryptstaging", "/imgs/providers/letsencrypt.svg", [ACCESS_USAGES.CA]],
|
||||
@ -260,6 +262,7 @@ export const caProvidersMap: Map<CAProvider["type"] | string, CAProvider> = 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<ACMEDns01Provider["type"] | string, ACME
|
||||
[ACME_DNS01_PROVIDERS.WESTCN, "provider.westcn"],
|
||||
[ACME_DNS01_PROVIDERS.POWERDNS, "provider.powerdns"],
|
||||
[ACME_DNS01_PROVIDERS.ACMEHTTPREQ, "provider.acmehttpreq"],
|
||||
[ACME_DNS01_PROVIDERS.ACMEDNS, "provider.acmedns"],
|
||||
].map(([type, name]) => [
|
||||
type,
|
||||
{
|
||||
|
||||
@ -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 <a href=\"https://go-acme.github.io/lego/dns/acme-dns/\" target=\"_blank\">https://go-acme.github.io/lego/dns/acme-dns/</a>",
|
||||
"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 <a href=\"https://go-acme.github.io/lego/dns/acme-dns/\" target=\"_blank\">https://go-acme.github.io/lego/dns/acme-dns/</a>",
|
||||
"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 <a href=\"https://go-acme.github.io/lego/dns/acme-dns/\" target=\"_blank\">https://go-acme.github.io/lego/dns/acme-dns/</a>",
|
||||
"access.form.acmehttpreq_endpoint.label": "Endpoint",
|
||||
"access.form.acmehttpreq_endpoint.placeholder": "Please enter endpoint",
|
||||
"access.form.acmehttpreq_endpoint.tooltip": "For more information, see <a href=\"https://go-acme.github.io/lego/dns/httpreq/\" target=\"_blank\">https://go-acme.github.io/lego/dns/httpreq/</a>",
|
||||
|
||||
@ -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)",
|
||||
|
||||
@ -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": "这是什么?请参阅 <a href=\"https://go-acme.github.io/lego/dns/acme-dns/\" target=\"_blank\">https://go-acme.github.io/lego/dns/acme-dns/</a>",
|
||||
"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": "这是什么?请参阅 <a href=\"https://go-acme.github.io/lego/dns/acme-dns/\" target=\"_blank\">https://go-acme.github.io/lego/dns/acme-dns/</a>",
|
||||
"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": "这是什么?请参阅 <a href=\"https://go-acme.github.io/lego/dns/acme-dns/\" target=\"_blank\">https://go-acme.github.io/lego/dns/acme-dns/</a>",
|
||||
"access.form.acmehttpreq_endpoint.label": "服务端点",
|
||||
"access.form.acmehttpreq_endpoint.placeholder": "请输入服务端点",
|
||||
"access.form.acmehttpreq_endpoint.tooltip": "这是什么?请参阅 <a href=\"https://go-acme.github.io/lego/dns/httpreq/\" target=\"_blank\">https://go-acme.github.io/lego/dns/httpreq/</a>",
|
||||
|
||||
@ -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",
|
||||
|
||||
Loading…
Reference in New Issue
Block a user