mirror of
https://github.com/woodchen-ink/certimate.git
synced 2025-07-18 17:31:55 +08:00
feat: add gname applicant
This commit is contained in:
parent
469d4b35c1
commit
0e1a964e7c
@ -96,6 +96,7 @@ make local.run
|
|||||||
| [Azure](https://azure.microsoft.com/) | |
|
| [Azure](https://azure.microsoft.com/) | |
|
||||||
| [CloudFlare](https://www.cloudflare.com/) | |
|
| [CloudFlare](https://www.cloudflare.com/) | |
|
||||||
| [ClouDNS](https://www.cloudns.net//) | |
|
| [ClouDNS](https://www.cloudns.net//) | |
|
||||||
|
| [GNAME](https://www.gname.com/) | |
|
||||||
| [GoDaddy](https://www.godaddy.com/) | |
|
| [GoDaddy](https://www.godaddy.com/) | |
|
||||||
| [Name.com](https://www.name.com/) | |
|
| [Name.com](https://www.name.com/) | |
|
||||||
| [NameSilo](https://www.namesilo.com/) | |
|
| [NameSilo](https://www.namesilo.com/) | |
|
||||||
|
@ -95,6 +95,7 @@ The following DNS providers are supported:
|
|||||||
| [Azure DNS](https://azure.microsoft.com/) | |
|
| [Azure DNS](https://azure.microsoft.com/) | |
|
||||||
| [CloudFlare](https://www.cloudflare.com/) | |
|
| [CloudFlare](https://www.cloudflare.com/) | |
|
||||||
| [ClouDNS](https://www.cloudns.net//) | |
|
| [ClouDNS](https://www.cloudns.net//) | |
|
||||||
|
| [GNAME](https://www.gname.com/) | |
|
||||||
| [GoDaddy](https://www.godaddy.com/) | |
|
| [GoDaddy](https://www.godaddy.com/) | |
|
||||||
| [Name.com](https://www.name.com/) | |
|
| [Name.com](https://www.name.com/) | |
|
||||||
| [NameSilo](https://www.namesilo.com/) | |
|
| [NameSilo](https://www.namesilo.com/) | |
|
||||||
|
@ -12,6 +12,7 @@ import (
|
|||||||
providerAzureDNS "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/azure-dns"
|
providerAzureDNS "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/azure-dns"
|
||||||
providerCloudflare "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudflare"
|
providerCloudflare "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudflare"
|
||||||
providerClouDNS "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudns"
|
providerClouDNS "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudns"
|
||||||
|
providerGname "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/gname"
|
||||||
providerGoDaddy "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/godaddy"
|
providerGoDaddy "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/godaddy"
|
||||||
providerHuaweiCloud "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/huaweicloud"
|
providerHuaweiCloud "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/huaweicloud"
|
||||||
providerNameDotCom "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/namedotcom"
|
providerNameDotCom "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/namedotcom"
|
||||||
@ -131,6 +132,22 @@ func createApplicant(options *applicantOptions) (challenge.Provider, error) {
|
|||||||
return applicant, err
|
return applicant, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case domain.ApplyDNSProviderTypeGname:
|
||||||
|
{
|
||||||
|
access := domain.AccessConfigForGname{}
|
||||||
|
if err := maps.Decode(options.ProviderAccessConfig, &access); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to decode provider access config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
applicant, err := providerGname.NewChallengeProvider(&providerGname.GnameApplicantConfig{
|
||||||
|
AppId: access.AppId,
|
||||||
|
AppKey: access.AppKey,
|
||||||
|
DnsPropagationTimeout: options.DnsPropagationTimeout,
|
||||||
|
DnsTTL: options.DnsTTL,
|
||||||
|
})
|
||||||
|
return applicant, err
|
||||||
|
}
|
||||||
|
|
||||||
case domain.ApplyDNSProviderTypeGoDaddy:
|
case domain.ApplyDNSProviderTypeGoDaddy:
|
||||||
{
|
{
|
||||||
access := domain.AccessConfigForGoDaddy{}
|
access := domain.AccessConfigForGoDaddy{}
|
||||||
|
@ -78,6 +78,11 @@ type AccessConfigForEdgio struct {
|
|||||||
ClientSecret string `json:"clientSecret"`
|
ClientSecret string `json:"clientSecret"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AccessConfigForGname struct {
|
||||||
|
AppId string `json:"appId"`
|
||||||
|
AppKey string `json:"appKey"`
|
||||||
|
}
|
||||||
|
|
||||||
type AccessConfigForGoDaddy struct {
|
type AccessConfigForGoDaddy struct {
|
||||||
ApiKey string `json:"apiKey"`
|
ApiKey string `json:"apiKey"`
|
||||||
ApiSecret string `json:"apiSecret"`
|
ApiSecret string `json:"apiSecret"`
|
||||||
|
@ -19,6 +19,7 @@ const (
|
|||||||
AccessProviderTypeClouDNS = AccessProviderType("cloudns")
|
AccessProviderTypeClouDNS = AccessProviderType("cloudns")
|
||||||
AccessProviderTypeDogeCloud = AccessProviderType("dogecloud")
|
AccessProviderTypeDogeCloud = AccessProviderType("dogecloud")
|
||||||
AccessProviderTypeEdgio = AccessProviderType("edgio")
|
AccessProviderTypeEdgio = AccessProviderType("edgio")
|
||||||
|
AccessProviderTypeGname = AccessProviderType("gname")
|
||||||
AccessProviderTypeGoDaddy = AccessProviderType("godaddy")
|
AccessProviderTypeGoDaddy = AccessProviderType("godaddy")
|
||||||
AccessProviderTypeHuaweiCloud = AccessProviderType("huaweicloud")
|
AccessProviderTypeHuaweiCloud = AccessProviderType("huaweicloud")
|
||||||
AccessProviderTypeKubernetes = AccessProviderType("k8s")
|
AccessProviderTypeKubernetes = AccessProviderType("k8s")
|
||||||
@ -55,6 +56,7 @@ const (
|
|||||||
ApplyDNSProviderTypeAzureDNS = ApplyDNSProviderType("azure-dns")
|
ApplyDNSProviderTypeAzureDNS = ApplyDNSProviderType("azure-dns")
|
||||||
ApplyDNSProviderTypeCloudflare = ApplyDNSProviderType("cloudflare")
|
ApplyDNSProviderTypeCloudflare = ApplyDNSProviderType("cloudflare")
|
||||||
ApplyDNSProviderTypeClouDNS = ApplyDNSProviderType("cloudns")
|
ApplyDNSProviderTypeClouDNS = ApplyDNSProviderType("cloudns")
|
||||||
|
ApplyDNSProviderTypeGname = ApplyDNSProviderType("gname")
|
||||||
ApplyDNSProviderTypeGoDaddy = ApplyDNSProviderType("godaddy")
|
ApplyDNSProviderTypeGoDaddy = ApplyDNSProviderType("godaddy")
|
||||||
ApplyDNSProviderTypeHuaweiCloud = ApplyDNSProviderType("huaweicloud") // 兼容旧值,等同于 [ApplyDNSProviderTypeHuaweiCloudDNS]
|
ApplyDNSProviderTypeHuaweiCloud = ApplyDNSProviderType("huaweicloud") // 兼容旧值,等同于 [ApplyDNSProviderTypeHuaweiCloudDNS]
|
||||||
ApplyDNSProviderTypeHuaweiCloudDNS = ApplyDNSProviderType("huaweicloud-dns")
|
ApplyDNSProviderTypeHuaweiCloudDNS = ApplyDNSProviderType("huaweicloud-dns")
|
||||||
|
@ -0,0 +1,40 @@
|
|||||||
|
package gname
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
|
||||||
|
internal "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/gname/internal"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GnameApplicantConfig struct {
|
||||||
|
AppId string `json:"appId"`
|
||||||
|
AppKey string `json:"appKey"`
|
||||||
|
DnsPropagationTimeout int32 `json:"dnsPropagationTimeout,omitempty"`
|
||||||
|
DnsTTL int32 `json:"dnsTTL,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeProvider(config *GnameApplicantConfig) (challenge.Provider, error) {
|
||||||
|
if config == nil {
|
||||||
|
return nil, errors.New("config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
providerConfig := internal.NewDefaultConfig()
|
||||||
|
providerConfig.AppID = config.AppId
|
||||||
|
providerConfig.AppKey = config.AppKey
|
||||||
|
if config.DnsPropagationTimeout != 0 {
|
||||||
|
providerConfig.PropagationTimeout = time.Duration(config.DnsPropagationTimeout) * time.Second
|
||||||
|
}
|
||||||
|
if config.DnsTTL != 0 {
|
||||||
|
providerConfig.TTL = int(config.DnsTTL)
|
||||||
|
}
|
||||||
|
|
||||||
|
provider, err := internal.NewDNSProviderConfig(providerConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider, nil
|
||||||
|
}
|
@ -0,0 +1,196 @@
|
|||||||
|
package lego_gname
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||||
|
"github.com/go-acme/lego/v4/platform/config/env"
|
||||||
|
|
||||||
|
gnamesdk "github.com/usual2970/certimate/internal/pkg/vendors/gname-sdk"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
envNamespace = "GNAME_"
|
||||||
|
|
||||||
|
EnvAppID = envNamespace + "APP_ID"
|
||||||
|
EnvAppKey = envNamespace + "APP_KEY"
|
||||||
|
|
||||||
|
EnvTTL = envNamespace + "TTL"
|
||||||
|
EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
|
||||||
|
EnvPollingInterval = envNamespace + "POLLING_INTERVAL"
|
||||||
|
EnvHTTPTimeout = envNamespace + "HTTP_TIMEOUT"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ challenge.ProviderTimeout = (*DNSProvider)(nil)
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
AppID string
|
||||||
|
AppKey string
|
||||||
|
|
||||||
|
PropagationTimeout time.Duration
|
||||||
|
PollingInterval time.Duration
|
||||||
|
TTL int
|
||||||
|
HTTPTimeout time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
type DNSProvider struct {
|
||||||
|
client *gnamesdk.GnameClient
|
||||||
|
config *Config
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDefaultConfig() *Config {
|
||||||
|
return &Config{
|
||||||
|
TTL: env.GetOrDefaultInt(EnvTTL, dns01.DefaultTTL),
|
||||||
|
PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, 2*time.Minute),
|
||||||
|
PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, dns01.DefaultPollingInterval),
|
||||||
|
HTTPTimeout: env.GetOrDefaultSecond(EnvHTTPTimeout, 30*time.Second),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
|
values, err := env.Get(EnvAppID, EnvAppKey)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("gname: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
config := NewDefaultConfig()
|
||||||
|
config.AppID = values[EnvAppID]
|
||||||
|
config.AppKey = values[EnvAppKey]
|
||||||
|
|
||||||
|
return NewDNSProviderConfig(config)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
if config == nil {
|
||||||
|
return nil, errors.New("gname: the configuration of the DNS provider is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
client := gnamesdk.NewGnameClient(config.AppID, config.AppKey).
|
||||||
|
WithTimeout(config.HTTPTimeout)
|
||||||
|
|
||||||
|
return &DNSProvider{
|
||||||
|
client: client,
|
||||||
|
config: config,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
info := dns01.GetChallengeInfo(domain, keyAuth)
|
||||||
|
|
||||||
|
zoneName, err := dns01.FindZoneByFqdn(info.EffectiveFQDN)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("gname: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
subDomain, err := dns01.ExtractSubDomain(info.EffectiveFQDN, zoneName)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("gname: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := d.addOrUpdateDNSRecord(domain, subDomain, info.Value); err != nil {
|
||||||
|
return fmt.Errorf("gname: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
fqdn, value := dns01.GetRecord(domain, keyAuth)
|
||||||
|
subDomain := dns01.UnFqdn(fqdn)
|
||||||
|
|
||||||
|
if err := d.removeDNSRecord(domain, subDomain, value); err != nil {
|
||||||
|
return fmt.Errorf("gname: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
|
||||||
|
return d.config.PropagationTimeout, d.config.PollingInterval
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DNSProvider) getDNSRecord(domain, subDomain string) (*gnamesdk.ResolutionRecord, error) {
|
||||||
|
page := 1
|
||||||
|
pageSize := 20
|
||||||
|
for {
|
||||||
|
request := &gnamesdk.ListDomainResolutionRequest{}
|
||||||
|
request.ZoneName = domain
|
||||||
|
request.Page = &page
|
||||||
|
request.PageSize = &pageSize
|
||||||
|
|
||||||
|
response, err := d.client.ListDomainResolution(request)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, record := range response.Data {
|
||||||
|
if record.RecordType == "TXT" && record.RecordName == subDomain {
|
||||||
|
return record, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(response.Data) == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if response.Page*response.PageSize >= response.Count {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
page++
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DNSProvider) addOrUpdateDNSRecord(domain, subDomain, value string) error {
|
||||||
|
record, err := d.getDNSRecord(domain, subDomain)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if record == nil {
|
||||||
|
request := &gnamesdk.AddDomainResolutionRequest{
|
||||||
|
ZoneName: domain,
|
||||||
|
RecordType: "TXT",
|
||||||
|
RecordName: subDomain,
|
||||||
|
RecordValue: value,
|
||||||
|
TTL: d.config.TTL,
|
||||||
|
}
|
||||||
|
_, err := d.client.AddDomainResolution(request)
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
request := &gnamesdk.ModifyDomainResolutionRequest{
|
||||||
|
ID: record.ID,
|
||||||
|
ZoneName: domain,
|
||||||
|
RecordType: "TXT",
|
||||||
|
RecordName: subDomain,
|
||||||
|
RecordValue: value,
|
||||||
|
TTL: d.config.TTL,
|
||||||
|
}
|
||||||
|
_, err := d.client.ModifyDomainResolution(request)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DNSProvider) removeDNSRecord(domain, subDomain, value string) error {
|
||||||
|
record, err := d.getDNSRecord(domain, subDomain)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if record == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
request := &gnamesdk.DeleteDomainResolutionRequest{
|
||||||
|
ZoneName: domain,
|
||||||
|
RecordID: record.ID,
|
||||||
|
}
|
||||||
|
_, err = d.client.DeleteDomainResolution(request)
|
||||||
|
return err
|
||||||
|
}
|
38
internal/pkg/vendors/gname-sdk/api.go
vendored
38
internal/pkg/vendors/gname-sdk/api.go
vendored
@ -5,7 +5,7 @@ type BaseResponse interface {
|
|||||||
GetMsg() string
|
GetMsg() string
|
||||||
}
|
}
|
||||||
|
|
||||||
type AddDNSRecordRequest struct {
|
type AddDomainResolutionRequest struct {
|
||||||
ZoneName string `json:"ym"`
|
ZoneName string `json:"ym"`
|
||||||
RecordType string `json:"lx"`
|
RecordType string `json:"lx"`
|
||||||
RecordName string `json:"zj"`
|
RecordName string `json:"zj"`
|
||||||
@ -14,21 +14,21 @@ type AddDNSRecordRequest struct {
|
|||||||
TTL int `json:"ttl"`
|
TTL int `json:"ttl"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AddDNSRecordResponse struct {
|
type AddDomainResolutionResponse struct {
|
||||||
Code int `json:"code"`
|
Code int `json:"code"`
|
||||||
Msg string `json:"msg"`
|
Msg string `json:"msg"`
|
||||||
Data int `json:"data"`
|
Data int `json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *AddDNSRecordResponse) GetCode() int {
|
func (r *AddDomainResolutionResponse) GetCode() int {
|
||||||
return r.Code
|
return r.Code
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *AddDNSRecordResponse) GetMsg() string {
|
func (r *AddDomainResolutionResponse) GetMsg() string {
|
||||||
return r.Msg
|
return r.Msg
|
||||||
}
|
}
|
||||||
|
|
||||||
type EditDNSRecordRequest struct {
|
type ModifyDomainResolutionRequest struct {
|
||||||
ID string `json:"jxid"`
|
ID string `json:"jxid"`
|
||||||
ZoneName string `json:"ym"`
|
ZoneName string `json:"ym"`
|
||||||
RecordType string `json:"lx"`
|
RecordType string `json:"lx"`
|
||||||
@ -38,53 +38,53 @@ type EditDNSRecordRequest struct {
|
|||||||
TTL int `json:"ttl"`
|
TTL int `json:"ttl"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type EditDNSRecordResponse struct {
|
type ModifyDomainResolutionResponse struct {
|
||||||
Code int `json:"code"`
|
Code int `json:"code"`
|
||||||
Msg string `json:"msg"`
|
Msg string `json:"msg"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *EditDNSRecordResponse) GetCode() int {
|
func (r *ModifyDomainResolutionResponse) GetCode() int {
|
||||||
return r.Code
|
return r.Code
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *EditDNSRecordResponse) GetMsg() string {
|
func (r *ModifyDomainResolutionResponse) GetMsg() string {
|
||||||
return r.Msg
|
return r.Msg
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeleteDNSRecordRequest struct {
|
type DeleteDomainResolutionRequest struct {
|
||||||
ZoneName string `json:"ym"`
|
ZoneName string `json:"ym"`
|
||||||
RecordId int `json:"jxid"`
|
RecordID string `json:"jxid"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeleteDNSRecordResponse struct {
|
type DeleteDomainResolutionResponse struct {
|
||||||
Code int `json:"code"`
|
Code int `json:"code"`
|
||||||
Msg string `json:"msg"`
|
Msg string `json:"msg"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *DeleteDNSRecordResponse) GetCode() int {
|
func (r *DeleteDomainResolutionResponse) GetCode() int {
|
||||||
return r.Code
|
return r.Code
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *DeleteDNSRecordResponse) GetMsg() string {
|
func (r *DeleteDomainResolutionResponse) GetMsg() string {
|
||||||
return r.Msg
|
return r.Msg
|
||||||
}
|
}
|
||||||
|
|
||||||
type ListDNSRecordRequest struct {
|
type ListDomainResolutionRequest struct {
|
||||||
ZoneName string `json:"ym"`
|
ZoneName string `json:"ym"`
|
||||||
Page *int `json:"page,omitempty"`
|
Page *int `json:"page,omitempty"`
|
||||||
PageSize *int `json:"limit,omitempty"`
|
PageSize *int `json:"limit,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ListDNSRecordResponse struct {
|
type ListDomainResolutionResponse struct {
|
||||||
Code int `json:"code"`
|
Code int `json:"code"`
|
||||||
Msg string `json:"msg"`
|
Msg string `json:"msg"`
|
||||||
Count int `json:"count"`
|
Count int `json:"count"`
|
||||||
Data []*DNSRecord `json:"data"`
|
Data []*ResolutionRecord `json:"data"`
|
||||||
Page int `json:"page"`
|
Page int `json:"page"`
|
||||||
PageSize int `json:"pagesize"`
|
PageSize int `json:"pagesize"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type DNSRecord struct {
|
type ResolutionRecord struct {
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
ZoneName string `json:"ym"`
|
ZoneName string `json:"ym"`
|
||||||
RecordType string `json:"lx"`
|
RecordType string `json:"lx"`
|
||||||
@ -93,10 +93,10 @@ type DNSRecord struct {
|
|||||||
MX int `json:"mx"`
|
MX int `json:"mx"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *ListDNSRecordResponse) GetCode() int {
|
func (r *ListDomainResolutionResponse) GetCode() int {
|
||||||
return r.Code
|
return r.Code
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *ListDNSRecordResponse) GetMsg() string {
|
func (r *ListDomainResolutionResponse) GetMsg() string {
|
||||||
return r.Msg
|
return r.Msg
|
||||||
}
|
}
|
||||||
|
18
internal/pkg/vendors/gname-sdk/client.go
vendored
18
internal/pkg/vendors/gname-sdk/client.go
vendored
@ -35,12 +35,12 @@ func (c *GnameClient) WithTimeout(timeout time.Duration) *GnameClient {
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GnameClient) AddDNSRecord(req *AddDNSRecordRequest) (*AddDNSRecordResponse, error) {
|
func (c *GnameClient) AddDomainResolution(req *AddDomainResolutionRequest) (*AddDomainResolutionResponse, error) {
|
||||||
params := make(map[string]any)
|
params := make(map[string]any)
|
||||||
jsonData, _ := json.Marshal(req)
|
jsonData, _ := json.Marshal(req)
|
||||||
json.Unmarshal(jsonData, ¶ms)
|
json.Unmarshal(jsonData, ¶ms)
|
||||||
|
|
||||||
result := AddDNSRecordResponse{}
|
result := AddDomainResolutionResponse{}
|
||||||
err := c.sendRequestWithResult("/api/resolution/add", params, &result)
|
err := c.sendRequestWithResult("/api/resolution/add", params, &result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -48,12 +48,12 @@ func (c *GnameClient) AddDNSRecord(req *AddDNSRecordRequest) (*AddDNSRecordRespo
|
|||||||
return &result, nil
|
return &result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GnameClient) EditDNSRecord(req *EditDNSRecordRequest) (*EditDNSRecordResponse, error) {
|
func (c *GnameClient) ModifyDomainResolution(req *ModifyDomainResolutionRequest) (*ModifyDomainResolutionResponse, error) {
|
||||||
params := make(map[string]any)
|
params := make(map[string]any)
|
||||||
jsonData, _ := json.Marshal(req)
|
jsonData, _ := json.Marshal(req)
|
||||||
json.Unmarshal(jsonData, ¶ms)
|
json.Unmarshal(jsonData, ¶ms)
|
||||||
|
|
||||||
result := EditDNSRecordResponse{}
|
result := ModifyDomainResolutionResponse{}
|
||||||
err := c.sendRequestWithResult("/api/resolution/edit", params, &result)
|
err := c.sendRequestWithResult("/api/resolution/edit", params, &result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -61,12 +61,12 @@ func (c *GnameClient) EditDNSRecord(req *EditDNSRecordRequest) (*EditDNSRecordRe
|
|||||||
return &result, nil
|
return &result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GnameClient) DeleteDNSRecord(req *DeleteDNSRecordRequest) (*DeleteDNSRecordResponse, error) {
|
func (c *GnameClient) DeleteDomainResolution(req *DeleteDomainResolutionRequest) (*DeleteDomainResolutionResponse, error) {
|
||||||
params := make(map[string]any)
|
params := make(map[string]any)
|
||||||
jsonData, _ := json.Marshal(req)
|
jsonData, _ := json.Marshal(req)
|
||||||
json.Unmarshal(jsonData, ¶ms)
|
json.Unmarshal(jsonData, ¶ms)
|
||||||
|
|
||||||
result := DeleteDNSRecordResponse{}
|
result := DeleteDomainResolutionResponse{}
|
||||||
err := c.sendRequestWithResult("/api/resolution/delete", params, &result)
|
err := c.sendRequestWithResult("/api/resolution/delete", params, &result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -74,12 +74,12 @@ func (c *GnameClient) DeleteDNSRecord(req *DeleteDNSRecordRequest) (*DeleteDNSRe
|
|||||||
return &result, nil
|
return &result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GnameClient) ListDNSRecord(req *ListDNSRecordRequest) (*ListDNSRecordResponse, error) {
|
func (c *GnameClient) ListDomainResolution(req *ListDomainResolutionRequest) (*ListDomainResolutionResponse, error) {
|
||||||
params := make(map[string]any)
|
params := make(map[string]any)
|
||||||
jsonData, _ := json.Marshal(req)
|
jsonData, _ := json.Marshal(req)
|
||||||
json.Unmarshal(jsonData, ¶ms)
|
json.Unmarshal(jsonData, ¶ms)
|
||||||
|
|
||||||
result := ListDNSRecordResponse{}
|
result := ListDomainResolutionResponse{}
|
||||||
err := c.sendRequestWithResult("/api/resolution/list", params, &result)
|
err := c.sendRequestWithResult("/api/resolution/list", params, &result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -124,7 +124,7 @@ func (c *GnameClient) sendRequest(path string, params map[string]any) (*resty.Re
|
|||||||
data["gntime"] = fmt.Sprintf("%d", time.Now().Unix())
|
data["gntime"] = fmt.Sprintf("%d", time.Now().Unix())
|
||||||
data["gntoken"] = c.generateSignature(data)
|
data["gntoken"] = c.generateSignature(data)
|
||||||
|
|
||||||
url := "https://api.gname.com" + path
|
url := "http://api.gname.com" + path
|
||||||
req := c.client.R().
|
req := c.client.R().
|
||||||
SetHeader("Content-Type", "application/x-www-form-urlencoded").
|
SetHeader("Content-Type", "application/x-www-form-urlencoded").
|
||||||
SetFormData(data)
|
SetFormData(data)
|
||||||
|
1
ui/public/imgs/providers/gname.svg
Normal file
1
ui/public/imgs/providers/gname.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="2000" viewBox="0 0 81 81" enable-background="new 0 0 81 81" xml:space="preserve"><image width="81" height="81" x="0" y="0" xlink:href="data:image/png;base64,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" /></svg>
|
File diff suppressed because one or more lines are too long
@ -19,6 +19,7 @@ import AccessFormCloudflareConfig from "./AccessFormCloudflareConfig";
|
|||||||
import AccessFormClouDNSConfig from "./AccessFormClouDNSConfig";
|
import AccessFormClouDNSConfig from "./AccessFormClouDNSConfig";
|
||||||
import AccessFormDogeCloudConfig from "./AccessFormDogeCloudConfig";
|
import AccessFormDogeCloudConfig from "./AccessFormDogeCloudConfig";
|
||||||
import AccessFormEdgioConfig from "./AccessFormEdgioConfig";
|
import AccessFormEdgioConfig from "./AccessFormEdgioConfig";
|
||||||
|
import AccessFormGnameConfig from "./AccessFormGnameConfig";
|
||||||
import AccessFormGoDaddyConfig from "./AccessFormGoDaddyConfig";
|
import AccessFormGoDaddyConfig from "./AccessFormGoDaddyConfig";
|
||||||
import AccessFormHuaweiCloudConfig from "./AccessFormHuaweiCloudConfig";
|
import AccessFormHuaweiCloudConfig from "./AccessFormHuaweiCloudConfig";
|
||||||
import AccessFormKubernetesConfig from "./AccessFormKubernetesConfig";
|
import AccessFormKubernetesConfig from "./AccessFormKubernetesConfig";
|
||||||
@ -106,6 +107,8 @@ const AccessForm = forwardRef<AccessFormInstance, AccessFormProps>(({ className,
|
|||||||
return <AccessFormClouDNSConfig {...nestedFormProps} />;
|
return <AccessFormClouDNSConfig {...nestedFormProps} />;
|
||||||
case ACCESS_PROVIDERS.DOGECLOUD:
|
case ACCESS_PROVIDERS.DOGECLOUD:
|
||||||
return <AccessFormDogeCloudConfig {...nestedFormProps} />;
|
return <AccessFormDogeCloudConfig {...nestedFormProps} />;
|
||||||
|
case ACCESS_PROVIDERS.GNAME:
|
||||||
|
return <AccessFormGnameConfig {...nestedFormProps} />;
|
||||||
case ACCESS_PROVIDERS.GODADDY:
|
case ACCESS_PROVIDERS.GODADDY:
|
||||||
return <AccessFormGoDaddyConfig {...nestedFormProps} />;
|
return <AccessFormGoDaddyConfig {...nestedFormProps} />;
|
||||||
case ACCESS_PROVIDERS.EDGIO:
|
case ACCESS_PROVIDERS.EDGIO:
|
||||||
|
76
ui/src/components/access/AccessFormGnameConfig.tsx
Normal file
76
ui/src/components/access/AccessFormGnameConfig.tsx
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { Form, type FormInstance, Input } from "antd";
|
||||||
|
import { createSchemaFieldRule } from "antd-zod";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { type AccessConfigForGname } from "@/domain/access";
|
||||||
|
|
||||||
|
type AccessFormGnameConfigFieldValues = Nullish<AccessConfigForGname>;
|
||||||
|
|
||||||
|
export type AccessFormGnameConfigProps = {
|
||||||
|
form: FormInstance;
|
||||||
|
formName: string;
|
||||||
|
disabled?: boolean;
|
||||||
|
initialValues?: AccessFormGnameConfigFieldValues;
|
||||||
|
onValuesChange?: (values: AccessFormGnameConfigFieldValues) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const initFormModel = (): AccessFormGnameConfigFieldValues => {
|
||||||
|
return {
|
||||||
|
appId: "",
|
||||||
|
appKey: "",
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const AccessFormGnameConfig = ({ form: formInst, formName, disabled, initialValues, onValuesChange }: AccessFormGnameConfigProps) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const formSchema = z.object({
|
||||||
|
appId: z
|
||||||
|
.string()
|
||||||
|
.min(1, t("access.form.gname_app_id.placeholder"))
|
||||||
|
.max(64, t("common.errmsg.string_max", { max: 64 }))
|
||||||
|
.trim(),
|
||||||
|
appKey: z
|
||||||
|
.string()
|
||||||
|
.min(1, t("access.form.gname_app_key.placeholder"))
|
||||||
|
.max(64, t("common.errmsg.string_max", { max: 64 }))
|
||||||
|
.trim(),
|
||||||
|
});
|
||||||
|
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="appId"
|
||||||
|
label={t("access.form.gname_app_id.label")}
|
||||||
|
rules={[formRule]}
|
||||||
|
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.gname_app_id.tooltip") }}></span>}
|
||||||
|
>
|
||||||
|
<Input autoComplete="new-password" placeholder={t("access.form.gname_app_id.placeholder")} />
|
||||||
|
</Form.Item>
|
||||||
|
|
||||||
|
<Form.Item
|
||||||
|
name="appKey"
|
||||||
|
label={t("access.form.gname_app_key.label")}
|
||||||
|
rules={[formRule]}
|
||||||
|
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.gname_app_key.tooltip") }}></span>}
|
||||||
|
>
|
||||||
|
<Input.Password autoComplete="new-password" placeholder={t("access.form.gname_app_key.placeholder")} />
|
||||||
|
</Form.Item>
|
||||||
|
</Form>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AccessFormGnameConfig;
|
@ -18,6 +18,7 @@ export interface AccessModel extends BaseModel {
|
|||||||
| AccessConfigForClouDNS
|
| AccessConfigForClouDNS
|
||||||
| AccessConfigForDogeCloud
|
| AccessConfigForDogeCloud
|
||||||
| AccessConfigForEdgio
|
| AccessConfigForEdgio
|
||||||
|
| AccessConfigForGname
|
||||||
| AccessConfigForGoDaddy
|
| AccessConfigForGoDaddy
|
||||||
| AccessConfigForHuaweiCloud
|
| AccessConfigForHuaweiCloud
|
||||||
| AccessConfigForKubernetes
|
| AccessConfigForKubernetes
|
||||||
@ -91,6 +92,11 @@ export type AccessConfigForEdgio = {
|
|||||||
clientSecret: string;
|
clientSecret: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type AccessConfigForGname = {
|
||||||
|
appId: string;
|
||||||
|
appKey: string;
|
||||||
|
};
|
||||||
|
|
||||||
export type AccessConfigForGoDaddy = {
|
export type AccessConfigForGoDaddy = {
|
||||||
apiKey: string;
|
apiKey: string;
|
||||||
apiSecret: string;
|
apiSecret: string;
|
||||||
|
@ -13,6 +13,7 @@ export const ACCESS_PROVIDERS = Object.freeze({
|
|||||||
CLOUDFLARE: "cloudflare",
|
CLOUDFLARE: "cloudflare",
|
||||||
CLOUDNS: "cloudns",
|
CLOUDNS: "cloudns",
|
||||||
DOGECLOUD: "dogecloud",
|
DOGECLOUD: "dogecloud",
|
||||||
|
GNAME: "gname",
|
||||||
GODADDY: "godaddy",
|
GODADDY: "godaddy",
|
||||||
EDGIO: "edgio",
|
EDGIO: "edgio",
|
||||||
HUAWEICLOUD: "huaweicloud",
|
HUAWEICLOUD: "huaweicloud",
|
||||||
@ -73,6 +74,7 @@ export const accessProvidersMap: Map<AccessProvider["type"] | string, AccessProv
|
|||||||
[ACCESS_PROVIDERS.AZURE, "common.provider.azure", "/imgs/providers/azure.svg", ACCESS_USAGES.APPLY],
|
[ACCESS_PROVIDERS.AZURE, "common.provider.azure", "/imgs/providers/azure.svg", ACCESS_USAGES.APPLY],
|
||||||
[ACCESS_PROVIDERS.CLOUDFLARE, "common.provider.cloudflare", "/imgs/providers/cloudflare.svg", ACCESS_USAGES.APPLY],
|
[ACCESS_PROVIDERS.CLOUDFLARE, "common.provider.cloudflare", "/imgs/providers/cloudflare.svg", ACCESS_USAGES.APPLY],
|
||||||
[ACCESS_PROVIDERS.CLOUDNS, "common.provider.cloudns", "/imgs/providers/cloudns.svg", ACCESS_USAGES.APPLY],
|
[ACCESS_PROVIDERS.CLOUDNS, "common.provider.cloudns", "/imgs/providers/cloudns.svg", ACCESS_USAGES.APPLY],
|
||||||
|
[ACCESS_PROVIDERS.GNAME, "common.provider.gname", "/imgs/providers/gname.svg", ACCESS_USAGES.APPLY],
|
||||||
[ACCESS_PROVIDERS.GODADDY, "common.provider.godaddy", "/imgs/providers/godaddy.svg", ACCESS_USAGES.APPLY],
|
[ACCESS_PROVIDERS.GODADDY, "common.provider.godaddy", "/imgs/providers/godaddy.svg", ACCESS_USAGES.APPLY],
|
||||||
[ACCESS_PROVIDERS.NAMEDOTCOM, "common.provider.namedotcom", "/imgs/providers/namedotcom.svg", ACCESS_USAGES.APPLY],
|
[ACCESS_PROVIDERS.NAMEDOTCOM, "common.provider.namedotcom", "/imgs/providers/namedotcom.svg", ACCESS_USAGES.APPLY],
|
||||||
[ACCESS_PROVIDERS.NAMESILO, "common.provider.namesilo", "/imgs/providers/namesilo.svg", ACCESS_USAGES.APPLY],
|
[ACCESS_PROVIDERS.NAMESILO, "common.provider.namesilo", "/imgs/providers/namesilo.svg", ACCESS_USAGES.APPLY],
|
||||||
@ -107,6 +109,7 @@ export const APPLY_DNS_PROVIDERS = Object.freeze({
|
|||||||
AZURE_DNS: `${ACCESS_PROVIDERS.AZURE}-dns`,
|
AZURE_DNS: `${ACCESS_PROVIDERS.AZURE}-dns`,
|
||||||
CLOUDFLARE: `${ACCESS_PROVIDERS.CLOUDFLARE}`,
|
CLOUDFLARE: `${ACCESS_PROVIDERS.CLOUDFLARE}`,
|
||||||
CLOUDNS: `${ACCESS_PROVIDERS.CLOUDNS}`,
|
CLOUDNS: `${ACCESS_PROVIDERS.CLOUDNS}`,
|
||||||
|
GNAME: `${ACCESS_PROVIDERS.GNAME}`,
|
||||||
GODADDY: `${ACCESS_PROVIDERS.GODADDY}`,
|
GODADDY: `${ACCESS_PROVIDERS.GODADDY}`,
|
||||||
HUAWEICLOUD: `${ACCESS_PROVIDERS.HUAWEICLOUD}`, // 兼容旧值,等同于 `HUAWEICLOUD_DNS`
|
HUAWEICLOUD: `${ACCESS_PROVIDERS.HUAWEICLOUD}`, // 兼容旧值,等同于 `HUAWEICLOUD_DNS`
|
||||||
HUAWEICLOUD_DNS: `${ACCESS_PROVIDERS.HUAWEICLOUD}-dns`,
|
HUAWEICLOUD_DNS: `${ACCESS_PROVIDERS.HUAWEICLOUD}-dns`,
|
||||||
@ -145,6 +148,7 @@ export const applyDNSProvidersMap: Map<ApplyDNSProvider["type"] | string, ApplyD
|
|||||||
[APPLY_DNS_PROVIDERS.AZURE_DNS, "common.provider.azure.dns"],
|
[APPLY_DNS_PROVIDERS.AZURE_DNS, "common.provider.azure.dns"],
|
||||||
[APPLY_DNS_PROVIDERS.CLOUDFLARE, "common.provider.cloudflare"],
|
[APPLY_DNS_PROVIDERS.CLOUDFLARE, "common.provider.cloudflare"],
|
||||||
[APPLY_DNS_PROVIDERS.CLOUDNS, "common.provider.cloudns"],
|
[APPLY_DNS_PROVIDERS.CLOUDNS, "common.provider.cloudns"],
|
||||||
|
[APPLY_DNS_PROVIDERS.GNAME, "common.provider.gname"],
|
||||||
[APPLY_DNS_PROVIDERS.GODADDY, "common.provider.godaddy"],
|
[APPLY_DNS_PROVIDERS.GODADDY, "common.provider.godaddy"],
|
||||||
[APPLY_DNS_PROVIDERS.NAMEDOTCOM, "common.provider.namedotcom"],
|
[APPLY_DNS_PROVIDERS.NAMEDOTCOM, "common.provider.namedotcom"],
|
||||||
[APPLY_DNS_PROVIDERS.NAMESILO, "common.provider.namesilo"],
|
[APPLY_DNS_PROVIDERS.NAMESILO, "common.provider.namesilo"],
|
||||||
|
@ -90,6 +90,12 @@
|
|||||||
"access.form.edgio_client_secret.label": "Edgio ClientSecret",
|
"access.form.edgio_client_secret.label": "Edgio ClientSecret",
|
||||||
"access.form.edgio_client_secret.placeholder": "Please enter Edgio ClientSecret",
|
"access.form.edgio_client_secret.placeholder": "Please enter Edgio ClientSecret",
|
||||||
"access.form.edgio_client_secret.tooltip": "For more information, see <a href=\"https://docs.edg.io/applications/v7/rest_api/authentication#administering-api-clients\" target=\"_blank\">https://docs.edg.io/applications/v7/rest_api/authentication#administering-api-clients</a>",
|
"access.form.edgio_client_secret.tooltip": "For more information, see <a href=\"https://docs.edg.io/applications/v7/rest_api/authentication#administering-api-clients\" target=\"_blank\">https://docs.edg.io/applications/v7/rest_api/authentication#administering-api-clients</a>",
|
||||||
|
"access.form.gname_app_id.label": "GNAME AppId",
|
||||||
|
"access.form.gname_app_id.placeholder": "Please enter GNAME AppId",
|
||||||
|
"access.form.gname_app_id.tooltip": "For more information, see <a href=\"https://www.gname.com/user#/dealer_api\" target=\"_blank\">https://www.gname.com/user#/dealer_api</a>",
|
||||||
|
"access.form.gname_app_key.label": "GNAME AppKey",
|
||||||
|
"access.form.gname_app_key.placeholder": "Please enter GNAME AppKey",
|
||||||
|
"access.form.gname_app_key.tooltip": "For more information, see <a href=\"https://www.gname.com/user#/dealer_api\" target=\"_blank\">https://www.gname.com/user#/dealer_api</a>",
|
||||||
"access.form.godaddy_api_key.label": "GoDaddy API key",
|
"access.form.godaddy_api_key.label": "GoDaddy API key",
|
||||||
"access.form.godaddy_api_key.placeholder": "Please enter GoDaddy API key",
|
"access.form.godaddy_api_key.placeholder": "Please enter GoDaddy API key",
|
||||||
"access.form.godaddy_api_key.tooltip": "For more information, see <a href=\"https://developer.godaddy.com/\" target=\"_blank\">https://developer.godaddy.com/</a>",
|
"access.form.godaddy_api_key.tooltip": "For more information, see <a href=\"https://developer.godaddy.com/\" target=\"_blank\">https://developer.godaddy.com/</a>",
|
||||||
|
@ -61,6 +61,7 @@
|
|||||||
"common.provider.dogecloud.cdn": "Doge Cloud - CDN (Content Delivery Network)",
|
"common.provider.dogecloud.cdn": "Doge Cloud - CDN (Content Delivery Network)",
|
||||||
"common.provider.edgio": "Edgio",
|
"common.provider.edgio": "Edgio",
|
||||||
"common.provider.edgio.applications": "Edgio - Applications",
|
"common.provider.edgio.applications": "Edgio - Applications",
|
||||||
|
"common.provider.gname": "GNAME",
|
||||||
"common.provider.godaddy": "GoDaddy",
|
"common.provider.godaddy": "GoDaddy",
|
||||||
"common.provider.huaweicloud": "Huawei Cloud",
|
"common.provider.huaweicloud": "Huawei Cloud",
|
||||||
"common.provider.huaweicloud.cdn": "Huawei Cloud - CDN (Content Delivery Network)",
|
"common.provider.huaweicloud.cdn": "Huawei Cloud - CDN (Content Delivery Network)",
|
||||||
|
@ -90,6 +90,12 @@
|
|||||||
"access.form.edgio_client_secret.label": "Edgio 客户端密码",
|
"access.form.edgio_client_secret.label": "Edgio 客户端密码",
|
||||||
"access.form.edgio_client_secret.placeholder": "请输入 Edgio 客户端密码",
|
"access.form.edgio_client_secret.placeholder": "请输入 Edgio 客户端密码",
|
||||||
"access.form.edgio_client_secret.tooltip": "这是什么?请参阅 <a href=\"https://docs.edg.io/applications/v7/rest_api/authentication#administering-api-clients\" target=\"_blank\">https://docs.edg.io/applications/v7/rest_api/authentication#administering-api-clients</a>",
|
"access.form.edgio_client_secret.tooltip": "这是什么?请参阅 <a href=\"https://docs.edg.io/applications/v7/rest_api/authentication#administering-api-clients\" target=\"_blank\">https://docs.edg.io/applications/v7/rest_api/authentication#administering-api-clients</a>",
|
||||||
|
"access.form.gname_app_id.label": "GNAME AppId",
|
||||||
|
"access.form.gname_app_id.placeholder": "请输入 GNAME AppId",
|
||||||
|
"access.form.gname_app_id.tooltip": "这是什么?请参阅 <a href=\"https://www.gname.com/user#/dealer_api\" target=\"_blank\">https://www.gname.com/user#/dealer_api</a>",
|
||||||
|
"access.form.gname_app_key.label": "GNAME AppKey",
|
||||||
|
"access.form.gname_app_key.placeholder": "请输入 GNAME AppKey",
|
||||||
|
"access.form.gname_app_key.tooltip": "这是什么?请参阅 <a href=\"https://www.gname.com/user#/dealer_api\" target=\"_blank\">https://www.gname.com/user#/dealer_api</a>",
|
||||||
"access.form.godaddy_api_key.label": "GoDaddy API Key",
|
"access.form.godaddy_api_key.label": "GoDaddy API Key",
|
||||||
"access.form.godaddy_api_key.placeholder": "请输入 GoDaddy API Key",
|
"access.form.godaddy_api_key.placeholder": "请输入 GoDaddy API Key",
|
||||||
"access.form.godaddy_api_key.tooltip": "这是什么?请参阅 <a href=\"https://developer.godaddy.com/\" target=\"_blank\">https://developer.godaddy.com/</a>",
|
"access.form.godaddy_api_key.tooltip": "这是什么?请参阅 <a href=\"https://developer.godaddy.com/\" target=\"_blank\">https://developer.godaddy.com/</a>",
|
||||||
|
@ -61,6 +61,7 @@
|
|||||||
"common.provider.dogecloud.cdn": "多吉云 - 内容分发网络 CDN",
|
"common.provider.dogecloud.cdn": "多吉云 - 内容分发网络 CDN",
|
||||||
"common.provider.edgio": "Edgio",
|
"common.provider.edgio": "Edgio",
|
||||||
"common.provider.edgio.applications": "Edgio - Applications",
|
"common.provider.edgio.applications": "Edgio - Applications",
|
||||||
|
"common.provider.gname": "GNAME",
|
||||||
"common.provider.godaddy": "GoDaddy",
|
"common.provider.godaddy": "GoDaddy",
|
||||||
"common.provider.huaweicloud": "华为云",
|
"common.provider.huaweicloud": "华为云",
|
||||||
"common.provider.huaweicloud.cdn": "华为云 - 内容分发网络 CDN",
|
"common.provider.huaweicloud.cdn": "华为云 - 内容分发网络 CDN",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user