// TrimDomainName trims origin from s if s is a subdomain. // This function will never return "", but returns "@" instead (@ represents the apex (bare) domain). func TrimDomainName(s, origin string) string { // An apex (bare) domain is always returned as "@". // If the return value ends in a ".", the domain was not the suffix. // origin can end in "." or not. Either way the results should be the same. if len(s) == 0 { return "@" // Return the apex (@) rather than "". } // Someone is using TrimDomainName(s, ".") to remove a dot if it exists. if origin == "." { return strings.TrimSuffix(s, origin) } // Dude, you aren't even if the right subdomain! if !dns.IsSubDomain(origin, s) { return s } slabels := dns.Split(s) olabels := dns.Split(origin) m := dns.CompareDomainName(s, origin) if len(olabels) == m { if len(olabels) == len(slabels) { return "@" // origin == s } if (s[0] == '.') && (len(slabels) == (len(olabels) + 1)) { return "@" // TrimDomainName(".foo.", "foo.") } } // Return the first (len-m) labels: return s[:slabels[len(slabels)-m]-1] }
// saveDNSRR saves 1 or more DNS records to the resolver cache. func (r *Resolver) saveDNSRR(host string, qname string, drrs []dns.RR) RRs { var rrs RRs cl := dns.CountLabel(qname) for _, drr := range drrs { rr, ok := convertRR(drr) if !ok { continue } if dns.CountLabel(rr.Name) < cl && dns.CompareDomainName(qname, rr.Name) < 2 { // fmt.Fprintf(os.Stderr, "Warning: potential poisoning from %s: %s -> %s\n", host, qname, drr.String()) continue } r.cache.add(rr.Name, rr) rrs = append(rrs, rr) } return rrs }