From 3d2f527d78a99df96e67659dcea3d38fafdf8efd Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Fri, 5 Sep 2025 22:47:45 +0800 Subject: [PATCH] feat(provider): new ca provider: actalisssl --- internal/certapply/config.go | 1 + internal/domain/access.go | 4 + internal/domain/provider.go | 2 + ui/public/imgs/providers/actalisssl.png | Bin 0 -> 4673 bytes ui/src/components/access/AccessForm.tsx | 4 + .../AccessConfigFieldsProviderActalisSSL.tsx | 70 +++++++++++++++++ ui/src/domain/provider.ts | 4 + ui/src/i18n/locales/en/nls.access.json | 6 ++ ui/src/i18n/locales/en/nls.provider.json | 1 + ui/src/i18n/locales/zh/nls.access.json | 6 ++ ui/src/i18n/locales/zh/nls.provider.json | 1 + ui/src/pages/settings/SettingsSSLProvider.tsx | 73 ++++++++++++++++++ 12 files changed, 172 insertions(+) create mode 100644 ui/public/imgs/providers/actalisssl.png create mode 100644 ui/src/components/access/forms/AccessConfigFieldsProviderActalisSSL.tsx diff --git a/internal/certapply/config.go b/internal/certapply/config.go index 8b36d778..d47753fb 100644 --- a/internal/certapply/config.go +++ b/internal/certapply/config.go @@ -15,6 +15,7 @@ import ( var acmeDirUrls = map[string]string{ string(domain.CAProviderTypeLetsEncrypt): "https://acme-v02.api.letsencrypt.org/directory", 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.CAProviderTypeGoogleTrustServices): "https://dv.acme-v02.api.pki.goog/directory", string(domain.CAProviderTypeSSLCom): "https://acme.ssl.com/sslcom-dv-rsa", diff --git a/internal/domain/access.go b/internal/domain/access.go index 5f745e3c..ceb569b8 100644 --- a/internal/domain/access.go +++ b/internal/domain/access.go @@ -44,6 +44,10 @@ type AccessConfigForACMEHttpReq struct { Password string `json:"password,omitempty"` } +type AccessConfigForActalisSSL struct { + AccessConfigForACMEExternalAccountBinding +} + type AccessConfigForAliyun struct { AccessKeyId string `json:"accessKeyId"` AccessKeySecret string `json:"accessKeySecret"` diff --git a/internal/domain/provider.go b/internal/domain/provider.go index 379b6276..fec6d3bf 100644 --- a/internal/domain/provider.go +++ b/internal/domain/provider.go @@ -13,6 +13,7 @@ const ( AccessProviderTypeACMECA = AccessProviderType("acmeca") AccessProviderTypeACMEDNS = AccessProviderType("acmedns") AccessProviderTypeACMEHttpReq = AccessProviderType("acmehttpreq") + AccessProviderTypeActalisSSL = AccessProviderType("actalisssl") AccessProviderTypeAkamai = AccessProviderType("akamai") // Akamai(预留) AccessProviderTypeAliyun = AccessProviderType("aliyun") AccessProviderTypeAPISIX = AccessProviderType("apisix") @@ -105,6 +106,7 @@ NOTICE: If you add new constant, please keep ASCII order. */ const ( CAProviderTypeACMECA = CAProviderType(AccessProviderTypeACMECA) + CAProviderTypeActalisSSL = CAProviderType(AccessProviderTypeActalisSSL) CAProviderTypeBuypass = CAProviderType(AccessProviderTypeBuypass) CAProviderTypeGoogleTrustServices = CAProviderType(AccessProviderTypeGoogleTrustServices) CAProviderTypeLetsEncrypt = CAProviderType(AccessProviderTypeLetsEncrypt) diff --git a/ui/public/imgs/providers/actalisssl.png b/ui/public/imgs/providers/actalisssl.png new file mode 100644 index 0000000000000000000000000000000000000000..3897c6b4e5defe0d6d5213c6b9c28a6e6047f002 GIT binary patch literal 4673 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 LR+cLLWEA)x07P%R literal 0 HcmV?d00001 diff --git a/ui/src/components/access/AccessForm.tsx b/ui/src/components/access/AccessForm.tsx index ed643447..69112aa5 100644 --- a/ui/src/components/access/AccessForm.tsx +++ b/ui/src/components/access/AccessForm.tsx @@ -15,6 +15,7 @@ import AccessConfigFieldsProvider1Panel from "./forms/AccessConfigFieldsProvider import AccessConfigFieldsProviderACMECA from "./forms/AccessConfigFieldsProviderACMECA"; import AccessConfigFieldsProviderACMEDNS from "./forms/AccessConfigFieldsProviderACMEDNS"; import AccessConfigFieldsProviderACMEHttpReq from "./forms/AccessConfigFieldsProviderACMEHttpReq"; +import AccessConfigFieldsProviderActalisSSL from "./forms/AccessConfigFieldsProviderActalisSSL"; import AccessConfigFieldsProviderAliyun from "./forms/AccessConfigFieldsProviderAliyun"; import AccessConfigFieldsProviderAPISIX from "./forms/AccessConfigFieldsProviderAPISIX"; import AccessConfigFieldsProviderAWS from "./forms/AccessConfigFieldsProviderAWS"; @@ -141,6 +142,9 @@ const AccessForm = ({ className, style, disabled, initialValues, mode, usage, .. case ACCESS_PROVIDERS.ACMEHTTPREQ: { return ; } + case ACCESS_PROVIDERS.ACTALISSSL: { + return ; + } case ACCESS_PROVIDERS.ALIYUN: { return ; } diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderActalisSSL.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderActalisSSL.tsx new file mode 100644 index 00000000..e0d95932 --- /dev/null +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderActalisSSL.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 AccessConfigFormFieldsProviderActalisSSL = () => { + 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.actalisssl_eab_kid.placeholder")) + .max(256, t("common.errmsg.string_max", { max: 256 })), + eabHmacKey: z + .string() + .min(1, t("access.form.actalisssl_eab_hmac_key.placeholder")) + .max(256, t("common.errmsg.string_max", { max: 256 })), + }); +}; + +const _default = Object.assign(AccessConfigFormFieldsProviderActalisSSL, { + getInitialValues, + getSchema, +}); + +export default _default; diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts index bbb87fd7..8a934aa9 100644 --- a/ui/src/domain/provider.ts +++ b/ui/src/domain/provider.ts @@ -19,6 +19,7 @@ export const ACCESS_PROVIDERS = Object.freeze({ ACMECA: "acmeca", ACMEDNS: "acmedns", ACMEHTTPREQ: "acmehttpreq", + ACTALISSSL: "actalisssl", ALIYUN: "aliyun", APISIX: "apisix", AWS: "aws", @@ -188,6 +189,7 @@ export const accessProvidersMap: Map = new [ [CA_PROVIDERS.LETSENCRYPT, "builtin"], [CA_PROVIDERS.LETSENCRYPTSTAGING, "builtin"], + [CA_PROVIDERS.ACTALISSSL], [CA_PROVIDERS.BUYPASS], [CA_PROVIDERS.GOOGLETRUSTSERVICES], [CA_PROVIDERS.SSLCOM], diff --git a/ui/src/i18n/locales/en/nls.access.json b/ui/src/i18n/locales/en/nls.access.json index 10522775..2603421f 100644 --- a/ui/src/i18n/locales/en/nls.access.json +++ b/ui/src/i18n/locales/en/nls.access.json @@ -78,6 +78,12 @@ "access.form.acmehttpreq_password.label": "HTTP Basic Auth password (Optional)", "access.form.acmehttpreq_password.placeholder": "Please enter HTTP Basic Auth password", "access.form.acmehttpreq_password.tooltip": "For more information, see https://go-acme.github.io/lego/dns/httpreq/", + "access.form.actalisssl_eab_kid.label": "ACME EAB KID", + "access.form.actalisssl_eab_kid.placeholder": "Please enter ACME EAB KID", + "access.form.actalisssl_eab_kid.tooltip": "For more information, see https://www.actalis.com/manage-with-acme", + "access.form.actalisssl_eab_hmac_key.label": "ACME EAB HMAC key", + "access.form.actalisssl_eab_hmac_key.placeholder": "Please enter ACME EAB HMAC key", + "access.form.actalisssl_eab_hmac_key.tooltip": "For more information, see https://www.actalis.com/manage-with-acme", "access.form.aliyun_access_key_id.label": "Aliyun AccessKeyId", "access.form.aliyun_access_key_id.placeholder": "Please enter Aliyun AccessKeyId", "access.form.aliyun_access_key_id.tooltip": "For more information, see https://www.alibabacloud.com/help/en/acr/create-and-obtain-an-accesskey-pair", diff --git a/ui/src/i18n/locales/en/nls.provider.json b/ui/src/i18n/locales/en/nls.provider.json index b620226e..49cf3367 100644 --- a/ui/src/i18n/locales/en/nls.provider.json +++ b/ui/src/i18n/locales/en/nls.provider.json @@ -5,6 +5,7 @@ "provider.acmeca": "ACME Custom CA Endpoint", "provider.acmedns": "ACME-DNS", "provider.acmehttpreq": "ACME Custom HTTP Endpoint", + "provider.actalisssl": "Actalis SSL", "provider.aliyun": "Alibaba Cloud", "provider.aliyun.alb": "Alibaba Cloud - ALB (Application Load Balancer)", "provider.aliyun.apigw": "Alibaba Cloud - API Gateway", diff --git a/ui/src/i18n/locales/zh/nls.access.json b/ui/src/i18n/locales/zh/nls.access.json index 5df865f4..1cda5e6b 100644 --- a/ui/src/i18n/locales/zh/nls.access.json +++ b/ui/src/i18n/locales/zh/nls.access.json @@ -77,6 +77,12 @@ "access.form.acmehttpreq_password.label": "HTTP 基本认证密码(可选)", "access.form.acmehttpreq_password.placeholder": "请输入 HTTP 基本认证密码", "access.form.acmehttpreq_password.tooltip": "这是什么?请参阅 https://go-acme.github.io/lego/dns/httpreq/", + "access.form.actalisssl_eab_kid.label": "ACME EAB KID", + "access.form.actalisssl_eab_kid.placeholder": "请输入 ACME EAB KID", + "access.form.actalisssl_eab_kid.tooltip": "这是什么?请参阅 https://www.actalis.com/manage-with-acme", + "access.form.actalisssl_eab_hmac_key.label": "ACME EAB HMAC Key", + "access.form.actalisssl_eab_hmac_key.placeholder": "请输入 ACME EAB HMAC Key", + "access.form.actalisssl_eab_hmac_key.tooltip": "这是什么?请参阅 https://www.actalis.com/manage-with-acme", "access.form.aliyun_access_key_id.label": "阿里云 AccessKeyId", "access.form.aliyun_access_key_id.placeholder": "请输入阿里云 AccessKeyId", "access.form.aliyun_access_key_id.tooltip": "这是什么?请参阅 https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair", diff --git a/ui/src/i18n/locales/zh/nls.provider.json b/ui/src/i18n/locales/zh/nls.provider.json index 6d9f78d6..85f1e578 100644 --- a/ui/src/i18n/locales/zh/nls.provider.json +++ b/ui/src/i18n/locales/zh/nls.provider.json @@ -5,6 +5,7 @@ "provider.acmeca": "ACME 自定义 CA 端点", "provider.acmedns": "ACME-DNS", "provider.acmehttpreq": "ACME 自定义 HTTP 端点", + "provider.actalisssl": "Actalis SSL", "provider.aliyun": "阿里云", "provider.aliyun.alb": "阿里云 - 应用型负载均衡 ALB", "provider.aliyun.apigw": "阿里云 - API 网关", diff --git a/ui/src/pages/settings/SettingsSSLProvider.tsx b/ui/src/pages/settings/SettingsSSLProvider.tsx index 4170af57..5d97aa49 100644 --- a/ui/src/pages/settings/SettingsSSLProvider.tsx +++ b/ui/src/pages/settings/SettingsSSLProvider.tsx @@ -108,6 +108,76 @@ const SSLProviderEditFormLetsEncryptStagingConfig = () => { ); }; +const SSLProviderEditFormActalisSSLConfig = () => { + const { t } = useTranslation(); + + const { pending, settings, updateSettings } = useContext(SSLProviderContext); + + const formSchema = z.object({ + eabKid: z + .string(t("access.form.actalisssl_eab_kid.placeholder")) + .min(1, t("access.form.actalisssl_eab_kid.placeholder")) + .max(256, t("common.errmsg.string_max", { max: 256 })), + eabHmacKey: z + .string(t("access.form.actalisssl_eab_hmac_key.placeholder")) + .min(1, t("access.form.actalisssl_eab_hmac_key.placeholder")) + .max(256, t("common.errmsg.string_max", { max: 256 })), + }); + const formRule = createSchemaFieldRule(formSchema); + const { form: formInst, formProps } = useAntdForm>({ + initialValues: settings?.content?.config?.[CA_PROVIDERS.ACTALISSSL], + onSubmit: async (values) => { + const newSettings = produce(settings, (draft) => { + draft.content ??= {} as SSLProviderSettingsContent; + draft.content.provider = CA_PROVIDERS.ACTALISSSL; + + draft.content.config ??= {} as SSLProviderSettingsContent["config"]; + draft.content.config[CA_PROVIDERS.ACTALISSSL] = values; + }); + await updateSettings(newSettings); + + setFormChanged(false); + }, + }); + + const [formChanged, setFormChanged] = useState(false); + useEffect(() => { + setFormChanged(settings?.content?.provider !== CA_PROVIDERS.ACTALISSSL); + }, [settings?.content?.provider]); + + const handleFormChange = () => { + setFormChanged(true); + }; + + return ( +
+ } + > + + + + } + > + + + + + + +
+ ); +}; + const SSLProviderEditFormBuypassConfig = () => { const { t } = useTranslation(); @@ -466,6 +536,7 @@ const SettingsSSLProvider = () => { const providers = [ [CA_PROVIDERS.LETSENCRYPT, "provider.letsencrypt", "letsencrypt.org", "/imgs/providers/letsencrypt.svg"], [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.GOOGLETRUSTSERVICES, "provider.googletrustservices", "pki.goog", "/imgs/providers/google.svg"], [CA_PROVIDERS.SSLCOM, "provider.sslcom", "ssl.com", "/imgs/providers/sslcom.svg"], @@ -486,6 +557,8 @@ const SettingsSSLProvider = () => { return ; case CA_PROVIDERS.LETSENCRYPTSTAGING: return ; + case CA_PROVIDERS.ACTALISSSL: + return ; case CA_PROVIDERS.BUYPASS: return ; case CA_PROVIDERS.GOOGLETRUSTSERVICES: