pages-server/utils/dns.go
hazycora e7a14c2100
All checks were successful
Deploy to VPS / build_site (push) Successful in 6s
add error pages
2024-03-29 23:03:26 -05:00

89 lines
1.8 KiB
Go

package utils
import (
"context"
"net"
"os"
"strings"
"time"
"git.gay/gitgay/pages/errors"
)
var (
DNS_SERVER string
ourIPs []net.IP
Resolver *net.Resolver
)
func init() {
dnsServer, ok := os.LookupEnv("DNS_SERVER")
if !ok {
DNS_SERVER = "1.1.1.1:53"
} else {
DNS_SERVER = dnsServer
}
Resolver = &net.Resolver{
PreferGo: true,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
d := net.Dialer{
Timeout: time.Millisecond * time.Duration(10000),
}
return d.DialContext(ctx, network, DNS_SERVER)
},
}
var err error
ourIPs, err = Resolver.LookupIP(context.Background(), "ip", PAGES_DOMAIN)
if err != nil {
panic(err)
}
}
func PointingAtUs(domain string) (ok bool) {
if !strings.HasSuffix(domain, ".") {
domain += "."
}
if strings.HasSuffix(domain, "."+PAGES_DOMAIN_CANONICAL) {
return true
}
ips, err := Resolver.LookupIP(context.Background(), "ip", domain)
if err != nil {
return
}
for _, ip := range ips {
for _, ourIP := range ourIPs {
if ip.Equal(ourIP) {
ok = true
return
}
}
}
return
}
func getTarget(domain string) (target string, err error) {
if !strings.HasSuffix(domain, ".") {
domain += "."
}
if strings.HasSuffix(domain, "."+PAGES_DOMAIN_CANONICAL) {
target = strings.TrimSuffix(domain, ".")
return
}
ctx := context.Background()
txtResults, txtErr := Resolver.LookupTXT(ctx, domain)
cnameResult, cnameErr := Resolver.LookupCNAME(ctx, domain)
if txtErr != nil && cnameErr != nil {
err = errors.NewErrorDNSNotConfigured()
return
}
allResults := append(txtResults, cnameResult)
for _, result := range allResults {
result = strings.TrimSuffix(result, ".")
if strings.HasSuffix(result, PAGES_SUBDOMAIN) {
return result, nil
}
}
err = errors.NewErrorNotPointedAtUs()
return
}