From 2f7fd95684bb919aec0b1b4c98ad3d10b7c46d6f Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Mon, 31 Mar 2025 21:13:07 +0800 Subject: [PATCH] feat: cloudflare zone api token --- internal/applicant/providers.go | 1 + internal/domain/access.go | 3 ++- .../lego-providers/cloudflare/cloudflare.go | 2 ++ .../access/AccessFormCloudflareConfig.tsx | 14 ++++++++++++++ ui/src/domain/access.ts | 1 + ui/src/i18n/locales/en/nls.access.json | 7 +++++-- ui/src/i18n/locales/zh/nls.access.json | 7 +++++-- 7 files changed, 30 insertions(+), 5 deletions(-) diff --git a/internal/applicant/providers.go b/internal/applicant/providers.go index 90e8a972..a9c8a329 100644 --- a/internal/applicant/providers.go +++ b/internal/applicant/providers.go @@ -137,6 +137,7 @@ func createApplicant(options *applicantOptions) (challenge.Provider, error) { applicant, err := pCloudflare.NewChallengeProvider(&pCloudflare.ChallengeProviderConfig{ DnsApiToken: access.DnsApiToken, + ZoneApiToken: access.ZoneApiToken, DnsPropagationTimeout: options.DnsPropagationTimeout, DnsTTL: options.DnsTTL, }) diff --git a/internal/domain/access.go b/internal/domain/access.go index dc796c83..a534db69 100644 --- a/internal/domain/access.go +++ b/internal/domain/access.go @@ -75,7 +75,8 @@ type AccessConfigForCdnfly struct { } type AccessConfigForCloudflare struct { - DnsApiToken string `json:"dnsApiToken"` + DnsApiToken string `json:"dnsApiToken"` + ZoneApiToken string `json:"zoneApiToken,omitempty"` } type AccessConfigForClouDNS struct { diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudflare/cloudflare.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudflare/cloudflare.go index 9782b39b..cdfc1313 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudflare/cloudflare.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudflare/cloudflare.go @@ -9,6 +9,7 @@ import ( type ChallengeProviderConfig struct { DnsApiToken string `json:"dnsApiToken"` + ZoneApiToken string `json:"zoneApiToken,omitempty"` DnsPropagationTimeout int32 `json:"dnsPropagationTimeout,omitempty"` DnsTTL int32 `json:"dnsTTL,omitempty"` } @@ -20,6 +21,7 @@ func NewChallengeProvider(config *ChallengeProviderConfig) (challenge.Provider, providerConfig := cloudflare.NewDefaultConfig() providerConfig.AuthToken = config.DnsApiToken + providerConfig.ZoneToken = config.ZoneApiToken if config.DnsPropagationTimeout != 0 { providerConfig.PropagationTimeout = time.Duration(config.DnsPropagationTimeout) * time.Second } diff --git a/ui/src/components/access/AccessFormCloudflareConfig.tsx b/ui/src/components/access/AccessFormCloudflareConfig.tsx index cd760ed6..a06d753d 100644 --- a/ui/src/components/access/AccessFormCloudflareConfig.tsx +++ b/ui/src/components/access/AccessFormCloudflareConfig.tsx @@ -30,6 +30,11 @@ const AccessFormCloudflareConfig = ({ form: formInst, formName, disabled, initia .min(1, t("access.form.cloudflare_dns_api_token.placeholder")) .max(64, t("common.errmsg.string_max", { max: 64 })) .trim(), + zoneApiToken: z + .string() + .max(64, t("common.errmsg.string_max", { max: 64 })) + .trim() + .nullish(), }); const formRule = createSchemaFieldRule(formSchema); @@ -54,6 +59,15 @@ const AccessFormCloudflareConfig = ({ form: formInst, formName, disabled, initia > + + } + > + + ); }; diff --git a/ui/src/domain/access.ts b/ui/src/domain/access.ts index ed1bc1ee..9038676b 100644 --- a/ui/src/domain/access.ts +++ b/ui/src/domain/access.ts @@ -114,6 +114,7 @@ export type AccessConfigForCdnfly = { export type AccessConfigForCloudflare = { dnsApiToken: string; + zoneApiToken?: string; }; export type AccessConfigForClouDNS = { diff --git a/ui/src/i18n/locales/en/nls.access.json b/ui/src/i18n/locales/en/nls.access.json index ef2f481d..09dd15fd 100644 --- a/ui/src/i18n/locales/en/nls.access.json +++ b/ui/src/i18n/locales/en/nls.access.json @@ -111,9 +111,12 @@ "access.form.cdnfly_api_secret.label": "Cdnfly user API secret", "access.form.cdnfly_api_secret.placeholder": "Please enter Cdnfly user API secret", "access.form.cdnfly_api_secret.tooltip": "For more information, see https://doc.cdnfly.cn/shiyongjieshao.html", - "access.form.cloudflare_dns_api_token.label": "Cloudflare API token", - "access.form.cloudflare_dns_api_token.placeholder": "Please enter Cloudflare API token", + "access.form.cloudflare_dns_api_token.label": "Cloudflare DNS API token", + "access.form.cloudflare_dns_api_token.placeholder": "Please enter Cloudflare DNS API token", "access.form.cloudflare_dns_api_token.tooltip": "For more information, see https://developers.cloudflare.com/fundamentals/api/get-started/create-token/", + "access.form.cloudflare_zone_api_token.label": "Cloudflare Zone API token (Optional)", + "access.form.cloudflare_zone_api_token.placeholder": "Please enter Cloudflare Zone API token", + "access.form.cloudflare_zone_api_token.tooltip": "For more information, see https://developers.cloudflare.com/fundamentals/api/get-started/create-token/

Only required when you scope the DNS API token to specific zones. PLease scope the Zone API token to all zones with Zone/Zone/Read permission.", "access.form.cloudns_auth_id.label": "ClouDNS API user ID", "access.form.cloudns_auth_id.placeholder": "Please enter ClouDNS API user ID", "access.form.cloudns_auth_id.tooltip": "For more information, see https://www.cloudns.net/wiki/article/42/", diff --git a/ui/src/i18n/locales/zh/nls.access.json b/ui/src/i18n/locales/zh/nls.access.json index bec170b6..b5bd5543 100644 --- a/ui/src/i18n/locales/zh/nls.access.json +++ b/ui/src/i18n/locales/zh/nls.access.json @@ -105,9 +105,12 @@ "access.form.cdnfly_api_secret.label": "Cdnfly 用户端 API Secret", "access.form.cdnfly_api_secret.placeholder": "请输入 Cdnfly 用户端 API Secret", "access.form.cdnfly_api_secret.tooltip": "这是什么?请参阅 https://doc.cdnfly.cn/shiyongjieshao.html", - "access.form.cloudflare_dns_api_token.label": "Cloudflare API Token", - "access.form.cloudflare_dns_api_token.placeholder": "请输入 Cloudflare API Token", + "access.form.cloudflare_dns_api_token.label": "Cloudflare DNS API 令牌", + "access.form.cloudflare_dns_api_token.placeholder": "请输入 Cloudflare DNS API 令牌", "access.form.cloudflare_dns_api_token.tooltip": "这是什么?请参阅 https://developers.cloudflare.com/fundamentals/api/get-started/create-token/", + "access.form.cloudflare_zone_api_token.label": "Cloudflare Zone API 令牌(可选)", + "access.form.cloudflare_zone_api_token.placeholder": "请输入 Cloudflare Zone API 令牌", + "access.form.cloudflare_zone_api_token.tooltip": "这是什么?请参阅 https://developers.cloudflare.com/fundamentals/api/get-started/create-token/

仅当你将 DNS API 令牌范围指定为特定域时需要填写,请将 Zone API 令牌范围指定为全部域,并分配 Zone/Zone/Read 权限。", "access.form.cloudns_auth_id.label": "ClouDNS API 用户 ID", "access.form.cloudns_auth_id.placeholder": "请输入 ClouDNS API 用户 ID", "access.form.cloudns_auth_id.tooltip": "这是什么?请参阅 https://www.cloudns.net/wiki/article/42/",