diff --git a/internal/certapply/config.go b/internal/certapply/config.go index d47753fb5..a8c36501f 100644 --- a/internal/certapply/config.go +++ b/internal/certapply/config.go @@ -17,6 +17,7 @@ var acmeDirUrls = map[string]string{ string(domain.CAProviderTypeLetsEncryptStaging): "https://acme-staging-v02.api.letsencrypt.org/directory", string(domain.CAProviderTypeActalisSSL): "https://acme-api.actalis.com/acme/directory", string(domain.CAProviderTypeBuypass): "https://api.buypass.com/acme/directory", + string(domain.CAProviderTypeGlobalSignAtlas): "https://emea.acme.atlas.globalsign.com/directory", string(domain.CAProviderTypeGoogleTrustServices): "https://dv.acme-v02.api.pki.goog/directory", string(domain.CAProviderTypeSSLCom): "https://acme.ssl.com/sslcom-dv-rsa", string(domain.CAProviderTypeSSLCom) + "RSA": "https://acme.ssl.com/sslcom-dv-rsa", diff --git a/internal/domain/access.go b/internal/domain/access.go index ceb569b8f..e801109a4 100644 --- a/internal/domain/access.go +++ b/internal/domain/access.go @@ -220,6 +220,10 @@ type AccessConfigForGoEdge struct { AllowInsecureConnections bool `json:"allowInsecureConnections,omitempty"` } +type AccessConfigForGlobalSignAtlas struct { + AccessConfigForACMEExternalAccountBinding +} + type AccessConfigForGoogleTrustServices struct { AccessConfigForACMEExternalAccountBinding } diff --git a/internal/domain/provider.go b/internal/domain/provider.go index 4562fda9a..f421d6d44 100644 --- a/internal/domain/provider.go +++ b/internal/domain/provider.go @@ -50,6 +50,7 @@ const ( AccessProviderTypeGcore = AccessProviderType("gcore") AccessProviderTypeGoDaddy = AccessProviderType("godaddy") AccessProviderTypeGoEdge = AccessProviderType("goedge") + AccessProviderTypeGlobalSignAtlas = AccessProviderType("globalsignatlas") AccessProviderTypeGoogleTrustServices = AccessProviderType("googletrustservices") AccessProviderTypeHetzner = AccessProviderType("hetzner") AccessProviderTypeHuaweiCloud = AccessProviderType("huaweicloud") @@ -108,6 +109,7 @@ const ( CAProviderTypeACMECA = CAProviderType(AccessProviderTypeACMECA) CAProviderTypeActalisSSL = CAProviderType(AccessProviderTypeActalisSSL) CAProviderTypeBuypass = CAProviderType(AccessProviderTypeBuypass) + CAProviderTypeGlobalSignAtlas = CAProviderType(AccessProviderTypeGlobalSignAtlas) CAProviderTypeGoogleTrustServices = CAProviderType(AccessProviderTypeGoogleTrustServices) CAProviderTypeLetsEncrypt = CAProviderType(AccessProviderTypeLetsEncrypt) CAProviderTypeLetsEncryptStaging = CAProviderType(AccessProviderTypeLetsEncryptStaging) diff --git a/ui/public/imgs/providers/globalsignatlas.png b/ui/public/imgs/providers/globalsignatlas.png new file mode 100644 index 000000000..a248c3249 Binary files /dev/null and b/ui/public/imgs/providers/globalsignatlas.png differ diff --git a/ui/src/components/access/AccessForm.tsx b/ui/src/components/access/AccessForm.tsx index 69112aa59..f868803fa 100644 --- a/ui/src/components/access/AccessForm.tsx +++ b/ui/src/components/access/AccessForm.tsx @@ -45,6 +45,7 @@ import AccessConfigFieldsProviderEdgio from "./forms/AccessConfigFieldsProviderE import AccessConfigFieldsProviderEmail from "./forms/AccessConfigFieldsProviderEmail"; import AccessConfigFieldsProviderFlexCDN from "./forms/AccessConfigFieldsProviderFlexCDN"; import AccessConfigFieldsProviderGcore from "./forms/AccessConfigFieldsProviderGcore"; +import AccessConfigFieldsProviderGlobalSignAtlas from "./forms/AccessConfigFieldsProviderGlobalSignAtlas"; import AccessConfigFieldsProviderGname from "./forms/AccessConfigFieldsProviderGname"; import AccessConfigFieldsProviderGoDaddy from "./forms/AccessConfigFieldsProviderGoDaddy"; import AccessConfigFieldsProviderGoEdge from "./forms/AccessConfigFieldsProviderGoEdge"; @@ -241,6 +242,9 @@ const AccessForm = ({ className, style, disabled, initialValues, mode, usage, .. case ACCESS_PROVIDERS.GOEDGE: { return ; } + case ACCESS_PROVIDERS.GLOBALSIGNATLAS: { + return ; + } case ACCESS_PROVIDERS.GOOGLETRUSTSERVICES: { return ; } diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderGlobalSignAtlas.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderGlobalSignAtlas.tsx new file mode 100644 index 000000000..076d28b80 --- /dev/null +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderGlobalSignAtlas.tsx @@ -0,0 +1,70 @@ +import { getI18n, useTranslation } from "react-i18next"; +import { Form, Input } from "antd"; +import { createSchemaFieldRule } from "antd-zod"; +import { z } from "zod"; + +import { useFormNestedFieldsContext } from "./_context"; + +const AccessConfigFormFieldsProviderGobalSignAtlas = () => { + const { i18n, t } = useTranslation(); + + const { parentNamePath } = useFormNestedFieldsContext(); + const formSchema = z.object({ + [parentNamePath]: getSchema({ i18n }), + }); + const formRule = createSchemaFieldRule(formSchema); + const initialValues = getInitialValues(); + + return ( + <> + } + > + + + + } + > + + + + ); +}; + +const getInitialValues = (): Nullish>> => { + return { + eabKid: "", + eabHmacKey: "", + }; +}; + +const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { + const { t } = i18n; + + return z.object({ + eabKid: z + .string() + .min(1, t("access.form.globalsignatlas_eab_kid.placeholder")) + .max(256, t("common.errmsg.string_max", { max: 256 })), + eabHmacKey: z + .string() + .min(1, t("access.form.globalsignatlas_eab_hmac_key.placeholder")) + .max(256, t("common.errmsg.string_max", { max: 256 })), + }); +}; + +const _default = Object.assign(AccessConfigFormFieldsProviderGobalSignAtlas, { + getInitialValues, + getSchema, +}); + +export default _default; diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts index e5370d3c6..1c2350574 100644 --- a/ui/src/domain/provider.ts +++ b/ui/src/domain/provider.ts @@ -50,6 +50,7 @@ export const ACCESS_PROVIDERS = Object.freeze({ EMAIL: "email", FLEXCDN: "flexcdn", GCORE: "gcore", + GLOBALSIGNATLAS: "globalsignatlas", GNAME: "gname", GODADDY: "godaddy", GOEDGE: "goedge", @@ -191,6 +192,7 @@ export const accessProvidersMap: Map = new [CA_PROVIDERS.LETSENCRYPTSTAGING, "builtin"], [CA_PROVIDERS.ACTALISSSL], [CA_PROVIDERS.BUYPASS], + [CA_PROVIDERS.GLOBALSIGNATLAS], [CA_PROVIDERS.GOOGLETRUSTSERVICES], [CA_PROVIDERS.SSLCOM], [CA_PROVIDERS.ZEROSSL], diff --git a/ui/src/i18n/locales/en/nls.access.json b/ui/src/i18n/locales/en/nls.access.json index bbf441815..886f6a1e7 100644 --- a/ui/src/i18n/locales/en/nls.access.json +++ b/ui/src/i18n/locales/en/nls.access.json @@ -284,6 +284,12 @@ "access.form.goedge_access_key.label": "GoEdge AccessKey", "access.form.goedge_access_key.placeholder": "Please enter GoEdge AccessKey", "access.form.goedge_access_key.tooltip": "For more information, see https://goedge.cloud/docs/API/Auth.md", + "access.form.globalsignatlas_eab_kid.label": "ACME EAB KID", + "access.form.globalsignatlas_eab_kid.placeholder": "Please enter ACME EAB KID", + "access.form.globalsignatlas_eab_kid.tooltip": "For more information, see https://www.globalsign.com/en/acme-automated-certificate-management", + "access.form.globalsignatlas_eab_hmac_key.label": "ACME EAB HMAC key", + "access.form.globalsignatlas_eab_hmac_key.placeholder": "Please enter ACME EAB HMAC key", + "access.form.globalsignatlas_eab_hmac_key.tooltip": "For more information, see https://www.globalsign.com/en/acme-automated-certificate-management", "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", diff --git a/ui/src/i18n/locales/en/nls.provider.json b/ui/src/i18n/locales/en/nls.provider.json index 84b006127..00fd9cc30 100644 --- a/ui/src/i18n/locales/en/nls.provider.json +++ b/ui/src/i18n/locales/en/nls.provider.json @@ -86,6 +86,7 @@ "provider.flexcdn": "FlexCDN", "provider.gcore": "Gcore", "provider.gcore.cdn": "Gcore - CDN (Content Delivery Network)", + "provider.globalsignatlas": "GlobalSign Atlas", "provider.gname": "GNAME", "provider.godaddy": "GoDaddy", "provider.goedge": "GoEdge", diff --git a/ui/src/i18n/locales/zh/nls.access.json b/ui/src/i18n/locales/zh/nls.access.json index 1cda5e6b8..e55c3aac8 100644 --- a/ui/src/i18n/locales/zh/nls.access.json +++ b/ui/src/i18n/locales/zh/nls.access.json @@ -283,6 +283,12 @@ "access.form.goedge_access_key.label": "GoEdge AccessKey", "access.form.goedge_access_key.placeholder": "请输入 GoEdge AccessKey", "access.form.goedge_access_key.tooltip": "这是什么?请参阅 https://goedge.cloud/docs/API/Auth.md", + "access.form.globalsignatlas_eab_kid.label": "ACME EAB KID", + "access.form.globalsignatlas_eab_kid.placeholder": "请输入 ACME EAB KID", + "access.form.globalsignatlas_eab_kid.tooltip": "这是什么?请参阅 https://globalsign.cn/acme-automated-certificate-management", + "access.form.globalsignatlas_eab_hmac_key.label": "ACME EAB HMAC Key", + "access.form.globalsignatlas_eab_hmac_key.placeholder": "请输入 ACME EAB HMAC Key", + "access.form.globalsignatlas_eab_hmac_key.tooltip": "这是什么?请参阅 https://globalsign.cn/acme-automated-certificate-management", "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", diff --git a/ui/src/i18n/locales/zh/nls.provider.json b/ui/src/i18n/locales/zh/nls.provider.json index 8d2c7d469..d18a50aaf 100644 --- a/ui/src/i18n/locales/zh/nls.provider.json +++ b/ui/src/i18n/locales/zh/nls.provider.json @@ -86,6 +86,7 @@ "provider.flexcdn": "FlexCDN", "provider.gcore": "Gcore", "provider.gcore.cdn": "Gcore - 内容分发网络 CDN", + "provider.globalsignatlas": "GlobalSign Atlas", "provider.gname": "GNAME", "provider.godaddy": "GoDaddy", "provider.goedge": "GoEdge", diff --git a/ui/src/pages/settings/SettingsSSLProvider.tsx b/ui/src/pages/settings/SettingsSSLProvider.tsx index 2367c67b6..34ba4bbe8 100644 --- a/ui/src/pages/settings/SettingsSSLProvider.tsx +++ b/ui/src/pages/settings/SettingsSSLProvider.tsx @@ -1,6 +1,6 @@ import { createContext, useContext, useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; -import { App, Button, Card, Form, Input, Skeleton, Typography } from "antd"; +import { App, Button, Card, Form, Input, Skeleton } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { produce } from "immer"; import { z } from "zod"; @@ -43,6 +43,7 @@ const SettingsSSLProvider = () => { [CA_PROVIDERS.LETSENCRYPTSTAGING, "provider.letsencryptstaging", "letsencrypt.org", "/imgs/providers/letsencrypt.svg"], [CA_PROVIDERS.ACTALISSSL, "provider.actalisssl", "actalis.com", "/imgs/providers/actalisssl.png"], [CA_PROVIDERS.BUYPASS, "provider.buypass", "buypass.com", "/imgs/providers/buypass.png"], + [CA_PROVIDERS.GLOBALSIGNATLAS, "provider.globalsignatlas", "atlas.globalsign.com", "/imgs/providers/globalsignatlas.png"], [CA_PROVIDERS.GOOGLETRUSTSERVICES, "provider.googletrustservices", "pki.goog", "/imgs/providers/google.svg"], [CA_PROVIDERS.SSLCOM, "provider.sslcom", "ssl.com", "/imgs/providers/sslcom.svg"], [CA_PROVIDERS.ZEROSSL, "provider.zerossl", "zerossl.com", "/imgs/providers/zerossl.svg"], @@ -66,6 +67,8 @@ const SettingsSSLProvider = () => { return ; case CA_PROVIDERS.BUYPASS: return ; + case CA_PROVIDERS.GLOBALSIGNATLAS: + return ; case CA_PROVIDERS.GOOGLETRUSTSERVICES: return ; case CA_PROVIDERS.SSLCOM: @@ -104,11 +107,9 @@ const SettingsSSLProvider = () => {

{t("settings.sslprovider.ca.title")}

}>
-
- - - -
+ + } /> +
@@ -265,6 +266,14 @@ const InternalSettingsFormProviderBuypass = () => { return ; }; +const InternalSettingsFormProviderGlobalSignAtlas = () => { + return ( + + + + ); +}; + const InternalSettingsFormProviderGoogleTrustServices = () => { return (