feat: add ssl.com ca

This commit is contained in:
Fu Diwei
2025-03-30 21:46:59 +08:00
parent a72737fdd5
commit f77c2dae23
19 changed files with 285 additions and 96 deletions

View File

@@ -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<AccessFormInstance, AccessFormProps>(({ className,
return <AccessFormSafeLineConfig {...nestedFormProps} />;
case ACCESS_PROVIDERS.SSH:
return <AccessFormSSHConfig {...nestedFormProps} />;
case ACCESS_PROVIDERS.SSLCOM:
return <AccessFormSSLComConfig {...nestedFormProps} />;
case ACCESS_PROVIDERS.TENCENTCLOUD:
return <AccessFormTencentCloudConfig {...nestedFormProps} />;
case ACCESS_PROVIDERS.UCLOUD:

View File

@@ -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<AccessConfigForSSLCom>;
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<typeof formSchema>) => {
onValuesChange?.(values);
};
return (
<Form
form={formInst}
disabled={disabled}
initialValues={initialValues ?? initFormModel()}
layout="vertical"
name={formName}
onValuesChange={handleFormChange}
>
<Form.Item
name="eabKid"
label={t("access.form.sslcom_eab_kid.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.sslcom_eab_kid.tooltip") }}></span>}
>
<Input autoComplete="new-password" placeholder={t("access.form.sslcom_eab_kid.placeholder")} />
</Form.Item>
<Form.Item
name="eabHmacKey"
label={t("access.form.sslcom_eab_hmac_key.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.sslcom_eab_hmac_key.tooltip") }}></span>}
>
<Input.Password autoComplete="new-password" placeholder={t("access.form.sslcom_eab_hmac_key.placeholder")} />
</Form.Item>
</Form>
);
};
export default AccessFormSSLComConfig;

View File

@@ -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;

View File

@@ -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<AccessProvider["type"] | string, AccessProv
[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]],
[ACCESS_PROVIDERS.SSLCOM, "provider.sslcom", "/imgs/providers/sslcom.svg", [ACCESS_USAGES.CA]],
].map((e) => [
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<ApplyCAProvider["type"] | string, ApplyCAP
[APPLY_CA_PROVIDERS.LETSENCRYPTSTAGING, "true"],
[APPLY_CA_PROVIDERS.ZEROSSL],
[APPLY_CA_PROVIDERS.GOOGLETRUSTSERVICES],
[APPLY_CA_PROVIDERS.SSLCOM],
].map(([type, builtin]) => [
type,
{

View File

@@ -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<NotifyChannel["type"], NotifyChannel> = 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<string, unknown> | undefined;
[SSLPROVIDERS.LETS_ENCRYPT]?: SSLProviderLetsEncryptConfig;
[SSLPROVIDERS.LETS_ENCRYPT_STAGING]?: SSLProviderLetsEncryptConfig;
[SSLPROVIDERS.ZERO_SSL]?: SSLProviderZeroSSLConfig;
[SSLPROVIDERS.GOOGLE_TRUST_SERVICES]?: SSLProviderGoogleTrustServicesConfig;
};
};
export type SSLProviderLetsEncryptConfig = NonNullable<unknown>;
export type SSLProviderZeroSSLConfig = {
eabKid: string;
eabHmacKey: string;
};
export type SSLProviderGoogleTrustServicesConfig = {
eabKid: string;
eabHmacKey: string;
};
// #endregion
// #region Settings: Persistence

View File

@@ -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 <a href=\"https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/#ftoc-heading-6\" target=\"_blank\">https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/</a>",
"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 <a href=\"https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/#ftoc-heading-6\" target=\"_blank\">https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/</a>",
"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 <a href=\"https://cloud.tencent.com/document/product/598/40488?lang=en\" target=\"_blank\">https://cloud.tencent.com/document/product/598/40488?lang=en</a>",

View File

@@ -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)",

View File

@@ -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.<br><br>Learn more:<br><a href=\"https://letsencrypt.org/docs/staging-environment/\" target=\"_blank\">https://letsencrypt.org/docs/staging-environment/</a>",
"settings.sslprovider.form.letsencryptstaging_alert": "The staging environment can reduce the chance of your running up against rate limits.<br><br>Learn more:<br><a href=\"https://letsencrypt.org/docs/staging-environment/\" target=\"_blank\">https://letsencrypt.org/docs/staging-environment/</a>",
"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 <a href=\"https://zerossl.com/documentation/acme/\" target=\"_blank\">https://zerossl.com/documentation/acme/</a>",
"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 <a href=\"https://zerossl.com/documentation/acme/\" target=\"_blank\">https://zerossl.com/documentation/acme/</a>",
"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 <a href=\"https://cloud.google.com/certificate-manager/docs/public-ca-tutorial\" target=\"_blank\">https://cloud.google.com/certificate-manager/docs/public-ca-tutorial</a>",
"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 <a href=\"https://cloud.google.com/certificate-manager/docs/public-ca-tutorial\" target=\"_blank\">https://cloud.google.com/certificate-manager/docs/public-ca-tutorial</a>",
"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 <a href=\"https://cloud.google.com/certificate-manager/docs/public-ca-tutorial\" target=\"_blank\">https://cloud.google.com/certificate-manager/docs/public-ca-tutorial</a>",
"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 <a href=\"https://cloud.google.com/certificate-manager/docs/public-ca-tutorial\" target=\"_blank\">https://cloud.google.com/certificate-manager/docs/public-ca-tutorial</a>",
"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 <a href=\"https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/#ftoc-heading-6\" target=\"_blank\">https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/</a>",
"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 <a href=\"https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/#ftoc-heading-6\" target=\"_blank\">https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/</a>",
"settings.persistence.tab": "Persistence",
"settings.persistence.form.workflow_runs_max_days.label": "Max days retention of workflow history runs",

View File

@@ -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": "这是什么?请参阅 <a href=\"https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/#ftoc-heading-6\" target=\"_blank\">https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/</a>",
"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": "这是什么?请参阅 <a href=\"https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/#ftoc-heading-6\" target=\"_blank\">https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/</a>",
"access.form.tencentcloud_secret_id.label": "腾讯云 SecretId",
"access.form.tencentcloud_secret_id.placeholder": "请输入腾讯云 SecretId",
"access.form.tencentcloud_secret_id.tooltip": "这是什么?请参阅 <a href=\"https://cloud.tencent.com/document/product/598/40488\" target=\"_blank\">https://cloud.tencent.com/document/product/598/40488</a>",

View File

@@ -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",

View File

@@ -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": "测试环境比生产环境有更宽松的速率限制,可进行测试性部署。<br><br>点击下方链接了解更多:<br><a href=\"https://letsencrypt.org/zh-cn/docs/staging-environment/\" target=\"_blank\">https://letsencrypt.org/zh-cn/docs/staging-environment/</a>",
"settings.sslprovider.form.letsencryptstaging_alert": "测试环境比生产环境有更宽松的速率限制,可进行测试性部署。<br><br>点击下方链接了解更多:<br><a href=\"https://letsencrypt.org/zh-cn/docs/staging-environment/\" target=\"_blank\">https://letsencrypt.org/zh-cn/docs/staging-environment/</a>",
"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": "这是什么?请参阅 <a href=\"https://zerossl.com/documentation/acme/\" target=\"_blank\">https://zerossl.com/documentation/acme/</a>",
"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": "这是什么?请参阅 <a href=\"https://zerossl.com/documentation/acme/\" target=\"_blank\">https://zerossl.com/documentation/acme/</a>",
"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": "这是什么?请参阅 <a href=\"https://cloud.google.com/certificate-manager/docs/public-ca-tutorial\" target=\"_blank\">https://cloud.google.com/certificate-manager/docs/public-ca-tutorial</a>",
"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": "这是什么?请参阅 <a href=\"https://cloud.google.com/certificate-manager/docs/public-ca-tutorial\" target=\"_blank\">https://cloud.google.com/certificate-manager/docs/public-ca-tutorial</a>",
"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": "这是什么?请参阅 <a href=\"https://cloud.google.com/certificate-manager/docs/public-ca-tutorial\" target=\"_blank\">https://cloud.google.com/certificate-manager/docs/public-ca-tutorial</a>",
"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": "这是什么?请参阅 <a href=\"https://cloud.google.com/certificate-manager/docs/public-ca-tutorial\" target=\"_blank\">https://cloud.google.com/certificate-manager/docs/public-ca-tutorial</a>",
"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": "这是什么?请参阅 <a href=\"https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/#ftoc-heading-6\" target=\"_blank\">https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/</a>",
"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": "这是什么?请参阅 <a href=\"https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/#ftoc-heading-6\" target=\"_blank\">https://www.ssl.com/how-to/generate-acme-credentials-for-reseller-customers/</a>",
"settings.persistence.tab": "数据持久化",
"settings.persistence.form.workflow_runs_max_days.label": "工作流执行历史保留天数",

View File

@@ -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<NonNullable<unknown>>({
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<NonNullable<unknown>>({
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 (
<Form {...formProps} form={formInst} disabled={pending} layout="vertical" onValuesChange={handleFormChange}>
<Form.Item>
<Alert type="info" message={<span dangerouslySetInnerHTML={{ __html: t("settings.sslprovider.form.letsencrypt_staging_alert") }}></span>} />
<Alert type="info" message={<span dangerouslySetInnerHTML={{ __html: t("settings.sslprovider.form.letsencryptstaging_alert") }}></span>} />
</Form.Item>
<Form.Item>
@@ -123,14 +124,14 @@ const SSLProviderEditFormZeroSSLConfig = () => {
});
const formRule = createSchemaFieldRule(formSchema);
const { form: formInst, formProps } = useAntdForm<z.infer<typeof formSchema>>({
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<z.infer<typeof formSchema>>({
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 = () => {
<Form {...formProps} form={formInst} disabled={pending} layout="vertical" onValuesChange={handleFormChange}>
<Form.Item
name="eabKid"
label={t("settings.sslprovider.form.gts_eab_kid.label")}
label={t("settings.sslprovider.form.googletrustservices_eab_kid.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("settings.sslprovider.form.gts_eab_kid.tooltip") }}></span>}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("settings.sslprovider.form.googletrustservices_eab_kid.tooltip") }}></span>}
>
<Input autoComplete="new-password" placeholder={t("settings.sslprovider.form.gts_eab_kid.placeholder")} />
<Input autoComplete="new-password" placeholder={t("settings.sslprovider.form.googletrustservices_eab_kid.placeholder")} />
</Form.Item>
<Form.Item
name="eabHmacKey"
label={t("settings.sslprovider.form.gts_eab_hmac_key.label")}
label={t("settings.sslprovider.form.googletrustservices_eab_hmac_key.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("settings.sslprovider.form.gts_eab_hmac_key.tooltip") }}></span>}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("settings.sslprovider.form.googletrustservices_eab_hmac_key.tooltip") }}></span>}
>
<Input.Password autoComplete="new-password" placeholder={t("settings.sslprovider.form.gts_eab_hmac_key.placeholder")} />
<Input.Password autoComplete="new-password" placeholder={t("settings.sslprovider.form.googletrustservices_eab_hmac_key.placeholder")} />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit" disabled={!formChanged} loading={pending}>
{t("common.button.save")}
</Button>
</Form.Item>
</Form>
);
};
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<z.infer<typeof formSchema>>({
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 (
<Form {...formProps} form={formInst} disabled={pending} layout="vertical" onValuesChange={handleFormChange}>
<Form.Item
name="eabKid"
label={t("settings.sslprovider.form.sslcom_eab_kid.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("settings.sslprovider.form.sslcom_eab_kid.tooltip") }}></span>}
>
<Input autoComplete="new-password" placeholder={t("settings.sslprovider.form.sslcom_eab_kid.placeholder")} />
</Form.Item>
<Form.Item
name="eabHmacKey"
label={t("settings.sslprovider.form.sslcom_eab_hmac_key.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("settings.sslprovider.form.sslcom_eab_hmac_key.tooltip") }}></span>}
>
<Input.Password autoComplete="new-password" placeholder={t("settings.sslprovider.form.sslcom_eab_hmac_key.placeholder")} />
</Form.Item>
<Form.Item>
@@ -271,17 +342,19 @@ const SettingsSSLProvider = () => {
fetchData();
}, []);
const [providerType, setProviderType] = useState<SSLProviders>(SSLPROVIDERS.LETS_ENCRYPT);
const [providerType, setProviderType] = useState<ApplyCAProviderType>(APPLY_CA_PROVIDERS.LETSENCRYPT);
const providerFormEl = useMemo(() => {
switch (providerType) {
case SSLPROVIDERS.LETS_ENCRYPT:
case APPLY_CA_PROVIDERS.LETSENCRYPT:
return <SSLProviderEditFormLetsEncryptConfig />;
case SSLPROVIDERS.LETS_ENCRYPT_STAGING:
case APPLY_CA_PROVIDERS.LETSENCRYPTSTAGING:
return <SSLProviderEditFormLetsEncryptStagingConfig />;
case SSLPROVIDERS.ZERO_SSL:
return <SSLProviderEditFormZeroSSLConfig />;
case SSLPROVIDERS.GOOGLE_TRUST_SERVICES:
case APPLY_CA_PROVIDERS.GOOGLETRUSTSERVICES:
return <SSLProviderEditFormGoogleTrustServicesConfig />;
case APPLY_CA_PROVIDERS.SSLCOM:
return <SSLProviderEditFormSSLComConfig />;
case APPLY_CA_PROVIDERS.ZEROSSL:
return <SSLProviderEditFormZeroSSLConfig />;
}
}, [providerType]);
@@ -315,34 +388,41 @@ const SettingsSSLProvider = () => {
<Show when={!loading} fallback={<Skeleton active />}>
<Form form={formInst} disabled={formPending} layout="vertical" initialValues={{ provider: providerType }}>
<Form.Item className="mb-2" name="provider" label={t("settings.sslprovider.form.provider.label")}>
<CheckCard.Group className="w-full" onChange={(value) => setProviderType(value as SSLProviders)}>
<CheckCard.Group className="w-full" onChange={(value) => setProviderType(value as ApplyCAProviderType)}>
<CheckCard
avatar={<img src={"/imgs/providers/letsencrypt.svg"} className="size-8" />}
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}
/>
<CheckCard
avatar={<img src={"/imgs/providers/letsencrypt.svg"} className="size-8" />}
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}
/>
<CheckCard
avatar={<img src={"/imgs/providers/zerossl.svg"} className="size-8" />}
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}
/>
<CheckCard
avatar={<img src={"/imgs/providers/google.svg"} className="size-8" />}
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}
/>
<CheckCard
avatar={<img src={"/imgs/providers/sslcom.svg"} className="size-8" />}
size="small"
title={t("provider.sslcom")}
description="ssl.com"
value={APPLY_CA_PROVIDERS.SSLCOM}
/>
</CheckCard.Group>
</Form.Item>