From 03d2f4ca3266958988c2a89bb7e233c8d922bd37 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Tue, 18 Feb 2025 15:14:24 +0800 Subject: [PATCH] feat: add cdnfly deployer --- README.md | 1 + README_EN.md | 1 + internal/deployer/providers.go | 19 ++ internal/domain/access.go | 6 + internal/domain/provider.go | 3 +- .../lego-providers/acmehttpreq/acmehttpreq.go | 3 +- .../lego-providers/aliyun/aliyun.go | 3 +- .../lego-providers/aws-route53/aws-route53.go | 3 +- .../lego-providers/azure-dns/azure-dns.go | 3 +- .../lego-providers/cloudflare/cloudflare.go | 3 +- .../lego-providers/cloudns/cloudns.go | 3 +- .../acme-dns-01/lego-providers/gcore/gcore.go | 3 +- .../acme-dns-01/lego-providers/gname/gname.go | 3 +- .../lego-providers/godaddy/godaddy.go | 3 +- .../lego-providers/huaweicloud/huaweicloud.go | 3 +- .../lego-providers/namedotcom/namedotcom.go | 3 +- .../lego-providers/namesilo/namesilo.go | 3 +- .../acme-dns-01/lego-providers/ns1/ns1.go | 3 +- .../lego-providers/powerdns/powerdns.go | 3 +- .../lego-providers/rainyun/rainyun.go | 3 +- .../tencentcloud/tencentcloud.go | 3 +- .../lego-providers/volcengine/volcengine.go | 3 +- .../lego-providers/westcn/westcn.go | 3 +- .../providers/aliyun-alb/aliyun_alb.go | 4 +- .../aliyun-cas-deploy/aliyun_cas_deploy.go | 4 +- .../providers/aliyun-cdn/aliyun_cdn.go | 5 +- .../providers/aliyun-clb/aliyun_clb.go | 4 +- .../providers/aliyun-dcdn/aliyun_dcdn.go | 5 +- .../providers/aliyun-esa/aliyun_esa.go | 4 +- .../providers/aliyun-live/aliyun_live.go | 5 +- .../providers/aliyun-nlb/aliyun_nlb.go | 4 +- .../providers/aliyun-oss/aliyun_oss.go | 4 +- .../providers/aliyun-waf/aliyun_waf.go | 4 +- .../aws-cloudfront/aws_cloudfront.go | 4 +- .../baiducloud-cdn/baiducloud_cdn.go | 5 +- .../providers/baishan-cdn/baishan_cdn.go | 8 +- .../baotapanel-console/baotapanel_console.go | 13 +- .../baotapanel_console_test.go | 4 +- .../baotapanel-site/baotapanel_site.go | 13 +- .../baotapanel-site/baotapanel_site_test.go | 6 +- .../providers/byteplus-cdn/byteplus_cdn.go | 4 +- .../deployer/providers/cachefly/cachefly.go | 8 +- .../providers/cachefly/cachefly_test.go | 2 +- .../core/deployer/providers/cdnfly/cdnfly.go | 180 ++++++++++++++++++ .../deployer/providers/cdnfly/cdnfly_test.go | 81 ++++++++ .../core/deployer/providers/cdnfly/consts.go | 10 + .../providers/dogecloud-cdn/dogecloud_cdn.go | 5 +- .../edgio-applications/edgio_applications.go | 5 +- .../deployer/providers/gcore-cdn/gcore_cdn.go | 8 +- .../huaweicloud-cdn/huaweicloud_cdn.go | 5 +- .../huaweicloud-elb/huaweicloud_elb.go | 4 +- .../huaweicloud-waf/huaweicloud_waf.go | 4 +- .../providers/k8s-secret/k8s_secret.go | 4 +- .../core/deployer/providers/local/local.go | 5 +- .../deployer/providers/qiniu-cdn/qiniu_cdn.go | 5 +- .../providers/qiniu-pili/qiniu_pili.go | 5 +- .../deployer/providers/safeline/safeline.go | 13 +- .../providers/safeline/safeline_test.go | 4 +- .../pkg/core/deployer/providers/ssh/ssh.go | 5 +- .../tencentcloud-cdn/tencentcloud_cdn.go | 5 +- .../tencentcloud-clb/tencentcloud_clb.go | 4 +- .../tencentcloud-cos/tencentcloud_cos.go | 4 +- .../tencentcloud-css/tencentcloud_css.go | 5 +- .../tencentcloud-ecdn/tencentcloud_ecdn.go | 5 +- .../tencentcloud-eo/tencentcloud_eo.go | 4 +- .../tencentcloud_ssl_deploy.go | 4 +- .../tencentcloud-waf/tencentcloud_waf.go | 4 +- .../providers/ucloud-ucdn/ucloud_ucdn.go | 4 +- .../providers/ucloud-us3/ucloud_us3.go | 5 +- .../volcengine-cdn/volcengine_cdn.go | 4 +- .../volcengine-clb/volcengine_clb.go | 4 +- .../volcengine-dcdn/volcengine_dcdn.go | 5 +- .../volcengine-imagex/volcengine_imagex.go | 4 +- .../volcengine-live/volcengine_live.go | 4 +- .../volcengine-tos/volcengine_tos.go | 4 +- .../deployer/providers/webhook/webhook.go | 5 +- .../pkg/core/notifier/providers/bark/bark.go | 3 +- .../notifier/providers/dingtalk/dingtalk.go | 3 +- .../core/notifier/providers/email/email.go | 3 +- .../pkg/core/notifier/providers/lark/lark.go | 3 +- .../providers/serverchan/serverchan.go | 3 +- .../notifier/providers/telegram/telegram.go | 3 +- .../notifier/providers/webhook/webhook.go | 3 +- .../core/notifier/providers/wecom/wecom.go | 3 +- .../providers/aliyun-cas/aliyun_cas.go | 3 +- .../providers/aliyun-slb/aliyun_slb.go | 3 +- .../uploader/providers/aws-acm/aws_acm.go | 3 +- .../providers/byteplus-cdn/byteplus_cdn.go | 3 +- .../uploader/providers/dogecloud/dogecloud.go | 3 +- .../uploader/providers/gcore-cdn/gcore_cdn.go | 6 +- .../huaweicloud-elb/huaweicloud_elb.go | 2 +- .../huaweicloud-scm/huaweicloud_scm.go | 3 +- .../huaweicloud-waf/huaweicloud_waf.go | 2 +- .../providers/qiniu-sslcert/qiniu_sslcert.go | 3 +- .../tencentcloud-ssl/tencentcloud_ssl.go | 3 +- .../providers/ucloud-ussl/ucloud_ussl.go | 2 +- .../volcengine-cdn/volcengine_cdn.go | 3 +- .../volcengine_certcenter.go | 3 +- .../volcengine-live/volcengine_live.go | 3 +- internal/pkg/vendors/baishan-sdk/client.go | 8 +- internal/pkg/vendors/btpanel-sdk/client.go | 9 +- internal/pkg/vendors/cachefly-sdk/client.go | 4 +- internal/pkg/vendors/cdnfly-sdk/api.go | 59 ++++++ internal/pkg/vendors/cdnfly-sdk/client.go | 79 ++++++++ internal/pkg/vendors/cdnfly-sdk/models.go | 70 +++++++ internal/pkg/vendors/gname-sdk/client.go | 5 +- internal/pkg/vendors/safeline-sdk/client.go | 13 +- ui/public/imgs/providers/cdnfly.png | Bin 0 -> 1086 bytes ui/src/components/access/AccessForm.tsx | 3 + .../access/AccessFormCdnflyConfig.tsx | 87 +++++++++ .../workflow/node/DeployNodeConfigForm.tsx | 5 +- .../DeployNodeConfigFormAliyunESAConfig.tsx | 11 +- .../node/DeployNodeConfigFormCdnflyConfig.tsx | 89 +++++++++ .../DeployNodeConfigFormGcoreCDNConfig.tsx | 10 +- .../DeployNodeConfigFormSafeLineConfig.tsx | 21 +- ui/src/domain/access.ts | 7 + ui/src/domain/provider.ts | 4 + ui/src/i18n/locales/en/nls.access.json | 9 + .../i18n/locales/en/nls.workflow.nodes.json | 8 + ui/src/i18n/locales/zh/nls.access.json | 9 + .../i18n/locales/zh/nls.workflow.nodes.json | 8 + ui/{src => types}/vite-env.d.ts | 0 122 files changed, 955 insertions(+), 243 deletions(-) create mode 100644 internal/pkg/core/deployer/providers/cdnfly/cdnfly.go create mode 100644 internal/pkg/core/deployer/providers/cdnfly/cdnfly_test.go create mode 100644 internal/pkg/core/deployer/providers/cdnfly/consts.go create mode 100644 internal/pkg/vendors/cdnfly-sdk/api.go create mode 100644 internal/pkg/vendors/cdnfly-sdk/client.go create mode 100644 internal/pkg/vendors/cdnfly-sdk/models.go create mode 100644 ui/public/imgs/providers/cdnfly.png create mode 100644 ui/src/components/access/AccessFormCdnflyConfig.tsx create mode 100644 ui/src/components/workflow/node/DeployNodeConfigFormCdnflyConfig.tsx rename ui/{src => types}/vite-env.d.ts (100%) diff --git a/README.md b/README.md index ab7d553c..bae31da1 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,7 @@ make local.run | [AWS](https://aws.amazon.com/) | 可部署到 AWS CloudFront | | [BytePlus](https://www.byteplus.com/) | 可部署到 BytePlus CDN | | [CacheFly](https://www.cachefly.com/) | 可部署到 CacheFly CDN | +| [Cdnfly](https://www.cdnfly.cn/) | 可部署到 Cdnfly CDN | | [Edgio](https://edg.io/) | 可部署到 Edgio Applications | | [Gcore](https://gcore.com/) | 可部署到 Gcore CDN | diff --git a/README_EN.md b/README_EN.md index 1320f3ea..0daf5b2b 100644 --- a/README_EN.md +++ b/README_EN.md @@ -136,6 +136,7 @@ The following hosting providers are supported: | [AWS](https://aws.amazon.com/) | Supports deployment to AWS CloudFront | | [BytePlus](https://www.byteplus.com/) | Supports deployment to BytePlus CDN | | [CacheFly](https://www.cachefly.com/) | Supports deployment to CacheFly CDN | +| [Cdnfly](https://www.cdnfly.cn/) | Supports deployment to Cdnfly CDN | | [Edgio](https://edg.io/) | Supports deployment to Edgio Applications | | [Gcore](https://gcore.com/) | Supports deployment to Gcore CDN | diff --git a/internal/deployer/providers.go b/internal/deployer/providers.go index 5c3c53ed..9b2bd4f7 100644 --- a/internal/deployer/providers.go +++ b/internal/deployer/providers.go @@ -23,6 +23,7 @@ import ( pBaotaPanelSite "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/baotapanel-site" pBytePlusCDN "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/byteplus-cdn" pCacheFly "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/cachefly" + pCdnfly "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/cdnfly" pDogeCDN "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/dogecloud-cdn" pEdgioApplications "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/edgio-applications" pGcoreCDN "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/gcore-cdn" @@ -302,6 +303,24 @@ func createDeployer(options *deployerOptions) (deployer.Deployer, logger.Logger, return deployer, logger, err } + case domain.DeployProviderTypeCdnfly: + { + access := domain.AccessConfigForCdnfly{} + if err := maps.Populate(options.ProviderAccessConfig, &access); err != nil { + return nil, nil, fmt.Errorf("failed to populate provider access config: %w", err) + } + + deployer, err := pCdnfly.NewWithLogger(&pCdnfly.CdnflyDeployerConfig{ + ApiUrl: access.ApiUrl, + ApiKey: access.ApiKey, + ApiSecret: access.ApiSecret, + ResourceType: pCdnfly.ResourceType(maps.GetValueAsString(options.ProviderDeployConfig, "resourceType")), + SiteId: maps.GetValueAsString(options.ProviderDeployConfig, "siteId"), + CertificateId: maps.GetValueAsString(options.ProviderDeployConfig, "certificateId"), + }, logger) + return deployer, logger, err + } + case domain.DeployProviderTypeDogeCloudCDN: { access := domain.AccessConfigForDogeCloud{} diff --git a/internal/domain/access.go b/internal/domain/access.go index b21b5a3f..eaa3340e 100644 --- a/internal/domain/access.go +++ b/internal/domain/access.go @@ -71,6 +71,12 @@ type AccessConfigForCacheFly struct { ApiToken string `json:"apiToken"` } +type AccessConfigForCdnfly struct { + ApiUrl string `json:"apiUrl"` + ApiKey string `json:"apiKey"` + ApiSecret string `json:"apiSecret"` +} + type AccessConfigForCloudflare struct { DnsApiToken string `json:"dnsApiToken"` } diff --git a/internal/domain/provider.go b/internal/domain/provider.go index 94e8c7ae..2aaa69a9 100644 --- a/internal/domain/provider.go +++ b/internal/domain/provider.go @@ -20,7 +20,7 @@ const ( AccessProviderTypeBaotaPanel = AccessProviderType("baotapanel") AccessProviderTypeBytePlus = AccessProviderType("byteplus") AccessProviderTypeCacheFly = AccessProviderType("cachefly") - AccessProviderTypeCdnfly = AccessProviderType("cdnfly") // Cdnly(预留) + AccessProviderTypeCdnfly = AccessProviderType("cdnfly") AccessProviderTypeCloudflare = AccessProviderType("cloudflare") AccessProviderTypeClouDNS = AccessProviderType("cloudns") AccessProviderTypeCMCCCloud = AccessProviderType("cmcccloud") // 移动云(预留) @@ -113,6 +113,7 @@ const ( DeployProviderTypeBaotaPanelSite = DeployProviderType("baotapanel-site") DeployProviderTypeBytePlusCDN = DeployProviderType("byteplus-cdn") DeployProviderTypeCacheFly = DeployProviderType("cachefly") + DeployProviderTypeCdnfly = DeployProviderType("cdnfly") DeployProviderTypeDogeCloudCDN = DeployProviderType("dogecloud-cdn") DeployProviderTypeEdgioApplications = DeployProviderType("edgio-applications") DeployProviderTypeGcoreCDN = DeployProviderType("gcore-cdn") diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/acmehttpreq/acmehttpreq.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/acmehttpreq/acmehttpreq.go index a25c13bb..a484b1ca 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/acmehttpreq/acmehttpreq.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/acmehttpreq/acmehttpreq.go @@ -1,7 +1,6 @@ package acmehttpreq import ( - "errors" "net/url" "time" @@ -19,7 +18,7 @@ type ACMEHttpReqApplicantConfig struct { func NewChallengeProvider(config *ACMEHttpReqApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } endpoint, _ := url.Parse(config.Endpoint) diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/aliyun/aliyun.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/aliyun/aliyun.go index 6f6d2d89..0f5673f3 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/aliyun/aliyun.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/aliyun/aliyun.go @@ -1,7 +1,6 @@ package aliyun import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -17,7 +16,7 @@ type AliyunApplicantConfig struct { func NewChallengeProvider(config *AliyunApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := alidns.NewDefaultConfig() diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/aws-route53/aws-route53.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/aws-route53/aws-route53.go index 6799885f..cf6af901 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/aws-route53/aws-route53.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/aws-route53/aws-route53.go @@ -1,7 +1,6 @@ package awsroute53 import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -19,7 +18,7 @@ type AWSRoute53ApplicantConfig struct { func NewChallengeProvider(config *AWSRoute53ApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := route53.NewDefaultConfig() diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/azure-dns/azure-dns.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/azure-dns/azure-dns.go index 7cfce4a7..858d937a 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/azure-dns/azure-dns.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/azure-dns/azure-dns.go @@ -1,7 +1,6 @@ package azuredns import ( - "errors" "fmt" "strings" "time" @@ -22,7 +21,7 @@ type AzureDNSApplicantConfig struct { func NewChallengeProvider(config *AzureDNSApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := azuredns.NewDefaultConfig() diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudflare/cloudflare.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudflare/cloudflare.go index cea32e94..de8edbcd 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudflare/cloudflare.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudflare/cloudflare.go @@ -1,7 +1,6 @@ package cloudflare import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -16,7 +15,7 @@ type CloudflareApplicantConfig struct { func NewChallengeProvider(config *CloudflareApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := cloudflare.NewDefaultConfig() diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudns/cloudns.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudns/cloudns.go index 09aac6df..acde9ee7 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudns/cloudns.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudns/cloudns.go @@ -1,7 +1,6 @@ package cloudns import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -17,7 +16,7 @@ type ClouDNSApplicantConfig struct { func NewChallengeProvider(config *ClouDNSApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := cloudns.NewDefaultConfig() diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/gcore/gcore.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/gcore/gcore.go index 1179d95d..652d7550 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/gcore/gcore.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/gcore/gcore.go @@ -1,7 +1,6 @@ package gcore import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -16,7 +15,7 @@ type GcoreApplicantConfig struct { func NewChallengeProvider(config *GcoreApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := gcore.NewDefaultConfig() diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/gname/gname.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/gname/gname.go index 90cec017..2f9d2443 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/gname/gname.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/gname/gname.go @@ -1,7 +1,6 @@ package gname import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -18,7 +17,7 @@ type GnameApplicantConfig struct { func NewChallengeProvider(config *GnameApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := internal.NewDefaultConfig() diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/godaddy/godaddy.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/godaddy/godaddy.go index 3a44616b..433390ed 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/godaddy/godaddy.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/godaddy/godaddy.go @@ -1,7 +1,6 @@ package godaddy import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -17,7 +16,7 @@ type GoDaddyApplicantConfig struct { func NewChallengeProvider(config *GoDaddyApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := godaddy.NewDefaultConfig() diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/huaweicloud/huaweicloud.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/huaweicloud/huaweicloud.go index cbdf2928..72c0a12c 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/huaweicloud/huaweicloud.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/huaweicloud/huaweicloud.go @@ -1,7 +1,6 @@ package huaweicloud import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -18,7 +17,7 @@ type HuaweiCloudApplicantConfig struct { func NewChallengeProvider(config *HuaweiCloudApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } region := config.Region diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/namedotcom/namedotcom.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/namedotcom/namedotcom.go index c51b1a9b..d7b98d85 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/namedotcom/namedotcom.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/namedotcom/namedotcom.go @@ -1,7 +1,6 @@ package namedotcom import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -17,7 +16,7 @@ type NameDotComApplicantConfig struct { func NewChallengeProvider(config *NameDotComApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := namedotcom.NewDefaultConfig() diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/namesilo/namesilo.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/namesilo/namesilo.go index 0f1bf8ea..c2c0618b 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/namesilo/namesilo.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/namesilo/namesilo.go @@ -1,7 +1,6 @@ package namesilo import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -16,7 +15,7 @@ type NameSiloApplicantConfig struct { func NewChallengeProvider(config *NameSiloApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := namesilo.NewDefaultConfig() diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/ns1/ns1.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/ns1/ns1.go index efa40076..cf2f2c40 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/ns1/ns1.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/ns1/ns1.go @@ -1,7 +1,6 @@ package ns1 import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -16,7 +15,7 @@ type NS1ApplicantConfig struct { func NewChallengeProvider(config *NS1ApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := ns1.NewDefaultConfig() diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/powerdns/powerdns.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/powerdns/powerdns.go index d5fa616c..9969b002 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/powerdns/powerdns.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/powerdns/powerdns.go @@ -1,7 +1,6 @@ package namesilo import ( - "errors" "net/url" "time" @@ -18,7 +17,7 @@ type PowerDNSApplicantConfig struct { func NewChallengeProvider(config *PowerDNSApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } host, _ := url.Parse(config.ApiUrl) diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/rainyun/rainyun.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/rainyun/rainyun.go index d250a279..eef887d2 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/rainyun/rainyun.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/rainyun/rainyun.go @@ -1,7 +1,6 @@ package rainyun import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -16,7 +15,7 @@ type RainYunApplicantConfig struct { func NewChallengeProvider(config *RainYunApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := rainyun.NewDefaultConfig() diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/tencentcloud/tencentcloud.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/tencentcloud/tencentcloud.go index f7e6bf7b..0e60328f 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/tencentcloud/tencentcloud.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/tencentcloud/tencentcloud.go @@ -1,7 +1,6 @@ package tencentcloud import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -17,7 +16,7 @@ type TencentCloudApplicantConfig struct { func NewChallengeProvider(config *TencentCloudApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := tencentcloud.NewDefaultConfig() diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/volcengine/volcengine.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/volcengine/volcengine.go index a8f11ff9..dfeddccd 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/volcengine/volcengine.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/volcengine/volcengine.go @@ -1,7 +1,6 @@ package volcengine import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -17,7 +16,7 @@ type VolcEngineApplicantConfig struct { func NewChallengeProvider(config *VolcEngineApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := volcengine.NewDefaultConfig() diff --git a/internal/pkg/core/applicant/acme-dns-01/lego-providers/westcn/westcn.go b/internal/pkg/core/applicant/acme-dns-01/lego-providers/westcn/westcn.go index f20b5d21..d7b26afd 100644 --- a/internal/pkg/core/applicant/acme-dns-01/lego-providers/westcn/westcn.go +++ b/internal/pkg/core/applicant/acme-dns-01/lego-providers/westcn/westcn.go @@ -1,7 +1,6 @@ package westcn import ( - "errors" "time" "github.com/go-acme/lego/v4/challenge" @@ -17,7 +16,7 @@ type WestcnApplicantConfig struct { func NewChallengeProvider(config *WestcnApplicantConfig) (challenge.Provider, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } providerConfig := westcn.NewDefaultConfig() diff --git a/internal/pkg/core/deployer/providers/aliyun-alb/aliyun_alb.go b/internal/pkg/core/deployer/providers/aliyun-alb/aliyun_alb.go index db4242d2..e81975ee 100644 --- a/internal/pkg/core/deployer/providers/aliyun-alb/aliyun_alb.go +++ b/internal/pkg/core/deployer/providers/aliyun-alb/aliyun_alb.go @@ -61,11 +61,11 @@ func New(config *AliyunALBDeployerConfig) (*AliyunALBDeployer, error) { func NewWithLogger(config *AliyunALBDeployerConfig, logger logger.Logger) (*AliyunALBDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } clients, err := createSdkClients(config.AccessKeyId, config.AccessKeySecret, config.Region) diff --git a/internal/pkg/core/deployer/providers/aliyun-cas-deploy/aliyun_cas_deploy.go b/internal/pkg/core/deployer/providers/aliyun-cas-deploy/aliyun_cas_deploy.go index 35f8edde..fb35364a 100644 --- a/internal/pkg/core/deployer/providers/aliyun-cas-deploy/aliyun_cas_deploy.go +++ b/internal/pkg/core/deployer/providers/aliyun-cas-deploy/aliyun_cas_deploy.go @@ -47,11 +47,11 @@ func New(config *AliyunCASDeployDeployerConfig) (*AliyunCASDeployDeployer, error func NewWithLogger(config *AliyunCASDeployDeployerConfig, logger logger.Logger) (*AliyunCASDeployDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret, config.Region) diff --git a/internal/pkg/core/deployer/providers/aliyun-cdn/aliyun_cdn.go b/internal/pkg/core/deployer/providers/aliyun-cdn/aliyun_cdn.go index d2de5684..df188523 100644 --- a/internal/pkg/core/deployer/providers/aliyun-cdn/aliyun_cdn.go +++ b/internal/pkg/core/deployer/providers/aliyun-cdn/aliyun_cdn.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "fmt" "strings" "time" @@ -39,11 +38,11 @@ func New(config *AliyunCDNDeployerConfig) (*AliyunCDNDeployer, error) { func NewWithLogger(config *AliyunCDNDeployerConfig, logger logger.Logger) (*AliyunCDNDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret) diff --git a/internal/pkg/core/deployer/providers/aliyun-clb/aliyun_clb.go b/internal/pkg/core/deployer/providers/aliyun-clb/aliyun_clb.go index 25f223b6..f344d1b6 100644 --- a/internal/pkg/core/deployer/providers/aliyun-clb/aliyun_clb.go +++ b/internal/pkg/core/deployer/providers/aliyun-clb/aliyun_clb.go @@ -51,11 +51,11 @@ func New(config *AliyunCLBDeployerConfig) (*AliyunCLBDeployer, error) { func NewWithLogger(config *AliyunCLBDeployerConfig, logger logger.Logger) (*AliyunCLBDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret, config.Region) diff --git a/internal/pkg/core/deployer/providers/aliyun-dcdn/aliyun_dcdn.go b/internal/pkg/core/deployer/providers/aliyun-dcdn/aliyun_dcdn.go index 65c9a375..8c571a3f 100644 --- a/internal/pkg/core/deployer/providers/aliyun-dcdn/aliyun_dcdn.go +++ b/internal/pkg/core/deployer/providers/aliyun-dcdn/aliyun_dcdn.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "fmt" "strings" "time" @@ -39,11 +38,11 @@ func New(config *AliyunDCDNDeployerConfig) (*AliyunDCDNDeployer, error) { func NewWithLogger(config *AliyunDCDNDeployerConfig, logger logger.Logger) (*AliyunDCDNDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret) diff --git a/internal/pkg/core/deployer/providers/aliyun-esa/aliyun_esa.go b/internal/pkg/core/deployer/providers/aliyun-esa/aliyun_esa.go index 8f492e36..87a483ff 100644 --- a/internal/pkg/core/deployer/providers/aliyun-esa/aliyun_esa.go +++ b/internal/pkg/core/deployer/providers/aliyun-esa/aliyun_esa.go @@ -44,11 +44,11 @@ func New(config *AliyunESADeployerConfig) (*AliyunESADeployer, error) { func NewWithLogger(config *AliyunESADeployerConfig, logger logger.Logger) (*AliyunESADeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret, config.Region) diff --git a/internal/pkg/core/deployer/providers/aliyun-live/aliyun_live.go b/internal/pkg/core/deployer/providers/aliyun-live/aliyun_live.go index 2e0c46af..fdc61d7d 100644 --- a/internal/pkg/core/deployer/providers/aliyun-live/aliyun_live.go +++ b/internal/pkg/core/deployer/providers/aliyun-live/aliyun_live.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "fmt" "strings" "time" @@ -41,11 +40,11 @@ func New(config *AliyunLiveDeployerConfig) (*AliyunLiveDeployer, error) { func NewWithLogger(config *AliyunLiveDeployerConfig, logger logger.Logger) (*AliyunLiveDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret, config.Region) diff --git a/internal/pkg/core/deployer/providers/aliyun-nlb/aliyun_nlb.go b/internal/pkg/core/deployer/providers/aliyun-nlb/aliyun_nlb.go index e55c9b80..8918e743 100644 --- a/internal/pkg/core/deployer/providers/aliyun-nlb/aliyun_nlb.go +++ b/internal/pkg/core/deployer/providers/aliyun-nlb/aliyun_nlb.go @@ -49,11 +49,11 @@ func New(config *AliyunNLBDeployerConfig) (*AliyunNLBDeployer, error) { func NewWithLogger(config *AliyunNLBDeployerConfig, logger logger.Logger) (*AliyunNLBDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret, config.Region) diff --git a/internal/pkg/core/deployer/providers/aliyun-oss/aliyun_oss.go b/internal/pkg/core/deployer/providers/aliyun-oss/aliyun_oss.go index 9caf0a3b..7b8b8c54 100644 --- a/internal/pkg/core/deployer/providers/aliyun-oss/aliyun_oss.go +++ b/internal/pkg/core/deployer/providers/aliyun-oss/aliyun_oss.go @@ -39,11 +39,11 @@ func New(config *AliyunOSSDeployerConfig) (*AliyunOSSDeployer, error) { func NewWithLogger(config *AliyunOSSDeployerConfig, logger logger.Logger) (*AliyunOSSDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret, config.Region) diff --git a/internal/pkg/core/deployer/providers/aliyun-waf/aliyun_waf.go b/internal/pkg/core/deployer/providers/aliyun-waf/aliyun_waf.go index 476ffaef..d355b382 100644 --- a/internal/pkg/core/deployer/providers/aliyun-waf/aliyun_waf.go +++ b/internal/pkg/core/deployer/providers/aliyun-waf/aliyun_waf.go @@ -43,11 +43,11 @@ func New(config *AliyunWAFDeployerConfig) (*AliyunWAFDeployer, error) { func NewWithLogger(config *AliyunWAFDeployerConfig, logger logger.Logger) (*AliyunWAFDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret, config.Region) diff --git a/internal/pkg/core/deployer/providers/aws-cloudfront/aws_cloudfront.go b/internal/pkg/core/deployer/providers/aws-cloudfront/aws_cloudfront.go index cf520a75..21c13df6 100644 --- a/internal/pkg/core/deployer/providers/aws-cloudfront/aws_cloudfront.go +++ b/internal/pkg/core/deployer/providers/aws-cloudfront/aws_cloudfront.go @@ -43,11 +43,11 @@ func New(config *AWSCloudFrontDeployerConfig) (*AWSCloudFrontDeployer, error) { func NewWithLogger(config *AWSCloudFrontDeployerConfig, logger logger.Logger) (*AWSCloudFrontDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.SecretAccessKey, config.Region) diff --git a/internal/pkg/core/deployer/providers/baiducloud-cdn/baiducloud_cdn.go b/internal/pkg/core/deployer/providers/baiducloud-cdn/baiducloud_cdn.go index ab932b42..ae34666a 100644 --- a/internal/pkg/core/deployer/providers/baiducloud-cdn/baiducloud_cdn.go +++ b/internal/pkg/core/deployer/providers/baiducloud-cdn/baiducloud_cdn.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "fmt" "time" @@ -37,11 +36,11 @@ func New(config *BaiduCloudCDNDeployerConfig) (*BaiduCloudCDNDeployer, error) { func NewWithLogger(config *BaiduCloudCDNDeployerConfig, logger logger.Logger) (*BaiduCloudCDNDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.SecretAccessKey) diff --git a/internal/pkg/core/deployer/providers/baishan-cdn/baishan_cdn.go b/internal/pkg/core/deployer/providers/baishan-cdn/baishan_cdn.go index 214f050e..454909fd 100644 --- a/internal/pkg/core/deployer/providers/baishan-cdn/baishan_cdn.go +++ b/internal/pkg/core/deployer/providers/baishan-cdn/baishan_cdn.go @@ -34,11 +34,11 @@ func New(config *BaishanCDNDeployerConfig) (*BaishanCDNDeployer, error) { func NewWithLogger(config *BaishanCDNDeployerConfig, logger logger.Logger) (*BaishanCDNDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.ApiToken) @@ -111,6 +111,10 @@ func (d *BaishanCDNDeployer) Deploy(ctx context.Context, certPem string, privkey } func createSdkClient(apiToken string) (*bssdk.Client, error) { + if apiToken == "" { + return nil, errors.New("invalid baishan api token") + } + client := bssdk.NewClient(apiToken) return client, nil } diff --git a/internal/pkg/core/deployer/providers/baotapanel-console/baotapanel_console.go b/internal/pkg/core/deployer/providers/baotapanel-console/baotapanel_console.go index e9c955c7..19dda685 100644 --- a/internal/pkg/core/deployer/providers/baotapanel-console/baotapanel_console.go +++ b/internal/pkg/core/deployer/providers/baotapanel-console/baotapanel_console.go @@ -3,6 +3,7 @@ import ( "context" "errors" + "net/url" xerrors "github.com/pkg/errors" @@ -34,11 +35,11 @@ func New(config *BaotaPanelConsoleDeployerConfig) (*BaotaPanelConsoleDeployer, e func NewWithLogger(config *BaotaPanelConsoleDeployerConfig, logger logger.Logger) (*BaotaPanelConsoleDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.ApiUrl, config.ApiKey) @@ -82,6 +83,14 @@ func (d *BaotaPanelConsoleDeployer) Deploy(ctx context.Context, certPem string, } func createSdkClient(apiUrl, apiKey string) (*btsdk.Client, error) { + if _, err := url.Parse(apiUrl); err != nil { + return nil, errors.New("invalid baota api url") + } + + if apiKey == "" { + return nil, errors.New("invalid baota api key") + } + client := btsdk.NewClient(apiUrl, apiKey) return client, nil } diff --git a/internal/pkg/core/deployer/providers/baotapanel-console/baotapanel_console_test.go b/internal/pkg/core/deployer/providers/baotapanel-console/baotapanel_console_test.go index ff388440..90a0a4ba 100644 --- a/internal/pkg/core/deployer/providers/baotapanel-console/baotapanel_console_test.go +++ b/internal/pkg/core/deployer/providers/baotapanel-console/baotapanel_console_test.go @@ -33,8 +33,8 @@ Shell command to run this test: go test -v ./baotapanel_console_test.go -args \ --CERTIMATE_DEPLOYER_BAOTAPANELCONSOLE_INPUTCERTPATH="/path/to/your-input-cert.pem" \ --CERTIMATE_DEPLOYER_BAOTAPANELCONSOLE_INPUTKEYPATH="/path/to/your-input-key.pem" \ - --CERTIMATE_DEPLOYER_BAOTAPANELCONSOLE_APIURL="your-baota-panel-url" \ - --CERTIMATE_DEPLOYER_BAOTAPANELCONSOLE_APIKEY="your-baota-panel-key" + --CERTIMATE_DEPLOYER_BAOTAPANELCONSOLE_APIURL="http://127.0.0.1:8888" \ + --CERTIMATE_DEPLOYER_BAOTAPANELCONSOLE_APIKEY="your-api-key" */ func TestDeploy(t *testing.T) { flag.Parse() diff --git a/internal/pkg/core/deployer/providers/baotapanel-site/baotapanel_site.go b/internal/pkg/core/deployer/providers/baotapanel-site/baotapanel_site.go index 14261968..6fffa670 100644 --- a/internal/pkg/core/deployer/providers/baotapanel-site/baotapanel_site.go +++ b/internal/pkg/core/deployer/providers/baotapanel-site/baotapanel_site.go @@ -3,6 +3,7 @@ import ( "context" "errors" + "net/url" xerrors "github.com/pkg/errors" @@ -34,11 +35,11 @@ func New(config *BaotaPanelSiteDeployerConfig) (*BaotaPanelSiteDeployer, error) func NewWithLogger(config *BaotaPanelSiteDeployerConfig, logger logger.Logger) (*BaotaPanelSiteDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.ApiUrl, config.ApiKey) @@ -76,6 +77,14 @@ func (d *BaotaPanelSiteDeployer) Deploy(ctx context.Context, certPem string, pri } func createSdkClient(apiUrl, apiKey string) (*btsdk.Client, error) { + if _, err := url.Parse(apiUrl); err != nil { + return nil, errors.New("invalid baota api url") + } + + if apiKey == "" { + return nil, errors.New("invalid baota api key") + } + client := btsdk.NewClient(apiUrl, apiKey) return client, nil } diff --git a/internal/pkg/core/deployer/providers/baotapanel-site/baotapanel_site_test.go b/internal/pkg/core/deployer/providers/baotapanel-site/baotapanel_site_test.go index 486e8428..ad45b56c 100644 --- a/internal/pkg/core/deployer/providers/baotapanel-site/baotapanel_site_test.go +++ b/internal/pkg/core/deployer/providers/baotapanel-site/baotapanel_site_test.go @@ -35,9 +35,9 @@ Shell command to run this test: go test -v ./baotapanel_site_test.go -args \ --CERTIMATE_DEPLOYER_BAOTAPANELSITE_INPUTCERTPATH="/path/to/your-input-cert.pem" \ --CERTIMATE_DEPLOYER_BAOTAPANELSITE_INPUTKEYPATH="/path/to/your-input-key.pem" \ - --CERTIMATE_DEPLOYER_BAOTAPANELSITE_APIURL="your-baota-panel-url" \ - --CERTIMATE_DEPLOYER_BAOTAPANELSITE_APIKEY="your-baota-panel-key" \ - --CERTIMATE_DEPLOYER_BAOTAPANELSITE_SITENAME="your-baota-site-name" + --CERTIMATE_DEPLOYER_BAOTAPANELSITE_APIURL="http://127.0.0.1:8888" \ + --CERTIMATE_DEPLOYER_BAOTAPANELSITE_APIKEY="your-api-key" \ + --CERTIMATE_DEPLOYER_BAOTAPANELSITE_SITENAME="your-site-name" */ func TestDeploy(t *testing.T) { flag.Parse() diff --git a/internal/pkg/core/deployer/providers/byteplus-cdn/byteplus_cdn.go b/internal/pkg/core/deployer/providers/byteplus-cdn/byteplus_cdn.go index 514bbd08..55c3e216 100644 --- a/internal/pkg/core/deployer/providers/byteplus-cdn/byteplus_cdn.go +++ b/internal/pkg/core/deployer/providers/byteplus-cdn/byteplus_cdn.go @@ -39,11 +39,11 @@ func New(config *BytePlusCDNDeployerConfig) (*BytePlusCDNDeployer, error) { func NewWithLogger(config *BytePlusCDNDeployerConfig, logger logger.Logger) (*BytePlusCDNDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client := bpCdn.NewInstance() diff --git a/internal/pkg/core/deployer/providers/cachefly/cachefly.go b/internal/pkg/core/deployer/providers/cachefly/cachefly.go index fe3fb3e4..352fba40 100644 --- a/internal/pkg/core/deployer/providers/cachefly/cachefly.go +++ b/internal/pkg/core/deployer/providers/cachefly/cachefly.go @@ -30,11 +30,11 @@ func New(config *CacheFlyDeployerConfig) (*CacheFlyDeployer, error) { func NewWithLogger(config *CacheFlyDeployerConfig, logger logger.Logger) (*CacheFlyDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.ApiToken) @@ -66,6 +66,10 @@ func (d *CacheFlyDeployer) Deploy(ctx context.Context, certPem string, privkeyPe } func createSdkClient(apiToken string) (*cfsdk.Client, error) { + if apiToken == "" { + return nil, errors.New("invalid cachefly api token") + } + client := cfsdk.NewClient(apiToken) return client, nil } diff --git a/internal/pkg/core/deployer/providers/cachefly/cachefly_test.go b/internal/pkg/core/deployer/providers/cachefly/cachefly_test.go index fcef1172..776b2438 100644 --- a/internal/pkg/core/deployer/providers/cachefly/cachefly_test.go +++ b/internal/pkg/core/deployer/providers/cachefly/cachefly_test.go @@ -31,7 +31,7 @@ Shell command to run this test: go test -v ./cachefly_test.go -args \ --CERTIMATE_DEPLOYER_CACHEFLY_INPUTCERTPATH="/path/to/your-input-cert.pem" \ --CERTIMATE_DEPLOYER_CACHEFLY_INPUTKEYPATH="/path/to/your-input-key.pem" \ - --CERTIMATE_DEPLOYER_CACHEFLY_APITOKEN="your-baota-panel-key" + --CERTIMATE_DEPLOYER_CACHEFLY_APITOKEN="your-api-token" */ func TestDeploy(t *testing.T) { flag.Parse() diff --git a/internal/pkg/core/deployer/providers/cdnfly/cdnfly.go b/internal/pkg/core/deployer/providers/cdnfly/cdnfly.go new file mode 100644 index 00000000..27abbc2f --- /dev/null +++ b/internal/pkg/core/deployer/providers/cdnfly/cdnfly.go @@ -0,0 +1,180 @@ +package cdnfly + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "net/url" + "time" + + xerrors "github.com/pkg/errors" + + "github.com/usual2970/certimate/internal/pkg/core/deployer" + "github.com/usual2970/certimate/internal/pkg/core/logger" + cfsdk "github.com/usual2970/certimate/internal/pkg/vendors/cdnfly-sdk" +) + +type CdnflyDeployerConfig struct { + // Cdnfly 地址。 + ApiUrl string `json:"apiUrl"` + // Cdnfly 用户端 API Key。 + ApiKey string `json:"apiKey"` + // Cdnfly 用户端 API Secret。 + ApiSecret string `json:"apiSecret"` + // 部署资源类型。 + ResourceType ResourceType `json:"resourceType"` + // 网站 ID。 + // 部署资源类型为 [RESOURCE_TYPE_SITE] 时必填。 + SiteId string `json:"siteId,omitempty"` + // 证书 ID。 + // 部署资源类型为 [RESOURCE_TYPE_CERTIFICATE] 时必填。 + CertificateId string `json:"certificateId,omitempty"` +} + +type CdnflyDeployer struct { + config *CdnflyDeployerConfig + logger logger.Logger + sdkClient *cfsdk.Client +} + +var _ deployer.Deployer = (*CdnflyDeployer)(nil) + +func New(config *CdnflyDeployerConfig) (*CdnflyDeployer, error) { + return NewWithLogger(config, logger.NewNilLogger()) +} + +func NewWithLogger(config *CdnflyDeployerConfig, logger logger.Logger) (*CdnflyDeployer, error) { + if config == nil { + panic("config is nil") + } + + if logger == nil { + panic("logger is nil") + } + + client, err := createSdkClient(config.ApiUrl, config.ApiKey, config.ApiSecret) + if err != nil { + return nil, xerrors.Wrap(err, "failed to create sdk client") + } + + return &CdnflyDeployer{ + logger: logger, + config: config, + sdkClient: client, + }, nil +} + +func (d *CdnflyDeployer) Deploy(ctx context.Context, certPem string, privkeyPem string) (*deployer.DeployResult, error) { + // 根据部署资源类型决定部署方式 + switch d.config.ResourceType { + case RESOURCE_TYPE_SITE: + if err := d.deployToSite(ctx, certPem, privkeyPem); err != nil { + return nil, err + } + + case RESOURCE_TYPE_CERTIFICATE: + if err := d.deployToCertificate(ctx, certPem, privkeyPem); err != nil { + return nil, err + } + + default: + return nil, fmt.Errorf("unsupported resource type: %s", d.config.ResourceType) + } + + return &deployer.DeployResult{}, nil +} + +func (d *CdnflyDeployer) deployToSite(ctx context.Context, certPem string, privkeyPem string) error { + if d.config.SiteId == "" { + return errors.New("config `siteId` is required") + } + + // 获取单个网站详情 + // REF: https://doc.cdnfly.cn/wangzhanguanli-v1-sites.html#%E8%8E%B7%E5%8F%96%E5%8D%95%E4%B8%AA%E7%BD%91%E7%AB%99%E8%AF%A6%E6%83%85 + getSiteReq := &cfsdk.GetSiteRequest{ + Id: d.config.SiteId, + } + getSiteResp, err := d.sdkClient.GetSite(getSiteReq) + if err != nil { + return xerrors.Wrap(err, "failed to execute sdk request 'cdnfly.GetSite'") + } else { + d.logger.Logt("已获取网站详情", getSiteResp) + } + + // 添加单个证书 + // REF: https://doc.cdnfly.cn/wangzhanzhengshu-v1-certs.html#%E6%B7%BB%E5%8A%A0%E5%8D%95%E4%B8%AA%E6%88%96%E5%A4%9A%E4%B8%AA%E8%AF%81%E4%B9%A6-%E5%A4%9A%E4%B8%AA%E8%AF%81%E4%B9%A6%E6%97%B6%E6%95%B0%E6%8D%AE%E6%A0%BC%E5%BC%8F%E4%B8%BA%E6%95%B0%E7%BB%84 + createCertificateReq := &cfsdk.CreateCertificateRequest{ + Name: fmt.Sprintf("certimate-%d", time.Now().UnixMilli()), + Type: "custom", + Cert: certPem, + Key: privkeyPem, + } + createCertificateResp, err := d.sdkClient.CreateCertificate(createCertificateReq) + if err != nil { + return xerrors.Wrap(err, "failed to execute sdk request 'cdnfly.CreateCertificate'") + } else { + d.logger.Logt("已添加证书", createCertificateResp) + } + + // 修改单个网站 + // REF: https://doc.cdnfly.cn/wangzhanguanli-v1-sites.html#%E4%BF%AE%E6%94%B9%E5%8D%95%E4%B8%AA%E7%BD%91%E7%AB%99 + updateSiteHttpsListenMap := make(map[string]any) + _ = json.Unmarshal([]byte(getSiteResp.Data.HttpsListen), &updateSiteHttpsListenMap) + updateSiteHttpsListenMap["cert"] = createCertificateResp.Data + updateSiteHttpsListenData, _ := json.Marshal(updateSiteHttpsListenMap) + updateSiteHttpsListen := string(updateSiteHttpsListenData) + updateSiteReq := &cfsdk.UpdateSiteRequest{ + Id: d.config.SiteId, + HttpsListen: &updateSiteHttpsListen, + } + updateSiteResp, err := d.sdkClient.UpdateSite(updateSiteReq) + if err != nil { + return xerrors.Wrap(err, "failed to execute sdk request 'cdnfly.UpdateSite'") + } else { + d.logger.Logt("已修改网站", updateSiteResp) + } + + return nil +} + +func (d *CdnflyDeployer) deployToCertificate(ctx context.Context, certPem string, privkeyPem string) error { + if d.config.CertificateId == "" { + return errors.New("config `certificateId` is required") + } + + // 修改单个证书 + // REF: https://doc.cdnfly.cn/wangzhanzhengshu-v1-certs.html#%E4%BF%AE%E6%94%B9%E5%8D%95%E4%B8%AA%E8%AF%81%E4%B9%A6 + updateCertificateType := "custom" + updateCertificateReq := &cfsdk.UpdateCertificateRequest{ + Id: d.config.CertificateId, + Type: &updateCertificateType, + Cert: &certPem, + Key: &privkeyPem, + } + updateCertificateResp, err := d.sdkClient.UpdateCertificate(updateCertificateReq) + if err != nil { + return xerrors.Wrap(err, "failed to execute sdk request 'cdnfly.UpdateCertificate'") + } else { + d.logger.Logt("已修改证书", updateCertificateResp) + } + + return nil +} + +func createSdkClient(apiUrl, apiKey, apiSecret string) (*cfsdk.Client, error) { + if _, err := url.Parse(apiUrl); err != nil { + return nil, errors.New("invalid cachefly api url") + } + + if apiKey == "" { + return nil, errors.New("invalid cachefly api key") + } + + if apiSecret == "" { + return nil, errors.New("invalid cachefly api secret") + } + + client := cfsdk.NewClient(apiUrl, apiKey, apiSecret) + return client, nil +} diff --git a/internal/pkg/core/deployer/providers/cdnfly/cdnfly_test.go b/internal/pkg/core/deployer/providers/cdnfly/cdnfly_test.go new file mode 100644 index 00000000..2d9604cd --- /dev/null +++ b/internal/pkg/core/deployer/providers/cdnfly/cdnfly_test.go @@ -0,0 +1,81 @@ +package cdnfly_test + +import ( + "context" + "flag" + "fmt" + "os" + "strings" + "testing" + + provider "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/cdnfly" +) + +var ( + fInputCertPath string + fInputKeyPath string + fApiUrl string + fApiKey string + fApiSecret string + fCertificateId string +) + +func init() { + argsPrefix := "CERTIMATE_DEPLOYER_CDNFLY_" + + flag.StringVar(&fInputCertPath, argsPrefix+"INPUTCERTPATH", "", "") + flag.StringVar(&fInputKeyPath, argsPrefix+"INPUTKEYPATH", "", "") + flag.StringVar(&fApiUrl, argsPrefix+"APIURL", "", "") + flag.StringVar(&fApiKey, argsPrefix+"APIKEY", "", "") + flag.StringVar(&fApiSecret, argsPrefix+"APISECRET", "", "") + flag.StringVar(&fCertificateId, argsPrefix+"CERTIFICATEID", "", "") +} + +/* +Shell command to run this test: + + go test -v ./cdnfly_test.go -args \ + --CERTIMATE_DEPLOYER_CDNFLY_INPUTCERTPATH="/path/to/your-input-cert.pem" \ + --CERTIMATE_DEPLOYER_CDNFLY_INPUTKEYPATH="/path/to/your-input-key.pem" \ + --CERTIMATE_DEPLOYER_CDNFLY_APIURL="http://127.0.0.1:88" \ + --CERTIMATE_DEPLOYER_CDNFLY_APIKEY="your-api-key" \ + --CERTIMATE_DEPLOYER_CDNFLY_APISECRET="your-api-secret" \ + --CERTIMATE_DEPLOYER_CDNFLY_CERTIFICATEID="your-cert-id" +*/ +func TestDeploy(t *testing.T) { + flag.Parse() + + t.Run("Deploy", func(t *testing.T) { + t.Log(strings.Join([]string{ + "args:", + fmt.Sprintf("INPUTCERTPATH: %v", fInputCertPath), + fmt.Sprintf("INPUTKEYPATH: %v", fInputKeyPath), + fmt.Sprintf("APIURL: %v", fApiUrl), + fmt.Sprintf("APIKEY: %v", fApiKey), + fmt.Sprintf("APISECRET: %v", fApiSecret), + fmt.Sprintf("CERTIFICATEID: %v", fCertificateId), + }, "\n")) + + deployer, err := provider.New(&provider.CdnflyDeployerConfig{ + ApiUrl: fApiUrl, + ApiKey: fApiKey, + ApiSecret: fApiSecret, + ResourceType: provider.RESOURCE_TYPE_CERTIFICATE, + CertificateId: fCertificateId, + }) + if err != nil { + t.Errorf("err: %+v", err) + return + } + + fInputCertData, _ := os.ReadFile(fInputCertPath) + fInputKeyData, _ := os.ReadFile(fInputKeyPath) + res, err := deployer.Deploy(context.Background(), string(fInputCertData), string(fInputKeyData)) + if err != nil { + t.Errorf("err: %+v", err) + return + } + + t.Logf("ok: %v", res) + }) +} diff --git a/internal/pkg/core/deployer/providers/cdnfly/consts.go b/internal/pkg/core/deployer/providers/cdnfly/consts.go new file mode 100644 index 00000000..3f6c6db0 --- /dev/null +++ b/internal/pkg/core/deployer/providers/cdnfly/consts.go @@ -0,0 +1,10 @@ +package cdnfly + +type ResourceType string + +const ( + // 资源类型:替换指定网站的证书。 + RESOURCE_TYPE_SITE = ResourceType("site") + // 资源类型:替换指定证书。 + RESOURCE_TYPE_CERTIFICATE = ResourceType("certificate") +) diff --git a/internal/pkg/core/deployer/providers/dogecloud-cdn/dogecloud_cdn.go b/internal/pkg/core/deployer/providers/dogecloud-cdn/dogecloud_cdn.go index 58e79ee8..25aac09d 100644 --- a/internal/pkg/core/deployer/providers/dogecloud-cdn/dogecloud_cdn.go +++ b/internal/pkg/core/deployer/providers/dogecloud-cdn/dogecloud_cdn.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "strconv" xerrors "github.com/pkg/errors" @@ -38,11 +37,11 @@ func New(config *DogeCloudCDNDeployerConfig) (*DogeCloudCDNDeployer, error) { func NewWithLogger(config *DogeCloudCDNDeployerConfig, logger logger.Logger) (*DogeCloudCDNDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client := dogesdk.NewClient(config.AccessKey, config.SecretKey) diff --git a/internal/pkg/core/deployer/providers/edgio-applications/edgio_applications.go b/internal/pkg/core/deployer/providers/edgio-applications/edgio_applications.go index 5a6d4bf2..523e33cd 100644 --- a/internal/pkg/core/deployer/providers/edgio-applications/edgio_applications.go +++ b/internal/pkg/core/deployer/providers/edgio-applications/edgio_applications.go @@ -2,7 +2,6 @@ import ( "context" - "errors" xerrors "github.com/pkg/errors" @@ -36,11 +35,11 @@ func New(config *EdgioApplicationsDeployerConfig) (*EdgioApplicationsDeployer, e func NewWithLogger(config *EdgioApplicationsDeployerConfig, logger logger.Logger) (*EdgioApplicationsDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.ClientId, config.ClientSecret) diff --git a/internal/pkg/core/deployer/providers/gcore-cdn/gcore_cdn.go b/internal/pkg/core/deployer/providers/gcore-cdn/gcore_cdn.go index 4c20c874..24f00d90 100644 --- a/internal/pkg/core/deployer/providers/gcore-cdn/gcore_cdn.go +++ b/internal/pkg/core/deployer/providers/gcore-cdn/gcore_cdn.go @@ -38,11 +38,11 @@ func New(config *GcoreCDNDeployerConfig) (*GcoreCDNDeployer, error) { func NewWithLogger(config *GcoreCDNDeployerConfig, logger logger.Logger) (*GcoreCDNDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.ApiToken) @@ -114,6 +114,10 @@ func (d *GcoreCDNDeployer) Deploy(ctx context.Context, certPem string, privkeyPe } func createSdkClient(apiToken string) (*gresources.Service, error) { + if apiToken == "" { + return nil, errors.New("invalid gcore api token") + } + requester := gprovider.NewClient( gcoresdk.BASE_URL, gprovider.WithSigner(gcoresdk.NewAuthRequestSigner(apiToken)), diff --git a/internal/pkg/core/deployer/providers/huaweicloud-cdn/huaweicloud_cdn.go b/internal/pkg/core/deployer/providers/huaweicloud-cdn/huaweicloud_cdn.go index b4356a0d..20361673 100644 --- a/internal/pkg/core/deployer/providers/huaweicloud-cdn/huaweicloud_cdn.go +++ b/internal/pkg/core/deployer/providers/huaweicloud-cdn/huaweicloud_cdn.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/global" hcCdn "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v2" @@ -43,11 +42,11 @@ func New(config *HuaweiCloudCDNDeployerConfig) (*HuaweiCloudCDNDeployer, error) func NewWithLogger(config *HuaweiCloudCDNDeployerConfig, logger logger.Logger) (*HuaweiCloudCDNDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient( diff --git a/internal/pkg/core/deployer/providers/huaweicloud-elb/huaweicloud_elb.go b/internal/pkg/core/deployer/providers/huaweicloud-elb/huaweicloud_elb.go index f22a07fe..457a8541 100644 --- a/internal/pkg/core/deployer/providers/huaweicloud-elb/huaweicloud_elb.go +++ b/internal/pkg/core/deployer/providers/huaweicloud-elb/huaweicloud_elb.go @@ -58,11 +58,11 @@ func New(config *HuaweiCloudELBDeployerConfig) (*HuaweiCloudELBDeployer, error) func NewWithLogger(config *HuaweiCloudELBDeployerConfig, logger logger.Logger) (*HuaweiCloudELBDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.SecretAccessKey, config.Region) diff --git a/internal/pkg/core/deployer/providers/huaweicloud-waf/huaweicloud_waf.go b/internal/pkg/core/deployer/providers/huaweicloud-waf/huaweicloud_waf.go index 4273d7f7..aa77ba6a 100644 --- a/internal/pkg/core/deployer/providers/huaweicloud-waf/huaweicloud_waf.go +++ b/internal/pkg/core/deployer/providers/huaweicloud-waf/huaweicloud_waf.go @@ -55,11 +55,11 @@ func New(config *HuaweiCloudWAFDeployerConfig) (*HuaweiCloudWAFDeployer, error) func NewWithLogger(config *HuaweiCloudWAFDeployerConfig, logger logger.Logger) (*HuaweiCloudWAFDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.SecretAccessKey, config.Region) diff --git a/internal/pkg/core/deployer/providers/k8s-secret/k8s_secret.go b/internal/pkg/core/deployer/providers/k8s-secret/k8s_secret.go index 2b7ab8fd..22772b58 100644 --- a/internal/pkg/core/deployer/providers/k8s-secret/k8s_secret.go +++ b/internal/pkg/core/deployer/providers/k8s-secret/k8s_secret.go @@ -45,11 +45,11 @@ func New(config *K8sSecretDeployerConfig) (*K8sSecretDeployer, error) { func NewWithLogger(config *K8sSecretDeployerConfig, logger logger.Logger) (*K8sSecretDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } return &K8sSecretDeployer{ diff --git a/internal/pkg/core/deployer/providers/local/local.go b/internal/pkg/core/deployer/providers/local/local.go index e254caf9..666bb3dd 100644 --- a/internal/pkg/core/deployer/providers/local/local.go +++ b/internal/pkg/core/deployer/providers/local/local.go @@ -3,7 +3,6 @@ package local import ( "bytes" "context" - "errors" "fmt" "os/exec" "runtime" @@ -57,11 +56,11 @@ func New(config *LocalDeployerConfig) (*LocalDeployer, error) { func NewWithLogger(config *LocalDeployerConfig, logger logger.Logger) (*LocalDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } return &LocalDeployer{ diff --git a/internal/pkg/core/deployer/providers/qiniu-cdn/qiniu_cdn.go b/internal/pkg/core/deployer/providers/qiniu-cdn/qiniu_cdn.go index 098e05aa..49e54b1d 100644 --- a/internal/pkg/core/deployer/providers/qiniu-cdn/qiniu_cdn.go +++ b/internal/pkg/core/deployer/providers/qiniu-cdn/qiniu_cdn.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "strings" xerrors "github.com/pkg/errors" @@ -39,11 +38,11 @@ func New(config *QiniuCDNDeployerConfig) (*QiniuCDNDeployer, error) { func NewWithLogger(config *QiniuCDNDeployerConfig, logger logger.Logger) (*QiniuCDNDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client := qiniusdk.NewClient(auth.New(config.AccessKey, config.SecretKey)) diff --git a/internal/pkg/core/deployer/providers/qiniu-pili/qiniu_pili.go b/internal/pkg/core/deployer/providers/qiniu-pili/qiniu_pili.go index 1b34f379..a2e25d4c 100644 --- a/internal/pkg/core/deployer/providers/qiniu-pili/qiniu_pili.go +++ b/internal/pkg/core/deployer/providers/qiniu-pili/qiniu_pili.go @@ -2,7 +2,6 @@ import ( "context" - "errors" xerrors "github.com/pkg/errors" "github.com/qiniu/go-sdk/v7/pili" @@ -39,11 +38,11 @@ func New(config *QiniuPiliDeployerConfig) (*QiniuPiliDeployer, error) { func NewWithLogger(config *QiniuPiliDeployerConfig, logger logger.Logger) (*QiniuPiliDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } manager := pili.NewManager(pili.ManagerConfig{AccessKey: config.AccessKey, SecretKey: config.SecretKey}) diff --git a/internal/pkg/core/deployer/providers/safeline/safeline.go b/internal/pkg/core/deployer/providers/safeline/safeline.go index d6b37aea..b24f6331 100644 --- a/internal/pkg/core/deployer/providers/safeline/safeline.go +++ b/internal/pkg/core/deployer/providers/safeline/safeline.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "net/url" xerrors "github.com/pkg/errors" @@ -38,11 +39,11 @@ func New(config *SafeLineDeployerConfig) (*SafeLineDeployer, error) { func NewWithLogger(config *SafeLineDeployerConfig, logger logger.Logger) (*SafeLineDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.ApiUrl, config.ApiToken) @@ -97,6 +98,14 @@ func (d *SafeLineDeployer) deployToCertificate(ctx context.Context, certPem stri } func createSdkClient(apiUrl, apiToken string) (*safelinesdk.Client, error) { + if _, err := url.Parse(apiUrl); err != nil { + return nil, errors.New("invalid safeline api url") + } + + if apiToken == "" { + return nil, errors.New("invalid safeline api token") + } + client := safelinesdk.NewClient(apiUrl, apiToken) return client, nil } diff --git a/internal/pkg/core/deployer/providers/safeline/safeline_test.go b/internal/pkg/core/deployer/providers/safeline/safeline_test.go index 052b0aab..29b5ac3a 100644 --- a/internal/pkg/core/deployer/providers/safeline/safeline_test.go +++ b/internal/pkg/core/deployer/providers/safeline/safeline_test.go @@ -35,8 +35,8 @@ Shell command to run this test: go test -v ./safeline_test.go -args \ --CERTIMATE_DEPLOYER_SAFELINE_INPUTCERTPATH="/path/to/your-input-cert.pem" \ --CERTIMATE_DEPLOYER_SAFELINE_INPUTKEYPATH="/path/to/your-input-key.pem" \ - --CERTIMATE_DEPLOYER_SAFELINE_APIURL="your-safeline-url" \ - --CERTIMATE_DEPLOYER_SAFELINE_APITOKEN="your-safeline-api-token" \ + --CERTIMATE_DEPLOYER_SAFELINE_APIURL="http://127.0.0.1:9443" \ + --CERTIMATE_DEPLOYER_SAFELINE_APITOKEN="your-api-token" \ --CERTIMATE_DEPLOYER_SAFELINE_CERTIFICATEID="your-cerficiate-id" */ func TestDeploy(t *testing.T) { diff --git a/internal/pkg/core/deployer/providers/ssh/ssh.go b/internal/pkg/core/deployer/providers/ssh/ssh.go index 20ea348a..562e6506 100644 --- a/internal/pkg/core/deployer/providers/ssh/ssh.go +++ b/internal/pkg/core/deployer/providers/ssh/ssh.go @@ -3,7 +3,6 @@ package ssh import ( "bytes" "context" - "errors" "fmt" "os" "path/filepath" @@ -72,11 +71,11 @@ func New(config *SshDeployerConfig) (*SshDeployer, error) { func NewWithLogger(config *SshDeployerConfig, logger logger.Logger) (*SshDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } return &SshDeployer{ diff --git a/internal/pkg/core/deployer/providers/tencentcloud-cdn/tencentcloud_cdn.go b/internal/pkg/core/deployer/providers/tencentcloud-cdn/tencentcloud_cdn.go index 37c982bf..440b78dd 100644 --- a/internal/pkg/core/deployer/providers/tencentcloud-cdn/tencentcloud_cdn.go +++ b/internal/pkg/core/deployer/providers/tencentcloud-cdn/tencentcloud_cdn.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "strings" xerrors "github.com/pkg/errors" @@ -47,11 +46,11 @@ func New(config *TencentCloudCDNDeployerConfig) (*TencentCloudCDNDeployer, error func NewWithLogger(config *TencentCloudCDNDeployerConfig, logger logger.Logger) (*TencentCloudCDNDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } clients, err := createSdkClients(config.SecretId, config.SecretKey) diff --git a/internal/pkg/core/deployer/providers/tencentcloud-clb/tencentcloud_clb.go b/internal/pkg/core/deployer/providers/tencentcloud-clb/tencentcloud_clb.go index 0f5532bc..28307f74 100644 --- a/internal/pkg/core/deployer/providers/tencentcloud-clb/tencentcloud_clb.go +++ b/internal/pkg/core/deployer/providers/tencentcloud-clb/tencentcloud_clb.go @@ -57,11 +57,11 @@ func New(config *TencentCloudCLBDeployerConfig) (*TencentCloudCLBDeployer, error func NewWithLogger(config *TencentCloudCLBDeployerConfig, logger logger.Logger) (*TencentCloudCLBDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } clients, err := createSdkClients(config.SecretId, config.SecretKey, config.Region) diff --git a/internal/pkg/core/deployer/providers/tencentcloud-cos/tencentcloud_cos.go b/internal/pkg/core/deployer/providers/tencentcloud-cos/tencentcloud_cos.go index 0efc2e7a..72653dcd 100644 --- a/internal/pkg/core/deployer/providers/tencentcloud-cos/tencentcloud_cos.go +++ b/internal/pkg/core/deployer/providers/tencentcloud-cos/tencentcloud_cos.go @@ -44,11 +44,11 @@ func New(config *TencentCloudCOSDeployerConfig) (*TencentCloudCOSDeployer, error func NewWithLogger(config *TencentCloudCOSDeployerConfig, logger logger.Logger) (*TencentCloudCOSDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.SecretId, config.SecretKey, config.Region) diff --git a/internal/pkg/core/deployer/providers/tencentcloud-css/tencentcloud_css.go b/internal/pkg/core/deployer/providers/tencentcloud-css/tencentcloud_css.go index 85f92780..205649e5 100644 --- a/internal/pkg/core/deployer/providers/tencentcloud-css/tencentcloud_css.go +++ b/internal/pkg/core/deployer/providers/tencentcloud-css/tencentcloud_css.go @@ -2,7 +2,6 @@ import ( "context" - "errors" xerrors "github.com/pkg/errors" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" @@ -39,11 +38,11 @@ func New(config *TencentCloudCSSDeployerConfig) (*TencentCloudCSSDeployer, error func NewWithLogger(config *TencentCloudCSSDeployerConfig, logger logger.Logger) (*TencentCloudCSSDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.SecretId, config.SecretKey) diff --git a/internal/pkg/core/deployer/providers/tencentcloud-ecdn/tencentcloud_ecdn.go b/internal/pkg/core/deployer/providers/tencentcloud-ecdn/tencentcloud_ecdn.go index 803c48f7..47349a73 100644 --- a/internal/pkg/core/deployer/providers/tencentcloud-ecdn/tencentcloud_ecdn.go +++ b/internal/pkg/core/deployer/providers/tencentcloud-ecdn/tencentcloud_ecdn.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "strings" xerrors "github.com/pkg/errors" @@ -46,11 +45,11 @@ func New(config *TencentCloudECDNDeployerConfig) (*TencentCloudECDNDeployer, err func NewWithLogger(config *TencentCloudECDNDeployerConfig, logger logger.Logger) (*TencentCloudECDNDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } clients, err := createSdkClients(config.SecretId, config.SecretKey) diff --git a/internal/pkg/core/deployer/providers/tencentcloud-eo/tencentcloud_eo.go b/internal/pkg/core/deployer/providers/tencentcloud-eo/tencentcloud_eo.go index 9c183fec..90129cc4 100644 --- a/internal/pkg/core/deployer/providers/tencentcloud-eo/tencentcloud_eo.go +++ b/internal/pkg/core/deployer/providers/tencentcloud-eo/tencentcloud_eo.go @@ -47,11 +47,11 @@ func New(config *TencentCloudEODeployerConfig) (*TencentCloudEODeployer, error) func NewWithLogger(config *TencentCloudEODeployerConfig, logger logger.Logger) (*TencentCloudEODeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } clients, err := createSdkClients(config.SecretId, config.SecretKey) diff --git a/internal/pkg/core/deployer/providers/tencentcloud-ssl-deploy/tencentcloud_ssl_deploy.go b/internal/pkg/core/deployer/providers/tencentcloud-ssl-deploy/tencentcloud_ssl_deploy.go index aea9d4a4..bab0c627 100644 --- a/internal/pkg/core/deployer/providers/tencentcloud-ssl-deploy/tencentcloud_ssl_deploy.go +++ b/internal/pkg/core/deployer/providers/tencentcloud-ssl-deploy/tencentcloud_ssl_deploy.go @@ -45,11 +45,11 @@ func New(config *TencentCloudSSLDeployDeployerConfig) (*TencentCloudSSLDeployDep func NewWithLogger(config *TencentCloudSSLDeployDeployerConfig, logger logger.Logger) (*TencentCloudSSLDeployDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.SecretId, config.SecretKey, config.Region) diff --git a/internal/pkg/core/deployer/providers/tencentcloud-waf/tencentcloud_waf.go b/internal/pkg/core/deployer/providers/tencentcloud-waf/tencentcloud_waf.go index 4482d1f9..631750eb 100644 --- a/internal/pkg/core/deployer/providers/tencentcloud-waf/tencentcloud_waf.go +++ b/internal/pkg/core/deployer/providers/tencentcloud-waf/tencentcloud_waf.go @@ -45,11 +45,11 @@ func New(config *TencentCloudWAFDeployerConfig) (*TencentCloudWAFDeployer, error func NewWithLogger(config *TencentCloudWAFDeployerConfig, logger logger.Logger) (*TencentCloudWAFDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.SecretId, config.SecretKey, config.Region) diff --git a/internal/pkg/core/deployer/providers/ucloud-ucdn/ucloud_ucdn.go b/internal/pkg/core/deployer/providers/ucloud-ucdn/ucloud_ucdn.go index 3fdfd611..4cb373ab 100644 --- a/internal/pkg/core/deployer/providers/ucloud-ucdn/ucloud_ucdn.go +++ b/internal/pkg/core/deployer/providers/ucloud-ucdn/ucloud_ucdn.go @@ -42,11 +42,11 @@ func New(config *UCloudUCDNDeployerConfig) (*UCloudUCDNDeployer, error) { func NewWithLogger(config *UCloudUCDNDeployerConfig, logger logger.Logger) (*UCloudUCDNDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.PrivateKey, config.PublicKey) diff --git a/internal/pkg/core/deployer/providers/ucloud-us3/ucloud_us3.go b/internal/pkg/core/deployer/providers/ucloud-us3/ucloud_us3.go index 93a3792c..c7787a31 100644 --- a/internal/pkg/core/deployer/providers/ucloud-us3/ucloud_us3.go +++ b/internal/pkg/core/deployer/providers/ucloud-us3/ucloud_us3.go @@ -2,7 +2,6 @@ import ( "context" - "errors" xerrors "github.com/pkg/errors" usdk "github.com/ucloud/ucloud-sdk-go/ucloud" @@ -45,11 +44,11 @@ func New(config *UCloudUS3DeployerConfig) (*UCloudUS3Deployer, error) { func NewWithLogger(config *UCloudUS3DeployerConfig, logger logger.Logger) (*UCloudUS3Deployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.PrivateKey, config.PublicKey, config.Region) diff --git a/internal/pkg/core/deployer/providers/volcengine-cdn/volcengine_cdn.go b/internal/pkg/core/deployer/providers/volcengine-cdn/volcengine_cdn.go index f2ddd753..dc631669 100644 --- a/internal/pkg/core/deployer/providers/volcengine-cdn/volcengine_cdn.go +++ b/internal/pkg/core/deployer/providers/volcengine-cdn/volcengine_cdn.go @@ -39,11 +39,11 @@ func New(config *VolcEngineCDNDeployerConfig) (*VolcEngineCDNDeployer, error) { func NewWithLogger(config *VolcEngineCDNDeployerConfig, logger logger.Logger) (*VolcEngineCDNDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client := veCdn.NewInstance() diff --git a/internal/pkg/core/deployer/providers/volcengine-clb/volcengine_clb.go b/internal/pkg/core/deployer/providers/volcengine-clb/volcengine_clb.go index 55311db9..b06b0142 100644 --- a/internal/pkg/core/deployer/providers/volcengine-clb/volcengine_clb.go +++ b/internal/pkg/core/deployer/providers/volcengine-clb/volcengine_clb.go @@ -45,11 +45,11 @@ func New(config *VolcEngineCLBDeployerConfig) (*VolcEngineCLBDeployer, error) { func NewWithLogger(config *VolcEngineCLBDeployerConfig, logger logger.Logger) (*VolcEngineCLBDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret, config.Region) diff --git a/internal/pkg/core/deployer/providers/volcengine-dcdn/volcengine_dcdn.go b/internal/pkg/core/deployer/providers/volcengine-dcdn/volcengine_dcdn.go index 67686fa8..9e7aa896 100644 --- a/internal/pkg/core/deployer/providers/volcengine-dcdn/volcengine_dcdn.go +++ b/internal/pkg/core/deployer/providers/volcengine-dcdn/volcengine_dcdn.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "strings" xerrors "github.com/pkg/errors" @@ -42,11 +41,11 @@ func New(config *VolcEngineDCDNDeployerConfig) (*VolcEngineDCDNDeployer, error) func NewWithLogger(config *VolcEngineDCDNDeployerConfig, logger logger.Logger) (*VolcEngineDCDNDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret, config.Region) diff --git a/internal/pkg/core/deployer/providers/volcengine-imagex/volcengine_imagex.go b/internal/pkg/core/deployer/providers/volcengine-imagex/volcengine_imagex.go index 1d174261..d02a6d1e 100644 --- a/internal/pkg/core/deployer/providers/volcengine-imagex/volcengine_imagex.go +++ b/internal/pkg/core/deployer/providers/volcengine-imagex/volcengine_imagex.go @@ -42,11 +42,11 @@ func New(config *VolcEngineImageXDeployerConfig) (*VolcEngineImageXDeployer, err func NewWithLogger(config *VolcEngineImageXDeployerConfig, logger logger.Logger) (*VolcEngineImageXDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret, config.Region) diff --git a/internal/pkg/core/deployer/providers/volcengine-live/volcengine_live.go b/internal/pkg/core/deployer/providers/volcengine-live/volcengine_live.go index 580d6ae1..fa9e357a 100644 --- a/internal/pkg/core/deployer/providers/volcengine-live/volcengine_live.go +++ b/internal/pkg/core/deployer/providers/volcengine-live/volcengine_live.go @@ -40,11 +40,11 @@ func New(config *VolcEngineLiveDeployerConfig) (*VolcEngineLiveDeployer, error) func NewWithLogger(config *VolcEngineLiveDeployerConfig, logger logger.Logger) (*VolcEngineLiveDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client := veLive.NewInstance() diff --git a/internal/pkg/core/deployer/providers/volcengine-tos/volcengine_tos.go b/internal/pkg/core/deployer/providers/volcengine-tos/volcengine_tos.go index 19c97fc7..273c92d4 100644 --- a/internal/pkg/core/deployer/providers/volcengine-tos/volcengine_tos.go +++ b/internal/pkg/core/deployer/providers/volcengine-tos/volcengine_tos.go @@ -42,11 +42,11 @@ func New(config *VolcEngineTOSDeployerConfig) (*VolcEngineTOSDeployer, error) { func NewWithLogger(config *VolcEngineTOSDeployerConfig, logger logger.Logger) (*VolcEngineTOSDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret, config.Region) diff --git a/internal/pkg/core/deployer/providers/webhook/webhook.go b/internal/pkg/core/deployer/providers/webhook/webhook.go index 694befc5..cd6e941a 100644 --- a/internal/pkg/core/deployer/providers/webhook/webhook.go +++ b/internal/pkg/core/deployer/providers/webhook/webhook.go @@ -3,7 +3,6 @@ package webhook import ( "context" "encoding/json" - "errors" "strings" "time" @@ -36,11 +35,11 @@ func New(config *WebhookDeployerConfig) (*WebhookDeployer, error) { func NewWithLogger(config *WebhookDeployerConfig, logger logger.Logger) (*WebhookDeployer, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } if logger == nil { - return nil, errors.New("logger is nil") + panic("logger is nil") } client := resty.New(). diff --git a/internal/pkg/core/notifier/providers/bark/bark.go b/internal/pkg/core/notifier/providers/bark/bark.go index 74683f82..731e0a96 100644 --- a/internal/pkg/core/notifier/providers/bark/bark.go +++ b/internal/pkg/core/notifier/providers/bark/bark.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "github.com/nikoksr/notify" "github.com/nikoksr/notify/service/bark" @@ -26,7 +25,7 @@ var _ notifier.Notifier = (*BarkNotifier)(nil) func New(config *BarkNotifierConfig) (*BarkNotifier, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } return &BarkNotifier{ diff --git a/internal/pkg/core/notifier/providers/dingtalk/dingtalk.go b/internal/pkg/core/notifier/providers/dingtalk/dingtalk.go index 52fe5f27..469d5e65 100644 --- a/internal/pkg/core/notifier/providers/dingtalk/dingtalk.go +++ b/internal/pkg/core/notifier/providers/dingtalk/dingtalk.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "github.com/nikoksr/notify/service/dingding" @@ -24,7 +23,7 @@ var _ notifier.Notifier = (*DingTalkNotifier)(nil) func New(config *DingTalkNotifierConfig) (*DingTalkNotifier, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } return &DingTalkNotifier{ diff --git a/internal/pkg/core/notifier/providers/email/email.go b/internal/pkg/core/notifier/providers/email/email.go index 127c5528..2619188f 100644 --- a/internal/pkg/core/notifier/providers/email/email.go +++ b/internal/pkg/core/notifier/providers/email/email.go @@ -3,7 +3,6 @@ import ( "context" "crypto/tls" - "errors" "fmt" "net/smtp" @@ -38,7 +37,7 @@ var _ notifier.Notifier = (*EmailNotifier)(nil) func New(config *EmailNotifierConfig) (*EmailNotifier, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } return &EmailNotifier{ diff --git a/internal/pkg/core/notifier/providers/lark/lark.go b/internal/pkg/core/notifier/providers/lark/lark.go index 4714e280..b726fa1c 100644 --- a/internal/pkg/core/notifier/providers/lark/lark.go +++ b/internal/pkg/core/notifier/providers/lark/lark.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "github.com/nikoksr/notify/service/lark" @@ -22,7 +21,7 @@ var _ notifier.Notifier = (*LarkNotifier)(nil) func New(config *LarkNotifierConfig) (*LarkNotifier, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } return &LarkNotifier{ diff --git a/internal/pkg/core/notifier/providers/serverchan/serverchan.go b/internal/pkg/core/notifier/providers/serverchan/serverchan.go index 7b5a6de0..1811c49e 100644 --- a/internal/pkg/core/notifier/providers/serverchan/serverchan.go +++ b/internal/pkg/core/notifier/providers/serverchan/serverchan.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "net/http" notifyHttp "github.com/nikoksr/notify/service/http" @@ -23,7 +22,7 @@ var _ notifier.Notifier = (*ServerChanNotifier)(nil) func New(config *ServerChanNotifierConfig) (*ServerChanNotifier, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } return &ServerChanNotifier{ diff --git a/internal/pkg/core/notifier/providers/telegram/telegram.go b/internal/pkg/core/notifier/providers/telegram/telegram.go index d1dcc45f..ce86c881 100644 --- a/internal/pkg/core/notifier/providers/telegram/telegram.go +++ b/internal/pkg/core/notifier/providers/telegram/telegram.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "github.com/nikoksr/notify/service/telegram" @@ -24,7 +23,7 @@ var _ notifier.Notifier = (*TelegramNotifier)(nil) func New(config *TelegramNotifierConfig) (*TelegramNotifier, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } return &TelegramNotifier{ diff --git a/internal/pkg/core/notifier/providers/webhook/webhook.go b/internal/pkg/core/notifier/providers/webhook/webhook.go index 3c2bc05f..66dd806b 100644 --- a/internal/pkg/core/notifier/providers/webhook/webhook.go +++ b/internal/pkg/core/notifier/providers/webhook/webhook.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "github.com/nikoksr/notify/service/http" @@ -22,7 +21,7 @@ var _ notifier.Notifier = (*WebhookNotifier)(nil) func New(config *WebhookNotifierConfig) (*WebhookNotifier, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } return &WebhookNotifier{ diff --git a/internal/pkg/core/notifier/providers/wecom/wecom.go b/internal/pkg/core/notifier/providers/wecom/wecom.go index 20938009..7731a1b5 100644 --- a/internal/pkg/core/notifier/providers/wecom/wecom.go +++ b/internal/pkg/core/notifier/providers/wecom/wecom.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "net/http" notifyHttp "github.com/nikoksr/notify/service/http" @@ -23,7 +22,7 @@ var _ notifier.Notifier = (*WeComNotifier)(nil) func New(config *WeComNotifierConfig) (*WeComNotifier, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } return &WeComNotifier{ diff --git a/internal/pkg/core/uploader/providers/aliyun-cas/aliyun_cas.go b/internal/pkg/core/uploader/providers/aliyun-cas/aliyun_cas.go index 3259bdb1..881dc57b 100644 --- a/internal/pkg/core/uploader/providers/aliyun-cas/aliyun_cas.go +++ b/internal/pkg/core/uploader/providers/aliyun-cas/aliyun_cas.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "fmt" "strings" "time" @@ -34,7 +33,7 @@ var _ uploader.Uploader = (*AliyunCASUploader)(nil) func New(config *AliyunCASUploaderConfig) (*AliyunCASUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client, err := createSdkClient( diff --git a/internal/pkg/core/uploader/providers/aliyun-slb/aliyun_slb.go b/internal/pkg/core/uploader/providers/aliyun-slb/aliyun_slb.go index 63779b48..9bd6d930 100644 --- a/internal/pkg/core/uploader/providers/aliyun-slb/aliyun_slb.go +++ b/internal/pkg/core/uploader/providers/aliyun-slb/aliyun_slb.go @@ -4,7 +4,6 @@ import ( "context" "crypto/sha256" "encoding/hex" - "errors" "fmt" "regexp" "strings" @@ -37,7 +36,7 @@ var _ uploader.Uploader = (*AliyunSLBUploader)(nil) func New(config *AliyunSLBUploaderConfig) (*AliyunSLBUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client, err := createSdkClient( diff --git a/internal/pkg/core/uploader/providers/aws-acm/aws_acm.go b/internal/pkg/core/uploader/providers/aws-acm/aws_acm.go index cac4d833..836bacfc 100644 --- a/internal/pkg/core/uploader/providers/aws-acm/aws_acm.go +++ b/internal/pkg/core/uploader/providers/aws-acm/aws_acm.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "fmt" "time" @@ -34,7 +33,7 @@ var _ uploader.Uploader = (*AWSCertificateManagerUploader)(nil) func New(config *AWSCertificateManagerUploaderConfig) (*AWSCertificateManagerUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client, err := createSdkClient(config.AccessKeyId, config.SecretAccessKey, config.Region) diff --git a/internal/pkg/core/uploader/providers/byteplus-cdn/byteplus_cdn.go b/internal/pkg/core/uploader/providers/byteplus-cdn/byteplus_cdn.go index f1bf2b46..bed962e2 100644 --- a/internal/pkg/core/uploader/providers/byteplus-cdn/byteplus_cdn.go +++ b/internal/pkg/core/uploader/providers/byteplus-cdn/byteplus_cdn.go @@ -5,7 +5,6 @@ import ( "crypto/sha1" "crypto/sha256" "encoding/hex" - "errors" "fmt" "strings" "time" @@ -33,7 +32,7 @@ var _ uploader.Uploader = (*ByteplusCDNUploader)(nil) func New(config *ByteplusCDNUploaderConfig) (*ByteplusCDNUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client := bpCdn.NewInstance() diff --git a/internal/pkg/core/uploader/providers/dogecloud/dogecloud.go b/internal/pkg/core/uploader/providers/dogecloud/dogecloud.go index a38e832c..c941a5a9 100644 --- a/internal/pkg/core/uploader/providers/dogecloud/dogecloud.go +++ b/internal/pkg/core/uploader/providers/dogecloud/dogecloud.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "fmt" "time" @@ -28,7 +27,7 @@ var _ uploader.Uploader = (*DogeCloudUploader)(nil) func New(config *DogeCloudUploaderConfig) (*DogeCloudUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client, err := createSdkClient( diff --git a/internal/pkg/core/uploader/providers/gcore-cdn/gcore_cdn.go b/internal/pkg/core/uploader/providers/gcore-cdn/gcore_cdn.go index 32cadb62..933f61b4 100644 --- a/internal/pkg/core/uploader/providers/gcore-cdn/gcore_cdn.go +++ b/internal/pkg/core/uploader/providers/gcore-cdn/gcore_cdn.go @@ -28,7 +28,7 @@ var _ uploader.Uploader = (*GcoreCDNUploader)(nil) func New(config *GcoreCDNUploaderConfig) (*GcoreCDNUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client, err := createSdkClient(config.ApiToken) @@ -70,6 +70,10 @@ func (u *GcoreCDNUploader) Upload(ctx context.Context, certPem string, privkeyPe } func createSdkClient(apiToken string) (*gsslcerts.Service, error) { + if apiToken == "" { + return nil, errors.New("invalid gcore api token") + } + requester := gprovider.NewClient( gcoresdk.BASE_URL, gprovider.WithSigner(gcoresdk.NewAuthRequestSigner(apiToken)), diff --git a/internal/pkg/core/uploader/providers/huaweicloud-elb/huaweicloud_elb.go b/internal/pkg/core/uploader/providers/huaweicloud-elb/huaweicloud_elb.go index 2ea7d031..321c488f 100644 --- a/internal/pkg/core/uploader/providers/huaweicloud-elb/huaweicloud_elb.go +++ b/internal/pkg/core/uploader/providers/huaweicloud-elb/huaweicloud_elb.go @@ -39,7 +39,7 @@ var _ uploader.Uploader = (*HuaweiCloudELBUploader)(nil) func New(config *HuaweiCloudELBUploaderConfig) (*HuaweiCloudELBUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client, err := createSdkClient( diff --git a/internal/pkg/core/uploader/providers/huaweicloud-scm/huaweicloud_scm.go b/internal/pkg/core/uploader/providers/huaweicloud-scm/huaweicloud_scm.go index c0618da0..53f723f4 100644 --- a/internal/pkg/core/uploader/providers/huaweicloud-scm/huaweicloud_scm.go +++ b/internal/pkg/core/uploader/providers/huaweicloud-scm/huaweicloud_scm.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "fmt" "time" @@ -35,7 +34,7 @@ var _ uploader.Uploader = (*HuaweiCloudSCMUploader)(nil) func New(config *HuaweiCloudSCMUploaderConfig) (*HuaweiCloudSCMUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client, err := createSdkClient( diff --git a/internal/pkg/core/uploader/providers/huaweicloud-waf/huaweicloud_waf.go b/internal/pkg/core/uploader/providers/huaweicloud-waf/huaweicloud_waf.go index eb2eb7f2..3fb89bf3 100644 --- a/internal/pkg/core/uploader/providers/huaweicloud-waf/huaweicloud_waf.go +++ b/internal/pkg/core/uploader/providers/huaweicloud-waf/huaweicloud_waf.go @@ -39,7 +39,7 @@ var _ uploader.Uploader = (*HuaweiCloudWAFUploader)(nil) func New(config *HuaweiCloudWAFUploaderConfig) (*HuaweiCloudWAFUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client, err := createSdkClient( diff --git a/internal/pkg/core/uploader/providers/qiniu-sslcert/qiniu_sslcert.go b/internal/pkg/core/uploader/providers/qiniu-sslcert/qiniu_sslcert.go index 851cbf01..3e32b73d 100644 --- a/internal/pkg/core/uploader/providers/qiniu-sslcert/qiniu_sslcert.go +++ b/internal/pkg/core/uploader/providers/qiniu-sslcert/qiniu_sslcert.go @@ -2,7 +2,6 @@ import ( "context" - "errors" "fmt" "time" @@ -30,7 +29,7 @@ var _ uploader.Uploader = (*QiniuSSLCertUploader)(nil) func New(config *QiniuSSLCertUploaderConfig) (*QiniuSSLCertUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client, err := createSdkClient( diff --git a/internal/pkg/core/uploader/providers/tencentcloud-ssl/tencentcloud_ssl.go b/internal/pkg/core/uploader/providers/tencentcloud-ssl/tencentcloud_ssl.go index a94af000..c802e77f 100644 --- a/internal/pkg/core/uploader/providers/tencentcloud-ssl/tencentcloud_ssl.go +++ b/internal/pkg/core/uploader/providers/tencentcloud-ssl/tencentcloud_ssl.go @@ -2,7 +2,6 @@ import ( "context" - "errors" xerrors "github.com/pkg/errors" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" @@ -28,7 +27,7 @@ var _ uploader.Uploader = (*TencentCloudSSLUploader)(nil) func New(config *TencentCloudSSLUploaderConfig) (*TencentCloudSSLUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client, err := createSdkClient( diff --git a/internal/pkg/core/uploader/providers/ucloud-ussl/ucloud_ussl.go b/internal/pkg/core/uploader/providers/ucloud-ussl/ucloud_ussl.go index 9c5fa2b3..56a66472 100644 --- a/internal/pkg/core/uploader/providers/ucloud-ussl/ucloud_ussl.go +++ b/internal/pkg/core/uploader/providers/ucloud-ussl/ucloud_ussl.go @@ -38,7 +38,7 @@ var _ uploader.Uploader = (*UCloudUSSLUploader)(nil) func New(config *UCloudUSSLUploaderConfig) (*UCloudUSSLUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client, err := createSdkClient(config.PrivateKey, config.PublicKey) diff --git a/internal/pkg/core/uploader/providers/volcengine-cdn/volcengine_cdn.go b/internal/pkg/core/uploader/providers/volcengine-cdn/volcengine_cdn.go index 23f05281..691effe6 100644 --- a/internal/pkg/core/uploader/providers/volcengine-cdn/volcengine_cdn.go +++ b/internal/pkg/core/uploader/providers/volcengine-cdn/volcengine_cdn.go @@ -5,7 +5,6 @@ import ( "crypto/sha1" "crypto/sha256" "encoding/hex" - "errors" "fmt" "strings" "time" @@ -34,7 +33,7 @@ var _ uploader.Uploader = (*VolcEngineCDNUploader)(nil) func New(config *VolcEngineCDNUploaderConfig) (*VolcEngineCDNUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client := veCdn.NewInstance() diff --git a/internal/pkg/core/uploader/providers/volcengine-certcenter/volcengine_certcenter.go b/internal/pkg/core/uploader/providers/volcengine-certcenter/volcengine_certcenter.go index 5e301ebd..05776396 100644 --- a/internal/pkg/core/uploader/providers/volcengine-certcenter/volcengine_certcenter.go +++ b/internal/pkg/core/uploader/providers/volcengine-certcenter/volcengine_certcenter.go @@ -2,7 +2,6 @@ package volcenginecertcenter import ( "context" - "errors" xerrors "github.com/pkg/errors" ve "github.com/volcengine/volcengine-go-sdk/volcengine" @@ -30,7 +29,7 @@ var _ uploader.Uploader = (*VolcEngineCertCenterUploader)(nil) func New(config *VolcEngineCertCenterUploaderConfig) (*VolcEngineCertCenterUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret, config.Region) diff --git a/internal/pkg/core/uploader/providers/volcengine-live/volcengine_live.go b/internal/pkg/core/uploader/providers/volcengine-live/volcengine_live.go index c7861cb6..ce85186f 100644 --- a/internal/pkg/core/uploader/providers/volcengine-live/volcengine_live.go +++ b/internal/pkg/core/uploader/providers/volcengine-live/volcengine_live.go @@ -2,7 +2,6 @@ package volcenginelive import ( "context" - "errors" "fmt" "strings" "time" @@ -31,7 +30,7 @@ var _ uploader.Uploader = (*VolcEngineLiveUploader)(nil) func New(config *VolcEngineLiveUploaderConfig) (*VolcEngineLiveUploader, error) { if config == nil { - return nil, errors.New("config is nil") + panic("config is nil") } client := veLive.NewInstance() diff --git a/internal/pkg/vendors/baishan-sdk/client.go b/internal/pkg/vendors/baishan-sdk/client.go index c49698ea..d30dd05f 100644 --- a/internal/pkg/vendors/baishan-sdk/client.go +++ b/internal/pkg/vendors/baishan-sdk/client.go @@ -30,11 +30,9 @@ func (c *Client) WithTimeout(timeout time.Duration) *Client { } func (c *Client) sendRequest(method string, path string, params map[string]any) (*resty.Response, error) { - url := "https://cdn.api.baishan.com" + path - req := c.client.R() req.Method = method - req.URL = url + req.URL = "https://cdn.api.baishan.com" + path if strings.EqualFold(method, http.MethodGet) { data := make(map[string]string) for k, v := range params { @@ -68,8 +66,8 @@ func (c *Client) sendRequestWithResult(method string, path string, params map[st if err := json.Unmarshal(resp.Body(), &result); err != nil { return fmt.Errorf("baishan api error: failed to parse response: %w", err) - } else if result.GetCode() != 0 { - return fmt.Errorf("baishan api error: %d - %s", result.GetCode(), result.GetMessage()) + } else if errcode := result.GetCode(); errcode != 0 { + return fmt.Errorf("baishan api error: %d - %s", errcode, result.GetMessage()) } return nil diff --git a/internal/pkg/vendors/btpanel-sdk/client.go b/internal/pkg/vendors/btpanel-sdk/client.go index 0620a80f..8134feca 100644 --- a/internal/pkg/vendors/btpanel-sdk/client.go +++ b/internal/pkg/vendors/btpanel-sdk/client.go @@ -14,14 +14,15 @@ import ( type Client struct { apiHost string apiKey string - client *resty.Client + + client *resty.Client } func NewClient(apiHost, apiKey string) *Client { client := resty.New() return &Client{ - apiHost: apiHost, + apiHost: strings.TrimRight(apiHost, "/"), apiKey: apiKey, client: client, } @@ -50,7 +51,7 @@ func (c *Client) sendRequest(path string, params map[string]any) (*resty.Respons params["request_time"] = timestamp params["request_token"] = c.generateSignature(fmt.Sprintf("%d", timestamp)) - url := strings.TrimRight(c.apiHost, "/") + path + url := c.apiHost + path req := c.client.R(). SetHeader("Content-Type", "application/json"). SetBody(params) @@ -72,7 +73,7 @@ func (c *Client) sendRequestWithResult(path string, params map[string]any, resul if err := json.Unmarshal(resp.Body(), &result); err != nil { return fmt.Errorf("baota api error: failed to parse response: %w", err) - } else if result.GetStatus() != nil && !*result.GetStatus() { + } else if errstatus := result.GetStatus(); errstatus != nil && !*errstatus { if result.GetMsg() == nil { return fmt.Errorf("baota api error: unknown error") } else { diff --git a/internal/pkg/vendors/cachefly-sdk/client.go b/internal/pkg/vendors/cachefly-sdk/client.go index 2516a388..6f6a4790 100644 --- a/internal/pkg/vendors/cachefly-sdk/client.go +++ b/internal/pkg/vendors/cachefly-sdk/client.go @@ -30,11 +30,9 @@ func (c *Client) WithTimeout(timeout time.Duration) *Client { } func (c *Client) sendRequest(method string, path string, params map[string]any) (*resty.Response, error) { - url := "https://api.cachefly.com/api/2.5" + path - req := c.client.R() req.Method = method - req.URL = url + req.URL = "https://api.cachefly.com/api/2.5" + path req = req.SetHeader("x-cf-authorization", "Bearer "+c.apiToken) if strings.EqualFold(method, http.MethodGet) { data := make(map[string]string) diff --git a/internal/pkg/vendors/cdnfly-sdk/api.go b/internal/pkg/vendors/cdnfly-sdk/api.go new file mode 100644 index 00000000..5f8ebb0a --- /dev/null +++ b/internal/pkg/vendors/cdnfly-sdk/api.go @@ -0,0 +1,59 @@ +package cdnflysdk + +import ( + "encoding/json" + "fmt" + "net/http" +) + +func (c *Client) GetSite(req *GetSiteRequest) (*GetSiteResponse, error) { + params := make(map[string]any) + jsonData, _ := json.Marshal(req) + json.Unmarshal(jsonData, ¶ms) + + result := GetSiteResponse{} + err := c.sendRequestWithResult(http.MethodGet, fmt.Sprintf("/v1/sites/%s", req.Id), params, &result) + if err != nil { + return nil, err + } + return &result, nil +} + +func (c *Client) UpdateSite(req *UpdateSiteRequest) (*UpdateSiteResponse, error) { + params := make(map[string]any) + jsonData, _ := json.Marshal(req) + json.Unmarshal(jsonData, ¶ms) + + result := UpdateSiteResponse{} + err := c.sendRequestWithResult(http.MethodPut, fmt.Sprintf("/v1/sites/%s", req.Id), params, &result) + if err != nil { + return nil, err + } + return &result, nil +} + +func (c *Client) CreateCertificate(req *CreateCertificateRequest) (*CreateCertificateResponse, error) { + params := make(map[string]any) + jsonData, _ := json.Marshal(req) + json.Unmarshal(jsonData, ¶ms) + + result := CreateCertificateResponse{} + err := c.sendRequestWithResult(http.MethodPost, "/v1/certs", params, &result) + if err != nil { + return nil, err + } + return &result, nil +} + +func (c *Client) UpdateCertificate(req *UpdateCertificateRequest) (*UpdateCertificateResponse, error) { + params := make(map[string]any) + jsonData, _ := json.Marshal(req) + json.Unmarshal(jsonData, ¶ms) + + result := UpdateCertificateResponse{} + err := c.sendRequestWithResult(http.MethodPut, fmt.Sprintf("/v1/certs/%s", req.Id), params, &result) + if err != nil { + return nil, err + } + return &result, nil +} diff --git a/internal/pkg/vendors/cdnfly-sdk/client.go b/internal/pkg/vendors/cdnfly-sdk/client.go new file mode 100644 index 00000000..910020b3 --- /dev/null +++ b/internal/pkg/vendors/cdnfly-sdk/client.go @@ -0,0 +1,79 @@ +package cdnflysdk + +import ( + "encoding/json" + "fmt" + "net/http" + "strings" + "time" + + "github.com/go-resty/resty/v2" +) + +type Client struct { + apiHost string + apiKey string + apiSecret string + + client *resty.Client +} + +func NewClient(apiHost, apiKey, apiSecret string) *Client { + client := resty.New() + + return &Client{ + apiHost: strings.TrimRight(apiHost, "/"), + apiKey: apiKey, + apiSecret: apiSecret, + client: client, + } +} + +func (c *Client) WithTimeout(timeout time.Duration) *Client { + c.client.SetTimeout(timeout) + return c +} + +func (c *Client) sendRequest(method string, path string, params map[string]any) (*resty.Response, error) { + req := c.client.R() + req.Method = method + req.URL = c.apiHost + path + req = req. + SetHeader("api-key", c.apiKey). + SetHeader("api-secret", c.apiSecret) + if strings.EqualFold(method, http.MethodGet) { + data := make(map[string]string) + for k, v := range params { + data[k] = fmt.Sprintf("%v", v) + } + req = req.SetQueryParams(data) + } else { + req = req. + SetHeader("Content-Type", "application/json"). + SetBody(params) + } + + resp, err := req.Send() + if err != nil { + return nil, fmt.Errorf("cdnfly api error: failed to send request: %w", err) + } else if resp.IsError() { + return nil, fmt.Errorf("cdnfly api error: unexpected status code: %d, %s", resp.StatusCode(), resp.Body()) + } + + return resp, nil +} + +func (c *Client) sendRequestWithResult(method string, path string, params map[string]any, result BaseResponse) error { + resp, err := c.sendRequest(method, path, params) + if err != nil { + return err + } + + if err := json.Unmarshal(resp.Body(), &result); err != nil { + return fmt.Errorf("cdnfly api error: failed to parse response: %w", err) + } else if errcode := result.GetCode(); errcode != "" && errcode != "0" { + return fmt.Errorf("cdnfly api error: %s - %s", errcode, result.GetMessage()) + } + + return nil +} diff --git a/internal/pkg/vendors/cdnfly-sdk/models.go b/internal/pkg/vendors/cdnfly-sdk/models.go new file mode 100644 index 00000000..873b80b0 --- /dev/null +++ b/internal/pkg/vendors/cdnfly-sdk/models.go @@ -0,0 +1,70 @@ +package cdnflysdk + +type BaseResponse interface { + GetCode() string + GetMessage() string +} + +type baseResponse struct { + Code string `json:"code"` + Message string `json:"msg"` +} + +func (r *baseResponse) GetCode() string { + return r.Code +} + +func (r *baseResponse) GetMessage() string { + return r.Message +} + +type GetSiteRequest struct { + Id string `json:"-"` +} + +type GetSiteResponse struct { + baseResponse + Data *struct { + Id string `json:"id"` + Name string `json:"name"` + Domain string `json:"domain"` + HttpsListen string `json:"https_listen"` + } `json:"data"` +} + +type UpdateSiteRequest struct { + Id string `json:"-"` + HttpsListen *string `json:"https_listen,omitempty"` + Enable *bool `json:"enable,omitempty"` +} + +type UpdateSiteResponse struct { + baseResponse +} + +type CreateCertificateRequest struct { + Name string `json:"name"` + Description *string `json:"des,omitempty"` + Type string `json:"type"` + Cert string `json:"cert"` + Key string `json:"key"` +} + +type CreateCertificateResponse struct { + baseResponse + Data string `json:"data"` +} + +type UpdateCertificateRequest struct { + Id string `json:"-"` + Name *string `json:"name,omitempty"` + Description *string `json:"des,omitempty"` + Type *string `json:"type,omitempty"` + Cert *string `json:"cert,omitempty"` + Key *string `json:"key,omitempty"` + Enable *bool `json:"enable,omitempty"` +} + +type UpdateCertificateResponse struct { + baseResponse +} diff --git a/internal/pkg/vendors/gname-sdk/client.go b/internal/pkg/vendors/gname-sdk/client.go index 5d9ffa3f..d3b9fb86 100644 --- a/internal/pkg/vendors/gname-sdk/client.go +++ b/internal/pkg/vendors/gname-sdk/client.go @@ -15,6 +15,7 @@ import ( type Client struct { appId string appKey string + client *resty.Client } @@ -92,8 +93,8 @@ func (c *Client) sendRequestWithResult(path string, params map[string]any, resul if err := json.Unmarshal(resp.Body(), &result); err != nil { return fmt.Errorf("gname api error: failed to parse response: %w", err) - } else if result.GetCode() != 1 { - return fmt.Errorf("gname api error: %d - %s", result.GetCode(), result.GetMsg()) + } else if errcode := result.GetCode(); errcode != 1 { + return fmt.Errorf("gname api error: %d - %s", errcode, result.GetMsg()) } return nil diff --git a/internal/pkg/vendors/safeline-sdk/client.go b/internal/pkg/vendors/safeline-sdk/client.go index dbf54f66..5aa19c07 100644 --- a/internal/pkg/vendors/safeline-sdk/client.go +++ b/internal/pkg/vendors/safeline-sdk/client.go @@ -12,14 +12,15 @@ import ( type Client struct { apiHost string apiToken string - client *resty.Client + + client *resty.Client } func NewClient(apiHost, apiToken string) *Client { client := resty.New() return &Client{ - apiHost: apiHost, + apiHost: strings.TrimRight(apiHost, "/"), apiToken: apiToken, client: client, } @@ -35,7 +36,7 @@ func (c *Client) sendRequest(path string, params map[string]any) (*resty.Respons params = make(map[string]any) } - url := strings.TrimRight(c.apiHost, "/") + path + url := c.apiHost + path req := c.client.R(). SetHeader("Content-Type", "application/json"). SetHeader("X-SLCE-API-TOKEN", c.apiToken). @@ -58,11 +59,11 @@ func (c *Client) sendRequestWithResult(path string, params map[string]any, resul if err := json.Unmarshal(resp.Body(), &result); err != nil { return fmt.Errorf("safeline api error: failed to parse response: %w", err) - } else if result.GetErrCode() != nil && *result.GetErrCode() != "" { + } else if errcode := result.GetErrCode(); errcode != nil && *errcode != "" { if result.GetErrMsg() == nil { - return fmt.Errorf("safeline api error: %s", *result.GetErrCode()) + return fmt.Errorf("safeline api error: %s", *errcode) } else { - return fmt.Errorf("safeline api error: %s - %s", *result.GetErrCode(), *result.GetErrMsg()) + return fmt.Errorf("safeline api error: %s - %s", *errcode, *result.GetErrMsg()) } } diff --git a/ui/public/imgs/providers/cdnfly.png b/ui/public/imgs/providers/cdnfly.png new file mode 100644 index 0000000000000000000000000000000000000000..3a8d984347d4daa824134e32fecc4c9780bdf365 GIT binary patch literal 1086 zcmV-E1i|}>P)Px&_(?=TRA@u(n_EcJQ5?s=N9QiOIn!BrDajPNScXzY7qAOaQ5f0HdhJ395 ziBv`0Cm`9J!b!>Q7#SJealCq`g-~a;aY9oV!}^oaF>J$XQgPtHDG;GlDn;S&oDiHO z6-D=(0J16^fFv0NG?I#<+93dX$>8t^a8O_&JXnIGP=JHW6TeZ4!~A*|oN~qC;PS+8 zl;SYI-UX*zaX7d<@f)Q$%+foZQG*4m<{)L632~`<=wj7~(yHKb`rsUJqyK{qU)!xP zzqVp*l+70Zzc{SYL?U-jCKhj=5BgcEIS1Wnt?5G7Qws!Pdcm0k$0TU6f%A*Ak+C*e)G%ZnMr}!x z_%78bcy>WLewrQVY2n1-S*dyyUS2QOMd<=`_k07a-M^$*Cq1X&+Z+2{2t@ca^LeUzu$l+&WRuO26!JnE>2eFqudFQe%N~;%@WhQr zcVjQ=%ffu)@z2)sLIbQHWo|7a2!t_?j)xnHv$1gE;o;&-4E4Jtry+?T$l0BNfgU?& z$3vY;+<+L9#*c??yBE!so#=XIp89wgL6DX^8##rUh@WrZ?|4Wd^(Gy*oX$mjnjzpU zE$MuJKL~rj3m%6LTD=-ECM}YeCO{Jt6^MIur42o;oE#4)&f6$$BywnpXH#$`9$E=$ zsq6$@?54XhTcxKGDi-nb=88_zMU9qo)X^%@WyhZ)-j~)sSl$dw`#IRJ=f46^w_Bl% zrvQhNHJB~ji)|}!#ueaiq;wF@QnF`xB%E^ z-W7oIqS})LC=2ELz*`^jl81OfD-MkSR`3QOQ*VcH#E}=csHIXx-V0;szZbRqS*qGw zrM5@uj|yWr1R`F=(({ className, return ; case ACCESS_PROVIDERS.CACHEFLY: return ; + case ACCESS_PROVIDERS.CDNFLY: + return ; case ACCESS_PROVIDERS.CLOUDFLARE: return ; case ACCESS_PROVIDERS.CLOUDNS: diff --git a/ui/src/components/access/AccessFormCdnflyConfig.tsx b/ui/src/components/access/AccessFormCdnflyConfig.tsx new file mode 100644 index 00000000..a9dd1139 --- /dev/null +++ b/ui/src/components/access/AccessFormCdnflyConfig.tsx @@ -0,0 +1,87 @@ +import { useTranslation } from "react-i18next"; +import { Form, type FormInstance, Input } from "antd"; +import { createSchemaFieldRule } from "antd-zod"; +import { z } from "zod"; + +import { type AccessConfigForCdnfly } from "@/domain/access"; + +type AccessFormCdnflyConfigFieldValues = Nullish; + +export type AccessFormCdnflyConfigProps = { + form: FormInstance; + formName: string; + disabled?: boolean; + initialValues?: AccessFormCdnflyConfigFieldValues; + onValuesChange?: (values: AccessFormCdnflyConfigFieldValues) => void; +}; + +const initFormModel = (): AccessFormCdnflyConfigFieldValues => { + return { + apiUrl: "http://:88/", + apiKey: "", + apiSecret: "", + }; +}; + +const AccessFormCdnflyConfig = ({ form: formInst, formName, disabled, initialValues, onValuesChange }: AccessFormCdnflyConfigProps) => { + const { t } = useTranslation(); + + const formSchema = z.object({ + apiUrl: z.string().url(t("common.errmsg.url_invalid")), + apiKey: z + .string() + .min(1, t("access.form.cdnfly_api_key.placeholder")) + .max(64, t("common.errmsg.string_max", { max: 64 })) + .trim(), + apiSecret: z + .string() + .min(1, t("access.form.cdnfly_api_secret.placeholder")) + .max(64, t("common.errmsg.string_max", { max: 64 })) + .trim(), + }); + const formRule = createSchemaFieldRule(formSchema); + + const handleFormChange = (_: unknown, values: z.infer) => { + onValuesChange?.(values); + }; + + return ( +
+ } + > + + + + } + > + + + + } + > + + +
+ ); +}; + +export default AccessFormCdnflyConfig; diff --git a/ui/src/components/workflow/node/DeployNodeConfigForm.tsx b/ui/src/components/workflow/node/DeployNodeConfigForm.tsx index 9b992914..4706e330 100644 --- a/ui/src/components/workflow/node/DeployNodeConfigForm.tsx +++ b/ui/src/components/workflow/node/DeployNodeConfigForm.tsx @@ -31,6 +31,7 @@ import DeployNodeConfigFormBaishanCDNConfig from "./DeployNodeConfigFormBaishanC import DeployNodeConfigFormBaotaPanelConsoleConfig from "./DeployNodeConfigFormBaotaPanelConsoleConfig"; import DeployNodeConfigFormBaotaPanelSiteConfig from "./DeployNodeConfigFormBaotaPanelSiteConfig"; import DeployNodeConfigFormBytePlusCDNConfig from "./DeployNodeConfigFormBytePlusCDNConfig"; +import DeployNodeConfigFormCdnflyConfig from "./DeployNodeConfigFormCdnflyConfig"; import DeployNodeConfigFormDogeCloudCDNConfig from "./DeployNodeConfigFormDogeCloudCDNConfig"; import DeployNodeConfigFormEdgioApplicationsConfig from "./DeployNodeConfigFormEdgioApplicationsConfig"; import DeployNodeConfigFormGcoreCDNConfig from "./DeployNodeConfigFormGcoreCDNConfig"; @@ -163,6 +164,8 @@ const DeployNodeConfigForm = forwardRef; case DEPLOY_PROVIDERS.BYTEPLUS_CDN: return ; + case DEPLOY_PROVIDERS.CDNFLY: + return ; case DEPLOY_PROVIDERS.DOGECLOUD_CDN: return ; case DEPLOY_PROVIDERS.EDGIO_APPLICATIONS: @@ -297,7 +300,7 @@ const DeployNodeConfigForm = forwardRef ; export type DeployNodeConfigFormAliyunESAConfigProps = { @@ -34,10 +34,9 @@ const DeployNodeConfigFormAliyunESAConfig = ({ .string({ message: t("workflow_node.deploy.form.aliyun_esa_region.placeholder") }) .nonempty(t("workflow_node.deploy.form.aliyun_esa_region.placeholder")) .trim(), - siteId: z - .string({ message: t("workflow_node.deploy.form.aliyun_esa_site_id.placeholder") }) - .regex(/^[1-9]\d*$/, t("workflow_node.deploy.form.aliyun_esa_site_id.placeholder")) - .trim(), + siteId: z.union([z.string(), z.number()]).refine((v) => { + return /^\d+$/.test(v + "") && +v > 0; + }, t("workflow_node.deploy.form.aliyun_esa_site_id.placeholder")), }); const formRule = createSchemaFieldRule(formSchema); @@ -69,7 +68,7 @@ const DeployNodeConfigFormAliyunESAConfig = ({ rules={[formRule]} tooltip={} > - + ); diff --git a/ui/src/components/workflow/node/DeployNodeConfigFormCdnflyConfig.tsx b/ui/src/components/workflow/node/DeployNodeConfigFormCdnflyConfig.tsx new file mode 100644 index 00000000..c9f61e02 --- /dev/null +++ b/ui/src/components/workflow/node/DeployNodeConfigFormCdnflyConfig.tsx @@ -0,0 +1,89 @@ +import { useTranslation } from "react-i18next"; +import { Form, type FormInstance, Input, Select } from "antd"; +import { createSchemaFieldRule } from "antd-zod"; +import { z } from "zod"; + +import Show from "@/components/Show"; + +type DeployNodeConfigFormCdnflyConfigFieldValues = Nullish<{ + resourceType: string; + certificateId?: string | number; +}>; + +export type DeployNodeConfigFormCdnflyConfigProps = { + form: FormInstance; + formName: string; + disabled?: boolean; + initialValues?: DeployNodeConfigFormCdnflyConfigFieldValues; + onValuesChange?: (values: DeployNodeConfigFormCdnflyConfigFieldValues) => void; +}; + +const RESOURCE_TYPE_SITE = "site" as const; +const RESOURCE_TYPE_CERTIFICATE = "certificate" as const; + +const initFormModel = (): DeployNodeConfigFormCdnflyConfigFieldValues => { + return { + resourceType: RESOURCE_TYPE_SITE, + }; +}; + +const DeployNodeConfigFormCdnflyConfig = ({ form: formInst, formName, disabled, initialValues, onValuesChange }: DeployNodeConfigFormCdnflyConfigProps) => { + const { t } = useTranslation(); + + const formSchema = z.object({ + resourceType: z.union([z.literal(RESOURCE_TYPE_SITE), z.literal(RESOURCE_TYPE_CERTIFICATE)], { + message: t("workflow_node.deploy.form.cdnfly_resource_type.placeholder"), + }), + siteId: z.union([z.string(), z.number().int()]).refine((v) => { + if (fieldResourceType !== RESOURCE_TYPE_SITE) return true; + return /^\d+$/.test(v + "") && +v > 0; + }, t("workflow_node.deploy.form.cdnfly_site_id.placeholder")), + certificateId: z.union([z.string(), z.number().int()]).refine((v) => { + if (fieldResourceType !== RESOURCE_TYPE_CERTIFICATE) return true; + return /^\d+$/.test(v + "") && +v > 0; + }, t("workflow_node.deploy.form.cdnfly_certificate_id.placeholder")), + }); + const formRule = createSchemaFieldRule(formSchema); + + const fieldResourceType = Form.useWatch("resourceType", formInst); + + const handleFormChange = (_: unknown, values: z.infer) => { + onValuesChange?.(values); + }; + + return ( +
+ + + + + + + + + + + + + + + +
+ ); +}; + +export default DeployNodeConfigFormCdnflyConfig; diff --git a/ui/src/components/workflow/node/DeployNodeConfigFormGcoreCDNConfig.tsx b/ui/src/components/workflow/node/DeployNodeConfigFormGcoreCDNConfig.tsx index 84d5e410..00dc48dd 100644 --- a/ui/src/components/workflow/node/DeployNodeConfigFormGcoreCDNConfig.tsx +++ b/ui/src/components/workflow/node/DeployNodeConfigFormGcoreCDNConfig.tsx @@ -4,7 +4,7 @@ import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; type DeployNodeConfigFormGcoreCDNConfigFieldValues = Nullish<{ - resourceId?: string; + resourceId?: string | number; }>; export type DeployNodeConfigFormGcoreCDNConfigProps = { @@ -25,9 +25,9 @@ const DeployNodeConfigFormGcoreCDNConfig = ({ form: formInst, formName, disabled const { t } = useTranslation(); const formSchema = z.object({ - resourceId: z - .string({ message: t("workflow_node.deploy.form.gcore_cdn_certificate_id.placeholder") }) - .regex(/^\d+$/, t("workflow_node.deploy.form.gcore_cdn_certificate_id.placeholder")), + resourceId: z.union([z.string(), z.number()]).refine((v) => { + return /^\d+$/.test(v + "") && +v > 0; + }, t("workflow_node.deploy.form.gcore_cdn_certificate_id.placeholder")), }); const formRule = createSchemaFieldRule(formSchema); @@ -50,7 +50,7 @@ const DeployNodeConfigFormGcoreCDNConfig = ({ form: formInst, formName, disabled rules={[formRule]} tooltip={} > - + ); diff --git a/ui/src/components/workflow/node/DeployNodeConfigFormSafeLineConfig.tsx b/ui/src/components/workflow/node/DeployNodeConfigFormSafeLineConfig.tsx index d17681cf..239a6c92 100644 --- a/ui/src/components/workflow/node/DeployNodeConfigFormSafeLineConfig.tsx +++ b/ui/src/components/workflow/node/DeployNodeConfigFormSafeLineConfig.tsx @@ -7,7 +7,7 @@ import Show from "@/components/Show"; type DeployNodeConfigFormSafeLineConfigFieldValues = Nullish<{ resourceType: string; - certificateId?: string; + certificateId?: string | number; }>; export type DeployNodeConfigFormSafeLineConfigProps = { @@ -34,19 +34,10 @@ const DeployNodeConfigFormSafeLineConfig = ({ form: formInst, formName, disabled resourceType: z.literal(RESOURCE_TYPE_CERTIFICATE, { message: t("workflow_node.deploy.form.safeline_resource_type.placeholder"), }), - region: z - .string({ message: t("workflow_node.deploy.form.safeline_region.placeholder") }) - .nonempty(t("workflow_node.deploy.form.safeline_region.placeholder")) - .trim(), - certificateId: z - .string() - .max(64, t("common.errmsg.string_max", { max: 64 })) - .trim() - .nullish() - .refine((v) => { - if (fieldResourceType !== RESOURCE_TYPE_CERTIFICATE) return true; - return /^\d+$/.test(v!); - }, t("workflow_node.deploy.form.safeline_certificate_id.placeholder")), + certificateId: z.union([z.string(), z.number().int()]).refine((v) => { + if (fieldResourceType !== RESOURCE_TYPE_CERTIFICATE) return true; + return /^\d+$/.test(v + "") && +v > 0; + }, t("workflow_node.deploy.form.safeline_certificate_id.placeholder")), }); const formRule = createSchemaFieldRule(formSchema); @@ -75,7 +66,7 @@ const DeployNodeConfigFormSafeLineConfig = ({ form: formInst, formName, disabled - + diff --git a/ui/src/domain/access.ts b/ui/src/domain/access.ts index c4132f60..0ece4826 100644 --- a/ui/src/domain/access.ts +++ b/ui/src/domain/access.ts @@ -15,6 +15,7 @@ export interface AccessModel extends BaseModel { | AccessConfigForBaotaPanel | AccessConfigForBytePlus | AccessConfigForCacheFly + | AccessConfigForCdnfly | AccessConfigForCloudflare | AccessConfigForClouDNS | AccessConfigForDogeCloud @@ -88,6 +89,12 @@ export type AccessConfigForCacheFly = { apiToken: string; }; +export type AccessConfigForCdnfly = { + apiUrl: string; + apiKey: string; + apiSecret: string; +}; + export type AccessConfigForCloudflare = { dnsApiToken: string; }; diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts index f58299da..ed14db23 100644 --- a/ui/src/domain/provider.ts +++ b/ui/src/domain/provider.ts @@ -13,6 +13,7 @@ export const ACCESS_PROVIDERS = Object.freeze({ BAOTAPANEL: "baotapanel", BYTEPLUS: "byteplus", CACHEFLY: "cachefly", + CDNFLY: "cdnfly", CLOUDFLARE: "cloudflare", CLOUDNS: "cloudns", DOGECLOUD: "dogecloud", @@ -79,6 +80,7 @@ export const accessProvidersMap: Maphttps://kb.cachefly.com/kb/guide/en/generating-tokens-and-keys-Oll9Irt5TI/Steps/2460228", + "access.form.cdnfly_api_url.label": "Cdnfly API URL", + "access.form.cdnfly_api_url.placeholder": "Please enter Cdnfly API URL", + "access.form.cdnfly_api_url.tooltip": "For more information, see https://doc.cdnfly.cn/anzhuangshuoming.html", + "access.form.cdnfly_api_key.label": "Cdnfly user API key", + "access.form.cdnfly_api_key.placeholder": "Please enter Cdnfly user API key", + "access.form.cdnfly_api_key.tooltip": "For more information, see https://doc.cdnfly.cn/shiyongjieshao.html", + "access.form.cdnfly_api_secret.label": "Cdnfly user API secret", + "access.form.cdnfly_api_secret.placeholder": "Please enter Cdnfly user API secret", + "access.form.cdnfly_api_secret.tooltip": "For more information, see https://doc.cdnfly.cn/shiyongjieshao.html", "access.form.cloudflare_dns_api_token.label": "Cloudflare API token", "access.form.cloudflare_dns_api_token.placeholder": "Please enter Cloudflare API token", "access.form.cloudflare_dns_api_token.tooltip": "For more information, see https://developers.cloudflare.com/fundamentals/api/get-started/create-token/", diff --git a/ui/src/i18n/locales/en/nls.workflow.nodes.json b/ui/src/i18n/locales/en/nls.workflow.nodes.json index e6a59086..ae79074f 100644 --- a/ui/src/i18n/locales/en/nls.workflow.nodes.json +++ b/ui/src/i18n/locales/en/nls.workflow.nodes.json @@ -200,6 +200,14 @@ "workflow_node.deploy.form.byteplus_cdn_domain.label": "BytePlus CDN domain", "workflow_node.deploy.form.byteplus_cdn_domain.placeholder": "Please enter BytePlus CDN domain name", "workflow_node.deploy.form.byteplus_cdn_domain.tooltip": "For more information, see https://console.byteplus.com/cdn", + "workflow_node.deploy.form.cdnfly_resource_type.label": "Resource type", + "workflow_node.deploy.form.cdnfly_resource_type.placeholder": "Please select resource type", + "workflow_node.deploy.form.cdnfly_resource_type.option.site.label": "Site", + "workflow_node.deploy.form.cdnfly_resource_type.option.certificate.label": "Certificate", + "workflow_node.deploy.form.cdnfly_site_id.label": "Cdnfly site ID", + "workflow_node.deploy.form.cdnfly_site_id.placeholder": "Please enter Cdnfly site ID", + "workflow_node.deploy.form.cdnfly_certificate_id.label": "Cdnfly certificate ID", + "workflow_node.deploy.form.cdnfly_certificate_id.placeholder": "Please enter Cdnfly certificate ID", "workflow_node.deploy.form.dogecloud_cdn_domain.label": "Doge Cloud CDN domain", "workflow_node.deploy.form.dogecloud_cdn_domain.placeholder": "Please enter Doge Cloud CDN domain name", "workflow_node.deploy.form.dogecloud_cdn_domain.tooltip": "For more information, see https://console.dogecloud.com/", diff --git a/ui/src/i18n/locales/zh/nls.access.json b/ui/src/i18n/locales/zh/nls.access.json index bb366764..ee7fea3a 100644 --- a/ui/src/i18n/locales/zh/nls.access.json +++ b/ui/src/i18n/locales/zh/nls.access.json @@ -82,6 +82,15 @@ "access.form.cachefly_api_token.label": "CacheFly API Token", "access.form.cachefly_api_token.placeholder": "请输入 CacheFly API Token", "access.form.cachefly_api_token.tooltip": "这是什么?请参阅 https://kb.cachefly.com/kb/guide/en/generating-tokens-and-keys-Oll9Irt5TI/Steps/2460228", + "access.form.cdnfly_api_url.label": "Cdnfly API URL", + "access.form.cdnfly_api_url.placeholder": "请输入 Cdnfly API URL", + "access.form.cdnfly_api_url.tooltip": "这是什么?请参阅 https://doc.cdnfly.cn/anzhuangshuoming.html", + "access.form.cdnfly_api_key.label": "Cdnfly 用户端 API Key", + "access.form.cdnfly_api_key.placeholder": "请输入 Cdnfly 用户端 API Key", + "access.form.cdnfly_api_key.tooltip": "这是什么?请参阅 https://doc.cdnfly.cn/shiyongjieshao.html", + "access.form.cdnfly_api_secret.label": "Cdnfly 用户端 API Secret", + "access.form.cdnfly_api_secret.placeholder": "请输入 Cdnfly 用户端 API Secret", + "access.form.cdnfly_api_secret.tooltip": "这是什么?请参阅 https://doc.cdnfly.cn/shiyongjieshao.html", "access.form.cloudflare_dns_api_token.label": "Cloudflare API Token", "access.form.cloudflare_dns_api_token.placeholder": "请输入 Cloudflare API Token", "access.form.cloudflare_dns_api_token.tooltip": "这是什么?请参阅 https://developers.cloudflare.com/fundamentals/api/get-started/create-token/", diff --git a/ui/src/i18n/locales/zh/nls.workflow.nodes.json b/ui/src/i18n/locales/zh/nls.workflow.nodes.json index 5335d5aa..ad886a02 100644 --- a/ui/src/i18n/locales/zh/nls.workflow.nodes.json +++ b/ui/src/i18n/locales/zh/nls.workflow.nodes.json @@ -200,6 +200,14 @@ "workflow_node.deploy.form.byteplus_cdn_domain.label": "BytePlus CDN 域名(支持泛域名)", "workflow_node.deploy.form.byteplus_cdn_domain.placeholder": "请输入 BytePlus CDN 域名", "workflow_node.deploy.form.byteplus_cdn_domain.tooltip": "这是什么?请参阅 https://console.byteplus.com/cdn", + "workflow_node.deploy.form.cdnfly_resource_type.label": "证书替换方式", + "workflow_node.deploy.form.cdnfly_resource_type.placeholder": "请选择证书替换方式", + "workflow_node.deploy.form.cdnfly_resource_type.option.site.label": "替换指定网站的证书", + "workflow_node.deploy.form.cdnfly_resource_type.option.certificate.label": "替换指定证书", + "workflow_node.deploy.form.cdnfly_site_id.label": "Cdnfly 网站 ID", + "workflow_node.deploy.form.cdnfly_site_id.placeholder": "请输入 Cdnfly 网站 ID", + "workflow_node.deploy.form.cdnfly_certificate_id.label": "Cdnfly 证书 ID", + "workflow_node.deploy.form.cdnfly_certificate_id.placeholder": "请输入 Cdnfly 证书 ID", "workflow_node.deploy.form.dogecloud_cdn_domain.label": "多吉云 CDN 加速域名", "workflow_node.deploy.form.dogecloud_cdn_domain.placeholder": "请输入多吉云 CDN 加速域名", "workflow_node.deploy.form.dogecloud_cdn_domain.tooltip": "这是什么?请参阅 https://console.dogecloud.com", diff --git a/ui/src/vite-env.d.ts b/ui/types/vite-env.d.ts similarity index 100% rename from ui/src/vite-env.d.ts rename to ui/types/vite-env.d.ts