From deb3b2f412fb623a1f0741d332d8ce1691505699 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Sun, 30 Mar 2025 10:36:05 +0800 Subject: [PATCH] feat: manage ca authorizations --- internal/applicant/acme_ca.go | 28 ++- internal/applicant/applicant.go | 4 +- internal/domain/access.go | 10 + internal/domain/provider.go | 120 +++++++----- migrations/1742209200_upgrade.go | 40 ++-- migrations/1743264000_upgrade.go | 171 ++++++++++++++++++ ui/public/imgs/{acme => providers}/google.svg | 0 .../imgs/{acme => providers}/letsencrypt.svg | 0 .../imgs/{acme => providers}/zerossl.svg | 0 ui/src/components/access/AccessForm.tsx | 6 + .../AccessFormGoogleTrustServicesConfig.tsx | 82 +++++++++ .../access/AccessFormZeroSSLConfig.tsx | 76 ++++++++ .../provider/AccessProviderSelect.tsx | 23 +-- ui/src/domain/access.ts | 12 ++ ui/src/domain/provider.ts | 110 ++++++----- ui/src/domain/settings.ts | 4 +- ui/src/i18n/locales/en/nls.access.json | 20 +- ui/src/i18n/locales/en/nls.provider.json | 4 + ui/src/i18n/locales/en/nls.settings.json | 8 +- ui/src/i18n/locales/zh/nls.access.json | 20 +- ui/src/i18n/locales/zh/nls.provider.json | 6 +- ui/src/pages/settings/SettingsSSLProvider.tsx | 8 +- 22 files changed, 592 insertions(+), 160 deletions(-) create mode 100644 migrations/1743264000_upgrade.go rename ui/public/imgs/{acme => providers}/google.svg (100%) rename ui/public/imgs/{acme => providers}/letsencrypt.svg (100%) rename ui/public/imgs/{acme => providers}/zerossl.svg (100%) create mode 100644 ui/src/components/access/AccessFormGoogleTrustServicesConfig.tsx create mode 100644 ui/src/components/access/AccessFormZeroSSLConfig.tsx diff --git a/internal/applicant/acme_ca.go b/internal/applicant/acme_ca.go index 57f24b6e..afd86bdf 100644 --- a/internal/applicant/acme_ca.go +++ b/internal/applicant/acme_ca.go @@ -1,25 +1,21 @@ package applicant -const ( - sslProviderLetsEncrypt = "letsencrypt" - sslProviderLetsEncryptStaging = "letsencrypt_staging" - sslProviderZeroSSL = "zerossl" - sslProviderGoogleTrustServices = "gts" -) -const defaultSSLProvider = sslProviderLetsEncrypt +import "github.com/usual2970/certimate/internal/domain" const ( - letsencryptUrl = "https://acme-v02.api.letsencrypt.org/directory" - letsencryptStagingUrl = "https://acme-staging-v02.api.letsencrypt.org/directory" - zerosslUrl = "https://acme.zerossl.com/v2/DV90" - gtsUrl = "https://dv.acme-v02.api.pki.goog/directory" + sslProviderLetsEncrypt = string(domain.ApplyCAProviderTypeLetsEncrypt) + sslProviderLetsEncryptStaging = string(domain.ApplyCAProviderTypeLetsEncryptStaging) + sslProviderGoogleTrustServices = string(domain.ApplyCAProviderTypeGoogleTrustServices) + sslProviderZeroSSL = string(domain.ApplyCAProviderTypeZeroSSL) + + sslProviderDefault = sslProviderLetsEncrypt ) var sslProviderUrls = map[string]string{ - sslProviderLetsEncrypt: letsencryptUrl, - sslProviderLetsEncryptStaging: letsencryptStagingUrl, - sslProviderZeroSSL: zerosslUrl, - sslProviderGoogleTrustServices: gtsUrl, + sslProviderLetsEncrypt: "https://acme-v02.api.letsencrypt.org/directory", + sslProviderLetsEncryptStaging: "https://acme-staging-v02.api.letsencrypt.org/directory", + sslProviderGoogleTrustServices: "https://dv.acme-v02.api.pki.goog/directory", + sslProviderZeroSSL: "https://acme.zerossl.com/v2/DV90", } type acmeSSLProviderConfig struct { @@ -29,7 +25,7 @@ type acmeSSLProviderConfig struct { type acmeSSLProviderConfigContent struct { ZeroSSL acmeSSLProviderEabConfig `json:"zerossl"` - GoogleTrustServices acmeSSLProviderEabConfig `json:"gts"` + GoogleTrustServices acmeSSLProviderEabConfig `json:"googletrustservices"` } type acmeSSLProviderEabConfig struct { diff --git a/internal/applicant/applicant.go b/internal/applicant/applicant.go index 8cd8b6d0..8b452aab 100644 --- a/internal/applicant/applicant.go +++ b/internal/applicant/applicant.go @@ -111,7 +111,7 @@ func apply(challengeProvider challenge.Provider, options *applicantOptions) (*Ap sslProviderConfig := &acmeSSLProviderConfig{ Config: acmeSSLProviderConfigContent{}, - Provider: defaultSSLProvider, + Provider: sslProviderDefault, } if settings != nil { if err := json.Unmarshal([]byte(settings.Content), sslProviderConfig); err != nil { @@ -120,7 +120,7 @@ func apply(challengeProvider challenge.Provider, options *applicantOptions) (*Ap } if sslProviderConfig.Provider == "" { - sslProviderConfig.Provider = defaultSSLProvider + sslProviderConfig.Provider = sslProviderDefault } acmeUser, err := newAcmeUser(sslProviderConfig.Provider, options.ContactEmail) diff --git a/internal/domain/access.go b/internal/domain/access.go index dc796c83..e88a3906 100644 --- a/internal/domain/access.go +++ b/internal/domain/access.go @@ -125,6 +125,11 @@ type AccessConfigForGoDaddy struct { ApiSecret string `json:"apiSecret"` } +type AccessConfigForGoogleTrustServices struct { + EabKid string `json:"eabKid"` + EabHmacKey string `json:"eabHmacKey"` +} + type AccessConfigForHuaweiCloud struct { AccessKeyId string `json:"accessKeyId"` SecretAccessKey string `json:"secretAccessKey"` @@ -228,3 +233,8 @@ type AccessConfigForWestcn struct { Username string `json:"username"` ApiPassword string `json:"password"` } + +type AccessConfigForZeroSSL struct { + EabKid string `json:"eabKid"` + EabHmacKey string `json:"eabHmacKey"` +} diff --git a/internal/domain/provider.go b/internal/domain/provider.go index 0e4bcce3..26b7054a 100644 --- a/internal/domain/provider.go +++ b/internal/domain/provider.go @@ -9,55 +9,75 @@ type AccessProviderType string NOTICE: If you add new constant, please keep ASCII order. */ const ( - AccessProviderType1Panel = AccessProviderType("1panel") - AccessProviderTypeACMEHttpReq = AccessProviderType("acmehttpreq") - AccessProviderTypeAkamai = AccessProviderType("akamai") // Akamai(预留) - AccessProviderTypeAliyun = AccessProviderType("aliyun") - AccessProviderTypeAWS = AccessProviderType("aws") - AccessProviderTypeAzure = AccessProviderType("azure") - AccessProviderTypeBaiduCloud = AccessProviderType("baiducloud") - AccessProviderTypeBaishan = AccessProviderType("baishan") - AccessProviderTypeBaotaPanel = AccessProviderType("baotapanel") - AccessProviderTypeBytePlus = AccessProviderType("byteplus") - AccessProviderTypeCacheFly = AccessProviderType("cachefly") - AccessProviderTypeCdnfly = AccessProviderType("cdnfly") - AccessProviderTypeCloudflare = AccessProviderType("cloudflare") - AccessProviderTypeClouDNS = AccessProviderType("cloudns") - AccessProviderTypeCMCCCloud = AccessProviderType("cmcccloud") - AccessProviderTypeCTCCCloud = AccessProviderType("ctcccloud") // 联通云(预留) - AccessProviderTypeCUCCCloud = AccessProviderType("cucccloud") // 天翼云(预留) - AccessProviderTypeDeSEC = AccessProviderType("desec") - AccessProviderTypeDNSLA = AccessProviderType("dnsla") - AccessProviderTypeDogeCloud = AccessProviderType("dogecloud") - AccessProviderTypeDynv6 = AccessProviderType("dynv6") - AccessProviderTypeEdgio = AccessProviderType("edgio") - AccessProviderTypeFastly = AccessProviderType("fastly") // Fastly(预留) - AccessProviderTypeGname = AccessProviderType("gname") - AccessProviderTypeGcore = AccessProviderType("gcore") - AccessProviderTypeGoDaddy = AccessProviderType("godaddy") - AccessProviderTypeGoEdge = AccessProviderType("goedge") // GoEdge(预留) - AccessProviderTypeHuaweiCloud = AccessProviderType("huaweicloud") - AccessProviderTypeJDCloud = AccessProviderType("jdcloud") - AccessProviderTypeKubernetes = AccessProviderType("k8s") - AccessProviderTypeLocal = AccessProviderType("local") - AccessProviderTypeNamecheap = AccessProviderType("namecheap") - AccessProviderTypeNameDotCom = AccessProviderType("namedotcom") - AccessProviderTypeNameSilo = AccessProviderType("namesilo") - AccessProviderTypeNS1 = AccessProviderType("ns1") - AccessProviderTypePorkbun = AccessProviderType("porkbun") - AccessProviderTypePowerDNS = AccessProviderType("powerdns") - AccessProviderTypeQiniu = AccessProviderType("qiniu") - AccessProviderTypeQingCloud = AccessProviderType("qingcloud") // 青云(预留) - AccessProviderTypeRainYun = AccessProviderType("rainyun") - AccessProviderTypeSafeLine = AccessProviderType("safeline") - AccessProviderTypeSSH = AccessProviderType("ssh") - AccessProviderTypeTencentCloud = AccessProviderType("tencentcloud") - AccessProviderTypeUCloud = AccessProviderType("ucloud") - AccessProviderTypeUpyun = AccessProviderType("upyun") - AccessProviderTypeVercel = AccessProviderType("vercel") - AccessProviderTypeVolcEngine = AccessProviderType("volcengine") - AccessProviderTypeWebhook = AccessProviderType("webhook") - AccessProviderTypeWestcn = AccessProviderType("westcn") + AccessProviderType1Panel = AccessProviderType("1panel") + AccessProviderTypeACMEHttpReq = AccessProviderType("acmehttpreq") + AccessProviderTypeAkamai = AccessProviderType("akamai") // Akamai(预留) + AccessProviderTypeAliyun = AccessProviderType("aliyun") + AccessProviderTypeAWS = AccessProviderType("aws") + AccessProviderTypeAzure = AccessProviderType("azure") + AccessProviderTypeBaiduCloud = AccessProviderType("baiducloud") + AccessProviderTypeBaishan = AccessProviderType("baishan") + AccessProviderTypeBaotaPanel = AccessProviderType("baotapanel") + AccessProviderTypeBytePlus = AccessProviderType("byteplus") + AccessProviderTypeCacheFly = AccessProviderType("cachefly") + AccessProviderTypeCdnfly = AccessProviderType("cdnfly") + AccessProviderTypeCloudflare = AccessProviderType("cloudflare") + AccessProviderTypeClouDNS = AccessProviderType("cloudns") + AccessProviderTypeCMCCCloud = AccessProviderType("cmcccloud") + AccessProviderTypeCTCCCloud = AccessProviderType("ctcccloud") // 联通云(预留) + AccessProviderTypeCUCCCloud = AccessProviderType("cucccloud") // 天翼云(预留) + AccessProviderTypeDeSEC = AccessProviderType("desec") + AccessProviderTypeDNSLA = AccessProviderType("dnsla") + AccessProviderTypeDogeCloud = AccessProviderType("dogecloud") + AccessProviderTypeDynv6 = AccessProviderType("dynv6") + AccessProviderTypeEdgio = AccessProviderType("edgio") + AccessProviderTypeFastly = AccessProviderType("fastly") // Fastly(预留) + AccessProviderTypeGname = AccessProviderType("gname") + AccessProviderTypeGcore = AccessProviderType("gcore") + AccessProviderTypeGoDaddy = AccessProviderType("godaddy") + AccessProviderTypeGoEdge = AccessProviderType("goedge") // GoEdge(预留) + AccessProviderTypeGoogleTrustServices = AccessProviderType("googletrustservices") + AccessProviderTypeHuaweiCloud = AccessProviderType("huaweicloud") + AccessProviderTypeJDCloud = AccessProviderType("jdcloud") + AccessProviderTypeKubernetes = AccessProviderType("k8s") + AccessProviderTypeLetsEncrypt = AccessProviderType("letsencrypt") + AccessProviderTypeLetsEncryptStaging = AccessProviderType("letsencryptstaging") + AccessProviderTypeLocal = AccessProviderType("local") + AccessProviderTypeNamecheap = AccessProviderType("namecheap") + AccessProviderTypeNameDotCom = AccessProviderType("namedotcom") + AccessProviderTypeNameSilo = AccessProviderType("namesilo") + AccessProviderTypeNS1 = AccessProviderType("ns1") + AccessProviderTypePorkbun = AccessProviderType("porkbun") + AccessProviderTypePowerDNS = AccessProviderType("powerdns") + AccessProviderTypeQiniu = AccessProviderType("qiniu") + AccessProviderTypeQingCloud = AccessProviderType("qingcloud") // 青云(预留) + AccessProviderTypeRainYun = AccessProviderType("rainyun") + AccessProviderTypeSafeLine = AccessProviderType("safeline") + AccessProviderTypeSSH = AccessProviderType("ssh") + AccessProviderTypeTencentCloud = AccessProviderType("tencentcloud") + AccessProviderTypeUCloud = AccessProviderType("ucloud") + AccessProviderTypeUpyun = AccessProviderType("upyun") + AccessProviderTypeVercel = AccessProviderType("vercel") + AccessProviderTypeVolcEngine = AccessProviderType("volcengine") + AccessProviderTypeWebhook = AccessProviderType("webhook") + AccessProviderTypeWestcn = AccessProviderType("westcn") + AccessProviderTypeZeroSSL = AccessProviderType("zerossl") +) + +type ApplyCAProviderType string + +/* +申请证书 CA 提供商常量值。 +始终等于授权提供商类型。 + + 注意:如果追加新的常量值,请保持以 ASCII 排序。 + NOTICE: If you add new constant, please keep ASCII order. +*/ +const ( + ApplyCAProviderTypeGoogleTrustServices = ApplyCAProviderType("googletrustservices") + ApplyCAProviderTypeLetsEncrypt = ApplyCAProviderType("letsencrypt") + ApplyCAProviderTypeLetsEncryptStaging = ApplyCAProviderType("letsencryptstaging") + ApplyCAProviderTypeZeroSSL = ApplyCAProviderType("zerossl") ) type ApplyDNSProviderType string @@ -111,7 +131,7 @@ const ( type DeployProviderType string /* -部署目标提供商常量值。 +部署证书主机提供商常量值。 短横线前的部分始终等于授权提供商类型。 注意:如果追加新的常量值,请保持以 ASCII 排序。 diff --git a/migrations/1742209200_upgrade.go b/migrations/1742209200_upgrade.go index 0a980972..d2ed7f9d 100644 --- a/migrations/1742209200_upgrade.go +++ b/migrations/1742209200_upgrade.go @@ -7,8 +7,6 @@ import ( "github.com/pocketbase/pocketbase/core" m "github.com/pocketbase/pocketbase/migrations" - - "github.com/usual2970/certimate/internal/domain" ) func init() { @@ -179,20 +177,20 @@ func init() { } for _, workflowRun := range workflowRuns { - type oldWorkflowRunLogRecord struct { + type dWorkflowRunLogRecord struct { Time string `json:"time"` Level string `json:"level"` Content string `json:"content"` Error string `json:"error"` } - type oldWorkflowRunLog struct { - NodeId string `json:"nodeId"` - NodeName string `json:"nodeName"` - Records []oldWorkflowRunLogRecord `json:"records"` - Error string `json:"error"` + type dWorkflowRunLog struct { + NodeId string `json:"nodeId"` + NodeName string `json:"nodeName"` + Records []dWorkflowRunLogRecord `json:"records"` + Error string `json:"error"` } - logs := make([]oldWorkflowRunLog, 0) + logs := make([]dWorkflowRunLog, 0) if err := workflowRun.UnmarshalJSONField("logs", &logs); err != nil { continue } @@ -259,8 +257,20 @@ func init() { return err } + type dWorkflowNode struct { + Id string `json:"id"` + Type string `json:"type"` + Name string `json:"name"` + Config map[string]any `json:"config"` + Inputs map[string]any `json:"inputs"` + Outputs map[string]any `json:"outputs"` + Next *dWorkflowNode `json:"next,omitempty"` + Branches []dWorkflowNode `json:"branches,omitempty"` + Validated bool `json:"validated"` + } + for _, workflowRun := range workflowRuns { - node := &domain.WorkflowNode{} + node := &dWorkflowNode{} for _, workflowOutput := range workflowOutputs { if workflowOutput.GetString("runId") != workflowRun.Get("id") { continue @@ -270,8 +280,8 @@ func init() { continue } - if node.Type != domain.WorkflowNodeTypeApply { - node = &domain.WorkflowNode{} + if node.Type != "apply" { + node = &dWorkflowNode{} continue } } @@ -286,7 +296,7 @@ func init() { } else { workflow, _ := app.FindRecordById("workflow", workflowRun.GetString("workflowId")) if workflow != nil { - rootNode := &domain.WorkflowNode{} + rootNode := &dWorkflowNode{} if err := workflow.UnmarshalJSONField("content", rootNode); err != nil { return err } @@ -294,9 +304,9 @@ func init() { rootNode.Next = node workflowRun.Set("detail", rootNode) } else { - rootNode := &domain.WorkflowNode{ + rootNode := &dWorkflowNode{ Id: core.GenerateDefaultRandomId(), - Type: domain.WorkflowNodeTypeStart, + Type: "start", Name: "开始", Config: map[string]any{ "trigger": "manual", diff --git a/migrations/1743264000_upgrade.go b/migrations/1743264000_upgrade.go new file mode 100644 index 00000000..50fd93f6 --- /dev/null +++ b/migrations/1743264000_upgrade.go @@ -0,0 +1,171 @@ +package migrations + +import ( + "github.com/pocketbase/pocketbase/core" + m "github.com/pocketbase/pocketbase/migrations" +) + +func init() { + m.Register(func(app core.App) error { + // update collection `settings` + { + collection, err := app.FindCollectionByNameOrId("dy6ccjb60spfy6p") + if err != nil { + return err + } + + records, err := app.FindRecordsByFilter(collection, "name='sslProvider'", "-created", 1, 0) + if err != nil { + return err + } + + if len(records) == 1 { + record := records[0] + + content := make(map[string]any) + if err := record.UnmarshalJSONField("content", &content); err != nil { + return err + } + + if provider, ok := content["provider"]; ok { + if providerStr, ok := provider.(string); ok { + if providerStr == "letsencrypt_staging" { + content["provider"] = "letsencryptstaging" + } + } + } + + if config, ok := content["config"]; ok { + if configMap, ok := config.(map[string]any); ok { + if _, ok := configMap["letsencrypt_staging"]; ok { + configMap["letsencryptstaging"] = configMap["letsencrypt_staging"] + delete(configMap, "letsencrypt_staging") + } + if _, ok := configMap["gts"]; ok { + configMap["googletrustservices"] = configMap["gts"] + delete(configMap, "gts") + } + } + } + + record.Set("content", content) + if err := app.Save(record); err != nil { + return err + } + } + } + + // update collection `access` + { + collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") + if err != nil { + return err + } + + // update field + if err := collection.Fields.AddMarshaledJSONAt(2, []byte(`{ + "hidden": false, + "id": "hwy7m03o", + "maxSelect": 1, + "name": "provider", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "1panel", + "acmehttpreq", + "akamai", + "aliyun", + "aws", + "azure", + "baiducloud", + "baishan", + "baotapanel", + "byteplus", + "cachefly", + "cdnfly", + "cloudflare", + "cloudns", + "cmcccloud", + "ctcccloud", + "cucccloud", + "desec", + "dnsla", + "dogecloud", + "dynv6", + "edgio", + "fastly", + "gname", + "gcore", + "godaddy", + "goedge", + "googletrustservices", + "huaweicloud", + "jdcloud", + "k8s", + "letsencrypt", + "letsencryptstaging", + "local", + "namecheap", + "namedotcom", + "namesilo", + "ns1", + "porkbun", + "powerdns", + "qiniu", + "qingcloud", + "rainyun", + "safeline", + "ssh", + "tencentcloud", + "ucloud", + "upyun", + "vercel", + "volcengine", + "webhook", + "westcn", + "zerossl" + ] + }`)); err != nil { + return err + } + + if err := app.Save(collection); err != nil { + return err + } + } + + // update collection `acme_accounts` + { + collection, err := app.FindCollectionByNameOrId("012d7abbod1hwvr") + if err != nil { + return err + } + + records, err := app.FindRecordsByFilter(collection, "ca='letsencrypt_staging' || ca='gts'", "-created", 0, 0) + if err != nil { + return err + } + + for _, record := range records { + ca := record.GetString("ca") + if ca == "letsencrypt_staging" { + record.Set("ca", "letsencryptstaging") + } else if ca == "gts" { + record.Set("ca", "googletrustservices") + } else { + continue + } + + if err := app.Save(record); err != nil { + return err + } + } + } + + return nil + }, func(app core.App) error { + return nil + }) +} diff --git a/ui/public/imgs/acme/google.svg b/ui/public/imgs/providers/google.svg similarity index 100% rename from ui/public/imgs/acme/google.svg rename to ui/public/imgs/providers/google.svg diff --git a/ui/public/imgs/acme/letsencrypt.svg b/ui/public/imgs/providers/letsencrypt.svg similarity index 100% rename from ui/public/imgs/acme/letsencrypt.svg rename to ui/public/imgs/providers/letsencrypt.svg diff --git a/ui/public/imgs/acme/zerossl.svg b/ui/public/imgs/providers/zerossl.svg similarity index 100% rename from ui/public/imgs/acme/zerossl.svg rename to ui/public/imgs/providers/zerossl.svg diff --git a/ui/src/components/access/AccessForm.tsx b/ui/src/components/access/AccessForm.tsx index 487d449a..75660cb2 100644 --- a/ui/src/components/access/AccessForm.tsx +++ b/ui/src/components/access/AccessForm.tsx @@ -31,6 +31,7 @@ import AccessFormEdgioConfig from "./AccessFormEdgioConfig"; import AccessFormGcoreConfig from "./AccessFormGcoreConfig"; import AccessFormGnameConfig from "./AccessFormGnameConfig"; import AccessFormGoDaddyConfig from "./AccessFormGoDaddyConfig"; +import AccessFormGoogleTrustServicesConfig from "./AccessFormGoogleTrustServicesConfig"; import AccessFormHuaweiCloudConfig from "./AccessFormHuaweiCloudConfig"; import AccessFormJDCloudConfig from "./AccessFormJDCloudConfig"; import AccessFormKubernetesConfig from "./AccessFormKubernetesConfig"; @@ -52,6 +53,7 @@ import AccessFormVercelConfig from "./AccessFormVercelConfig"; import AccessFormVolcEngineConfig from "./AccessFormVolcEngineConfig"; import AccessFormWebhookConfig from "./AccessFormWebhookConfig"; import AccessFormWestcnConfig from "./AccessFormWestcnConfig"; +import AccessFormZeroSSLConfig from "./AccessFormZeroSSLConfig"; type AccessFormFieldValues = Partial>; type AccessFormPresets = "add" | "edit"; @@ -147,6 +149,8 @@ const AccessForm = forwardRef(({ className, return ; case ACCESS_PROVIDERS.GODADDY: return ; + case ACCESS_PROVIDERS.GOOGLETRUSTSERVICES: + return ; case ACCESS_PROVIDERS.EDGIO: return ; case ACCESS_PROVIDERS.HUAWEICLOUD: @@ -191,6 +195,8 @@ const AccessForm = forwardRef(({ className, return ; case ACCESS_PROVIDERS.WESTCN: return ; + case ACCESS_PROVIDERS.ZEROSSL: + return ; } }, [disabled, initialValues?.config, fieldProvider, nestedFormInst, nestedFormName]); diff --git a/ui/src/components/access/AccessFormGoogleTrustServicesConfig.tsx b/ui/src/components/access/AccessFormGoogleTrustServicesConfig.tsx new file mode 100644 index 00000000..95eb6270 --- /dev/null +++ b/ui/src/components/access/AccessFormGoogleTrustServicesConfig.tsx @@ -0,0 +1,82 @@ +import { useTranslation } from "react-i18next"; +import { Form, type FormInstance, Input } from "antd"; +import { createSchemaFieldRule } from "antd-zod"; +import { z } from "zod"; + +import { type AccessConfigForGoogleTrustServices } from "@/domain/access"; + +type AccessFormGoogleTrustServicesConfigFieldValues = Nullish; + +export type AccessFormGoogleTrustServicesConfigProps = { + form: FormInstance; + formName: string; + disabled?: boolean; + initialValues?: AccessFormGoogleTrustServicesConfigFieldValues; + onValuesChange?: (values: AccessFormGoogleTrustServicesConfigFieldValues) => void; +}; + +const initFormModel = (): AccessFormGoogleTrustServicesConfigFieldValues => { + return { + eabKid: "", + eabHmacKey: "", + }; +}; + +const AccessFormGoogleTrustServicesConfig = ({ + form: formInst, + formName, + disabled, + initialValues, + onValuesChange, +}: AccessFormGoogleTrustServicesConfigProps) => { + const { t } = useTranslation(); + + const formSchema = z.object({ + eabKid: z + .string() + .min(1, t("access.form.googletrustservices_eab_kid.placeholder")) + .max(256, t("common.errmsg.string_max", { max: 256 })) + .trim(), + eabHmacKey: z + .string() + .min(1, t("access.form.googletrustservices_eab_hmac_key.placeholder")) + .max(256, t("common.errmsg.string_max", { max: 256 })) + .trim(), + }); + const formRule = createSchemaFieldRule(formSchema); + + const handleFormChange = (_: unknown, values: z.infer) => { + onValuesChange?.(values); + }; + + return ( +
+ } + > + + + + } + > + + +
+ ); +}; + +export default AccessFormGoogleTrustServicesConfig; diff --git a/ui/src/components/access/AccessFormZeroSSLConfig.tsx b/ui/src/components/access/AccessFormZeroSSLConfig.tsx new file mode 100644 index 00000000..336777b0 --- /dev/null +++ b/ui/src/components/access/AccessFormZeroSSLConfig.tsx @@ -0,0 +1,76 @@ +import { useTranslation } from "react-i18next"; +import { Form, type FormInstance, Input } from "antd"; +import { createSchemaFieldRule } from "antd-zod"; +import { z } from "zod"; + +import { type AccessConfigForZeroSSL } from "@/domain/access"; + +type AccessFormZeroSSLConfigFieldValues = Nullish; + +export type AccessFormZeroSSLConfigProps = { + form: FormInstance; + formName: string; + disabled?: boolean; + initialValues?: AccessFormZeroSSLConfigFieldValues; + onValuesChange?: (values: AccessFormZeroSSLConfigFieldValues) => void; +}; + +const initFormModel = (): AccessFormZeroSSLConfigFieldValues => { + return { + eabKid: "", + eabHmacKey: "", + }; +}; + +const AccessFormZeroSSLConfig = ({ form: formInst, formName, disabled, initialValues, onValuesChange }: AccessFormZeroSSLConfigProps) => { + const { t } = useTranslation(); + + const formSchema = z.object({ + eabKid: z + .string() + .min(1, t("access.form.zerossl_eab_kid.placeholder")) + .max(256, t("common.errmsg.string_max", { max: 256 })) + .trim(), + eabHmacKey: z + .string() + .min(1, t("access.form.zerossl_eab_hmac_key.placeholder")) + .max(256, t("common.errmsg.string_max", { max: 256 })) + .trim(), + }); + const formRule = createSchemaFieldRule(formSchema); + + const handleFormChange = (_: unknown, values: z.infer) => { + onValuesChange?.(values); + }; + + return ( +
+ } + > + + + + } + > + + +
+ ); +}; + +export default AccessFormZeroSSLConfig; diff --git a/ui/src/components/provider/AccessProviderSelect.tsx b/ui/src/components/provider/AccessProviderSelect.tsx index 0e0a992c..fb38419e 100644 --- a/ui/src/components/provider/AccessProviderSelect.tsx +++ b/ui/src/components/provider/AccessProviderSelect.tsx @@ -9,9 +9,10 @@ export type AccessProviderSelectProps = Omit< "filterOption" | "filterSort" | "labelRender" | "options" | "optionFilterProp" | "optionLabelProp" | "optionRender" > & { filter?: (record: AccessProvider) => boolean; + showOptionTags?: boolean; }; -const AccessProviderSelect = ({ filter, ...props }: AccessProviderSelectProps) => { +const AccessProviderSelect = ({ filter, showOptionTags, ...props }: AccessProviderSelectProps = { showOptionTags: true }) => { const { t } = useTranslation(); const [options, setOptions] = useState>([]); @@ -38,18 +39,14 @@ const AccessProviderSelect = ({ filter, ...props }: AccessProviderSelectProps) = {t(provider?.name ?? "")} -
- {provider?.usages?.includes(ACCESS_USAGES.APPLY) && ( - <> - {t("access.props.provider.usage.dns")} - - )} - {provider?.usages?.includes(ACCESS_USAGES.DEPLOY) && ( - <> - {t("access.props.provider.usage.host")} - - )} -
+ {!showOptionTags && ( +
+ {provider?.usages?.includes(ACCESS_USAGES.DNS) && {t("access.props.provider.usage.dns")}} + {provider?.usages?.includes(ACCESS_USAGES.HOSTING) && {t("access.props.provider.usage.hosting")}} + {/* {provider?.usages?.includes(ACCESS_USAGES.CA) && {t("access.props.provider.usage.ca")}} */} + {/* {provider?.usages?.includes(ACCESS_USAGES.NOTIFICATION) && {t("access.props.provider.usage.notification")}} */} +
+ )} ); }; diff --git a/ui/src/domain/access.ts b/ui/src/domain/access.ts index ed1bc1ee..0e14d2bf 100644 --- a/ui/src/domain/access.ts +++ b/ui/src/domain/access.ts @@ -28,6 +28,7 @@ export interface AccessModel extends BaseModel { | AccessConfigForGcore | AccessConfigForGname | AccessConfigForGoDaddy + | AccessConfigForGoogleTrustServices | AccessConfigForHuaweiCloud | AccessConfigForJDCloud | AccessConfigForKubernetes @@ -48,6 +49,7 @@ export interface AccessModel extends BaseModel { | AccessConfigForVolcEngine | AccessConfigForWebhook | AccessConfigForWestcn + | AccessConfigForZeroSSL ); } @@ -163,6 +165,11 @@ export type AccessConfigForGoDaddy = { apiSecret: string; }; +export type AccessConfigForGoogleTrustServices = { + eabKid: string; + eabHmacKey: string; +}; + export type AccessConfigForHuaweiCloud = { accessKeyId: string; secretAccessKey: string; @@ -266,4 +273,9 @@ export type AccessConfigForWestcn = { username: string; apiPassword: string; }; + +export type AccessConfigForZeroSSL = { + eabKid: string; + eabHmacKey: string; +}; // #endregion diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts index d4f7ba46..31cd02e3 100644 --- a/ui/src/domain/provider.ts +++ b/ui/src/domain/provider.ts @@ -22,13 +22,16 @@ export const ACCESS_PROVIDERS = Object.freeze({ DNSLA: "dnsla", DOGECLOUD: "dogecloud", DYNV6: "dynv6", + EDGIO: "edgio", GCORE: "gcore", GNAME: "gname", GODADDY: "godaddy", - EDGIO: "edgio", + GOOGLETRUSTSERVICES: "googletrustservices", HUAWEICLOUD: "huaweicloud", JDCLOUD: "jdcloud", KUBERNETES: "k8s", + LETSENCRYPT: "letsencrypt", + LETSENCRYPTSTAGING: "letsencryptstaging", LOCAL: "local", NAMECHEAP: "namecheap", NAMEDOTCOM: "namedotcom", @@ -47,13 +50,16 @@ export const ACCESS_PROVIDERS = Object.freeze({ VOLCENGINE: "volcengine", WEBHOOK: "webhook", WESTCN: "westcn", + ZEROSSL: "zerossl", } as const); export type AccessProviderType = (typeof ACCESS_PROVIDERS)[keyof typeof ACCESS_PROVIDERS]; export const ACCESS_USAGES = Object.freeze({ - APPLY: "apply", - DEPLOY: "deploy", + DNS: "dns", + HOSTING: "hosting", + CA: "ca", + NOTIFICATION: "notification", } as const); export type AccessUsageType = (typeof ACCESS_USAGES)[keyof typeof ACCESS_USAGES]; @@ -67,55 +73,61 @@ export type AccessProvider = { export const accessProvidersMap: Map = new Map( /* - 注意:此处的顺序决定显示在前端的顺序。 - NOTICE: The following order determines the order displayed at the frontend. - */ + 注意:此处的顺序决定显示在前端的顺序。 + NOTICE: The following order determines the order displayed at the frontend. + */ [ - [ACCESS_PROVIDERS.LOCAL, "provider.local", "/imgs/providers/local.svg", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.SSH, "provider.ssh", "/imgs/providers/ssh.svg", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.WEBHOOK, "provider.webhook", "/imgs/providers/webhook.svg", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.KUBERNETES, "provider.kubernetes", "/imgs/providers/kubernetes.svg", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.ALIYUN, "provider.aliyun", "/imgs/providers/aliyun.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.TENCENTCLOUD, "provider.tencentcloud", "/imgs/providers/tencentcloud.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.BAIDUCLOUD, "provider.baiducloud", "/imgs/providers/baiducloud.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.HUAWEICLOUD, "provider.huaweicloud", "/imgs/providers/huaweicloud.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.VOLCENGINE, "provider.volcengine", "/imgs/providers/volcengine.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.JDCLOUD, "provider.jdcloud", "/imgs/providers/jdcloud.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.AWS, "provider.aws", "/imgs/providers/aws.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.AZURE, "provider.azure", "/imgs/providers/azure.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.GCORE, "provider.gcore", "/imgs/providers/gcore.png", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]], + [ACCESS_PROVIDERS.LOCAL, "provider.local", "/imgs/providers/local.svg", [ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.SSH, "provider.ssh", "/imgs/providers/ssh.svg", [ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.WEBHOOK, "provider.webhook", "/imgs/providers/webhook.svg", [ACCESS_USAGES.HOSTING, ACCESS_USAGES.NOTIFICATION]], + [ACCESS_PROVIDERS.KUBERNETES, "provider.kubernetes", "/imgs/providers/kubernetes.svg", [ACCESS_USAGES.HOSTING]], - [ACCESS_PROVIDERS.QINIU, "provider.qiniu", "/imgs/providers/qiniu.svg", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.UPYUN, "provider.upyun", "/imgs/providers/upyun.svg", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.BAISHAN, "provider.baishan", "/imgs/providers/baishan.png", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.DOGECLOUD, "provider.dogecloud", "/imgs/providers/dogecloud.png", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.BYTEPLUS, "provider.byteplus", "/imgs/providers/byteplus.svg", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.UCLOUD, "provider.ucloud", "/imgs/providers/ucloud.svg", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.SAFELINE, "provider.safeline", "/imgs/providers/safeline.svg", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS["1PANEL"], "provider.1panel", "/imgs/providers/1panel.svg", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.BAOTAPANEL, "provider.baotapanel", "/imgs/providers/baotapanel.svg", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.CACHEFLY, "provider.cachefly", "/imgs/providers/cachefly.png", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.CDNFLY, "provider.cdnfly", "/imgs/providers/cdnfly.png", [ACCESS_USAGES.DEPLOY]], - [ACCESS_PROVIDERS.EDGIO, "provider.edgio", "/imgs/providers/edgio.svg", [ACCESS_USAGES.DEPLOY]], + [ACCESS_PROVIDERS.ALIYUN, "provider.aliyun", "/imgs/providers/aliyun.svg", [ACCESS_USAGES.DNS, ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.TENCENTCLOUD, "provider.tencentcloud", "/imgs/providers/tencentcloud.svg", [ACCESS_USAGES.DNS, ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.BAIDUCLOUD, "provider.baiducloud", "/imgs/providers/baiducloud.svg", [ACCESS_USAGES.DNS, ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.HUAWEICLOUD, "provider.huaweicloud", "/imgs/providers/huaweicloud.svg", [ACCESS_USAGES.DNS, ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.VOLCENGINE, "provider.volcengine", "/imgs/providers/volcengine.svg", [ACCESS_USAGES.DNS, ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.JDCLOUD, "provider.jdcloud", "/imgs/providers/jdcloud.svg", [ACCESS_USAGES.DNS, ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.AWS, "provider.aws", "/imgs/providers/aws.svg", [ACCESS_USAGES.DNS, ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.AZURE, "provider.azure", "/imgs/providers/azure.svg", [ACCESS_USAGES.DNS, ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.GCORE, "provider.gcore", "/imgs/providers/gcore.png", [ACCESS_USAGES.DNS, ACCESS_USAGES.HOSTING]], - [ACCESS_PROVIDERS.CLOUDFLARE, "provider.cloudflare", "/imgs/providers/cloudflare.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.CLOUDNS, "provider.cloudns", "/imgs/providers/cloudns.png", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.DESEC, "provider.desec", "/imgs/providers/desec.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.DNSLA, "provider.dnsla", "/imgs/providers/dnsla.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.DYNV6, "provider.dynv6", "/imgs/providers/dynv6.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.GNAME, "provider.gname", "/imgs/providers/gname.png", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.GODADDY, "provider.godaddy", "/imgs/providers/godaddy.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.NAMECHEAP, "provider.namecheap", "/imgs/providers/namecheap.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.NAMEDOTCOM, "provider.namedotcom", "/imgs/providers/namedotcom.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.NAMESILO, "provider.namesilo", "/imgs/providers/namesilo.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.NS1, "provider.ns1", "/imgs/providers/ns1.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.PORKBUN, "provider.porkbun", "/imgs/providers/porkbun.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.VERCEL, "provider.vercel", "/imgs/providers/vercel.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.CMCCCLOUD, "provider.cmcccloud", "/imgs/providers/cmcccloud.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.RAINYUN, "provider.rainyun", "/imgs/providers/rainyun.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.WESTCN, "provider.westcn", "/imgs/providers/westcn.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.POWERDNS, "provider.powerdns", "/imgs/providers/powerdns.svg", [ACCESS_USAGES.APPLY]], - [ACCESS_PROVIDERS.ACMEHTTPREQ, "provider.acmehttpreq", "/imgs/providers/acmehttpreq.svg", [ACCESS_USAGES.APPLY]], + [ACCESS_PROVIDERS.QINIU, "provider.qiniu", "/imgs/providers/qiniu.svg", [ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.UPYUN, "provider.upyun", "/imgs/providers/upyun.svg", [ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.BAISHAN, "provider.baishan", "/imgs/providers/baishan.png", [ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.DOGECLOUD, "provider.dogecloud", "/imgs/providers/dogecloud.png", [ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.BYTEPLUS, "provider.byteplus", "/imgs/providers/byteplus.svg", [ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.UCLOUD, "provider.ucloud", "/imgs/providers/ucloud.svg", [ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.SAFELINE, "provider.safeline", "/imgs/providers/safeline.svg", [ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS["1PANEL"], "provider.1panel", "/imgs/providers/1panel.svg", [ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.BAOTAPANEL, "provider.baotapanel", "/imgs/providers/baotapanel.svg", [ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.CACHEFLY, "provider.cachefly", "/imgs/providers/cachefly.png", [ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.CDNFLY, "provider.cdnfly", "/imgs/providers/cdnfly.png", [ACCESS_USAGES.HOSTING]], + [ACCESS_PROVIDERS.EDGIO, "provider.edgio", "/imgs/providers/edgio.svg", [ACCESS_USAGES.HOSTING]], + + [ACCESS_PROVIDERS.CLOUDFLARE, "provider.cloudflare", "/imgs/providers/cloudflare.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.CLOUDNS, "provider.cloudns", "/imgs/providers/cloudns.png", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.DESEC, "provider.desec", "/imgs/providers/desec.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.DNSLA, "provider.dnsla", "/imgs/providers/dnsla.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.DYNV6, "provider.dynv6", "/imgs/providers/dynv6.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.GNAME, "provider.gname", "/imgs/providers/gname.png", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.GODADDY, "provider.godaddy", "/imgs/providers/godaddy.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.NAMECHEAP, "provider.namecheap", "/imgs/providers/namecheap.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.NAMEDOTCOM, "provider.namedotcom", "/imgs/providers/namedotcom.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.NAMESILO, "provider.namesilo", "/imgs/providers/namesilo.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.NS1, "provider.ns1", "/imgs/providers/ns1.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.PORKBUN, "provider.porkbun", "/imgs/providers/porkbun.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.VERCEL, "provider.vercel", "/imgs/providers/vercel.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.CMCCCLOUD, "provider.cmcccloud", "/imgs/providers/cmcccloud.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.RAINYUN, "provider.rainyun", "/imgs/providers/rainyun.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.WESTCN, "provider.westcn", "/imgs/providers/westcn.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.POWERDNS, "provider.powerdns", "/imgs/providers/powerdns.svg", [ACCESS_USAGES.DNS]], + [ACCESS_PROVIDERS.ACMEHTTPREQ, "provider.acmehttpreq", "/imgs/providers/acmehttpreq.svg", [ACCESS_USAGES.DNS]], + + [ACCESS_PROVIDERS.LETSENCRYPT, "provider.letsencrypt", "/imgs/providers/letsencrypt.svg", [ACCESS_USAGES.CA]], + [ACCESS_PROVIDERS.LETSENCRYPTSTAGING, "provider.letsencryptstaging", "/imgs/providers/letsencrypt.svg", [ACCESS_USAGES.CA]], + [ACCESS_PROVIDERS.GOOGLETRUSTSERVICES, "provider.googletrustservices", "/imgs/providers/google.svg", [ACCESS_USAGES.CA]], + [ACCESS_PROVIDERS.ZEROSSL, "provider.zerossl", "/imgs/providers/zerossl.svg", [ACCESS_USAGES.CA]], ].map((e) => [ e[0] as string, { diff --git a/ui/src/domain/settings.ts b/ui/src/domain/settings.ts index e34105e0..445e1dc6 100644 --- a/ui/src/domain/settings.ts +++ b/ui/src/domain/settings.ts @@ -136,9 +136,9 @@ export const notifyChannelsMap: Map = new // #region Settings: SSLProvider export const SSLPROVIDERS = Object.freeze({ LETS_ENCRYPT: "letsencrypt", - LETS_ENCRYPT_STAGING: "letsencrypt_staging", + LETS_ENCRYPT_STAGING: "letsencryptstaging", ZERO_SSL: "zerossl", - GOOGLE_TRUST_SERVICES: "gts", + GOOGLE_TRUST_SERVICES: "googletrustservices", } as const); export type SSLProviders = (typeof SSLPROVIDERS)[keyof typeof SSLPROVIDERS]; diff --git a/ui/src/i18n/locales/en/nls.access.json b/ui/src/i18n/locales/en/nls.access.json index ef2f481d..5cb4e7b0 100644 --- a/ui/src/i18n/locales/en/nls.access.json +++ b/ui/src/i18n/locales/en/nls.access.json @@ -14,7 +14,11 @@ "access.props.name": "Name", "access.props.provider": "Provider", "access.props.provider.usage.dns": "DNS provider", - "access.props.provider.usage.host": "Host provider", + "access.props.provider.usage.hosting": "Hosting provider", + "access.props.provider.usage.ca": "CA", + "access.props.provider.usage.notification": "Notification channel", + "access.props.ca": "Certificate authority", + "access.props.channel": "Notification channel", "access.props.created_at": "Created at", "access.props.updated_at": "Updated at", @@ -165,6 +169,12 @@ "access.form.godaddy_api_secret.label": "GoDaddy API secret", "access.form.godaddy_api_secret.placeholder": "Please enter GoDaddy API secret", "access.form.godaddy_api_secret.tooltip": "For more information, see https://developer.godaddy.com/", + "access.form.googletrustservices_eab_kid.label": "ACME EAB KID", + "access.form.googletrustservices_eab_kid.placeholder": "Please enter ACME EAB KID", + "access.form.googletrustservices_eab_kid.tooltip": "For more information, see https://cloud.google.com/certificate-manager/docs/public-ca-tutorial", + "access.form.googletrustservices_eab_hmac_key.label": "ACME EAB HMAC key", + "access.form.googletrustservices_eab_hmac_key.placeholder": "Please enter ACME EAB HMAC key", + "access.form.googletrustservices_eab_hmac_key.tooltip": "For more information, see https://cloud.google.com/certificate-manager/docs/public-ca-tutorial", "access.form.huaweicloud_access_key_id.label": "Huawei Cloud AccessKeyId", "access.form.huaweicloud_access_key_id.placeholder": "Please enter Huawei Cloud AccessKeyId", "access.form.huaweicloud_access_key_id.tooltip": "For more information, see https://support.huaweicloud.com/intl/en-us/usermanual-ca/ca_01_0003.html", @@ -284,5 +294,11 @@ "access.form.westcn_username.tooltip": "For more information, see https://www.west.cn/CustomerCenter/doc/apiv2.html", "access.form.westcn_api_password.label": "West.cn API password", "access.form.westcn_api_password.placeholder": "Please enter West.cn API password", - "access.form.westcn_api_password.tooltip": "For more information, see https://www.west.cn/CustomerCenter/doc/apiv2.html" + "access.form.westcn_api_password.tooltip": "For more information, see https://www.west.cn/CustomerCenter/doc/apiv2.html", + "access.form.zerossl_eab_kid.label": "ACME EAB KID", + "access.form.zerossl_eab_kid.placeholder": "Please enter ACME EAB KID", + "access.form.zerossl_eab_kid.tooltip": "For more information, see https://zerossl.com/documentation/acme/", + "access.form.zerossl_eab_hmac_key.label": "ACME EAB HMAC key", + "access.form.zerossl_eab_hmac_key.placeholder": "Please enter ACME EAB HMAC key", + "access.form.zerossl_eab_hmac_key.tooltip": "For more information, see https://zerossl.com/documentation/acme/" } diff --git a/ui/src/i18n/locales/en/nls.provider.json b/ui/src/i18n/locales/en/nls.provider.json index b7c3fc93..f2e286a9 100644 --- a/ui/src/i18n/locales/en/nls.provider.json +++ b/ui/src/i18n/locales/en/nls.provider.json @@ -61,6 +61,7 @@ "provider.godaddy": "GoDaddy", "provider.goedge": "GoEdge", "provider.goedge.cdn": "GoEdge - CDN (Content Delivery Network)", + "provider.googletrustservices": "Google Trust Services", "provider.huaweicloud": "Huawei Cloud", "provider.huaweicloud.cdn": "Huawei Cloud - CDN (Content Delivery Network)", "provider.huaweicloud.dns": "Huawei Cloud - DNS (Domain Name Service)", @@ -75,6 +76,8 @@ "provider.jdcloud.vod": "JD Cloud - VOD (Video on Demand)", "provider.kubernetes": "Kubernetes", "provider.kubernetes.secret": "Kubernetes - Secret", + "provider.letsencrypt": "Let's Encrypt", + "provider.letsencryptstaging": "Let's Encrypt Staging Environment", "provider.local": "Local deployment", "provider.namecheap": "Namecheap", "provider.namedotcom": "Name.com", @@ -121,6 +124,7 @@ "provider.volcengine.tos": "Volcengine - TOS (Tinder Object Storage)", "provider.webhook": "Webhook", "provider.westcn": "West.cn", + "provider.zerossl": "ZeroSSL", "provider.category.all": "All", "provider.category.cdn": "CDN", diff --git a/ui/src/i18n/locales/en/nls.settings.json b/ui/src/i18n/locales/en/nls.settings.json index 74e869bd..7c73f6e0 100644 --- a/ui/src/i18n/locales/en/nls.settings.json +++ b/ui/src/i18n/locales/en/nls.settings.json @@ -82,14 +82,14 @@ "settings.sslprovider.form.zerossl_eab_kid.label": "EAB KID", "settings.sslprovider.form.zerossl_eab_kid.placeholder": "Please enter EAB KID", "settings.sslprovider.form.zerossl_eab_kid.tooltip": "For more information, see https://zerossl.com/documentation/acme/", - "settings.sslprovider.form.zerossl_eab_hmac_key.label": "EAB HMAC Key", - "settings.sslprovider.form.zerossl_eab_hmac_key.placeholder": "Please enter EAB HMAC Key", + "settings.sslprovider.form.zerossl_eab_hmac_key.label": "EAB HMAC key", + "settings.sslprovider.form.zerossl_eab_hmac_key.placeholder": "Please enter EAB HMAC key", "settings.sslprovider.form.zerossl_eab_hmac_key.tooltip": "For more information, see https://zerossl.com/documentation/acme/", "settings.sslprovider.form.gts_eab_kid.label": "EAB KID", "settings.sslprovider.form.gts_eab_kid.placeholder": "Please enter EAB KID", "settings.sslprovider.form.gts_eab_kid.tooltip": "For more information, see https://cloud.google.com/certificate-manager/docs/public-ca-tutorial", - "settings.sslprovider.form.gts_eab_hmac_key.label": "EAB HMAC Key", - "settings.sslprovider.form.gts_eab_hmac_key.placeholder": "Please enter EAB HMAC Key", + "settings.sslprovider.form.gts_eab_hmac_key.label": "EAB HMAC key", + "settings.sslprovider.form.gts_eab_hmac_key.placeholder": "Please enter EAB HMAC key", "settings.sslprovider.form.gts_eab_hmac_key.tooltip": "For more information, see https://cloud.google.com/certificate-manager/docs/public-ca-tutorial", "settings.persistence.tab": "Persistence", diff --git a/ui/src/i18n/locales/zh/nls.access.json b/ui/src/i18n/locales/zh/nls.access.json index bec170b6..016392fb 100644 --- a/ui/src/i18n/locales/zh/nls.access.json +++ b/ui/src/i18n/locales/zh/nls.access.json @@ -14,7 +14,11 @@ "access.props.name": "名称", "access.props.provider": "提供商", "access.props.provider.usage.dns": "DNS 提供商", - "access.props.provider.usage.host": "主机提供商", + "access.props.provider.usage.hosting": "主机提供商", + "access.props.provider.usage.ca": "证书颁发机构", + "access.props.provider.usage.notification": "通知渠道", + "access.props.ca": "证书颁发机构", + "access.props.channel": "通知渠道", "access.props.created_at": "创建时间", "access.props.updated_at": "更新时间", @@ -159,6 +163,12 @@ "access.form.godaddy_api_secret.label": "GoDaddy API Secret", "access.form.godaddy_api_secret.placeholder": "请输入 GoDaddy API Secret", "access.form.godaddy_api_secret.tooltip": "这是什么?请参阅 https://developer.godaddy.com/", + "access.form.googletrustservices_eab_kid.label": "ACME EAB KID", + "access.form.googletrustservices_eab_kid.placeholder": "请输入 ACME EAB KID", + "access.form.googletrustservices_eab_kid.tooltip": "这是什么?请参阅 https://cloud.google.com/certificate-manager/docs/public-ca-tutorial", + "access.form.googletrustservices_eab_hmac_key.label": "ACME EAB HMAC Key", + "access.form.googletrustservices_eab_hmac_key.placeholder": "请输入 ACME EAB HMAC Key", + "access.form.googletrustservices_eab_hmac_key.tooltip": "这是什么?请参阅 https://cloud.google.com/certificate-manager/docs/public-ca-tutorial", "access.form.huaweicloud_access_key_id.label": "华为云 AccessKeyId", "access.form.huaweicloud_access_key_id.placeholder": "请输入华为云 AccessKeyId", "access.form.huaweicloud_access_key_id.tooltip": "这是什么?请参阅 https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html", @@ -284,5 +294,11 @@ "access.form.westcn_username.tooltip": "这是什么?请参阅 https://www.west.cn/CustomerCenter/doc/apiv2.html", "access.form.westcn_api_password.label": "西部数码 API 密码", "access.form.westcn_api_password.placeholder": "请输入西部数码 API 密码", - "access.form.westcn_api_password.tooltip": "这是什么?请参阅 https://www.west.cn/CustomerCenter/doc/apiv2.html" + "access.form.westcn_api_password.tooltip": "这是什么?请参阅 https://www.west.cn/CustomerCenter/doc/apiv2.html", + "access.form.zerossl_eab_kid.label": "ACME EAB KID", + "access.form.zerossl_eab_kid.placeholder": "请输入 ACME EAB KID", + "access.form.zerossl_eab_kid.tooltip": "这是什么?请参阅 https://zerossl.com/documentation/acme/", + "access.form.zerossl_eab_hmac_key.label": "ACME EAB HMAC Key", + "access.form.zerossl_eab_hmac_key.placeholder": "请输入 ACME EAB HMAC Key", + "access.form.zerossl_eab_hmac_key.tooltip": "这是什么?请参阅 https://zerossl.com/documentation/acme/" } diff --git a/ui/src/i18n/locales/zh/nls.provider.json b/ui/src/i18n/locales/zh/nls.provider.json index 62806a9d..341ceb1b 100644 --- a/ui/src/i18n/locales/zh/nls.provider.json +++ b/ui/src/i18n/locales/zh/nls.provider.json @@ -61,6 +61,7 @@ "provider.godaddy": "GoDaddy", "provider.goedge": "GoEdge", "provider.goedge.cdn": "GoEdge - 内容分发网络 CDN", + "provider.googletrustservices": "Google Trust Services", "provider.huaweicloud": "华为云", "provider.huaweicloud.cdn": "华为云 - 内容分发网络 CDN", "provider.huaweicloud.dns": "华为云 - 云解析 DNS", @@ -75,11 +76,13 @@ "provider.jdcloud.vod": "京东云 - 视频点播", "provider.kubernetes": "Kubernetes", "provider.kubernetes.secret": "Kubernetes - Secret", + "provider.letsencrypt": "Let's Encrypt", + "provider.letsencryptstaging": "Let's Encrypt 测试环境", "provider.local": "本地部署", "provider.namecheap": "Namecheap", "provider.namedotcom": "Name.com", "provider.namesilo": "NameSilo", - "provider.ns1": "NS1(IBM NS1 Connect)", + "provider.ns1": "NS1 (IBM NS1 Connect)", "provider.porkbun": "Porkbun", "provider.powerdns": "PowerDNS", "provider.qiniu": "七牛云", @@ -121,6 +124,7 @@ "provider.volcengine.tos": "火山引擎 - 对象存储 TOS", "provider.webhook": "Webhook", "provider.westcn": "西部数码", + "provider.zerossl": "ZeroSSL", "provider.category.all": "全部", "provider.category.cdn": "CDN", diff --git a/ui/src/pages/settings/SettingsSSLProvider.tsx b/ui/src/pages/settings/SettingsSSLProvider.tsx index c082c4e7..face7d9d 100644 --- a/ui/src/pages/settings/SettingsSSLProvider.tsx +++ b/ui/src/pages/settings/SettingsSSLProvider.tsx @@ -317,28 +317,28 @@ const SettingsSSLProvider = () => { setProviderType(value as SSLProviders)}> } + avatar={} size="small" title={t("settings.sslprovider.form.provider.option.letsencrypt.label")} description="letsencrypt.org" value={SSLPROVIDERS.LETS_ENCRYPT} /> } + avatar={} size="small" title={t("settings.sslprovider.form.provider.option.letsencrypt_staging.label")} description="letsencrypt.org" value={SSLPROVIDERS.LETS_ENCRYPT_STAGING} /> } + avatar={} size="small" title={t("settings.sslprovider.form.provider.option.zerossl.label")} description="zerossl.com" value={SSLPROVIDERS.ZERO_SSL} /> } + avatar={} size="small" title={t("settings.sslprovider.form.provider.option.gts.label")} description="pki.goog"