From d2eaea7a4407a4cb5892bd7de7238bce05067fdd Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Sun, 30 Mar 2025 22:14:13 +0800 Subject: [PATCH] feat: add buypass ca --- internal/applicant/acme_ca.go | 4 +- internal/applicant/acme_user.go | 5 + internal/domain/provider.go | 2 + migrations/1743264000_upgrade.go | 1 + ui/public/imgs/providers/buypass.png | Bin 0 -> 8163 bytes ui/src/domain/provider.ts | 18 ++- ui/src/i18n/locales/en/nls.provider.json | 1 + ui/src/i18n/locales/zh/nls.provider.json | 1 + ui/src/pages/settings/SettingsSSLProvider.tsx | 128 ++++++++++++------ 9 files changed, 113 insertions(+), 47 deletions(-) create mode 100644 ui/public/imgs/providers/buypass.png diff --git a/internal/applicant/acme_ca.go b/internal/applicant/acme_ca.go index 52bfcb8f..ea0c6b74 100644 --- a/internal/applicant/acme_ca.go +++ b/internal/applicant/acme_ca.go @@ -5,6 +5,7 @@ import "github.com/usual2970/certimate/internal/domain" const ( sslProviderLetsEncrypt = string(domain.ApplyCAProviderTypeLetsEncrypt) sslProviderLetsEncryptStaging = string(domain.ApplyCAProviderTypeLetsEncryptStaging) + sslProviderBuypass = string(domain.ApplyCAProviderTypeBuypass) sslProviderGoogleTrustServices = string(domain.ApplyCAProviderTypeGoogleTrustServices) sslProviderSSLCom = string(domain.ApplyCAProviderTypeSSLCom) sslProviderZeroSSL = string(domain.ApplyCAProviderTypeZeroSSL) @@ -15,8 +16,9 @@ const ( var sslProviderUrls = map[string]string{ sslProviderLetsEncrypt: "https://acme-v02.api.letsencrypt.org/directory", sslProviderLetsEncryptStaging: "https://acme-staging-v02.api.letsencrypt.org/directory", + sslProviderBuypass: "https://api.buypass.com/acme/directory", sslProviderGoogleTrustServices: "https://dv.acme-v02.api.pki.goog/directory", - sslProviderSSLCom: "https://acme.ssl.com/sslcom-dv-ecc", + sslProviderSSLCom: "https://acme.ssl.com/sslcom-dv-rsa", sslProviderZeroSSL: "https://acme.zerossl.com/v2/DV90", } diff --git a/internal/applicant/acme_user.go b/internal/applicant/acme_user.go index fa8e81b9..430db5a3 100644 --- a/internal/applicant/acme_user.go +++ b/internal/applicant/acme_user.go @@ -98,6 +98,11 @@ func registerAcmeUser(client *lego.Client, user *acmeUser, userRegisterOptions m case sslProviderLetsEncrypt, sslProviderLetsEncryptStaging: reg, err = client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true}) + case sslProviderBuypass: + { + reg, err = client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true}) + } + case sslProviderGoogleTrustServices: { access := domain.AccessConfigForGoogleTrustServices{} diff --git a/internal/domain/provider.go b/internal/domain/provider.go index c0da68ed..d8726034 100644 --- a/internal/domain/provider.go +++ b/internal/domain/provider.go @@ -19,6 +19,7 @@ const ( AccessProviderTypeBaishan = AccessProviderType("baishan") AccessProviderTypeBaotaPanel = AccessProviderType("baotapanel") AccessProviderTypeBytePlus = AccessProviderType("byteplus") + AccessProviderTypeBuypass = AccessProviderType("buypass") AccessProviderTypeCacheFly = AccessProviderType("cachefly") AccessProviderTypeCdnfly = AccessProviderType("cdnfly") AccessProviderTypeCloudflare = AccessProviderType("cloudflare") @@ -75,6 +76,7 @@ type ApplyCAProviderType string NOTICE: If you add new constant, please keep ASCII order. */ const ( + ApplyCAProviderTypeBuypass = ApplyCAProviderType(string(AccessProviderTypeBuypass)) ApplyCAProviderTypeGoogleTrustServices = ApplyCAProviderType(string(AccessProviderTypeGoogleTrustServices)) ApplyCAProviderTypeLetsEncrypt = ApplyCAProviderType(string(AccessProviderTypeLetsEncrypt)) ApplyCAProviderTypeLetsEncryptStaging = ApplyCAProviderType(string(AccessProviderTypeLetsEncryptStaging)) diff --git a/migrations/1743264000_upgrade.go b/migrations/1743264000_upgrade.go index e7bb5087..75f98b30 100644 --- a/migrations/1743264000_upgrade.go +++ b/migrations/1743264000_upgrade.go @@ -83,6 +83,7 @@ func init() { "baishan", "baotapanel", "byteplus", + "buypass", "cachefly", "cdnfly", "cloudflare", diff --git a/ui/public/imgs/providers/buypass.png b/ui/public/imgs/providers/buypass.png new file mode 100644 index 0000000000000000000000000000000000000000..f46925386fbdf816ea45db01dc956625778ce456 GIT binary patch literal 8163 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

90=*@)mq&m3p#6*A0)u2 zw~=PT=3!0ZH(vdjaWopVm`x*_}-C1^j+6F_69p!^KCy>NS* z$2(GvCX^=pA>|(C5%RqkPcEEbC*Kr*WrTB53zWz9(xXv}JGR@y&rjO#n0f~?E=;Md zc}*z#K%wc}D`$9}A;t+Wst4XiZFUxhl*BPNb-XHw*-hQj0xw0P9j|^F?bhQK$|3M9 zr-^_&!L5hk>)LHa)&3!q6m}b=+hd}!_fwh5^KqW_#fhVe^5W;+3O^G~h6H8@36y{W z+4+b!ih;o&B^Us5bV8wA1V`fP?1sdwu}`GB>a2Bk)cZ4MRzJ1IU7nK4&NzzKR{+~O zVAYmL6$qs$(;tY}dlDXbM_d(=61E}76Pr^d_Smgv9wcV~jXnA6Kv}fv=Bc8WQ!ZHx zNi&bPDRZztGBA*@ERyQUkN5M6qp%9|-&)llcgplgA-7^_(@u02pTRoB46+dmk7vU%SqU|bQ~zfG zHMYY($C+105fHwV-YXpoMqxa}5c(AxG3WLwQ;U_6vwtn4ivx|n%e ze8x4%gnZ%d20f&#jztt#k%hR?ri?U_bMd&HUPB=fl`ADGMM-U9y>Rd#`i`zeFRvGM z^ZDaZQj6;eAGS0Q{EU+?uO});WaX=98317DsU#A#eC?6`IUp?MZV}nOR`Kd{f9UsGENe0-@ [ e[0] as string, { @@ -150,6 +152,7 @@ export const accessProvidersMap: Map [ type, { @@ -185,7 +189,7 @@ export const applyCAProvidersMap: Map { ); }; -const SSLProviderEditFormZeroSSLConfig = () => { +const SSLProviderEditFormBuypassConfig = () => { const { t } = useTranslation(); const { pending, settings, updateSettings } = useContext(SSLProviderContext); - const formSchema = z.object({ - eabKid: z - .string({ message: t("settings.sslprovider.form.zerossl_eab_kid.placeholder") }) - .min(1, t("settings.sslprovider.form.zerossl_eab_kid.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), - eabHmacKey: z - .string({ message: t("settings.sslprovider.form.zerossl_eab_hmac_key.placeholder") }) - .min(1, t("settings.sslprovider.form.zerossl_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.ZEROSSL], + const { form: formInst, formProps } = useAntdForm>({ + initialValues: settings?.content?.config?.[APPLY_CA_PROVIDERS.BUYPASS], onSubmit: async (values) => { const newSettings = produce(settings, (draft) => { draft.content ??= {} as SSLProviderSettingsContent; - draft.content.provider = APPLY_CA_PROVIDERS.ZEROSSL; + draft.content.provider = APPLY_CA_PROVIDERS.BUYPASS; draft.content.config ??= {} as SSLProviderSettingsContent["config"]; - draft.content.config[APPLY_CA_PROVIDERS.ZEROSSL] = values; + draft.content.config[APPLY_CA_PROVIDERS.BUYPASS] = values; }); await updateSettings(newSettings); @@ -141,7 +130,7 @@ const SSLProviderEditFormZeroSSLConfig = () => { const [formChanged, setFormChanged] = useState(false); useEffect(() => { - setFormChanged(settings?.content?.provider !== APPLY_CA_PROVIDERS.ZEROSSL); + setFormChanged(settings?.content?.provider !== APPLY_CA_PROVIDERS.LETSENCRYPTSTAGING); }, [settings?.content?.provider]); const handleFormChange = () => { @@ -150,24 +139,6 @@ const SSLProviderEditFormZeroSSLConfig = () => { return (

- } - > - - - - } - > - - - + +
+ ); +}; + const SettingsSSLProvider = () => { const { t } = useTranslation(); @@ -349,6 +390,8 @@ const SettingsSSLProvider = () => { return ; case APPLY_CA_PROVIDERS.LETSENCRYPTSTAGING: return ; + case APPLY_CA_PROVIDERS.BUYPASS: + return ; case APPLY_CA_PROVIDERS.GOOGLETRUSTSERVICES: return ; case APPLY_CA_PROVIDERS.SSLCOM: @@ -404,11 +447,11 @@ const SettingsSSLProvider = () => { value={APPLY_CA_PROVIDERS.LETSENCRYPTSTAGING} /> } + avatar={} size="small" - title={t("provider.zerossl")} - description="zerossl.com" - value={APPLY_CA_PROVIDERS.ZEROSSL} + title={t("provider.buypass")} + description="buypass.com" + value={APPLY_CA_PROVIDERS.BUYPASS} /> } @@ -424,6 +467,13 @@ const SettingsSSLProvider = () => { description="ssl.com" value={APPLY_CA_PROVIDERS.SSLCOM} /> + } + size="small" + title={t("provider.zerossl")} + description="zerossl.com" + value={APPLY_CA_PROVIDERS.ZEROSSL} + />