package dns import ( "dove/models/dns" "strings" ) type ResolvedRecords struct { ARecords []dns.ARecord AAAARecords []dns.AAAARecord CNAMERecords []dns.CNAMERecord MXRecords []dns.MXRecord TXTRecords []dns.TXTRecord SRVRecords []dns.SRVRecord } func IsLocalDomain(queryName string) bool { _, tldName := splitQueryName(queryName) return tldExists(tldName) } func ResolveA(queryName string) []dns.ARecord { domainName, tldName, subdomain := splitQueryParts(queryName) foundDomain := findDomainByFQDN(domainName, tldName) if foundDomain == nil { return nil } records := FindARecords(foundDomain.ID, subdomain) if len(records) == 0 && subdomain != "@" { records = FindARecords(foundDomain.ID, "*") } return records } func ResolveAAAA(queryName string) []dns.AAAARecord { domainName, tldName, subdomain := splitQueryParts(queryName) foundDomain := findDomainByFQDN(domainName, tldName) if foundDomain == nil { return nil } records := FindAAAARecords(foundDomain.ID, subdomain) if len(records) == 0 && subdomain != "@" { records = FindAAAARecords(foundDomain.ID, "*") } return records } func ResolveCNAME(queryName string) []dns.CNAMERecord { domainName, tldName, subdomain := splitQueryParts(queryName) foundDomain := findDomainByFQDN(domainName, tldName) if foundDomain == nil { return nil } records := FindCNAMERecords(foundDomain.ID, subdomain) if len(records) == 0 && subdomain != "@" { records = FindCNAMERecords(foundDomain.ID, "*") } return records } func ResolveMX(queryName string) []dns.MXRecord { domainName, tldName, subdomain := splitQueryParts(queryName) foundDomain := findDomainByFQDN(domainName, tldName) if foundDomain == nil { return nil } return FindMXRecords(foundDomain.ID, subdomain) } func ResolveTXT(queryName string) []dns.TXTRecord { domainName, tldName, subdomain := splitQueryParts(queryName) foundDomain := findDomainByFQDN(domainName, tldName) if foundDomain == nil { return nil } return FindTXTRecords(foundDomain.ID, subdomain) } func ResolveSRV(queryName string) []dns.SRVRecord { domainName, tldName, subdomain := splitQueryParts(queryName) foundDomain := findDomainByFQDN(domainName, tldName) if foundDomain == nil { return nil } return FindSRVRecords(foundDomain.ID, subdomain) } func splitQueryName(queryName string) (string, string) { name := strings.TrimSuffix(queryName, ".") parts := strings.Split(name, ".") if len(parts) < 2 { return name, "" } tldName := parts[len(parts)-1] domainName := parts[len(parts)-2] return domainName, tldName } func splitQueryParts(queryName string) (string, string, string) { name := strings.TrimSuffix(queryName, ".") parts := strings.Split(name, ".") if len(parts) < 2 { return name, "", "@" } tldName := parts[len(parts)-1] domainName := parts[len(parts)-2] if len(parts) == 2 { return domainName, tldName, "@" } subdomain := strings.Join(parts[:len(parts)-2], ".") return domainName, tldName, subdomain }