diff --git a/internal/applicant/acme_ca.go b/internal/applicant/acme_ca.go
index 074b2a18..52bfcb8f 100644
--- a/internal/applicant/acme_ca.go
+++ b/internal/applicant/acme_ca.go
@@ -6,6 +6,7 @@ const (
sslProviderLetsEncrypt = string(domain.ApplyCAProviderTypeLetsEncrypt)
sslProviderLetsEncryptStaging = string(domain.ApplyCAProviderTypeLetsEncryptStaging)
sslProviderGoogleTrustServices = string(domain.ApplyCAProviderTypeGoogleTrustServices)
+ sslProviderSSLCom = string(domain.ApplyCAProviderTypeSSLCom)
sslProviderZeroSSL = string(domain.ApplyCAProviderTypeZeroSSL)
sslProviderDefault = sslProviderLetsEncrypt
@@ -15,6 +16,7 @@ var sslProviderUrls = map[string]string{
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",
+ sslProviderSSLCom: "https://acme.ssl.com/sslcom-dv-ecc",
sslProviderZeroSSL: "https://acme.zerossl.com/v2/DV90",
}
diff --git a/internal/applicant/acme_user.go b/internal/applicant/acme_user.go
index 75afa708..fa8e81b9 100644
--- a/internal/applicant/acme_user.go
+++ b/internal/applicant/acme_user.go
@@ -112,6 +112,20 @@ func registerAcmeUser(client *lego.Client, user *acmeUser, userRegisterOptions m
})
}
+ case sslProviderSSLCom:
+ {
+ access := domain.AccessConfigForSSLCom{}
+ if err := maputil.Populate(userRegisterOptions, &access); err != nil {
+ return nil, fmt.Errorf("failed to populate provider access config: %w", err)
+ }
+
+ reg, err = client.Registration.RegisterWithExternalAccountBinding(registration.RegisterEABOptions{
+ TermsOfServiceAgreed: true,
+ Kid: access.EabKid,
+ HmacEncoded: access.EabHmacKey,
+ })
+ }
+
case sslProviderZeroSSL:
{
access := domain.AccessConfigForZeroSSL{}
diff --git a/internal/domain/access.go b/internal/domain/access.go
index ccc33592..6eca8df3 100644
--- a/internal/domain/access.go
+++ b/internal/domain/access.go
@@ -196,6 +196,11 @@ type AccessConfigForSSH struct {
KeyPassphrase string `json:"keyPassphrase,omitempty"`
}
+type AccessConfigForSSLCom struct {
+ EabKid string `json:"eabKid"`
+ EabHmacKey string `json:"eabHmacKey"`
+}
+
type AccessConfigForTencentCloud struct {
SecretId string `json:"secretId"`
SecretKey string `json:"secretKey"`
diff --git a/internal/domain/provider.go b/internal/domain/provider.go
index 26b7054a..c0da68ed 100644
--- a/internal/domain/provider.go
+++ b/internal/domain/provider.go
@@ -54,6 +54,7 @@ const (
AccessProviderTypeRainYun = AccessProviderType("rainyun")
AccessProviderTypeSafeLine = AccessProviderType("safeline")
AccessProviderTypeSSH = AccessProviderType("ssh")
+ AccessProviderTypeSSLCOM = AccessProviderType("sslcom")
AccessProviderTypeTencentCloud = AccessProviderType("tencentcloud")
AccessProviderTypeUCloud = AccessProviderType("ucloud")
AccessProviderTypeUpyun = AccessProviderType("upyun")
@@ -74,10 +75,11 @@ type ApplyCAProviderType string
NOTICE: If you add new constant, please keep ASCII order.
*/
const (
- ApplyCAProviderTypeGoogleTrustServices = ApplyCAProviderType("googletrustservices")
- ApplyCAProviderTypeLetsEncrypt = ApplyCAProviderType("letsencrypt")
- ApplyCAProviderTypeLetsEncryptStaging = ApplyCAProviderType("letsencryptstaging")
- ApplyCAProviderTypeZeroSSL = ApplyCAProviderType("zerossl")
+ ApplyCAProviderTypeGoogleTrustServices = ApplyCAProviderType(string(AccessProviderTypeGoogleTrustServices))
+ ApplyCAProviderTypeLetsEncrypt = ApplyCAProviderType(string(AccessProviderTypeLetsEncrypt))
+ ApplyCAProviderTypeLetsEncryptStaging = ApplyCAProviderType(string(AccessProviderTypeLetsEncryptStaging))
+ ApplyCAProviderTypeSSLCom = ApplyCAProviderType(string(AccessProviderTypeSSLCOM))
+ ApplyCAProviderTypeZeroSSL = ApplyCAProviderType(string(AccessProviderTypeZeroSSL))
)
type ApplyDNSProviderType string
diff --git a/migrations/1743264000_upgrade.go b/migrations/1743264000_upgrade.go
index 50fd93f6..e7bb5087 100644
--- a/migrations/1743264000_upgrade.go
+++ b/migrations/1743264000_upgrade.go
@@ -118,6 +118,7 @@ func init() {
"rainyun",
"safeline",
"ssh",
+ "sslcom",
"tencentcloud",
"ucloud",
"upyun",
diff --git a/ui/public/imgs/providers/google.svg b/ui/public/imgs/providers/google.svg
index 78f81c93..350cdfcc 100644
--- a/ui/public/imgs/providers/google.svg
+++ b/ui/public/imgs/providers/google.svg
@@ -1 +1 @@
-
+
diff --git a/ui/public/imgs/providers/sslcom.svg b/ui/public/imgs/providers/sslcom.svg
new file mode 100644
index 00000000..4cd53176
--- /dev/null
+++ b/ui/public/imgs/providers/sslcom.svg
@@ -0,0 +1 @@
+
diff --git a/ui/src/components/access/AccessForm.tsx b/ui/src/components/access/AccessForm.tsx
index 49e7dfe0..7d0d6986 100644
--- a/ui/src/components/access/AccessForm.tsx
+++ b/ui/src/components/access/AccessForm.tsx
@@ -45,6 +45,7 @@ import AccessFormQiniuConfig from "./AccessFormQiniuConfig";
import AccessFormRainYunConfig from "./AccessFormRainYunConfig";
import AccessFormSafeLineConfig from "./AccessFormSafeLineConfig";
import AccessFormSSHConfig from "./AccessFormSSHConfig";
+import AccessFormSSLComConfig from "./AccessFormSSLComConfig";
import AccessFormTencentCloudConfig from "./AccessFormTencentCloudConfig";
import AccessFormUCloudConfig from "./AccessFormUCloudConfig";
import AccessFormUpyunConfig from "./AccessFormUpyunConfig";
@@ -216,6 +217,8 @@ const AccessForm = forwardRef(({ className,
return ;
case ACCESS_PROVIDERS.SSH:
return ;
+ case ACCESS_PROVIDERS.SSLCOM:
+ return ;
case ACCESS_PROVIDERS.TENCENTCLOUD:
return ;
case ACCESS_PROVIDERS.UCLOUD:
diff --git a/ui/src/components/access/AccessFormSSLComConfig.tsx b/ui/src/components/access/AccessFormSSLComConfig.tsx
new file mode 100644
index 00000000..85266266
--- /dev/null
+++ b/ui/src/components/access/AccessFormSSLComConfig.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 AccessConfigForSSLCom } from "@/domain/access";
+
+type AccessFormSSLComConfigFieldValues = Nullish;
+
+export type AccessFormSSLComConfigProps = {
+ form: FormInstance;
+ formName: string;
+ disabled?: boolean;
+ initialValues?: AccessFormSSLComConfigFieldValues;
+ onValuesChange?: (values: AccessFormSSLComConfigFieldValues) => void;
+};
+
+const initFormModel = (): AccessFormSSLComConfigFieldValues => {
+ return {
+ eabKid: "",
+ eabHmacKey: "",
+ };
+};
+
+const AccessFormSSLComConfig = ({ form: formInst, formName, disabled, initialValues, onValuesChange }: AccessFormSSLComConfigProps) => {
+ const { t } = useTranslation();
+
+ const formSchema = z.object({
+ eabKid: z
+ .string()
+ .min(1, t("access.form.sslcom_eab_kid.placeholder"))
+ .max(256, t("common.errmsg.string_max", { max: 256 }))
+ .trim(),
+ eabHmacKey: z
+ .string()
+ .min(1, t("access.form.sslcom_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 AccessFormSSLComConfig;
diff --git a/ui/src/domain/access.ts b/ui/src/domain/access.ts
index afa3bb05..3e198cdf 100644
--- a/ui/src/domain/access.ts
+++ b/ui/src/domain/access.ts
@@ -41,6 +41,7 @@ export interface AccessModel extends BaseModel {
| AccessConfigForRainYun
| AccessConfigForSafeLine
| AccessConfigForSSH
+ | AccessConfigForSSLCom
| AccessConfigForTencentCloud
| AccessConfigForUCloud
| AccessConfigForUpyun
@@ -235,6 +236,11 @@ export type AccessConfigForSSH = {
keyPassphrase?: string;
};
+export type AccessConfigForSSLCom = {
+ eabKid: string;
+ eabHmacKey: string;
+};
+
export type AccessConfigForTencentCloud = {
secretId: string;
secretKey: string;
diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts
index d52ad82a..ac66f670 100644
--- a/ui/src/domain/provider.ts
+++ b/ui/src/domain/provider.ts
@@ -43,6 +43,7 @@ export const ACCESS_PROVIDERS = Object.freeze({
RAINYUN: "rainyun",
SAFELINE: "safeline",
SSH: "ssh",
+ SSLCOM: "sslcom",
TENCENTCLOUD: "tencentcloud",
UCLOUD: "ucloud",
UPYUN: "upyun",
@@ -129,6 +130,7 @@ export const accessProvidersMap: Map [
e[0] as string,
{
@@ -151,6 +153,7 @@ export const APPLY_CA_PROVIDERS = Object.freeze({
GOOGLETRUSTSERVICES: `${ACCESS_PROVIDERS.GOOGLETRUSTSERVICES}`,
LETSENCRYPT: `${ACCESS_PROVIDERS.LETSENCRYPT}`,
LETSENCRYPTSTAGING: `${ACCESS_PROVIDERS.LETSENCRYPTSTAGING}`,
+ SSLCOM: `${ACCESS_PROVIDERS.SSLCOM}`,
ZEROSSL: `${ACCESS_PROVIDERS.ZEROSSL}`,
} as const);
@@ -174,6 +177,7 @@ export const applyCAProvidersMap: Map [
type,
{
diff --git a/ui/src/domain/settings.ts b/ui/src/domain/settings.ts
index 445e1dc6..b5e5f09c 100644
--- a/ui/src/domain/settings.ts
+++ b/ui/src/domain/settings.ts
@@ -1,3 +1,5 @@
+import { type ApplyCAProviderType } from "./provider";
+
export const SETTINGS_NAMES = Object.freeze({
EMAILS: "emails",
NOTIFY_TEMPLATES: "notifyTemplates",
@@ -134,37 +136,12 @@ export const notifyChannelsMap: Map = new
// #endregion
// #region Settings: SSLProvider
-export const SSLPROVIDERS = Object.freeze({
- LETS_ENCRYPT: "letsencrypt",
- LETS_ENCRYPT_STAGING: "letsencryptstaging",
- ZERO_SSL: "zerossl",
- GOOGLE_TRUST_SERVICES: "googletrustservices",
-} as const);
-
-export type SSLProviders = (typeof SSLPROVIDERS)[keyof typeof SSLPROVIDERS];
-
export type SSLProviderSettingsContent = {
- provider: (typeof SSLPROVIDERS)[keyof typeof SSLPROVIDERS];
+ provider: ApplyCAProviderType;
config: {
[key: string]: Record | undefined;
- [SSLPROVIDERS.LETS_ENCRYPT]?: SSLProviderLetsEncryptConfig;
- [SSLPROVIDERS.LETS_ENCRYPT_STAGING]?: SSLProviderLetsEncryptConfig;
- [SSLPROVIDERS.ZERO_SSL]?: SSLProviderZeroSSLConfig;
- [SSLPROVIDERS.GOOGLE_TRUST_SERVICES]?: SSLProviderGoogleTrustServicesConfig;
};
};
-
-export type SSLProviderLetsEncryptConfig = NonNullable;
-
-export type SSLProviderZeroSSLConfig = {
- eabKid: string;
- eabHmacKey: string;
-};
-
-export type SSLProviderGoogleTrustServicesConfig = {
- eabKid: string;
- eabHmacKey: string;
-};
// #endregion
// #region Settings: Persistence
diff --git a/ui/src/i18n/locales/en/nls.access.json b/ui/src/i18n/locales/en/nls.access.json
index 806a961d..1e7ceaa2 100644
--- a/ui/src/i18n/locales/en/nls.access.json
+++ b/ui/src/i18n/locales/en/nls.access.json
@@ -261,6 +261,12 @@
"access.form.ssh_key_passphrase.label": "SSH key passphrase",
"access.form.ssh_key_passphrase.placeholder": "Please enter SSH key passphrase",
"access.form.ssh_key_passphrase.tooltip": "Optional when using key to connect to SSH.",
+ "access.form.sslcom_eab_kid.label": "ACME EAB KID",
+ "access.form.sslcom_eab_kid.placeholder": "Please enter ACME EAB KID",
+ "access.form.sslcom_eab_kid.tooltip": "For more information, see https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/ ",
+ "access.form.sslcom_eab_hmac_key.label": "ACME EAB HMAC key",
+ "access.form.sslcom_eab_hmac_key.placeholder": "Please enter ACME EAB HMAC key",
+ "access.form.sslcom_eab_hmac_key.tooltip": "For more information, see https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/ ",
"access.form.tencentcloud_secret_id.label": "Tencent Cloud SecretId",
"access.form.tencentcloud_secret_id.placeholder": "Please enter Tencent Cloud SecretId",
"access.form.tencentcloud_secret_id.tooltip": "For more information, see https://cloud.tencent.com/document/product/598/40488?lang=en ",
diff --git a/ui/src/i18n/locales/en/nls.provider.json b/ui/src/i18n/locales/en/nls.provider.json
index 89bf68e6..351f5b1d 100644
--- a/ui/src/i18n/locales/en/nls.provider.json
+++ b/ui/src/i18n/locales/en/nls.provider.json
@@ -92,6 +92,7 @@
"provider.rainyun": "Rain Yun",
"provider.safeline": "SafeLine",
"provider.ssh": "SSH deployment",
+ "provider.sslcom": "SSL.com",
"provider.tencentcloud": "Tencent Cloud",
"provider.tencentcloud.cdn": "Tencent Cloud - CDN (Content Delivery Network)",
"provider.tencentcloud.clb": "Tencent Cloud - CLB (Cloud Load Balancer)",
diff --git a/ui/src/i18n/locales/en/nls.settings.json b/ui/src/i18n/locales/en/nls.settings.json
index 7c73f6e0..451fd902 100644
--- a/ui/src/i18n/locales/en/nls.settings.json
+++ b/ui/src/i18n/locales/en/nls.settings.json
@@ -73,24 +73,26 @@
"settings.sslprovider.tab": "Certificate authority",
"settings.sslprovider.form.provider.label": "ACME provider",
- "settings.sslprovider.form.provider.option.letsencrypt.label": "Let's Encrypt",
- "settings.sslprovider.form.provider.option.letsencrypt_staging.label": "Let's Encrypt Staging Environment",
- "settings.sslprovider.form.provider.option.zerossl.label": "ZeroSSL",
- "settings.sslprovider.form.provider.option.gts.label": "Google Trust Services",
"settings.sslprovider.form.provider.alert": "Attention: The certificate validity lifetime, certificate algorithm, domain names count, and support for wildcard domain names are allowed may vary among different providers. After switching service providers, please check whether the configuration of the workflows needs to be adjusted.",
- "settings.sslprovider.form.letsencrypt_staging_alert": "The staging environment can reduce the chance of your running up against rate limits. Learn more:https://letsencrypt.org/docs/staging-environment/ ",
+ "settings.sslprovider.form.letsencryptstaging_alert": "The staging environment can reduce the chance of your running up against rate limits. Learn more:https://letsencrypt.org/docs/staging-environment/ ",
"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.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.tooltip": "For more information, see https://cloud.google.com/certificate-manager/docs/public-ca-tutorial ",
+ "settings.sslprovider.form.googletrustservices_eab_kid.label": "EAB KID",
+ "settings.sslprovider.form.googletrustservices_eab_kid.placeholder": "Please enter EAB KID",
+ "settings.sslprovider.form.googletrustservices_eab_kid.tooltip": "For more information, see https://cloud.google.com/certificate-manager/docs/public-ca-tutorial ",
+ "settings.sslprovider.form.googletrustservices_eab_hmac_key.label": "EAB HMAC key",
+ "settings.sslprovider.form.googletrustservices_eab_hmac_key.placeholder": "Please enter EAB HMAC key",
+ "settings.sslprovider.form.googletrustservices_eab_hmac_key.tooltip": "For more information, see https://cloud.google.com/certificate-manager/docs/public-ca-tutorial ",
+ "settings.sslprovider.form.sslcom_eab_kid.label": "EAB KID",
+ "settings.sslprovider.form.sslcom_eab_kid.placeholder": "Please enter EAB KID",
+ "settings.sslprovider.form.sslcom_eab_kid.tooltip": "For more information, see https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/ ",
+ "settings.sslprovider.form.sslcom_eab_hmac_key.label": "EAB HMAC key",
+ "settings.sslprovider.form.sslcom_eab_hmac_key.placeholder": "Please enter EAB HMAC key",
+ "settings.sslprovider.form.sslcom_eab_hmac_key.tooltip": "For more information, see https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/ ",
"settings.persistence.tab": "Persistence",
"settings.persistence.form.workflow_runs_max_days.label": "Max days retention of workflow history runs",
diff --git a/ui/src/i18n/locales/zh/nls.access.json b/ui/src/i18n/locales/zh/nls.access.json
index a9a9d468..29d1b2f6 100644
--- a/ui/src/i18n/locales/zh/nls.access.json
+++ b/ui/src/i18n/locales/zh/nls.access.json
@@ -255,6 +255,12 @@
"access.form.ssh_key_passphrase.label": "SSH 密钥口令",
"access.form.ssh_key_passphrase.placeholder": "请输入 SSH 密钥口令",
"access.form.ssh_key_passphrase.tooltip": "使用 SSH 密钥连接到 SSH 时选填。",
+ "access.form.sslcom_eab_kid.label": "ACME EAB KID",
+ "access.form.sslcom_eab_kid.placeholder": "请输入 ACME EAB KID",
+ "access.form.sslcom_eab_kid.tooltip": "这是什么?请参阅 https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/ ",
+ "access.form.sslcom_eab_hmac_key.label": "ACME EAB HMAC key",
+ "access.form.sslcom_eab_hmac_key.placeholder": "请输入 ACME EAB HMAC key",
+ "access.form.sslcom_eab_hmac_key.tooltip": "这是什么?请参阅 https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/ ",
"access.form.tencentcloud_secret_id.label": "腾讯云 SecretId",
"access.form.tencentcloud_secret_id.placeholder": "请输入腾讯云 SecretId",
"access.form.tencentcloud_secret_id.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/598/40488 ",
diff --git a/ui/src/i18n/locales/zh/nls.provider.json b/ui/src/i18n/locales/zh/nls.provider.json
index a164e360..bcaf50b6 100644
--- a/ui/src/i18n/locales/zh/nls.provider.json
+++ b/ui/src/i18n/locales/zh/nls.provider.json
@@ -92,6 +92,7 @@
"provider.rainyun": "雨云",
"provider.safeline": "雷池",
"provider.ssh": "SSH 部署",
+ "provider.sslcom": "SSL.com",
"provider.tencentcloud": "腾讯云",
"provider.tencentcloud.cdn": "腾讯云 - 内容分发网络 CDN",
"provider.tencentcloud.clb": "腾讯云 - 负载均衡 CLB",
diff --git a/ui/src/i18n/locales/zh/nls.settings.json b/ui/src/i18n/locales/zh/nls.settings.json
index 0c51d33e..f1cf4c51 100644
--- a/ui/src/i18n/locales/zh/nls.settings.json
+++ b/ui/src/i18n/locales/zh/nls.settings.json
@@ -73,24 +73,26 @@
"settings.sslprovider.tab": "证书颁发机构",
"settings.sslprovider.form.provider.label": "ACME 服务商",
- "settings.sslprovider.form.provider.option.letsencrypt.label": "Let's Encrypt",
- "settings.sslprovider.form.provider.option.letsencrypt_staging.label": "Let's Encrypt 测试环境",
- "settings.sslprovider.form.provider.option.zerossl.label": "ZeroSSL",
- "settings.sslprovider.form.provider.option.gts.label": "Google Trust Services",
"settings.sslprovider.form.provider.alert": "注意:不同服务商所支持的证书有效期、证书算法、多域名数量上限、是否允许泛域名等可能不同,切换服务商后请注意检查已有工作流的配置是否需要调整。",
- "settings.sslprovider.form.letsencrypt_staging_alert": "测试环境比生产环境有更宽松的速率限制,可进行测试性部署。 点击下方链接了解更多:https://letsencrypt.org/zh-cn/docs/staging-environment/ ",
+ "settings.sslprovider.form.letsencryptstaging_alert": "测试环境比生产环境有更宽松的速率限制,可进行测试性部署。 点击下方链接了解更多:https://letsencrypt.org/zh-cn/docs/staging-environment/ ",
"settings.sslprovider.form.zerossl_eab_kid.label": "EAB KID",
"settings.sslprovider.form.zerossl_eab_kid.placeholder": "请输入 EAB KID",
"settings.sslprovider.form.zerossl_eab_kid.tooltip": "这是什么?请参阅 https://zerossl.com/documentation/acme/ ",
"settings.sslprovider.form.zerossl_eab_hmac_key.label": "EAB HMAC Key",
"settings.sslprovider.form.zerossl_eab_hmac_key.placeholder": "请输入 EAB HMAC Key",
"settings.sslprovider.form.zerossl_eab_hmac_key.tooltip": "这是什么?请参阅 https://zerossl.com/documentation/acme/ ",
- "settings.sslprovider.form.gts_eab_kid.label": "EAB KID",
- "settings.sslprovider.form.gts_eab_kid.placeholder": "请输入 EAB KID",
- "settings.sslprovider.form.gts_eab_kid.tooltip": "这是什么?请参阅 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": "请输入 EAB HMAC Key",
- "settings.sslprovider.form.gts_eab_hmac_key.tooltip": "这是什么?请参阅 https://cloud.google.com/certificate-manager/docs/public-ca-tutorial ",
+ "settings.sslprovider.form.googletrustservices_eab_kid.label": "EAB KID",
+ "settings.sslprovider.form.googletrustservices_eab_kid.placeholder": "请输入 EAB KID",
+ "settings.sslprovider.form.googletrustservices_eab_kid.tooltip": "这是什么?请参阅 https://cloud.google.com/certificate-manager/docs/public-ca-tutorial ",
+ "settings.sslprovider.form.googletrustservices_eab_hmac_key.label": "EAB HMAC Key",
+ "settings.sslprovider.form.googletrustservices_eab_hmac_key.placeholder": "请输入 EAB HMAC Key",
+ "settings.sslprovider.form.googletrustservices_eab_hmac_key.tooltip": "这是什么?请参阅 https://cloud.google.com/certificate-manager/docs/public-ca-tutorial ",
+ "settings.sslprovider.form.sslcom_eab_kid.label": "EAB KID",
+ "settings.sslprovider.form.sslcom_eab_kid.placeholder": "请输入 EAB KID",
+ "settings.sslprovider.form.sslcom_eab_kid.tooltip": "这是什么?请参阅 https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/ ",
+ "settings.sslprovider.form.sslcom_eab_hmac_key.label": "EAB HMAC Key",
+ "settings.sslprovider.form.sslcom_eab_hmac_key.placeholder": "请输入 EAB HMAC Key",
+ "settings.sslprovider.form.sslcom_eab_hmac_key.tooltip": "这是什么?请参阅 https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/ ",
"settings.persistence.tab": "数据持久化",
"settings.persistence.form.workflow_runs_max_days.label": "工作流执行历史保留天数",
diff --git a/ui/src/pages/settings/SettingsSSLProvider.tsx b/ui/src/pages/settings/SettingsSSLProvider.tsx
index face7d9d..f325fbad 100644
--- a/ui/src/pages/settings/SettingsSSLProvider.tsx
+++ b/ui/src/pages/settings/SettingsSSLProvider.tsx
@@ -7,7 +7,8 @@ import { produce } from "immer";
import { z } from "zod";
import Show from "@/components/Show";
-import { SETTINGS_NAMES, SSLPROVIDERS, type SSLProviderSettingsContent, type SSLProviders, type SettingsModel } from "@/domain/settings";
+import { APPLY_CA_PROVIDERS, type ApplyCAProviderType } from "@/domain/provider";
+import { SETTINGS_NAMES, type SSLProviderSettingsContent, type SettingsModel } from "@/domain/settings";
import { useAntdForm } from "@/hooks";
import { get as getSettings, save as saveSettings } from "@/repository/settings";
import { getErrMsg } from "@/utils/error";
@@ -26,14 +27,14 @@ const SSLProviderEditFormLetsEncryptConfig = () => {
const { pending, settings, updateSettings } = useContext(SSLProviderContext);
const { form: formInst, formProps } = useAntdForm>({
- initialValues: settings?.content?.config?.[SSLPROVIDERS.LETS_ENCRYPT],
+ initialValues: settings?.content?.config?.[APPLY_CA_PROVIDERS.LETSENCRYPT],
onSubmit: async (values) => {
const newSettings = produce(settings, (draft) => {
draft.content ??= {} as SSLProviderSettingsContent;
- draft.content.provider = SSLPROVIDERS.LETS_ENCRYPT;
+ draft.content.provider = APPLY_CA_PROVIDERS.LETSENCRYPT;
draft.content.config ??= {} as SSLProviderSettingsContent["config"];
- draft.content.config[SSLPROVIDERS.LETS_ENCRYPT] = values;
+ draft.content.config[APPLY_CA_PROVIDERS.LETSENCRYPT] = values;
});
await updateSettings(newSettings);
@@ -43,7 +44,7 @@ const SSLProviderEditFormLetsEncryptConfig = () => {
const [formChanged, setFormChanged] = useState(false);
useEffect(() => {
- setFormChanged(settings?.content?.provider !== SSLPROVIDERS.LETS_ENCRYPT);
+ setFormChanged(settings?.content?.provider !== APPLY_CA_PROVIDERS.LETSENCRYPT);
}, [settings?.content?.provider]);
const handleFormChange = () => {
@@ -67,14 +68,14 @@ const SSLProviderEditFormLetsEncryptStagingConfig = () => {
const { pending, settings, updateSettings } = useContext(SSLProviderContext);
const { form: formInst, formProps } = useAntdForm>({
- initialValues: settings?.content?.config?.[SSLPROVIDERS.LETS_ENCRYPT_STAGING],
+ initialValues: settings?.content?.config?.[APPLY_CA_PROVIDERS.LETSENCRYPTSTAGING],
onSubmit: async (values) => {
const newSettings = produce(settings, (draft) => {
draft.content ??= {} as SSLProviderSettingsContent;
- draft.content.provider = SSLPROVIDERS.LETS_ENCRYPT_STAGING;
+ draft.content.provider = APPLY_CA_PROVIDERS.LETSENCRYPTSTAGING;
draft.content.config ??= {} as SSLProviderSettingsContent["config"];
- draft.content.config[SSLPROVIDERS.LETS_ENCRYPT_STAGING] = values;
+ draft.content.config[APPLY_CA_PROVIDERS.LETSENCRYPTSTAGING] = values;
});
await updateSettings(newSettings);
@@ -84,7 +85,7 @@ const SSLProviderEditFormLetsEncryptStagingConfig = () => {
const [formChanged, setFormChanged] = useState(false);
useEffect(() => {
- setFormChanged(settings?.content?.provider !== SSLPROVIDERS.LETS_ENCRYPT_STAGING);
+ setFormChanged(settings?.content?.provider !== APPLY_CA_PROVIDERS.LETSENCRYPTSTAGING);
}, [settings?.content?.provider]);
const handleFormChange = () => {
@@ -94,7 +95,7 @@ const SSLProviderEditFormLetsEncryptStagingConfig = () => {
return (
- } />
+ } />
@@ -123,14 +124,14 @@ const SSLProviderEditFormZeroSSLConfig = () => {
});
const formRule = createSchemaFieldRule(formSchema);
const { form: formInst, formProps } = useAntdForm>({
- initialValues: settings?.content?.config?.[SSLPROVIDERS.ZERO_SSL],
+ initialValues: settings?.content?.config?.[APPLY_CA_PROVIDERS.ZEROSSL],
onSubmit: async (values) => {
const newSettings = produce(settings, (draft) => {
draft.content ??= {} as SSLProviderSettingsContent;
- draft.content.provider = SSLPROVIDERS.ZERO_SSL;
+ draft.content.provider = APPLY_CA_PROVIDERS.ZEROSSL;
draft.content.config ??= {} as SSLProviderSettingsContent["config"];
- draft.content.config[SSLPROVIDERS.ZERO_SSL] = values;
+ draft.content.config[APPLY_CA_PROVIDERS.ZEROSSL] = values;
});
await updateSettings(newSettings);
@@ -140,7 +141,7 @@ const SSLProviderEditFormZeroSSLConfig = () => {
const [formChanged, setFormChanged] = useState(false);
useEffect(() => {
- setFormChanged(settings?.content?.provider !== SSLPROVIDERS.ZERO_SSL);
+ setFormChanged(settings?.content?.provider !== APPLY_CA_PROVIDERS.ZEROSSL);
}, [settings?.content?.provider]);
const handleFormChange = () => {
@@ -183,24 +184,24 @@ const SSLProviderEditFormGoogleTrustServicesConfig = () => {
const formSchema = z.object({
eabKid: z
- .string({ message: t("settings.sslprovider.form.gts_eab_kid.placeholder") })
- .min(1, t("settings.sslprovider.form.gts_eab_kid.placeholder"))
+ .string({ message: t("settings.sslprovider.form.googletrustservices_eab_kid.placeholder") })
+ .min(1, t("settings.sslprovider.form.googletrustservices_eab_kid.placeholder"))
.max(256, t("common.errmsg.string_max", { max: 256 })),
eabHmacKey: z
- .string({ message: t("settings.sslprovider.form.gts_eab_hmac_key.placeholder") })
- .min(1, t("settings.sslprovider.form.gts_eab_hmac_key.placeholder"))
+ .string({ message: t("settings.sslprovider.form.googletrustservices_eab_hmac_key.placeholder") })
+ .min(1, t("settings.sslprovider.form.googletrustservices_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?.[SSLPROVIDERS.GOOGLE_TRUST_SERVICES],
+ initialValues: settings?.content?.config?.[APPLY_CA_PROVIDERS.GOOGLETRUSTSERVICES],
onSubmit: async (values) => {
const newSettings = produce(settings, (draft) => {
draft.content ??= {} as SSLProviderSettingsContent;
- draft.content.provider = SSLPROVIDERS.GOOGLE_TRUST_SERVICES;
+ draft.content.provider = APPLY_CA_PROVIDERS.GOOGLETRUSTSERVICES;
draft.content.config ??= {} as SSLProviderSettingsContent["config"];
- draft.content.config[SSLPROVIDERS.GOOGLE_TRUST_SERVICES] = values;
+ draft.content.config[APPLY_CA_PROVIDERS.GOOGLETRUSTSERVICES] = values;
});
await updateSettings(newSettings);
@@ -210,7 +211,7 @@ const SSLProviderEditFormGoogleTrustServicesConfig = () => {
const [formChanged, setFormChanged] = useState(false);
useEffect(() => {
- setFormChanged(settings?.content?.provider !== SSLPROVIDERS.GOOGLE_TRUST_SERVICES);
+ setFormChanged(settings?.content?.provider !== APPLY_CA_PROVIDERS.GOOGLETRUSTSERVICES);
}, [settings?.content?.provider]);
const handleFormChange = () => {
@@ -221,20 +222,90 @@ const SSLProviderEditFormGoogleTrustServicesConfig = () => {
}
+ tooltip={ }
>
-
+
}
+ tooltip={ }
>
-
+
+
+
+
+
+ {t("common.button.save")}
+
+
+
+ );
+};
+
+const SSLProviderEditFormSSLComConfig = () => {
+ const { t } = useTranslation();
+
+ const { pending, settings, updateSettings } = useContext(SSLProviderContext);
+
+ const formSchema = z.object({
+ eabKid: z
+ .string({ message: t("settings.sslprovider.form.sslcom_eab_kid.placeholder") })
+ .min(1, t("settings.sslprovider.form.sslcom_eab_kid.placeholder"))
+ .max(256, t("common.errmsg.string_max", { max: 256 })),
+ eabHmacKey: z
+ .string({ message: t("settings.sslprovider.form.sslcom_eab_hmac_key.placeholder") })
+ .min(1, t("settings.sslprovider.form.sslcom_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?.[APPLY_CA_PROVIDERS.SSLCOM],
+ onSubmit: async (values) => {
+ const newSettings = produce(settings, (draft) => {
+ draft.content ??= {} as SSLProviderSettingsContent;
+ draft.content.provider = APPLY_CA_PROVIDERS.SSLCOM;
+
+ draft.content.config ??= {} as SSLProviderSettingsContent["config"];
+ draft.content.config[APPLY_CA_PROVIDERS.SSLCOM] = values;
+ });
+ await updateSettings(newSettings);
+
+ setFormChanged(false);
+ },
+ });
+
+ const [formChanged, setFormChanged] = useState(false);
+ useEffect(() => {
+ setFormChanged(settings?.content?.provider !== APPLY_CA_PROVIDERS.SSLCOM);
+ }, [settings?.content?.provider]);
+
+ const handleFormChange = () => {
+ setFormChanged(true);
+ };
+
+ return (
+ }
+ >
+
+
+
+ }
+ >
+
@@ -271,17 +342,19 @@ const SettingsSSLProvider = () => {
fetchData();
}, []);
- const [providerType, setProviderType] = useState(SSLPROVIDERS.LETS_ENCRYPT);
+ const [providerType, setProviderType] = useState(APPLY_CA_PROVIDERS.LETSENCRYPT);
const providerFormEl = useMemo(() => {
switch (providerType) {
- case SSLPROVIDERS.LETS_ENCRYPT:
+ case APPLY_CA_PROVIDERS.LETSENCRYPT:
return ;
- case SSLPROVIDERS.LETS_ENCRYPT_STAGING:
+ case APPLY_CA_PROVIDERS.LETSENCRYPTSTAGING:
return ;
- case SSLPROVIDERS.ZERO_SSL:
- return ;
- case SSLPROVIDERS.GOOGLE_TRUST_SERVICES:
+ case APPLY_CA_PROVIDERS.GOOGLETRUSTSERVICES:
return ;
+ case APPLY_CA_PROVIDERS.SSLCOM:
+ return ;
+ case APPLY_CA_PROVIDERS.ZEROSSL:
+ return ;
}
}, [providerType]);
@@ -315,34 +388,41 @@ const SettingsSSLProvider = () => {
}>
- setProviderType(value as SSLProviders)}>
+ setProviderType(value as ApplyCAProviderType)}>
}
size="small"
- title={t("settings.sslprovider.form.provider.option.letsencrypt.label")}
+ title={t("provider.letsencrypt")}
description="letsencrypt.org"
- value={SSLPROVIDERS.LETS_ENCRYPT}
+ value={APPLY_CA_PROVIDERS.LETSENCRYPT}
/>
}
size="small"
- title={t("settings.sslprovider.form.provider.option.letsencrypt_staging.label")}
+ title={t("provider.letsencryptstaging")}
description="letsencrypt.org"
- value={SSLPROVIDERS.LETS_ENCRYPT_STAGING}
+ value={APPLY_CA_PROVIDERS.LETSENCRYPTSTAGING}
/>
}
size="small"
- title={t("settings.sslprovider.form.provider.option.zerossl.label")}
+ title={t("provider.zerossl")}
description="zerossl.com"
- value={SSLPROVIDERS.ZERO_SSL}
+ value={APPLY_CA_PROVIDERS.ZEROSSL}
/>
}
size="small"
- title={t("settings.sslprovider.form.provider.option.gts.label")}
+ title={t("provider.googletrustservices")}
description="pki.goog"
- value={SSLPROVIDERS.GOOGLE_TRUST_SERVICES}
+ value={APPLY_CA_PROVIDERS.GOOGLETRUSTSERVICES}
+ />
+ }
+ size="small"
+ title={t("provider.sslcom")}
+ description="ssl.com"
+ value={APPLY_CA_PROVIDERS.SSLCOM}
/>