Files
mailgoserver/internal/acmecert/providers.go
T

50 lines
1.8 KiB
Go

package acmecert
import (
"fmt"
"os"
"github.com/go-acme/lego/v4/challenge"
"github.com/go-acme/lego/v4/providers/dns/cloudflare"
"github.com/go-acme/lego/v4/providers/dns/digitalocean"
"github.com/go-acme/lego/v4/providers/dns/gcloud"
"github.com/go-acme/lego/v4/providers/dns/route53"
"gopkg.in/ini.v1"
)
// buildDNSProvider constructs the lego DNS-01 provider selected by [LetsEncrypt]
// dns_provider. A plain switch is the right amount of structure for a fixed set of
// providers — no pluggable registry needed.
func buildDNSProvider(cfg *ini.File) (challenge.Provider, error) {
sec := cfg.Section("LetsEncrypt")
switch name := sec.Key("dns_provider").String(); name {
case "cloudflare":
c := cloudflare.NewDefaultConfig()
c.AuthToken = sec.Key("cloudflare_api_token").String()
return cloudflare.NewDNSProviderConfig(c)
case "route53":
c := route53.NewDefaultConfig()
c.AccessKeyID = sec.Key("route53_access_key_id").String()
c.SecretAccessKey = sec.Key("route53_secret_access_key").String()
c.Region = sec.Key("route53_region").String()
c.HostedZoneID = sec.Key("route53_hosted_zone_id").String()
return route53.NewDNSProviderConfig(c)
case "digitalocean":
c := digitalocean.NewDefaultConfig()
c.AuthToken = sec.Key("digitalocean_api_token").String()
return digitalocean.NewDNSProviderConfig(c)
case "gcloud":
project := sec.Key("gcloud_project").String()
if saPath := sec.Key("gcloud_service_account_json_path").String(); saPath != "" {
keyBytes, err := os.ReadFile(saPath)
if err != nil {
return nil, fmt.Errorf("read gcloud service account file: %w", err)
}
return gcloud.NewDNSProviderServiceAccountKey(keyBytes)
}
return gcloud.NewDNSProviderCredentials(project)
default:
return nil, fmt.Errorf("unknown or unset Let's Encrypt DNS provider %q", name)
}
}