mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-05-11 05:55:12 +00:00
PopulateFromString is back to the original txt parser
This commit is contained in:
@ -97,9 +97,6 @@ func RRtoRC(rr dns.RR, origin string) (RecordConfig, error) {
|
||||
case *dns.TLSA:
|
||||
err = rc.SetTargetTLSA(v.Usage, v.Selector, v.MatchingType, v.Certificate)
|
||||
case *dns.TXT:
|
||||
//fmt.Fprintf(os.Stdout, "DEBUG: RRtoRC TXT inbounds=%s q=%q\n", v.Txt, v.Txt)
|
||||
//d := strings.ReplaceAll(strings.Join(v.Txt, ""), `\"`, `"`)
|
||||
//fmt.Fprintf(os.Stdout, "DEBUG: RRtoRC TXT decodeds=%s q=%q\n", d, d)
|
||||
err = rc.SetTargetTXTs(v.Txt)
|
||||
default:
|
||||
return *rc, fmt.Errorf("rrToRecord: Unimplemented zone record type=%s (%v)", rc.Type, rr)
|
||||
|
@ -395,7 +395,7 @@ func (rc *RecordConfig) ToRR() dns.RR {
|
||||
rr.(*dns.SOA).Expire = rc.SoaExpire
|
||||
rr.(*dns.SOA).Minttl = rc.SoaMinttl
|
||||
case dns.TypeSPF:
|
||||
rr.(*dns.SPF).Txt = []string{rc.target}
|
||||
rr.(*dns.SPF).Txt = rc.GetTargetTXTChunked255()
|
||||
case dns.TypeSRV:
|
||||
rr.(*dns.SRV).Priority = rc.SrvPriority
|
||||
rr.(*dns.SRV).Weight = rc.SrvWeight
|
||||
@ -411,7 +411,7 @@ func (rc *RecordConfig) ToRR() dns.RR {
|
||||
rr.(*dns.TLSA).Selector = rc.TlsaSelector
|
||||
rr.(*dns.TLSA).Certificate = rc.GetTargetField()
|
||||
case dns.TypeTXT:
|
||||
rr.(*dns.TXT).Txt = []string{rc.target}
|
||||
rr.(*dns.TXT).Txt = rc.GetTargetTXTChunked255()
|
||||
default:
|
||||
panic(fmt.Sprintf("ToRR: Unimplemented rtype %v", rc.Type))
|
||||
// We panic so that we quickly find any switch statements
|
||||
|
@ -3,8 +3,6 @@ package models
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/StackExchange/dnscontrol/v4/pkg/txtutil"
|
||||
)
|
||||
|
||||
// PopulateFromString populates a RecordConfig given a type and string. Many
|
||||
@ -17,27 +15,26 @@ import (
|
||||
// Recommended calling convention: Process the exceptions first, then use the
|
||||
// PopulateFromString function for everything else.
|
||||
//
|
||||
// rtype := FILL_IN_TYPE
|
||||
// var err error
|
||||
// rc := &models.RecordConfig{Type: rtype}
|
||||
// rc.SetLabelFromFQDN(FILL_IN_NAME, origin)
|
||||
// rc.TTL = uint32(FILL_IN_TTL)
|
||||
// rc.Original = FILL_IN_ORIGINAL // The raw data received from provider (if needed later)
|
||||
// switch rtype {
|
||||
// case "MX":
|
||||
// // MX priority in a separate field.
|
||||
// err = rc.SetTargetMX(cr.Priority, target)
|
||||
// case "TXT":
|
||||
// // TXT records are stored verbatim; no quoting/escaping to parse.
|
||||
// err = rc.SetTargetTXT(target)
|
||||
// default:
|
||||
// err = rc.PopulateFromString(rtype, target, origin)
|
||||
// }
|
||||
// if err != nil {
|
||||
// return nil, fmt.Errorf("unparsable record type=%q received from PROVDER_NAME: %w", rtype, err)
|
||||
// }
|
||||
// return rc, nil
|
||||
|
||||
// rtype := FILL_IN_TYPE
|
||||
// var err error
|
||||
// rc := &models.RecordConfig{Type: rtype}
|
||||
// rc.SetLabelFromFQDN(FILL_IN_NAME, origin)
|
||||
// rc.TTL = uint32(FILL_IN_TTL)
|
||||
// rc.Original = FILL_IN_ORIGINAL // The raw data received from provider (if needed later)
|
||||
// switch rtype {
|
||||
// case "MX":
|
||||
// // MX priority in a separate field.
|
||||
// err = rc.SetTargetMX(cr.Priority, target)
|
||||
// case "TXT":
|
||||
// // TXT records are stored verbatim; no quoting/escaping to parse.
|
||||
// err = rc.SetTargetTXT(target)
|
||||
// default:
|
||||
// err = rc.PopulateFromString(rtype, target, origin)
|
||||
// }
|
||||
// if err != nil {
|
||||
// return nil, fmt.Errorf("unparsable record type=%q received from PROVDER_NAME: %w", rtype, err)
|
||||
// }
|
||||
// return rc, nil
|
||||
func (rc *RecordConfig) PopulateFromString(rtype, contents, origin string) error {
|
||||
if rc.Type != "" && rc.Type != rtype {
|
||||
panic(fmt.Errorf("assertion failed: rtype already set (%s) (%s)", rtype, rc.Type))
|
||||
@ -72,11 +69,59 @@ func (rc *RecordConfig) PopulateFromString(rtype, contents, origin string) error
|
||||
case "SOA":
|
||||
return rc.SetTargetSOAString(contents)
|
||||
case "SPF", "TXT":
|
||||
t, err := txtutil.ParseQuoted(contents)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return rc.SetTargetTXT(t)
|
||||
return rc.SetTargetTXTs(ParseQuotedTxt(contents))
|
||||
case "SRV":
|
||||
return rc.SetTargetSRVString(contents)
|
||||
case "SSHFP":
|
||||
return rc.SetTargetSSHFPString(contents)
|
||||
case "TLSA":
|
||||
return rc.SetTargetTLSAString(contents)
|
||||
default:
|
||||
return fmt.Errorf("unknown rtype (%s) when parsing (%s) domain=(%s)",
|
||||
rtype, contents, origin)
|
||||
}
|
||||
}
|
||||
|
||||
func (rc *RecordConfig) PopulateFromStringFunc(rtype, contents, origin string, txtFn func(s string) string) error {
|
||||
if rc.Type != "" && rc.Type != rtype {
|
||||
return fmt.Errorf("assertion failed: rtype already set (%s) (%s)", rtype, rc.Type)
|
||||
}
|
||||
|
||||
switch rc.Type = rtype; rtype { // #rtype_variations
|
||||
case "A":
|
||||
ip := net.ParseIP(contents)
|
||||
if ip == nil || ip.To4() == nil {
|
||||
return fmt.Errorf("invalid IP in A record: %s", contents)
|
||||
}
|
||||
return rc.SetTargetIP(ip) // Reformat to canonical form.
|
||||
case "AAAA":
|
||||
ip := net.ParseIP(contents)
|
||||
if ip == nil || ip.To16() == nil {
|
||||
return fmt.Errorf("invalid IP in AAAA record: %s", contents)
|
||||
}
|
||||
return rc.SetTargetIP(ip) // Reformat to canonical form.
|
||||
case "AKAMAICDN", "ALIAS", "ANAME", "CNAME", "NS", "PTR":
|
||||
return rc.SetTarget(contents)
|
||||
case "CAA":
|
||||
return rc.SetTargetCAAString(contents)
|
||||
case "DS":
|
||||
return rc.SetTargetDSString(contents)
|
||||
case "DHCID":
|
||||
return rc.SetTarget(contents)
|
||||
case "LOC":
|
||||
return rc.SetTargetLOCString(origin, contents)
|
||||
case "MX":
|
||||
return rc.SetTargetMXString(contents)
|
||||
case "NAPTR":
|
||||
return rc.SetTargetNAPTRString(contents)
|
||||
case "SOA":
|
||||
return rc.SetTargetSOAString(contents)
|
||||
case "SPF", "TXT":
|
||||
if txtFn == nil {
|
||||
return rc.SetTargetTXT(contents)
|
||||
} else {
|
||||
return rc.SetTargetTXT(txtFn(contents))
|
||||
}
|
||||
case "SRV":
|
||||
return rc.SetTargetSRVString(contents)
|
||||
case "SSHFP":
|
||||
|
Reference in New Issue
Block a user