feat(provider): new acme dns-01 provider: gandinet

This commit is contained in:
Fu Diwei 2025-10-23 12:04:24 +08:00
parent 921df0b28c
commit 019e697f6b
17 changed files with 163 additions and 24 deletions

View File

@ -0,0 +1,29 @@
package applicators
import (
"fmt"
"github.com/go-acme/lego/v4/challenge"
"github.com/certimate-go/certimate/internal/domain"
"github.com/certimate-go/certimate/pkg/core/ssl-applicator/acme-dns01/providers/gandinet"
xmaps "github.com/certimate-go/certimate/pkg/utils/maps"
)
func init() {
if err := ACMEDns01Registries.Register(domain.ACMEDns01ProviderTypeGandinet, func(options *ProviderFactoryOptions) (challenge.Provider, error) {
credentials := domain.AccessConfigForGandinet{}
if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil {
return nil, fmt.Errorf("failed to populate provider access config: %w", err)
}
provider, err := gandinet.NewChallengeProvider(&gandinet.ChallengeProviderConfig{
PersonalAccessToken: credentials.PersonalAccessToken,
DnsPropagationTimeout: options.DnsPropagationTimeout,
DnsTTL: options.DnsTTL,
})
return provider, err
}); err != nil {
panic(err)
}
}

View File

@ -204,6 +204,10 @@ type AccessConfigForFlexCDN struct {
AllowInsecureConnections bool `json:"allowInsecureConnections,omitempty"`
}
type AccessConfigForGandinet struct {
PersonalAccessToken string `json:"personalAccessToken"`
}
type AccessConfigForGcore struct {
ApiToken string `json:"apiToken"`
}

View File

@ -46,11 +46,12 @@ const (
AccessProviderTypeEmail = AccessProviderType("email")
AccessProviderTypeFastly = AccessProviderType("fastly") // Fastly预留
AccessProviderTypeFlexCDN = AccessProviderType("flexcdn")
AccessProviderTypeGname = AccessProviderType("gname")
AccessProviderTypeGandinet = AccessProviderType("gandinet")
AccessProviderTypeGcore = AccessProviderType("gcore")
AccessProviderTypeGlobalSignAtlas = AccessProviderType("globalsignatlas")
AccessProviderTypeGname = AccessProviderType("gname")
AccessProviderTypeGoDaddy = AccessProviderType("godaddy")
AccessProviderTypeGoEdge = AccessProviderType("goedge")
AccessProviderTypeGlobalSignAtlas = AccessProviderType("globalsignatlas")
AccessProviderTypeGoogleTrustServices = AccessProviderType("googletrustservices")
AccessProviderTypeHetzner = AccessProviderType("hetzner")
AccessProviderTypeHostinger = AccessProviderType("hostinger")
@ -159,6 +160,7 @@ const (
ACMEDns01ProviderTypeDNSLA = ACMEDns01ProviderType(AccessProviderTypeDNSLA)
ACMEDns01ProviderTypeDuckDNS = ACMEDns01ProviderType(AccessProviderTypeDuckDNS)
ACMEDns01ProviderTypeDynv6 = ACMEDns01ProviderType(AccessProviderTypeDynv6)
ACMEDns01ProviderTypeGandinet = ACMEDns01ProviderType(AccessProviderTypeGandinet)
ACMEDns01ProviderTypeGcore = ACMEDns01ProviderType(AccessProviderTypeGcore)
ACMEDns01ProviderTypeGname = ACMEDns01ProviderType(AccessProviderTypeGname)
ACMEDns01ProviderTypeGoDaddy = ACMEDns01ProviderType(AccessProviderTypeGoDaddy)

View File

@ -0,0 +1,38 @@
package gandinet
import (
"errors"
"time"
"github.com/go-acme/lego/v4/providers/dns/gandiv5"
"github.com/certimate-go/certimate/pkg/core"
)
type ChallengeProviderConfig struct {
PersonalAccessToken string `json:"personalAccessToken"`
DnsPropagationTimeout int32 `json:"dnsPropagationTimeout,omitempty"`
DnsTTL int32 `json:"dnsTTL,omitempty"`
}
func NewChallengeProvider(config *ChallengeProviderConfig) (core.ACMEChallenger, error) {
if config == nil {
return nil, errors.New("the configuration of the acme challenge provider is nil")
}
providerConfig := gandiv5.NewDefaultConfig()
providerConfig.PersonalAccessToken = config.PersonalAccessToken
if config.DnsPropagationTimeout != 0 {
providerConfig.PropagationTimeout = time.Duration(config.DnsPropagationTimeout) * time.Second
}
if config.DnsTTL != 0 {
providerConfig.TTL = int(config.DnsTTL)
}
provider, err := gandiv5.NewDNSProviderConfig(providerConfig)
if err != nil {
return nil, err
}
return provider, nil
}

View File

@ -18,7 +18,7 @@ import (
)
type SSLDeployerProviderConfig struct {
// Gcore API Token。
// G-Core API Token。
ApiToken string `json:"apiToken"`
// CDN 资源 ID。
ResourceId int64 `json:"resourceId"`

View File

@ -15,7 +15,7 @@ import (
)
type SSLManagerProviderConfig struct {
// Gcore API Token。
// G-Core API Token。
ApiToken string `json:"apiToken"`
}

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 960" width="200" height="200"><defs><style>.cls-1 {fill: #231f20;stroke-width: 0px;}</style></defs><path class="cls-1" d="M312.54,488.22c-12.35,0-14.74-8.96-14.74-23.29,0-17.52,6.77-24.3,15.33-24.3,9.56,0,14.53,6.18,14.53,20.71,0,17.32-4.58,26.88-15.13,26.88ZM304.57,527.05c1.19.2,2.39.4,3.78.4,17.52,1.19,22.7,3.78,22.7,12.75,0,6.96-6.17,15.33-20.31,15.33s-16.73-4.97-16.73-11.35,4.78-12.95,10.55-17.13h0ZM323.69,430.28c-3.39-1-7.37-1.59-9.96-1.59-19.51,0-33.05,10.95-33.05,37.43,0,12.74,2.99,23.7,12.15,29.67-5.77,4.78-12.35,12.94-12.54,18.12-.2,5.17,4.38,8.76,11.95,10.95-8.36,5.57-14.93,13.54-14.93,23.09,0,10.36,5.18,22.7,32.06,22.7s38.03-15.53,38.03-32.66c0-15.73-11.95-21.5-24.69-23.29-14.93-2-25.09-2.59-25.09-5.98,0-2.79,2.59-6.17,5.18-8.96,2.59.6,5.58.8,8.97.8,23.1,0,32.26-13.74,32.26-34.84,0-9.96-2.99-17.52-7.77-22.5,2.79.6,5.18,1,7.37,1,3.39,0,5.57-1.99,5.57-6.37,0-3.59-.79-6.17-1.59-7.57h-23.89ZM205.67,411.91c-7.05-4.99-16.82-3.32-21.81,3.73-6.13,8.66-12.91,15.09-20.63,19.52-.71.41-1.43.8-2.16,1.18-.67.35-1.35.68-2.04,1-7.21,3.34-15.24,5.09-24.52,5.37-9.28-.28-17.31-2.03-24.52-5.37-9.5-4.4-17.62-11.5-24.84-21.7-4.99-7.05-14.76-8.72-21.81-3.73-7.05,4.99-8.73,14.75-3.73,21.81,10.31,14.57,22.84,25.34,37.23,32.01,2.83,1.31,5.71,2.46,8.66,3.46-12.22,8.82-25.43,21.19-31.76,38.15-6.57,17.6-6.49,36.65.23,53.65,6.44,16.31,18.37,29.57,33.59,37.35,16.95,8.67,38.53,8.69,57.73.04,20.14-9.07,33.28-25.66,35.14-44.41,1.96-19.73-7.5-37.3-24.1-44.76-17.2-7.72-36.6-2.21-49.42,14.04-5.35,6.78-4.19,16.62,2.59,21.97,6.78,5.35,16.62,4.19,21.97-2.59,3.81-4.83,8.2-6.61,12.05-4.88,3.28,1.47,6.52,5.69,5.78,13.12-.73,7.35-7.19,14.62-16.85,18.97-10.45,4.7-22.2,4.94-30.64.62-8.43-4.31-15.08-11.77-18.73-20.99-2.74-6.92-4.96-17.96-.02-31.21,3.71-9.93,13.06-19.31,29.42-29.49,6.95-4.33,14.4-8.36,21.6-12.25,8.31-4.5,16.18-8.76,23.09-13.32,12.3-6.73,23.13-16.63,32.23-29.49,4.99-7.05,3.32-16.82-3.73-21.81h0ZM404.48,517.5c-1.79,1.99-6.77,3.19-10.75,3.19-7.76,0-12.74-.8-12.74-17.93s6.77-20.3,14.74-20.3c2.78,0,6.77.4,9.36,1.79,0,14.33-.6,33.25-.6,33.25h0ZM400.9,428.69c-18.52,0-31.86,2.59-34.85,4.78-1.39,1-1.79,2.99-1.79,5.18,0,1.39.2,6.97,2.19,10.35,6.18-2.79,19.11-4.58,28.08-4.58,6.17,0,10.56,2.39,10.56,11.75v16.72c-3.98-1.99-10.16-2.59-15.13-2.59-12.74,0-25.88,4.98-25.88,32.66,0,30.26,13.94,31.46,28.47,31.26,12.94,0,22.3-3.19,27.68-6.57,0,0,1.2-28.27,1.2-63.12v-11.55c0-17.92-7.57-24.29-20.51-24.29ZM126.14,382.46c2-2,4.67-3.11,7.5-3.11s5.5,1.1,7.5,3.11c2,2.01,3.11,4.67,3.11,7.5s-1.1,5.5-3.11,7.5c-2,2.01-4.67,3.11-7.5,3.11s-5.5-1.1-7.5-3.11c-2-2-3.11-4.67-3.11-7.5s1.1-5.5,3.11-7.5ZM133.64,426.07c9.65,0,18.72-3.76,25.53-10.58,6.82-6.82,10.57-15.88,10.57-25.53s-3.76-18.71-10.58-25.53c-6.82-6.82-15.89-10.57-25.53-10.57s-18.71,3.76-25.53,10.58c-6.82,6.82-10.58,15.88-10.58,25.53s3.76,18.71,10.58,25.53c6.82,6.82,15.89,10.58,25.53,10.58ZM663.54,510.13c-7.17,0-11.15,5.38-11.15,11.55,0,6.97,2.79,11.35,11.15,11.35,6.97,0,11.16-5.18,11.16-11.35,0-6.97-2.99-11.55-11.16-11.55ZM730.4,428.69c-10.75,0-25.09,2.99-32.86,6.57v95.97c16.53,0,16.14,0,16.14-3.38v-81.24c4.38-2.78,10.55-3.78,14.93-3.78,10.55,0,11.75,5.97,11.75,21.7v66.71c16.92,0,16.73,0,16.73-3.38v-62.53c0-27.48-2.59-36.64-26.68-36.64h0ZM621.18,385.48c-6.37,0-9.16,4.78-9.16,11.95-.2,9.36,2.99,12.34,8.16,12.54,5.97,0,8.96-4.78,9.16-12.94,0-8.36-1.99-11.55-8.16-11.55ZM504.39,465.33c0-27.48-2.59-36.64-26.68-36.64-10.75,0-25.09,2.99-32.86,6.57v95.97c16.53,0,16.13,0,16.13-3.38v-81.24c4.38-2.78,10.55-3.78,14.93-3.78,10.55,0,11.75,5.97,11.75,21.7v66.71c16.92,0,16.72,0,16.72-3.38v-62.53ZM821.74,475.48c-6.97,1.99-19.31,2.39-27.08,2.19,1.19-27.68,8.56-34.84,16.72-34.84s11.15,5.97,11.35,20.31c0,3.79-.2,8.76-.99,12.34h0ZM838.47,461.34c0-21.3-8.56-32.65-25.29-32.65-17.72,0-35.24,6.17-35.24,57.94,0,40.62,13.34,47.59,31.86,47.59,14.93,0,27.47-4.78,27.47-7.56,0-4.38-.39-11.35-1.39-14.34-6.77,3.78-14.74,6.17-24.29,6.17-10.75,0-16.33-3.59-16.92-27.68,9.55,0,27.87-.4,41.61-3.19,1.59-7.17,2.19-17.32,2.19-26.28h0ZM570.26,516.7c-3.19,2.19-7.37,2.98-11.75,2.98-9.36,0-14.93-4.38-14.93-36.44s8.76-40.42,17.52-40.42c4.17,0,6.57.6,9.16,2.59v71.29h0ZM570.26,392.25v40.42c-3.39-2.39-7.97-3.98-14.14-3.98-17.12,0-30.67,16.93-30.67,56.35,0,43.21,13.55,49.18,32.46,49.18,12.35,0,21.71-1.99,28.48-5.97v-143.37c-13.14,0-16.12,0-16.12,7.37h0ZM612.22,439.04v92.19c16.33,0,16.53,0,16.53-3.38v-96.18c-13.14,0-16.53,0-16.53,7.37ZM890.59,520.48c-7.16,0-7.16-7.17-7.16-15.73v-59.14h17.12c3.19,0,3.19-1.39,3.19-13.94h-20.31v-35.84c-13.14,0-16.12,0-16.12,5.58v30.26h-10.16c-3.38,0-3.58,1.59-3.58,13.94h13.74v57.35c0,17.92,0,31.46,18.91,31.46,7.77,0,17.13-1.6,17.13-6.38,0-3.98-.6-8.36-1.2-10.55-4.18,1.79-5.97,2.98-11.55,2.98"/></svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -45,6 +45,7 @@ import AccessConfigFieldsProviderDuckDNS from "./forms/AccessConfigFieldsProvide
import AccessConfigFieldsProviderDynv6 from "./forms/AccessConfigFieldsProviderDynv6";
import AccessConfigFieldsProviderEmail from "./forms/AccessConfigFieldsProviderEmail";
import AccessConfigFieldsProviderFlexCDN from "./forms/AccessConfigFieldsProviderFlexCDN";
import AccessConfigFieldsProviderGandinet from "./forms/AccessConfigFieldsProviderGandinet";
import AccessConfigFieldsProviderGcore from "./forms/AccessConfigFieldsProviderGcore";
import AccessConfigFieldsProviderGlobalSignAtlas from "./forms/AccessConfigFieldsProviderGlobalSignAtlas";
import AccessConfigFieldsProviderGname from "./forms/AccessConfigFieldsProviderGname";
@ -241,6 +242,9 @@ const AccessForm = ({ className, style, disabled, initialValues, mode, usage, on
case ACCESS_PROVIDERS.FLEXCDN: {
return <AccessConfigFieldsProviderFlexCDN />;
}
case ACCESS_PROVIDERS.GANDINET: {
return <AccessConfigFieldsProviderGandinet />;
}
case ACCESS_PROVIDERS.GCORE: {
return <AccessConfigFieldsProviderGcore />;
}

View File

@ -0,0 +1,52 @@
import { getI18n, useTranslation } from "react-i18next";
import { Form, Input } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import { useFormNestedFieldsContext } from "./_context";
const AccessConfigFormFieldsProviderGandinet = () => {
const { i18n, t } = useTranslation();
const { parentNamePath } = useFormNestedFieldsContext();
const formSchema = z.object({
[parentNamePath]: getSchema({ i18n }),
});
const formRule = createSchemaFieldRule(formSchema);
const initialValues = getInitialValues();
return (
<>
<Form.Item
name={[parentNamePath, "personalAccessToken"]}
initialValue={initialValues.personalAccessToken}
label={t("access.form.gandinet_personal_access_token.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.gandinet_personal_access_token.tooltip") }}></span>}
>
<Input.Password autoComplete="new-password" placeholder={t("access.form.gandinet_personal_access_token.placeholder")} />
</Form.Item>
</>
);
};
const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
return {
personalAccessToken: "",
};
};
const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType<typeof getI18n> }) => {
const { t } = i18n;
return z.object({
personalAccessToken: z.string().nonempty(t("access.form.gandinet_personal_access_token.placeholder")),
});
};
const _default = Object.assign(AccessConfigFormFieldsProviderGandinet, {
getInitialValues,
getSchema,
});
export default _default;

View File

@ -40,10 +40,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType<typeof getI18n> }) =
const { t } = i18n;
return z.object({
apiToken: z
.string()
.min(1, t("access.form.gcore_api_token.placeholder"))
.max(256, t("common.errmsg.string_max", { max: 256 })),
apiToken: z.string().nonempty(t("access.form.gcore_api_token.placeholder")),
});
};

View File

@ -49,6 +49,7 @@ export const ACCESS_PROVIDERS = Object.freeze({
DYNV6: "dynv6",
EMAIL: "email",
FLEXCDN: "flexcdn",
GANDINET: "gandinet",
GCORE: "gcore",
GLOBALSIGNATLAS: "globalsignatlas",
GNAME: "gname",
@ -177,6 +178,7 @@ export const accessProvidersMap: Map<AccessProvider["type"] | string, AccessProv
[ACCESS_PROVIDERS.DNSLA, "provider.dnsla", "/imgs/providers/dnsla.svg", [ACCESS_USAGES.DNS]],
[ACCESS_PROVIDERS.DUCKDNS, "provider.duckdns", "/imgs/providers/duckdns.png", [ACCESS_USAGES.DNS]],
[ACCESS_PROVIDERS.DYNV6, "provider.dynv6", "/imgs/providers/dynv6.svg", [ACCESS_USAGES.DNS]],
[ACCESS_PROVIDERS.GANDINET, "provider.gandinet", "/imgs/providers/gandinet.svg", [ACCESS_USAGES.DNS]],
[ACCESS_PROVIDERS.GNAME, "provider.gname", "/imgs/providers/gname.png", [ACCESS_USAGES.DNS]],
[ACCESS_PROVIDERS.GODADDY, "provider.godaddy", "/imgs/providers/godaddy.svg", [ACCESS_USAGES.DNS]],
[ACCESS_PROVIDERS.HETZNER, "provider.hetzner", "/imgs/providers/hetzner.svg", [ACCESS_USAGES.DNS]],
@ -314,6 +316,7 @@ export const ACME_DNS01_PROVIDERS = Object.freeze({
DNSLA: `${ACCESS_PROVIDERS.DNSLA}`,
DUCKDNS: `${ACCESS_PROVIDERS.DUCKDNS}`,
DYNV6: `${ACCESS_PROVIDERS.DYNV6}`,
GANDINET: `${ACCESS_PROVIDERS.GANDINET}`,
GCORE: `${ACCESS_PROVIDERS.GCORE}`,
GNAME: `${ACCESS_PROVIDERS.GNAME}`,
GODADDY: `${ACCESS_PROVIDERS.GODADDY}`,
@ -379,6 +382,7 @@ export const acmeDns01ProvidersMap: Map<ACMEDns01Provider["type"] | string, ACME
[ACME_DNS01_PROVIDERS.DNSLA, "provider.dnsla"],
[ACME_DNS01_PROVIDERS.DUCKDNS, "provider.duckdns"],
[ACME_DNS01_PROVIDERS.DYNV6, "provider.dynv6"],
[ACME_DNS01_PROVIDERS.GANDINET, "provider.gandinet"],
[ACME_DNS01_PROVIDERS.GCORE, "provider.gcore"],
[ACME_DNS01_PROVIDERS.GNAME, "provider.gname"],
[ACME_DNS01_PROVIDERS.GODADDY, "provider.godaddy"],

View File

@ -261,8 +261,11 @@
"access.form.flexcdn_access_key.label": "FlexCDN AccessKey",
"access.form.flexcdn_access_key.placeholder": "Please enter FlexCDN AccessKey",
"access.form.flexcdn_access_key.tooltip": "For more information, see <a href=\"https://flexcdn.cn/docs/api/auth\" target=\"_blank\">https://flexcdn.cn/docs/api/auth</a>",
"access.form.gcore_api_token.label": "Gcore API token",
"access.form.gcore_api_token.placeholder": "Please enter Gcore API token",
"access.form.gandinet_personal_access_token.label": "Gandi.net personal access token",
"access.form.gandinet_personal_access_token.placeholder": "Please enter Gandi.net personal access token",
"access.form.gandinet_personal_access_token.tooltip": "For more information, see <a href=\"https://api.gandi.net/docs/authentication/\" target=\"_blank\">https://api.gandi.net/docs/authentication/</a>",
"access.form.gcore_api_token.label": "G-Core API token",
"access.form.gcore_api_token.placeholder": "Please enter G-Core API token",
"access.form.gcore_api_token.tooltip": "For more information, see <a href=\"https://api.gcore.com/docs/iam#section/Authentication\" target=\"_blank\">https://api.gcore.com/docs/iam#section/Authentication</a>",
"access.form.gname_app_id.label": "GNAME AppID",
"access.form.gname_app_id.placeholder": "Please enter GNAME AppID",

View File

@ -85,8 +85,9 @@
"provider.email": "Email (SMTP)",
"provider.fastly": "Fastly",
"provider.flexcdn": "FlexCDN",
"provider.gcore": "Gcore",
"provider.gcore.cdn": "Gcore - CDN (Content Delivery Network)",
"provider.gandinet": "Gandi.net",
"provider.gcore": "G-Core",
"provider.gcore.cdn": "G-Core - CDN (Content Delivery Network)",
"provider.globalsignatlas": "GlobalSign Atlas",
"provider.gname": "GNAME",
"provider.godaddy": "GoDaddy",

View File

@ -521,11 +521,11 @@
"workflow_node.deploy.form.flexcdn_certificate_id.label": "FlexCDN certificate ID",
"workflow_node.deploy.form.flexcdn_certificate_id.placeholder": "Please enter FlexCDN certificate ID",
"workflow_node.deploy.form.flexcdn_certificate_id.tooltip": "You can find it on FlexCDN dashboard.",
"workflow_node.deploy.form.gcore_cdn_resource_id.label": "Gcore CDN resource ID",
"workflow_node.deploy.form.gcore_cdn_resource_id.placeholder": "Please enter Gcore CDN resource ID",
"workflow_node.deploy.form.gcore_cdn_resource_id.label": "G-Core CDN resource ID",
"workflow_node.deploy.form.gcore_cdn_resource_id.placeholder": "Please enter G-Core CDN resource ID",
"workflow_node.deploy.form.gcore_cdn_resource_id.tooltip": "For more information, see <a href=\"https://cdn.gcore.com/resources/list\" target=\"_blank\">https://cdn.gcore.com/resources/list</a>",
"workflow_node.deploy.form.gcore_cdn_certificate_id.label": "Gcore CDN certificate ID (Optional)",
"workflow_node.deploy.form.gcore_cdn_certificate_id.placeholder": "Please enter Gcore CDN certificate ID",
"workflow_node.deploy.form.gcore_cdn_certificate_id.label": "G-Core CDN certificate ID (Optional)",
"workflow_node.deploy.form.gcore_cdn_certificate_id.placeholder": "Please enter G-Core CDN certificate ID",
"workflow_node.deploy.form.gcore_cdn_certificate_id.help": "",
"workflow_node.deploy.form.gcore_cdn_certificate_id.tooltip": "For more information, see <a href=\"https://cdn.gcore.com/ssl\" target=\"_blank\">https://cdn.gcore.com/ssl</a>",
"workflow_node.deploy.form.goedge_resource_type.label": "Resource type",

View File

@ -260,8 +260,11 @@
"access.form.flexcdn_access_key.label": "FlexCDN AccessKey",
"access.form.flexcdn_access_key.placeholder": "请输入 FlexCDN AccessKey",
"access.form.flexcdn_access_key.tooltip": "这是什么?请参阅 <a href=\"https://flexcdn.cn/docs/api/auth\" target=\"_blank\">https://flexcdn.cn/docs/api/auth</a>",
"access.form.gcore_api_token.label": "Gcore API Token",
"access.form.gcore_api_token.placeholder": "请输入 Gcore API Token",
"access.form.gandinet_personal_access_token.label": "Gandi.net Personal Access Token",
"access.form.gandinet_personal_access_token.placeholder": "请输入 Gandi.net Personal Access Token",
"access.form.gandinet_personal_access_token.tooltip": "这是什么?请参阅 <a href=\"https://api.gandi.net/docs/authentication/\" target=\"_blank\">https://api.gandi.net/docs/authentication/</a>",
"access.form.gcore_api_token.label": "G-Core API Token",
"access.form.gcore_api_token.placeholder": "请输入 G-Core API Token",
"access.form.gcore_api_token.tooltip": "这是什么?请参阅 <a href=\"https://api.gcore.com/docs/iam#section/Authentication\" target=\"_blank\">https://api.gcore.com/docs/iam#section/Authentication</a>",
"access.form.gname_app_id.label": "GNAME AppID",
"access.form.gname_app_id.placeholder": "请输入 GNAME AppID",

View File

@ -85,8 +85,9 @@
"provider.email": "邮件SMTP",
"provider.fastly": "Fastly",
"provider.flexcdn": "FlexCDN",
"provider.gcore": "Gcore",
"provider.gcore.cdn": "Gcore - 内容分发网络 CDN",
"provider.gandinet": "Gandi.net",
"provider.gcore": "G-Core",
"provider.gcore.cdn": "G-Core - 内容分发网络 CDN",
"provider.globalsignatlas": "GlobalSign Atlas",
"provider.gname": "GNAME",
"provider.godaddy": "GoDaddy",

View File

@ -519,11 +519,11 @@
"workflow_node.deploy.form.flexcdn_certificate_id.label": "FlexCDN 证书 ID",
"workflow_node.deploy.form.flexcdn_certificate_id.placeholder": "请输入 FlexCDN 证书 ID",
"workflow_node.deploy.form.flexcdn_certificate_id.tooltip": "请登录 FlexCDN 控制台查看",
"workflow_node.deploy.form.gcore_cdn_resource_id.label": "Gcore CDN 资源 ID",
"workflow_node.deploy.form.gcore_cdn_resource_id.placeholder": "请输入 Gcore CDN 资源 ID",
"workflow_node.deploy.form.gcore_cdn_resource_id.label": "G-Core CDN 资源 ID",
"workflow_node.deploy.form.gcore_cdn_resource_id.placeholder": "请输入 G-Core CDN 资源 ID",
"workflow_node.deploy.form.gcore_cdn_resource_id.tooltip": "这是什么?请参阅 <a href=\"https://cdn.gcore.com/resources/list\" target=\"_blank\">https://cdn.gcore.com/resources/list</a>",
"workflow_node.deploy.form.gcore_cdn_certificate_id.label": "Gcore CDN 原证书 ID可选",
"workflow_node.deploy.form.gcore_cdn_certificate_id.placeholder": "请输入 Gcore CDN 原证书 ID",
"workflow_node.deploy.form.gcore_cdn_certificate_id.label": "G-Core CDN 原证书 ID可选",
"workflow_node.deploy.form.gcore_cdn_certificate_id.placeholder": "请输入 G-Core CDN 原证书 ID",
"workflow_node.deploy.form.gcore_cdn_certificate_id.help": "提示:不填写时,将上传新证书;否则,将替换原证书。",
"workflow_node.deploy.form.gcore_cdn_certificate_id.tooltip": "这是什么?请参阅 <a href=\"https://cdn.gcore.com/ssl\" target=\"_blank\">https://cdn.gcore.com/ssl</a>",
"workflow_node.deploy.form.goedge_resource_type.label": "证书部署方式",