Files
vps/.agents/skills/encrypted-dns-skill/internal/edns/providers.go
T

107 lines
2.9 KiB
Go

package edns
import (
"errors"
"fmt"
"strings"
)
type UnsupportedError struct {
Message string
}
func (err *UnsupportedError) Error() string { return err.Message }
func IsUnsupported(err error) bool {
var unsupported *UnsupportedError
return errors.As(err, &unsupported)
}
type Provider struct {
ID string
Profile string
SourceURL string
VerifiedDate string
DoHURL string
DoTAddr string
DoTName string
DoQAddr string
DoQName string
DoH3URL string
DNSCryptStamp string
}
var providers = map[string]Provider{
"cloudflare": {
ID: "cloudflare",
Profile: "unfiltered",
SourceURL: "https://developers.cloudflare.com/1.1.1.1/encryption/",
VerifiedDate: "2026-08-13",
DoHURL: "https://cloudflare-dns.com/dns-query",
DoTAddr: "one.one.one.one:853",
DoTName: "one.one.one.one",
DoH3URL: "https://cloudflare-dns.com/dns-query",
},
"google": {
ID: "google",
Profile: "unfiltered",
SourceURL: "https://developers.google.com/speed/public-dns/docs/secure-transports",
VerifiedDate: "2026-08-13",
DoHURL: "https://dns.google/dns-query",
DoTAddr: "dns.google:853",
DoTName: "dns.google",
DoH3URL: "https://dns.google/dns-query",
},
"quad9": {
ID: "quad9",
Profile: "security-filtered",
SourceURL: "https://docs.quad9.net/services/",
VerifiedDate: "2026-08-13",
DoHURL: "https://dns.quad9.net/dns-query",
DoTAddr: "dns.quad9.net:853",
DoTName: "dns.quad9.net",
},
"adguard": {
ID: "adguard",
Profile: "ad-and-security-filtered",
SourceURL: "https://adguard-dns.io/kb/en/public-dns/overview/",
VerifiedDate: "2026-08-13",
DoHURL: "https://dns.adguard-dns.com/dns-query",
DoTAddr: "dns.adguard-dns.com:853",
DoTName: "dns.adguard-dns.com",
DoQAddr: "dns.adguard-dns.com:853",
DoQName: "dns.adguard-dns.com",
DNSCryptStamp: "sdns://AQMAAAAAAAAAETk0LjE0MC4xNC4xNDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20",
},
}
func (provider Provider) Endpoint(protocol string) (string, error) {
var endpoint string
switch strings.ToLower(protocol) {
case "doh":
endpoint = provider.DoHURL
case "dot":
endpoint = provider.DoTAddr
case "doq":
endpoint = provider.DoQAddr
case "doh3":
endpoint = provider.DoH3URL
case "dnscrypt":
endpoint = provider.DNSCryptStamp
default:
return "", &UnsupportedError{Message: fmt.Sprintf("protocol %q is not available", protocol)}
}
if endpoint == "" {
return "", &UnsupportedError{Message: fmt.Sprintf("provider %q does not support protocol %q", provider.ID, protocol)}
}
return endpoint, nil
}
func FindProvider(name string) (Provider, error) {
provider, ok := providers[strings.ToLower(name)]
if !ok {
return Provider{}, fmt.Errorf("unknown provider %q", name)
}
return provider, nil
}