mirror of
https://github.com/certimate-go/certimate.git
synced 2026-09-24 23:10:13 +08:00
feat(provider): new acme dns-01 provider: beget
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
package certifiers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/certimate-go/certimate/internal/domain"
|
||||
"github.com/certimate-go/certimate/pkg/core"
|
||||
"github.com/certimate-go/certimate/pkg/core/certifier/challengers/dns01/beget"
|
||||
xmaps "github.com/certimate-go/certimate/pkg/utils/maps"
|
||||
)
|
||||
|
||||
func init() {
|
||||
ACMEDns01Registries.MustRegister(domain.ACMEDns01ProviderTypeBeget, func(options *ProviderFactoryOptions) (core.ACMEChallenger, error) {
|
||||
credentials := domain.AccessConfigForBeget{}
|
||||
if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil {
|
||||
return nil, fmt.Errorf("failed to populate provider access config: %w", err)
|
||||
}
|
||||
|
||||
provider, err := beget.NewChallenger(&beget.ChallengerConfig{
|
||||
Username: credentials.Username,
|
||||
ApiPassword: credentials.ApiPassword,
|
||||
DnsPropagationTimeout: options.DnsPropagationTimeout,
|
||||
DnsTTL: options.DnsTTL,
|
||||
})
|
||||
return provider, err
|
||||
})
|
||||
}
|
||||
@@ -120,6 +120,11 @@ type AccessConfigForBaotaWAF struct {
|
||||
AllowInsecureConnections bool `json:"allowInsecureConnections,omitempty"`
|
||||
}
|
||||
|
||||
type AccessConfigForBeget struct {
|
||||
Username string `json:"username"`
|
||||
ApiPassword string `json:"apiPassword"`
|
||||
}
|
||||
|
||||
type AccessConfigForBookMyName struct {
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
|
||||
@@ -31,6 +31,7 @@ const (
|
||||
AccessProviderTypeBaotaPanel = AccessProviderType("baotapanel")
|
||||
AccessProviderTypeBaotaPanelGo = AccessProviderType("baotapanelgo")
|
||||
AccessProviderTypeBaotaWAF = AccessProviderType("baotawaf")
|
||||
AccessProviderTypeBeget = AccessProviderType("beget")
|
||||
AccessProviderTypeBookMyName = AccessProviderType("bookmyname")
|
||||
AccessProviderTypeBunny = AccessProviderType("bunny")
|
||||
AccessProviderTypeBytePlus = AccessProviderType("byteplus")
|
||||
@@ -199,6 +200,7 @@ const (
|
||||
ACMEDns01ProviderTypeAzureDNS = ACMEDns01ProviderType(AccessProviderTypeAzure + "-dns")
|
||||
ACMEDns01ProviderTypeBaiduCloud = ACMEDns01ProviderType(AccessProviderTypeBaiduCloud) // 兼容旧值,等同于 [ACMEDns01ProviderTypeBaiduCloudDNS]
|
||||
ACMEDns01ProviderTypeBaiduCloudDNS = ACMEDns01ProviderType(AccessProviderTypeBaiduCloud + "-dns")
|
||||
ACMEDns01ProviderTypeBeget = ACMEDns01ProviderType(AccessProviderTypeBeget)
|
||||
ACMEDns01ProviderTypeBookMyName = ACMEDns01ProviderType(AccessProviderTypeBookMyName)
|
||||
ACMEDns01ProviderTypeBunny = ACMEDns01ProviderType(AccessProviderTypeBunny)
|
||||
ACMEDns01ProviderTypeCloudflare = ACMEDns01ProviderType(AccessProviderTypeCloudflare)
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
package beget
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/go-acme/lego/v5/providers/dns/beget"
|
||||
|
||||
"github.com/certimate-go/certimate/pkg/core/certifier"
|
||||
)
|
||||
|
||||
type ChallengerConfig struct {
|
||||
Username string `json:"username"`
|
||||
ApiPassword string `json:"apiPassword"`
|
||||
DnsPropagationTimeout int `json:"dnsPropagationTimeout,omitempty"`
|
||||
DnsTTL int `json:"dnsTTL,omitempty"`
|
||||
}
|
||||
|
||||
func NewChallenger(config *ChallengerConfig) (certifier.ACMEChallenger, error) {
|
||||
if config == nil {
|
||||
return nil, fmt.Errorf("the configuration of the acme challenge provider is nil")
|
||||
}
|
||||
|
||||
providerConfig := beget.NewDefaultConfig()
|
||||
providerConfig.Username = config.Username
|
||||
providerConfig.Password = config.ApiPassword
|
||||
if config.DnsPropagationTimeout != 0 {
|
||||
providerConfig.PropagationTimeout = time.Duration(config.DnsPropagationTimeout) * time.Second
|
||||
}
|
||||
if config.DnsTTL != 0 {
|
||||
providerConfig.TTL = config.DnsTTL
|
||||
}
|
||||
|
||||
provider, err := beget.NewDNSProviderConfig(providerConfig)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return provider, nil
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-8 0 102 40" width="200" height="200" fill="none"><path d="M51.1169 23.7018C55.3726 26.7135 56.0689 32.1073 53.6787 35.9103C51.3031 39.6903 46.5389 41.0618 42.5714 39.1364C38.8582 37.3346 36.2591 32.5326 38.4518 27.3202C38.0955 27.2658 37.7554 27.213 37.4154 27.1603C37.404 27.1174 37.3927 27.0729 37.3813 27.03C38.7011 26.585 40.0209 26.1399 41.4087 25.6701C41.6063 27.1405 41.7958 28.545 41.9836 29.9478C41.948 29.966 41.9107 29.9857 41.8751 30.0039C41.5901 29.5802 41.3035 29.1582 41.0087 28.7214C39.9416 30.6138 40.4047 33.4871 42.0354 35.2509C43.875 37.239 46.7899 37.722 49.1429 36.4263C51.4958 35.1306 52.7055 32.3579 52.0626 29.7286C51.4035 27.0333 49.104 25.1706 46.398 25.1393C41.8443 25.0865 38.2445 21.8176 37.6777 17.2233C37.1546 12.9785 39.94 8.85243 44.1034 7.71004C48.0563 6.6237 52.2294 8.52273 54.0965 12.2582C55.9604 15.9853 55.0066 20.5351 51.8132 23.1529C51.5946 23.3292 51.3711 23.5007 51.1169 23.7018ZM40.4501 16.2359C40.4387 19.5625 43.0427 22.2561 46.2895 22.2775C49.5623 22.299 52.2391 19.6037 52.244 16.2821C52.2472 12.9818 49.6028 10.2767 46.364 10.2685C43.1058 10.2586 40.4614 12.9291 40.4501 16.2359Z" fill="currentColor"></path><path d="M3.99524 12.3437C4.33855 10.931 4.63975 9.61714 4.99116 8.31815C5.03974 8.13682 5.31341 7.96868 5.51907 7.88955C8.61369 6.7109 12.0694 7.71646 14.2637 10.4199C17.8474 14.8312 16.5098 21.8026 11.5998 24.305C7.46232 26.4133 2.48761 24.394 0.711157 19.8063C0.31441 18.7826 0.0553109 17.632 0.0407365 16.5358C-0.0272771 11.1436 0.00834906 5.7482 0.00834906 0.35442C0.00834906 0.243973 0.0196847 0.135174 0.0261622 0C0.954062 0.00164846 1.84472 0.00164846 2.81796 0.00164846C2.81796 0.220894 2.81796 0.44014 2.81796 0.661034C2.81796 5.84546 2.81796 11.0299 2.81796 16.2127C2.81796 17.8166 3.28758 19.2541 4.34017 20.4607C6.47774 22.912 9.90433 22.8823 12.016 20.408C14.1196 17.9452 13.9479 13.9955 11.6419 11.7354C9.64199 9.77705 6.66235 9.77869 4.65919 11.7371C4.47296 11.9184 4.27539 12.0882 3.99524 12.3437Z" fill="currentColor"></path><path d="M35.2406 17.6977C33.0641 17.6977 30.878 17.6977 28.6902 17.6977C26.5025 17.6977 24.3163 17.6977 22.0573 17.6977C22.5933 19.7665 23.6928 21.2617 25.6426 21.9903C27.6587 22.7436 29.4092 22.1403 31.461 20.0369C32.235 20.4984 33.0188 20.965 33.8479 21.4595C32.5006 23.3898 30.7808 24.6542 28.5202 25.0119C24.0297 25.7224 19.8679 22.4667 19.2218 17.7917C18.8056 14.7799 19.5213 12.1028 21.6006 9.89386C25.6458 5.59302 32.4585 7.07994 34.7127 12.7292C35.3588 14.3431 35.5596 16.1811 35.2406 17.6977ZM32.3662 14.8178C32.0585 12.2957 29.6214 10.2137 27.1097 10.2648C24.7309 10.3142 22.3115 12.5182 22.1334 14.8178C25.5357 14.8178 28.9364 14.8178 32.3662 14.8178Z" fill="currentColor"></path><path d="M73.4564 17.693C69.063 17.693 64.7037 17.693 60.2569 17.693C60.7378 19.6464 61.7386 21.1235 63.5394 21.8636C65.9911 22.8725 67.9861 22.0235 69.6363 20.0322C70.4217 20.4987 71.1957 20.957 72.0378 21.4581C71.8678 21.6905 71.7253 21.9032 71.5666 22.101C68.3084 26.1447 62.5726 26.1447 59.3096 22.1043C56.4724 18.5898 56.6522 13.2553 59.7193 9.95512C63.8713 5.48778 70.9221 7.13625 73.0305 13.0674C73.5519 14.5329 73.6961 16.0314 73.4564 17.693ZM70.5512 14.8148C70.331 12.3454 67.7789 10.181 65.2186 10.27C62.8689 10.3524 60.3719 12.6784 60.3459 14.8148C63.7482 14.8148 67.1489 14.8148 70.5512 14.8148Z" fill="currentColor"></path><path d="M85.4075 20.6699C85.7087 21.5914 86.0244 22.5261 86.3078 23.4707C86.3451 23.596 86.256 23.8333 86.1475 23.9207C83.7039 25.8972 79.3413 25.4076 77.3657 22.9448C76.7552 22.1832 76.3989 21.3128 76.3973 20.3221C76.3924 14.8129 76.394 9.30378 76.3957 3.79461C76.3957 3.68416 76.4086 3.57206 76.4183 3.43359C77.3349 3.43359 78.2256 3.43359 79.1842 3.43359C79.1842 4.92381 79.1842 6.41896 79.1842 7.95863C80.891 7.95863 82.5315 7.95863 84.2156 7.95863C84.2156 8.92628 84.2156 9.84612 84.2156 10.8171C82.5671 10.8171 80.9267 10.8171 79.2344 10.8171C79.2215 11.0446 79.2037 11.2275 79.2037 11.4089C79.202 14.2871 79.2134 17.1653 79.1939 20.0435C79.1891 20.7243 79.4676 21.2123 79.9793 21.5931C81.1971 22.503 83.3816 22.508 84.5864 21.5749C84.8925 21.3425 85.1144 20.9996 85.4075 20.6699Z" fill="currentColor"></path></svg>
|
||||
@@ -20,6 +20,7 @@ import AccessConfigFieldsProviderBaishan from "./AccessConfigFieldsProviderBaish
|
||||
import AccessConfigFieldsProviderBaotaPanel from "./AccessConfigFieldsProviderBaotaPanel";
|
||||
import AccessConfigFieldsProviderBaotaPanelGo from "./AccessConfigFieldsProviderBaotaPanelGo";
|
||||
import AccessConfigFieldsProviderBaotaWAF from "./AccessConfigFieldsProviderBaotaWAF";
|
||||
import AccessConfigFieldsProviderBeget from "./AccessConfigFieldsProviderBeget";
|
||||
import AccessConfigFieldsProviderBookMyName from "./AccessConfigFieldsProviderBookMyName";
|
||||
import AccessConfigFieldsProviderBunny from "./AccessConfigFieldsProviderBunny";
|
||||
import AccessConfigFieldsProviderBytePlus from "./AccessConfigFieldsProviderBytePlus";
|
||||
@@ -141,6 +142,7 @@ const providerComponentMap: Partial<Record<AccessProviderType, React.ComponentTy
|
||||
[ACCESS_PROVIDERS.BAOTAPANEL]: AccessConfigFieldsProviderBaotaPanel,
|
||||
[ACCESS_PROVIDERS.BAOTAPANELGO]: AccessConfigFieldsProviderBaotaPanelGo,
|
||||
[ACCESS_PROVIDERS.BAOTAWAF]: AccessConfigFieldsProviderBaotaWAF,
|
||||
[ACCESS_PROVIDERS.BEGET]: AccessConfigFieldsProviderBeget,
|
||||
[ACCESS_PROVIDERS.BOOKMYNAME]: AccessConfigFieldsProviderBookMyName,
|
||||
[ACCESS_PROVIDERS.BUNNY]: AccessConfigFieldsProviderBunny,
|
||||
[ACCESS_PROVIDERS.BYTEPLUS]: AccessConfigFieldsProviderBytePlus,
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
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 AccessConfigFieldsProviderBeget = () => {
|
||||
const { i18n, t } = useTranslation();
|
||||
|
||||
const { parentNamePath } = useFormNestedFieldsContext();
|
||||
const formSchema = z.object({
|
||||
[parentNamePath]: getSchema({ i18n }),
|
||||
});
|
||||
const formRule = createSchemaFieldRule(formSchema);
|
||||
const initialValues = getInitialValues();
|
||||
|
||||
return (
|
||||
<>
|
||||
<Form.Item name={[parentNamePath, "username"]} initialValue={initialValues.username} label={t("access.form.beget_username.label")} rules={[formRule]}>
|
||||
<Input autoComplete="new-password" placeholder={t("access.form.beget_username.placeholder")} />
|
||||
</Form.Item>
|
||||
|
||||
<Form.Item
|
||||
name={[parentNamePath, "apiPassword"]}
|
||||
initialValue={initialValues.apiPassword}
|
||||
label={t("access.form.beget_api_password.label")}
|
||||
rules={[formRule]}
|
||||
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.beget_api_password.tooltip") }}></span>}
|
||||
>
|
||||
<Input.Password autoComplete="new-password" placeholder={t("access.form.beget_api_password.placeholder")} />
|
||||
</Form.Item>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
|
||||
return {
|
||||
username: "",
|
||||
apiPassword: "",
|
||||
};
|
||||
};
|
||||
|
||||
const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType<typeof getI18n> }) => {
|
||||
const { t: _ } = i18n;
|
||||
|
||||
return z.object({
|
||||
username: z.string().nonempty(),
|
||||
apiPassword: z.string().nonempty(),
|
||||
});
|
||||
};
|
||||
|
||||
const _default = Object.assign(AccessConfigFieldsProviderBeget, {
|
||||
getInitialValues,
|
||||
getSchema,
|
||||
});
|
||||
|
||||
export default _default;
|
||||
@@ -33,6 +33,7 @@ export const ACCESS_PROVIDERS = Object.freeze({
|
||||
BAOTAPANEL: "baotapanel",
|
||||
BAOTAPANELGO: "baotapanelgo",
|
||||
BAOTAWAF: "baotawaf",
|
||||
BEGET: "beget",
|
||||
BOOKMYNAME: "bookmyname",
|
||||
BUNNY: "bunny",
|
||||
BYTEPLUS: "byteplus",
|
||||
@@ -213,6 +214,7 @@ export const accessProvidersMap: Map<AccessProvider["type"] | string, AccessProv
|
||||
|
||||
[ACCESS_PROVIDERS.AKAMAI, "provider.akamai", "/imgs/providers/akamai.svg", [ACCESS_USAGES.DNS]],
|
||||
[ACCESS_PROVIDERS.ARVANCLOUD, "provider.arvancloud", "/imgs/providers/arvancloud.svg", [ACCESS_USAGES.DNS]],
|
||||
[ACCESS_PROVIDERS.BEGET, "provider.beget", "/imgs/providers/beget.svg", [ACCESS_USAGES.DNS]],
|
||||
[ACCESS_PROVIDERS.BOOKMYNAME, "provider.bookmyname", "/imgs/providers/bookmyname.png", [ACCESS_USAGES.DNS]],
|
||||
[ACCESS_PROVIDERS.CLOUDFLARE, "provider.cloudflare", "/imgs/providers/cloudflare.svg", [ACCESS_USAGES.DNS]],
|
||||
[ACCESS_PROVIDERS.CLOUDNS, "provider.cloudns", "/imgs/providers/cloudns.png", [ACCESS_USAGES.DNS]],
|
||||
@@ -375,6 +377,7 @@ export const ACME_DNS01_PROVIDERS = Object.freeze({
|
||||
AZURE_DNS: `${ACCESS_PROVIDERS.AZURE}-dns`,
|
||||
BAIDUCLOUD: `${ACCESS_PROVIDERS.BAIDUCLOUD}`, // 兼容旧值,等同于 `BAIDUCLOUD_DNS`
|
||||
BAIDUCLOUD_DNS: `${ACCESS_PROVIDERS.BAIDUCLOUD}-dns`,
|
||||
BEGET: `${ACCESS_PROVIDERS.BEGET}`,
|
||||
BOOKMYNAME: `${ACCESS_PROVIDERS.BOOKMYNAME}`,
|
||||
BUNNY: `${ACCESS_PROVIDERS.BUNNY}`,
|
||||
CLOUDFLARE: `${ACCESS_PROVIDERS.CLOUDFLARE}`,
|
||||
@@ -464,6 +467,7 @@ export const acmeDns01ProvidersMap: Map<ACMEDns01Provider["type"] | string, ACME
|
||||
[ACME_DNS01_PROVIDERS.AZURE_DNS, "provider.azure_dns"],
|
||||
[ACME_DNS01_PROVIDERS.AKAMAI_EDGEDNS, "provider.akamai_edgedns"],
|
||||
[ACME_DNS01_PROVIDERS.ARVANCLOUD, "provider.arvancloud"],
|
||||
[ACME_DNS01_PROVIDERS.BEGET, "provider.beget"],
|
||||
[ACME_DNS01_PROVIDERS.BOOKMYNAME, "provider.bookmyname"],
|
||||
[ACME_DNS01_PROVIDERS.BUNNY, "provider.bunny"],
|
||||
[ACME_DNS01_PROVIDERS.CLOUDFLARE, "provider.cloudflare"],
|
||||
|
||||
@@ -304,6 +304,15 @@
|
||||
"placeholder": "Please enter aaWAF API key",
|
||||
"tooltip": "For more information, see <a href=\"https://github.com/aaPanel/aaWAF/blob/main/API.md\" target=\"_blank\">https://github.com/aaPanel/aaWAF/blob/main/API.md</a>"
|
||||
},
|
||||
"beget_username": {
|
||||
"label": "Beget username",
|
||||
"placeholder": "Please enter Beget username"
|
||||
},
|
||||
"beget_api_password": {
|
||||
"label": "Beget API password",
|
||||
"placeholder": "Please enter Beget API password",
|
||||
"tooltip": "For more information, see <a href=\"https://cp.beget.com/settings/security/api\" target=\"_blank\">https://cp.beget.com/settings/security/api</a>"
|
||||
},
|
||||
"bookmyname_username": {
|
||||
"label": "BookMyName username",
|
||||
"placeholder": "Please enter BookMyName username"
|
||||
|
||||
@@ -84,6 +84,7 @@
|
||||
"baotawaf": "aaWAF (aka BaotaWAF)",
|
||||
"baotawaf_common": "aaWAF",
|
||||
"baotawaf_console": "aaWAF - Console itself",
|
||||
"beget": "Бегет (Beget)",
|
||||
"bookmyname": "BookMyName",
|
||||
"bunny": "Bunny",
|
||||
"bunny_cdn": "Bunny - CDN (Content Delivery Network)",
|
||||
|
||||
@@ -302,6 +302,15 @@
|
||||
"placeholder": "请输入堡塔云 WAF 接口密钥",
|
||||
"tooltip": "这是什么?请参阅 <a href=\"https://github.com/aaPanel/aaWAF/blob/main/API.md\" target=\"_blank\">https://github.com/aaPanel/aaWAF/blob/main/API.md</a>"
|
||||
},
|
||||
"beget_username": {
|
||||
"label": "Beget 用户名",
|
||||
"placeholder": "请输入 Beget 用户名"
|
||||
},
|
||||
"beget_api_password": {
|
||||
"label": "Beget API 密码",
|
||||
"placeholder": "请输入 Beget API 密码",
|
||||
"tooltip": "这是什么?请参阅 <a href=\"https://cp.beget.com/settings/security/api\" target=\"_blank\">https://cp.beget.com/settings/security/api</a>"
|
||||
},
|
||||
"bookmyname_username": {
|
||||
"label": "BookMyName 用户名",
|
||||
"placeholder": "请输入 BookMyName 用户名"
|
||||
|
||||
@@ -84,6 +84,7 @@
|
||||
"baotawaf": "堡塔云 WAF(又名:aaWAF)",
|
||||
"baotawaf_common": "堡塔云 WAF",
|
||||
"baotawaf_console": "堡塔云 WAF - 面板自身",
|
||||
"beget": "Бегет(Beget)",
|
||||
"bookmyname": "BookMyName",
|
||||
"bunny": "Bunny",
|
||||
"bunny_cdn": "Bunny - 内容分发网络 CDN",
|
||||
|
||||
Reference in New Issue
Block a user