mirror of
https://github.com/usual2970/certimate.git
synced 2025-06-08 13:39:53 +00:00
feat: add namecheap dns-01 applicant
This commit is contained in:
parent
543d2d9d50
commit
63f824e3dd
@ -102,6 +102,7 @@ make local.run
|
|||||||
| [GNAME](https://www.gname.com/) | |
|
| [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/) | |
|
||||||
|
| [Namecheap](https://www.namecheap.com/) | |
|
||||||
| [NameSilo](https://www.namesilo.com/) | |
|
| [NameSilo](https://www.namesilo.com/) | |
|
||||||
| [IBM NS1 Connect](https://www.ibm.com/cn-zh/products/ns1-connect/) | |
|
| [IBM NS1 Connect](https://www.ibm.com/cn-zh/products/ns1-connect/) | |
|
||||||
| [移动云](https://ecloud.10086.cn/) | |
|
| [移动云](https://ecloud.10086.cn/) | |
|
||||||
|
@ -101,6 +101,7 @@ The following DNS providers are supported:
|
|||||||
| [GNAME](https://www.gname.com/) | |
|
| [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/) | |
|
||||||
|
| [Namecheap](https://www.namecheap.com/) | |
|
||||||
| [NameSilo](https://www.namesilo.com/) | |
|
| [NameSilo](https://www.namesilo.com/) | |
|
||||||
| [IBM NS1 Connect](https://www.ibm.com/products/ns1-connect/) | |
|
| [IBM NS1 Connect](https://www.ibm.com/products/ns1-connect/) | |
|
||||||
| [CMCC Cloud](https://ecloud.10086.cn/) | |
|
| [CMCC Cloud](https://ecloud.10086.cn/) | |
|
||||||
|
3
go.mod
3
go.mod
@ -21,7 +21,7 @@ require (
|
|||||||
github.com/aws/aws-sdk-go-v2/service/cloudfront v1.44.10
|
github.com/aws/aws-sdk-go-v2/service/cloudfront v1.44.10
|
||||||
github.com/baidubce/bce-sdk-go v0.9.217
|
github.com/baidubce/bce-sdk-go v0.9.217
|
||||||
github.com/byteplus-sdk/byteplus-sdk-golang v1.0.41
|
github.com/byteplus-sdk/byteplus-sdk-golang v1.0.41
|
||||||
github.com/go-acme/lego/v4 v4.21.0
|
github.com/go-acme/lego/v4 v4.22.2
|
||||||
github.com/go-resty/resty/v2 v2.16.5
|
github.com/go-resty/resty/v2 v2.16.5
|
||||||
github.com/go-viper/mapstructure/v2 v2.2.1
|
github.com/go-viper/mapstructure/v2 v2.2.1
|
||||||
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.136
|
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.136
|
||||||
@ -215,4 +215,5 @@ require (
|
|||||||
)
|
)
|
||||||
|
|
||||||
replace gitlab.ecloud.com/ecloud/ecloudsdkcore v1.0.0 => ./internal/pkg/vendors/cmcc-sdk/ecloudsdkcore@v1.0.0
|
replace gitlab.ecloud.com/ecloud/ecloudsdkcore v1.0.0 => ./internal/pkg/vendors/cmcc-sdk/ecloudsdkcore@v1.0.0
|
||||||
|
|
||||||
replace gitlab.ecloud.com/ecloud/ecloudsdkclouddns v1.0.1 => ./internal/pkg/vendors/cmcc-sdk/ecloudsdkclouddns@v1.0.1
|
replace gitlab.ecloud.com/ecloud/ecloudsdkclouddns v1.0.1 => ./internal/pkg/vendors/cmcc-sdk/ecloudsdkclouddns@v1.0.1
|
||||||
|
2
go.sum
2
go.sum
@ -376,6 +376,8 @@ github.com/ganigeorgiev/fexpr v0.4.1/go.mod h1:RyGiGqmeXhEQ6+mlGdnUleLHgtzzu/VGO
|
|||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
github.com/go-acme/lego/v4 v4.21.0 h1:arEW+8o5p7VI8Bk1kr/PDlgD1DrxtTH1gJ4b7mehL8o=
|
github.com/go-acme/lego/v4 v4.21.0 h1:arEW+8o5p7VI8Bk1kr/PDlgD1DrxtTH1gJ4b7mehL8o=
|
||||||
github.com/go-acme/lego/v4 v4.21.0/go.mod h1:HrSWzm3Ckj45Ie3i+p1zKVobbQoMOaGu9m4up0dUeDI=
|
github.com/go-acme/lego/v4 v4.21.0/go.mod h1:HrSWzm3Ckj45Ie3i+p1zKVobbQoMOaGu9m4up0dUeDI=
|
||||||
|
github.com/go-acme/lego/v4 v4.22.2 h1:ck+HllWrV/rZGeYohsKQ5iKNnU/WAZxwOdiu6cxky+0=
|
||||||
|
github.com/go-acme/lego/v4 v4.22.2/go.mod h1:E2FndyI3Ekv0usNJt46mFb9LVpV/XBYT+4E3tz02Tzo=
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
|
@ -19,6 +19,7 @@ import (
|
|||||||
pGoDaddy "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/godaddy"
|
pGoDaddy "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/godaddy"
|
||||||
pHuaweiCloud "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/huaweicloud"
|
pHuaweiCloud "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/huaweicloud"
|
||||||
pJDCloud "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/jdcloud"
|
pJDCloud "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/jdcloud"
|
||||||
|
pNamecheap "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/namecheap"
|
||||||
pNameDotCom "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/namedotcom"
|
pNameDotCom "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/namedotcom"
|
||||||
pNameSilo "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/namesilo"
|
pNameSilo "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/namesilo"
|
||||||
pNS1 "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/ns1"
|
pNS1 "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/ns1"
|
||||||
@ -249,6 +250,22 @@ func createApplicant(options *applicantOptions) (challenge.Provider, error) {
|
|||||||
return applicant, err
|
return applicant, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case domain.ApplyDNSProviderTypeNamecheap:
|
||||||
|
{
|
||||||
|
access := domain.AccessConfigForNamecheap{}
|
||||||
|
if err := maps.Populate(options.ProviderAccessConfig, &access); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to populate provider access config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
applicant, err := pNamecheap.NewChallengeProvider(&pNamecheap.ChallengeProviderConfig{
|
||||||
|
Username: access.Username,
|
||||||
|
ApiKey: access.ApiKey,
|
||||||
|
DnsPropagationTimeout: options.DnsPropagationTimeout,
|
||||||
|
DnsTTL: options.DnsTTL,
|
||||||
|
})
|
||||||
|
return applicant, err
|
||||||
|
}
|
||||||
|
|
||||||
case domain.ApplyDNSProviderTypeNameDotCom:
|
case domain.ApplyDNSProviderTypeNameDotCom:
|
||||||
{
|
{
|
||||||
access := domain.AccessConfigForNameDotCom{}
|
access := domain.AccessConfigForNameDotCom{}
|
||||||
|
@ -131,6 +131,11 @@ type AccessConfigForKubernetes struct {
|
|||||||
|
|
||||||
type AccessConfigForLocal struct{}
|
type AccessConfigForLocal struct{}
|
||||||
|
|
||||||
|
type AccessConfigForNamecheap struct {
|
||||||
|
Username string `json:"username"`
|
||||||
|
ApiKey string `json:"apiKey"`
|
||||||
|
}
|
||||||
|
|
||||||
type AccessConfigForNameDotCom struct {
|
type AccessConfigForNameDotCom struct {
|
||||||
Username string `json:"username"`
|
Username string `json:"username"`
|
||||||
ApiToken string `json:"apiToken"`
|
ApiToken string `json:"apiToken"`
|
||||||
|
@ -26,6 +26,7 @@ const (
|
|||||||
AccessProviderTypeCMCCCloud = AccessProviderType("cmcccloud")
|
AccessProviderTypeCMCCCloud = AccessProviderType("cmcccloud")
|
||||||
AccessProviderTypeCTCCCloud = AccessProviderType("ctcccloud") // 联通云(预留)
|
AccessProviderTypeCTCCCloud = AccessProviderType("ctcccloud") // 联通云(预留)
|
||||||
AccessProviderTypeCUCCCloud = AccessProviderType("cucccloud") // 天翼云(预留)
|
AccessProviderTypeCUCCCloud = AccessProviderType("cucccloud") // 天翼云(预留)
|
||||||
|
AccessProviderTypeDNSLA = AccessProviderType("dnsla") // DNS.LA(预留)
|
||||||
AccessProviderTypeDogeCloud = AccessProviderType("dogecloud")
|
AccessProviderTypeDogeCloud = AccessProviderType("dogecloud")
|
||||||
AccessProviderTypeEdgio = AccessProviderType("edgio")
|
AccessProviderTypeEdgio = AccessProviderType("edgio")
|
||||||
AccessProviderTypeFastly = AccessProviderType("fastly") // Fastly(预留)
|
AccessProviderTypeFastly = AccessProviderType("fastly") // Fastly(预留)
|
||||||
@ -37,6 +38,7 @@ const (
|
|||||||
AccessProviderTypeJDCloud = AccessProviderType("jdcloud")
|
AccessProviderTypeJDCloud = AccessProviderType("jdcloud")
|
||||||
AccessProviderTypeKubernetes = AccessProviderType("k8s")
|
AccessProviderTypeKubernetes = AccessProviderType("k8s")
|
||||||
AccessProviderTypeLocal = AccessProviderType("local")
|
AccessProviderTypeLocal = AccessProviderType("local")
|
||||||
|
AccessProviderTypeNamecheap = AccessProviderType("namecheap")
|
||||||
AccessProviderTypeNameDotCom = AccessProviderType("namedotcom")
|
AccessProviderTypeNameDotCom = AccessProviderType("namedotcom")
|
||||||
AccessProviderTypeNameSilo = AccessProviderType("namesilo")
|
AccessProviderTypeNameSilo = AccessProviderType("namesilo")
|
||||||
AccessProviderTypeNS1 = AccessProviderType("ns1")
|
AccessProviderTypeNS1 = AccessProviderType("ns1")
|
||||||
@ -82,6 +84,7 @@ const (
|
|||||||
ApplyDNSProviderTypeHuaweiCloudDNS = ApplyDNSProviderType("huaweicloud-dns")
|
ApplyDNSProviderTypeHuaweiCloudDNS = ApplyDNSProviderType("huaweicloud-dns")
|
||||||
ApplyDNSProviderTypeJDCloud = ApplyDNSProviderType("jdcloud") // 兼容旧值,等同于 [ApplyDNSProviderTypeJDCloudDNS]
|
ApplyDNSProviderTypeJDCloud = ApplyDNSProviderType("jdcloud") // 兼容旧值,等同于 [ApplyDNSProviderTypeJDCloudDNS]
|
||||||
ApplyDNSProviderTypeJDCloudDNS = ApplyDNSProviderType("jdcloud-dns")
|
ApplyDNSProviderTypeJDCloudDNS = ApplyDNSProviderType("jdcloud-dns")
|
||||||
|
ApplyDNSProviderTypeNamecheap = ApplyDNSProviderType("namecheap")
|
||||||
ApplyDNSProviderTypeNameDotCom = ApplyDNSProviderType("namedotcom")
|
ApplyDNSProviderTypeNameDotCom = ApplyDNSProviderType("namedotcom")
|
||||||
ApplyDNSProviderTypeNameSilo = ApplyDNSProviderType("namesilo")
|
ApplyDNSProviderTypeNameSilo = ApplyDNSProviderType("namesilo")
|
||||||
ApplyDNSProviderTypeNS1 = ApplyDNSProviderType("ns1")
|
ApplyDNSProviderTypeNS1 = ApplyDNSProviderType("ns1")
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
package namedotcom
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/namecheap"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ChallengeProviderConfig struct {
|
||||||
|
Username string `json:"username"`
|
||||||
|
ApiKey string `json:"apiKey"`
|
||||||
|
DnsPropagationTimeout int32 `json:"dnsPropagationTimeout,omitempty"`
|
||||||
|
DnsTTL int32 `json:"dnsTTL,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeProvider(config *ChallengeProviderConfig) (challenge.Provider, error) {
|
||||||
|
if config == nil {
|
||||||
|
panic("config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
providerConfig := namecheap.NewDefaultConfig()
|
||||||
|
providerConfig.APIUser = config.Username
|
||||||
|
providerConfig.APIKey = config.ApiKey
|
||||||
|
if config.DnsPropagationTimeout != 0 {
|
||||||
|
providerConfig.PropagationTimeout = time.Duration(config.DnsPropagationTimeout) * time.Second
|
||||||
|
}
|
||||||
|
if config.DnsTTL != 0 {
|
||||||
|
providerConfig.TTL = int(config.DnsTTL)
|
||||||
|
}
|
||||||
|
|
||||||
|
provider, err := namecheap.NewDNSProviderConfig(providerConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider, nil
|
||||||
|
}
|
@ -65,6 +65,7 @@ func init() {
|
|||||||
"cmcccloud",
|
"cmcccloud",
|
||||||
"ctcccloud",
|
"ctcccloud",
|
||||||
"cucccloud",
|
"cucccloud",
|
||||||
|
"dnsla",
|
||||||
"dogecloud",
|
"dogecloud",
|
||||||
"edgio",
|
"edgio",
|
||||||
"fastly",
|
"fastly",
|
||||||
@ -76,6 +77,7 @@ func init() {
|
|||||||
"jdcloud",
|
"jdcloud",
|
||||||
"k8s",
|
"k8s",
|
||||||
"local",
|
"local",
|
||||||
|
"namecheap",
|
||||||
"namedotcom",
|
"namedotcom",
|
||||||
"namesilo",
|
"namesilo",
|
||||||
"ns1",
|
"ns1",
|
||||||
@ -173,6 +175,7 @@ func init() {
|
|||||||
"cmcccloud",
|
"cmcccloud",
|
||||||
"ctcccloud",
|
"ctcccloud",
|
||||||
"cucccloud",
|
"cucccloud",
|
||||||
|
"dnsla",
|
||||||
"dogecloud",
|
"dogecloud",
|
||||||
"edgio",
|
"edgio",
|
||||||
"fastly",
|
"fastly",
|
||||||
@ -184,6 +187,7 @@ func init() {
|
|||||||
"jdcloud",
|
"jdcloud",
|
||||||
"k8s",
|
"k8s",
|
||||||
"local",
|
"local",
|
||||||
|
"namecheap",
|
||||||
"namedotcom",
|
"namedotcom",
|
||||||
"namesilo",
|
"namesilo",
|
||||||
"ns1",
|
"ns1",
|
||||||
|
1
ui/public/imgs/providers/namecheap.svg
Normal file
1
ui/public/imgs/providers/namecheap.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="200" viewBox="0 -57 256 256" preserveAspectRatio="xMidYMid"><defs><linearGradient x1="13.3220455%" y1="94.9449067%" x2="82.6195455%" y2="1.13156385%"><stop stop-color="#D4202C" offset="0%"></stop><stop stop-color="#D82D2B" stop-opacity="0.9583" offset="4.166156%"></stop><stop stop-color="#E25226" stop-opacity="0.824" offset="17.6%"></stop><stop stop-color="#EB7123" stop-opacity="0.6833" offset="31.67%"></stop><stop stop-color="#F28920" stop-opacity="0.5365" offset="46.35%"></stop><stop stop-color="#F69A1E" stop-opacity="0.3812" offset="61.88%"></stop><stop stop-color="#F9A41D" stop-opacity="0.2114" offset="78.86%"></stop><stop stop-color="#FAA71D" stop-opacity="0" offset="100%"></stop></linearGradient><linearGradient x1="86.6243182%" y1="5.04045911%" x2="17.3261364%" y2="98.8545194%"><stop stop-color="#D4202C" offset="0%"></stop><stop stop-color="#D82D2B" stop-opacity="0.9583" offset="4.166156%"></stop><stop stop-color="#E25226" stop-opacity="0.824" offset="17.6%"></stop><stop stop-color="#EB7123" stop-opacity="0.6833" offset="31.67%"></stop><stop stop-color="#F28920" stop-opacity="0.5365" offset="46.35%"></stop><stop stop-color="#F69A1E" stop-opacity="0.3812" offset="61.88%"></stop><stop stop-color="#F9A41D" stop-opacity="0.2114" offset="78.86%"></stop><stop stop-color="#FAA71D" stop-opacity="0" offset="100%"></stop></linearGradient></defs><g><path d="M232,0 C223,0 215.2,5 211.1,12.3 L210.6,13.3 L191.8,50.3 L168,97.2 L183.6,127.9 L184.5,129.6 C186.9,133.8 190.5,137.3 194.9,139.4 C199.3,137.2 202.9,133.8 205.3,129.6 L206.2,127.9 L252.9,35.9 L254,33.7 C255.3,30.7 256,27.5 256,24 C256,10.7 245.3,0 232,0 L232,0 Z" fill="#FF5000"></path><path d="M87.9,44.6 L72.4,14 L71.5,12.3 C69.1,8.1 65.5,4.6 61.1,2.5 C56.7,4.7 53.1,8.1 50.7,12.3 L49.9,14 L3.2,106 L2.1,108.2 C0.8,111.2 0.1,114.4 0.1,117.9 C0.1,131.1 10.8,141.9 24.1,141.9 C33.1,141.9 40.9,136.9 45,129.6 L45.5,128.6 L64.3,91.6 L88,44.7 L87.9,44.6 L87.9,44.6 Z" fill="#FF5000"></path><path d="M232,0 C223,0 215.1,5 211.1,12.3 L210.6,13.3 L191.8,50.3 L168,97.2 L183.6,127.9 L184.5,129.6 C186.9,133.8 190.5,137.3 194.9,139.4 C199.3,137.2 202.9,133.8 205.3,129.6 L206.2,127.9 L252.9,35.9 L254,33.7 C255.3,30.7 256,27.5 256,24 C256,10.7 245.2,0 232,0 L232,0 Z" fill="url(#linearGradient-1)"></path><path d="M24,141.9 C33,141.9 40.9,136.9 44.9,129.6 L45.4,128.6 L64.2,91.6 L88,44.7 L72.4,14 L71.5,12.3 C69.1,8.1 65.5,4.6 61.1,2.5 C56.7,4.7 53.1,8.1 50.7,12.3 L49.9,14 L3.2,106 L2,108.3 C0.7,111.3 0,114.5 0,118 C0,131.2 10.7,141.9 24,141.9 L24,141.9 Z" fill="url(#linearGradient-2)"></path><path d="M87.9,44.6 L72.4,14 L71.5,12.3 C69.1,8.1 65.5,4.6 61.1,2.5 C62.5,1.8 64.1,1.2 65.6,0.8 C67.5,0.3 69.6,0 71.6,0 L71.6,0 L104,0 L104.2,0 L104.4,0 C113.4,0.1 121.2,5 125.3,12.3 L126,14 L168.1,97.3 L183.6,127.9 L184.5,129.6 C186.9,133.8 190.5,137.3 194.9,139.4 C193.5,140.1 191.9,140.7 190.4,141.1 C188.5,141.6 186.4,141.9 184.3,141.9 L184.3,141.9 L152.1,141.9 L151.9,141.9 L151.7,141.9 C142.7,141.8 134.9,136.9 130.8,129.6 L129.9,127.9 L87.9,44.6 L87.9,44.6 Z" fill="#FF8C44"></path></g></svg>
|
After Width: | Height: | Size: 3.1 KiB |
@ -31,6 +31,7 @@ import AccessFormHuaweiCloudConfig from "./AccessFormHuaweiCloudConfig";
|
|||||||
import AccessFormJDCloudConfig from "./AccessFormJDCloudConfig";
|
import AccessFormJDCloudConfig from "./AccessFormJDCloudConfig";
|
||||||
import AccessFormKubernetesConfig from "./AccessFormKubernetesConfig";
|
import AccessFormKubernetesConfig from "./AccessFormKubernetesConfig";
|
||||||
import AccessFormLocalConfig from "./AccessFormLocalConfig";
|
import AccessFormLocalConfig from "./AccessFormLocalConfig";
|
||||||
|
import AccessFormNamecheapConfig from "./AccessFormNamecheapConfig";
|
||||||
import AccessFormNameDotComConfig from "./AccessFormNameDotComConfig";
|
import AccessFormNameDotComConfig from "./AccessFormNameDotComConfig";
|
||||||
import AccessFormNameSiloConfig from "./AccessFormNameSiloConfig";
|
import AccessFormNameSiloConfig from "./AccessFormNameSiloConfig";
|
||||||
import AccessFormNS1Config from "./AccessFormNS1Config";
|
import AccessFormNS1Config from "./AccessFormNS1Config";
|
||||||
@ -141,6 +142,8 @@ const AccessForm = forwardRef<AccessFormInstance, AccessFormProps>(({ className,
|
|||||||
return <AccessFormKubernetesConfig {...nestedFormProps} />;
|
return <AccessFormKubernetesConfig {...nestedFormProps} />;
|
||||||
case ACCESS_PROVIDERS.LOCAL:
|
case ACCESS_PROVIDERS.LOCAL:
|
||||||
return <AccessFormLocalConfig {...nestedFormProps} />;
|
return <AccessFormLocalConfig {...nestedFormProps} />;
|
||||||
|
case ACCESS_PROVIDERS.NAMECHEAP:
|
||||||
|
return <AccessFormNamecheapConfig {...nestedFormProps} />;
|
||||||
case ACCESS_PROVIDERS.NAMEDOTCOM:
|
case ACCESS_PROVIDERS.NAMEDOTCOM:
|
||||||
return <AccessFormNameDotComConfig {...nestedFormProps} />;
|
return <AccessFormNameDotComConfig {...nestedFormProps} />;
|
||||||
case ACCESS_PROVIDERS.NAMESILO:
|
case ACCESS_PROVIDERS.NAMESILO:
|
||||||
|
76
ui/src/components/access/AccessFormNamecheapConfig.tsx
Normal file
76
ui/src/components/access/AccessFormNamecheapConfig.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 AccessConfigForNamecheap } from "@/domain/access";
|
||||||
|
|
||||||
|
type AccessFormNamecheapConfigFieldValues = Nullish<AccessConfigForNamecheap>;
|
||||||
|
|
||||||
|
export type AccessFormNamecheapConfigProps = {
|
||||||
|
form: FormInstance;
|
||||||
|
formName: string;
|
||||||
|
disabled?: boolean;
|
||||||
|
initialValues?: AccessFormNamecheapConfigFieldValues;
|
||||||
|
onValuesChange?: (values: AccessFormNamecheapConfigFieldValues) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const initFormModel = (): AccessFormNamecheapConfigFieldValues => {
|
||||||
|
return {
|
||||||
|
username: "",
|
||||||
|
apiKey: "",
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const AccessFormNamecheapConfig = ({ form: formInst, formName, disabled, initialValues, onValuesChange }: AccessFormNamecheapConfigProps) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const formSchema = z.object({
|
||||||
|
username: z
|
||||||
|
.string()
|
||||||
|
.min(1, t("access.form.namecheap_username.placeholder"))
|
||||||
|
.max(64, t("common.errmsg.string_max", { max: 64 }))
|
||||||
|
.trim(),
|
||||||
|
apiKey: z
|
||||||
|
.string()
|
||||||
|
.min(1, t("access.form.namecheap_api_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="username"
|
||||||
|
label={t("access.form.namecheap_username.label")}
|
||||||
|
rules={[formRule]}
|
||||||
|
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.namecheap_username.tooltip") }}></span>}
|
||||||
|
>
|
||||||
|
<Input autoComplete="new-password" placeholder={t("access.form.namecheap_username.placeholder")} />
|
||||||
|
</Form.Item>
|
||||||
|
|
||||||
|
<Form.Item
|
||||||
|
name="apiKey"
|
||||||
|
label={t("access.form.namecheap_api_key.label")}
|
||||||
|
rules={[formRule]}
|
||||||
|
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.namecheap_api_key.tooltip") }}></span>}
|
||||||
|
>
|
||||||
|
<Input.Password autoComplete="new-password" placeholder={t("access.form.namecheap_api_key.placeholder")} />
|
||||||
|
</Form.Item>
|
||||||
|
</Form>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AccessFormNamecheapConfig;
|
@ -28,6 +28,7 @@ export interface AccessModel extends BaseModel {
|
|||||||
| AccessConfigForJDCloud
|
| AccessConfigForJDCloud
|
||||||
| AccessConfigForKubernetes
|
| AccessConfigForKubernetes
|
||||||
| AccessConfigForLocal
|
| AccessConfigForLocal
|
||||||
|
| AccessConfigForNamecheap
|
||||||
| AccessConfigForNameDotCom
|
| AccessConfigForNameDotCom
|
||||||
| AccessConfigForNameSilo
|
| AccessConfigForNameSilo
|
||||||
| AccessConfigForPowerDNS
|
| AccessConfigForPowerDNS
|
||||||
@ -151,6 +152,11 @@ export type AccessConfigForKubernetes = {
|
|||||||
|
|
||||||
export type AccessConfigForLocal = NonNullable<unknown>;
|
export type AccessConfigForLocal = NonNullable<unknown>;
|
||||||
|
|
||||||
|
export type AccessConfigForNamecheap = {
|
||||||
|
username: string;
|
||||||
|
apiKey: string;
|
||||||
|
};
|
||||||
|
|
||||||
export type AccessConfigForNameDotCom = {
|
export type AccessConfigForNameDotCom = {
|
||||||
username: string;
|
username: string;
|
||||||
apiToken: string;
|
apiToken: string;
|
||||||
|
@ -26,6 +26,7 @@ export const ACCESS_PROVIDERS = Object.freeze({
|
|||||||
JDCLOUD: "jdcloud",
|
JDCLOUD: "jdcloud",
|
||||||
KUBERNETES: "k8s",
|
KUBERNETES: "k8s",
|
||||||
LOCAL: "local",
|
LOCAL: "local",
|
||||||
|
NAMECHEAP: "namecheap",
|
||||||
NAMEDOTCOM: "namedotcom",
|
NAMEDOTCOM: "namedotcom",
|
||||||
NAMESILO: "namesilo",
|
NAMESILO: "namesilo",
|
||||||
NS1: "ns1",
|
NS1: "ns1",
|
||||||
@ -92,6 +93,7 @@ export const accessProvidersMap: Map<AccessProvider["type"] | string, AccessProv
|
|||||||
[ACCESS_PROVIDERS.CLOUDNS, "provider.cloudns", "/imgs/providers/cloudns.png", [ACCESS_USAGES.APPLY]],
|
[ACCESS_PROVIDERS.CLOUDNS, "provider.cloudns", "/imgs/providers/cloudns.png", [ACCESS_USAGES.APPLY]],
|
||||||
[ACCESS_PROVIDERS.GNAME, "provider.gname", "/imgs/providers/gname.png", [ACCESS_USAGES.APPLY]],
|
[ACCESS_PROVIDERS.GNAME, "provider.gname", "/imgs/providers/gname.png", [ACCESS_USAGES.APPLY]],
|
||||||
[ACCESS_PROVIDERS.GODADDY, "provider.godaddy", "/imgs/providers/godaddy.svg", [ACCESS_USAGES.APPLY]],
|
[ACCESS_PROVIDERS.GODADDY, "provider.godaddy", "/imgs/providers/godaddy.svg", [ACCESS_USAGES.APPLY]],
|
||||||
|
[ACCESS_PROVIDERS.NAMECHEAP, "provider.namecheap", "/imgs/providers/namecheap.svg", [ACCESS_USAGES.APPLY]],
|
||||||
[ACCESS_PROVIDERS.NAMEDOTCOM, "provider.namedotcom", "/imgs/providers/namedotcom.svg", [ACCESS_USAGES.APPLY]],
|
[ACCESS_PROVIDERS.NAMEDOTCOM, "provider.namedotcom", "/imgs/providers/namedotcom.svg", [ACCESS_USAGES.APPLY]],
|
||||||
[ACCESS_PROVIDERS.NAMESILO, "provider.namesilo", "/imgs/providers/namesilo.svg", [ACCESS_USAGES.APPLY]],
|
[ACCESS_PROVIDERS.NAMESILO, "provider.namesilo", "/imgs/providers/namesilo.svg", [ACCESS_USAGES.APPLY]],
|
||||||
[ACCESS_PROVIDERS.NS1, "provider.ns1", "/imgs/providers/ns1.svg", [ACCESS_USAGES.APPLY]],
|
[ACCESS_PROVIDERS.NS1, "provider.ns1", "/imgs/providers/ns1.svg", [ACCESS_USAGES.APPLY]],
|
||||||
@ -129,6 +131,7 @@ export const APPLY_DNS_PROVIDERS = Object.freeze({
|
|||||||
BAIDUCLOUD_DNS: `${ACCESS_PROVIDERS.BAIDUCLOUD}-dns`,
|
BAIDUCLOUD_DNS: `${ACCESS_PROVIDERS.BAIDUCLOUD}-dns`,
|
||||||
CLOUDFLARE: `${ACCESS_PROVIDERS.CLOUDFLARE}`,
|
CLOUDFLARE: `${ACCESS_PROVIDERS.CLOUDFLARE}`,
|
||||||
CLOUDNS: `${ACCESS_PROVIDERS.CLOUDNS}`,
|
CLOUDNS: `${ACCESS_PROVIDERS.CLOUDNS}`,
|
||||||
|
CMCCCLOUD: `${ACCESS_PROVIDERS.CMCCCLOUD}`,
|
||||||
GCORE: `${ACCESS_PROVIDERS.GCORE}`,
|
GCORE: `${ACCESS_PROVIDERS.GCORE}`,
|
||||||
GNAME: `${ACCESS_PROVIDERS.GNAME}`,
|
GNAME: `${ACCESS_PROVIDERS.GNAME}`,
|
||||||
GODADDY: `${ACCESS_PROVIDERS.GODADDY}`,
|
GODADDY: `${ACCESS_PROVIDERS.GODADDY}`,
|
||||||
@ -136,6 +139,7 @@ export const APPLY_DNS_PROVIDERS = Object.freeze({
|
|||||||
HUAWEICLOUD_DNS: `${ACCESS_PROVIDERS.HUAWEICLOUD}-dns`,
|
HUAWEICLOUD_DNS: `${ACCESS_PROVIDERS.HUAWEICLOUD}-dns`,
|
||||||
JDCLOUD: `${ACCESS_PROVIDERS.JDCLOUD}`, // 兼容旧值,等同于 `JDCLOUD_DNS`
|
JDCLOUD: `${ACCESS_PROVIDERS.JDCLOUD}`, // 兼容旧值,等同于 `JDCLOUD_DNS`
|
||||||
JDCLOUD_DNS: `${ACCESS_PROVIDERS.JDCLOUD}-dns`,
|
JDCLOUD_DNS: `${ACCESS_PROVIDERS.JDCLOUD}-dns`,
|
||||||
|
NAMECHEAP: `${ACCESS_PROVIDERS.NAMECHEAP}`,
|
||||||
NAMEDOTCOM: `${ACCESS_PROVIDERS.NAMEDOTCOM}`,
|
NAMEDOTCOM: `${ACCESS_PROVIDERS.NAMEDOTCOM}`,
|
||||||
NAMESILO: `${ACCESS_PROVIDERS.NAMESILO}`,
|
NAMESILO: `${ACCESS_PROVIDERS.NAMESILO}`,
|
||||||
NS1: `${ACCESS_PROVIDERS.NS1}`,
|
NS1: `${ACCESS_PROVIDERS.NS1}`,
|
||||||
@ -173,9 +177,11 @@ export const applyDNSProvidersMap: Map<ApplyDNSProvider["type"] | string, ApplyD
|
|||||||
[APPLY_DNS_PROVIDERS.AZURE_DNS, "provider.azure.dns"],
|
[APPLY_DNS_PROVIDERS.AZURE_DNS, "provider.azure.dns"],
|
||||||
[APPLY_DNS_PROVIDERS.CLOUDFLARE, "provider.cloudflare"],
|
[APPLY_DNS_PROVIDERS.CLOUDFLARE, "provider.cloudflare"],
|
||||||
[APPLY_DNS_PROVIDERS.CLOUDNS, "provider.cloudns"],
|
[APPLY_DNS_PROVIDERS.CLOUDNS, "provider.cloudns"],
|
||||||
|
[APPLY_DNS_PROVIDERS.CMCCCLOUD, "provider.cmcc"],
|
||||||
[APPLY_DNS_PROVIDERS.GCORE, "provider.gcore"],
|
[APPLY_DNS_PROVIDERS.GCORE, "provider.gcore"],
|
||||||
[APPLY_DNS_PROVIDERS.GNAME, "provider.gname"],
|
[APPLY_DNS_PROVIDERS.GNAME, "provider.gname"],
|
||||||
[APPLY_DNS_PROVIDERS.GODADDY, "provider.godaddy"],
|
[APPLY_DNS_PROVIDERS.GODADDY, "provider.godaddy"],
|
||||||
|
[APPLY_DNS_PROVIDERS.NAMECHEAP, "provider.namecheap"],
|
||||||
[APPLY_DNS_PROVIDERS.NAMEDOTCOM, "provider.namedotcom"],
|
[APPLY_DNS_PROVIDERS.NAMEDOTCOM, "provider.namedotcom"],
|
||||||
[APPLY_DNS_PROVIDERS.NAMESILO, "provider.namesilo"],
|
[APPLY_DNS_PROVIDERS.NAMESILO, "provider.namesilo"],
|
||||||
[APPLY_DNS_PROVIDERS.NS1, "provider.ns1"],
|
[APPLY_DNS_PROVIDERS.NS1, "provider.ns1"],
|
||||||
|
@ -149,6 +149,12 @@
|
|||||||
"access.form.k8s_kubeconfig.placeholder": "Please enter KubeConfig file",
|
"access.form.k8s_kubeconfig.placeholder": "Please enter KubeConfig file",
|
||||||
"access.form.k8s_kubeconfig.upload": "Choose File ...",
|
"access.form.k8s_kubeconfig.upload": "Choose File ...",
|
||||||
"access.form.k8s_kubeconfig.tooltip": "For more information, see <a href=\"https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/\" target=\"_blank\">https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/</a><br><br>Leave it blank to use the Pod's ServiceAccount.",
|
"access.form.k8s_kubeconfig.tooltip": "For more information, see <a href=\"https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/\" target=\"_blank\">https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/</a><br><br>Leave it blank to use the Pod's ServiceAccount.",
|
||||||
|
"access.form.namecheap_username.label": "Namecheap username",
|
||||||
|
"access.form.namecheap_username.placeholder": "Please enter Namecheap username",
|
||||||
|
"access.form.namecheap_username.tooltip": "For more information, see <a href=\"https://www.namecheap.com/support/api/intro/\" target=\"_blank\">https://www.namecheap.com/support/api/intro/</a>",
|
||||||
|
"access.form.namecheap_api_key.label": "Namecheap API key",
|
||||||
|
"access.form.namecheap_api_key.placeholder": "Please enter Namecheap API key",
|
||||||
|
"access.form.namecheap_api_key.tooltip": "For more information, see <a href=\"https://www.namecheap.com/support/api/intro/\" target=\"_blank\">https://www.namecheap.com/support/api/intro/</a>",
|
||||||
"access.form.namedotcom_username.label": "Name.com username",
|
"access.form.namedotcom_username.label": "Name.com username",
|
||||||
"access.form.namedotcom_username.placeholder": "Please enter Name.com username",
|
"access.form.namedotcom_username.placeholder": "Please enter Name.com username",
|
||||||
"access.form.namedotcom_username.tooltip": "For more information, see <a href=\"https://www.name.com/account/settings/api\" target=\"_blank\">https://www.name.com/account/settings/api</a>",
|
"access.form.namedotcom_username.tooltip": "For more information, see <a href=\"https://www.name.com/account/settings/api\" target=\"_blank\">https://www.name.com/account/settings/api</a>",
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
"provider.cmcccloud": "China Mobile Cloud (ECloud)",
|
"provider.cmcccloud": "China Mobile Cloud (ECloud)",
|
||||||
"provider.ctcccloud": "China Telecom Cloud (State Cloud)",
|
"provider.ctcccloud": "China Telecom Cloud (State Cloud)",
|
||||||
"provider.cucccloud": "China Unicom Cloud",
|
"provider.cucccloud": "China Unicom Cloud",
|
||||||
|
"provider.dnsla": "DNS.LA",
|
||||||
"provider.dogecloud": "Doge Cloud",
|
"provider.dogecloud": "Doge Cloud",
|
||||||
"provider.dogecloud.cdn": "Doge Cloud - CDN (Content Delivery Network)",
|
"provider.dogecloud.cdn": "Doge Cloud - CDN (Content Delivery Network)",
|
||||||
"provider.edgio": "Edgio",
|
"provider.edgio": "Edgio",
|
||||||
@ -63,6 +64,7 @@
|
|||||||
"provider.kubernetes": "Kubernetes",
|
"provider.kubernetes": "Kubernetes",
|
||||||
"provider.kubernetes.secret": "Kubernetes - Secret",
|
"provider.kubernetes.secret": "Kubernetes - Secret",
|
||||||
"provider.local": "Local deployment",
|
"provider.local": "Local deployment",
|
||||||
|
"provider.namecheap": "Namecheap",
|
||||||
"provider.namedotcom": "Name.com",
|
"provider.namedotcom": "Name.com",
|
||||||
"provider.namesilo": "NameSilo",
|
"provider.namesilo": "NameSilo",
|
||||||
"provider.ns1": "NS1 (IBM NS1 Connect)",
|
"provider.ns1": "NS1 (IBM NS1 Connect)",
|
||||||
|
@ -149,6 +149,12 @@
|
|||||||
"access.form.k8s_kubeconfig.placeholder": "请选择 KubeConfig 文件",
|
"access.form.k8s_kubeconfig.placeholder": "请选择 KubeConfig 文件",
|
||||||
"access.form.k8s_kubeconfig.upload": "选择文件",
|
"access.form.k8s_kubeconfig.upload": "选择文件",
|
||||||
"access.form.k8s_kubeconfig.tooltip": "这是什么?请参阅 <a href=\"https://kubernetes.io/zh-cn/docs/concepts/configuration/organize-cluster-access-kubeconfig/\" target=\"_blank\">https://kubernetes.io/zh-cn/docs/concepts/configuration/organize-cluster-access-kubeconfig/</a><br><br>为空时,将使用 Pod 的 ServiceAccount 作为凭证。",
|
"access.form.k8s_kubeconfig.tooltip": "这是什么?请参阅 <a href=\"https://kubernetes.io/zh-cn/docs/concepts/configuration/organize-cluster-access-kubeconfig/\" target=\"_blank\">https://kubernetes.io/zh-cn/docs/concepts/configuration/organize-cluster-access-kubeconfig/</a><br><br>为空时,将使用 Pod 的 ServiceAccount 作为凭证。",
|
||||||
|
"access.form.namecheap_username.label": "Namecheap 用户名",
|
||||||
|
"access.form.namecheap_username.placeholder": "请输入 Namecheap 用户名",
|
||||||
|
"access.form.namecheap_username.tooltip": "这是什么?请参阅 <a href=\"https://www.namecheap.com/support/api/intro/\" target=\"_blank\">https://www.namecheap.com/support/api/intro/</a>",
|
||||||
|
"access.form.namecheap_api_key.label": "Namecheap API Key",
|
||||||
|
"access.form.namecheap_api_key.placeholder": "请输入 Namecheap API Key",
|
||||||
|
"access.form.namecheap_api_key.tooltip": "这是什么?请参阅 <a href=\"https://www.namecheap.com/support/api/intro/\" target=\"_blank\">https://www.namecheap.com/support/api/intro/</a>",
|
||||||
"access.form.namedotcom_username.label": "Name.com 用户名",
|
"access.form.namedotcom_username.label": "Name.com 用户名",
|
||||||
"access.form.namedotcom_username.placeholder": "请输入 Name.com 用户名",
|
"access.form.namedotcom_username.placeholder": "请输入 Name.com 用户名",
|
||||||
"access.form.namedotcom_username.tooltip": "这是什么?请参阅 <a href=\"https://www.name.com/account/settings/api\" target=\"_blank\">https://www.name.com/account/settings/api</a>",
|
"access.form.namedotcom_username.tooltip": "这是什么?请参阅 <a href=\"https://www.name.com/account/settings/api\" target=\"_blank\">https://www.name.com/account/settings/api</a>",
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
"provider.cmcccloud": "移动云",
|
"provider.cmcccloud": "移动云",
|
||||||
"provider.ctcccloud": "联通云",
|
"provider.ctcccloud": "联通云",
|
||||||
"provider.cucccloud": "天翼云",
|
"provider.cucccloud": "天翼云",
|
||||||
|
"provider.dnsla": "DNS.LA",
|
||||||
"provider.dogecloud": "多吉云",
|
"provider.dogecloud": "多吉云",
|
||||||
"provider.dogecloud.cdn": "多吉云 - 内容分发网络 CDN",
|
"provider.dogecloud.cdn": "多吉云 - 内容分发网络 CDN",
|
||||||
"provider.edgio": "Edgio",
|
"provider.edgio": "Edgio",
|
||||||
@ -63,6 +64,7 @@
|
|||||||
"provider.kubernetes": "Kubernetes",
|
"provider.kubernetes": "Kubernetes",
|
||||||
"provider.kubernetes.secret": "Kubernetes - Secret",
|
"provider.kubernetes.secret": "Kubernetes - Secret",
|
||||||
"provider.local": "本地部署",
|
"provider.local": "本地部署",
|
||||||
|
"provider.namecheap": "Namecheap",
|
||||||
"provider.namedotcom": "Name.com",
|
"provider.namedotcom": "Name.com",
|
||||||
"provider.namesilo": "NameSilo",
|
"provider.namesilo": "NameSilo",
|
||||||
"provider.ns1": "NS1(IBM NS1 Connect)",
|
"provider.ns1": "NS1(IBM NS1 Connect)",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user