Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 11 additions & 13 deletions providers/websupport/auditrecords_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,35 +7,33 @@ import (
)

func makeRC(rtype, label, target string) *models.RecordConfig {
rc := &models.RecordConfig{Type: rtype}
rc.SetLabel(label, "example.com")
dc := models.MustNewDomainConfig("example.com")
switch rtype {
case "TXT":
_ = rc.SetTargetTXT(target)
return dc.MustNewRecordConfig(label, 0, rtype, target)
case "MX":
_ = rc.SetTargetMX(10, target)
return dc.MustNewRecordConfig(label, 0, rtype, 10, target)
case "SRV":
_ = rc.SetTargetSRV(0, 0, 443, target)
return dc.MustNewRecordConfig(label, 0, rtype, 0, 0, 443, target)
default:
_ = rc.SetTarget(target)
return dc.MustNewRecordConfig(label, 0, rtype, target)
}
return rc
}

func TestAuditRecords(t *testing.T) {
tests := []struct {
name string
records []*models.RecordConfig
records models.Records
wantCount int
}{
{
name: "empty",
records: []*models.RecordConfig{},
records: models.Records{},
wantCount: 0,
},
{
name: "supported types are fine",
records: []*models.RecordConfig{
records: models.Records{
makeRC("A", "@", "1.2.3.4"),
makeRC("AAAA", "@", "::1"),
makeRC("CNAME", "www", "example.net."),
Expand All @@ -47,17 +45,17 @@ func TestAuditRecords(t *testing.T) {
},
{
name: "NS is rejected (API silently drops it)",
records: []*models.RecordConfig{makeRC("NS", "deleg", "ns1.example.net.")},
records: models.Records{makeRC("NS", "deleg", "ns1.example.net.")},
wantCount: 1,
},
{
name: "empty TXT is rejected",
records: []*models.RecordConfig{makeRC("TXT", "@", "")},
records: models.Records{makeRC("TXT", "@", "")},
wantCount: 1,
},
{
name: "SRV with null target is rejected",
records: []*models.RecordConfig{makeRC("SRV", "_sip._tcp", ".")},
records: models.Records{makeRC("SRV", "_sip._tcp", ".")},
wantCount: 1,
},
}
Expand Down
42 changes: 23 additions & 19 deletions providers/websupport/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,52 +43,56 @@ func toNative(rc *models.RecordConfig) (nativeRecord, error) {

switch rc.Type {
case "MX":
r.Content = trimDot(rc.GetTargetField())
r.Priority = intPtr(rc.MxPreference)
f := rc.AsMX()
r.Priority = intPtr(f.Preference)
r.Content = trimDot(f.Mx)
// r.Content = trimDot(rc.GetTargetField())
// r.Priority = intPtr(rc.MxPreference)
case "SRV":
r.Content = trimDot(rc.GetTargetField())
r.Priority = intPtr(rc.SrvPriority)
r.Weight = intPtr(rc.SrvWeight)
r.Port = intPtr(rc.SrvPort)
f := rc.AsSRV()
r.Priority = intPtr(f.Priority)
r.Weight = intPtr(f.Weight)
r.Port = intPtr(f.Port)
r.Content = trimDot(f.Target)
case "TXT":
r.Content = rc.GetTargetTXTJoined()
case "CNAME":
r.Content = trimDot(rc.GetTargetField())
f := rc.AsCNAME()
r.Content = trimDot(f.Target)
default:
r.Content = rc.GetTargetField()
// TODO(tlim): Try this instead.
//r.Content = rc.GetRDATA().String()
}

return r, nil
}

// toRecordConfig converts a WebSupport native record into a dnscontrol RecordConfig.
func toRecordConfig(domain string, n nativeRecord) (*models.RecordConfig, error) {
rc := &models.RecordConfig{
Type: n.Type,
TTL: n.TTL,
Original: n,
}
rc.SetLabelFromFQDN(n.Name, domain)

func toRecordConfig(dc *models.DomainConfig, n nativeRecord) (*models.RecordConfig, error) {
content := n.Content
if fqdnTypes[n.Type] {
content = ensureDot(content)
}

label := dc.LabelFromFQDNNoDot(n.Name)
ttl := n.TTL
var rc *models.RecordConfig
var err error
switch n.Type {
case "MX":
err = rc.SetTargetMX(derefInt(n.Priority), content)
rc, err = dc.NewRecordConfig(label, ttl, n.Type, derefInt(n.Priority), content)
case "SRV":
err = rc.SetTargetSRV(derefInt(n.Priority), derefInt(n.Weight), derefInt(n.Port), content)
rc, err = dc.NewRecordConfig(label, ttl, n.Type, derefInt(n.Priority), derefInt(n.Weight), derefInt(n.Port), content)
case "TXT":
err = rc.SetTargetTXT(n.Content)
rc, err = dc.NewRecordConfig(label, ttl, n.Type, n.Content)
default:
err = rc.SetTarget(content)
rc, err = dc.NewRecordConfig(label, ttl, n.Type, content)
}
if err != nil {
return nil, fmt.Errorf("WEBSUPPORT: %s record %q: %w", n.Type, n.Name, err)
}
rc.Original = n
return rc, nil
}

Expand Down
25 changes: 12 additions & 13 deletions providers/websupport/convert_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,10 @@ import (

const testDomain = "example.com"

func mkRC(t *testing.T, rtype, label string, build func(rc *models.RecordConfig)) *models.RecordConfig {
func mkRC(t *testing.T, rtype, label string, args ...any) *models.RecordConfig {
t.Helper()
rc := &models.RecordConfig{Type: rtype, TTL: 3600}
rc.SetLabel(label, testDomain)
build(rc)
return rc
dc := models.MustNewDomainConfig(testDomain)
return dc.MustNewRecordConfig(label, 3600, rtype, args...)
}

func TestRoundTrip(t *testing.T) {
Expand All @@ -26,42 +24,42 @@ func TestRoundTrip(t *testing.T) {
}{
{
name: "A apex",
rc: mkRC(t, "A", "@", func(rc *models.RecordConfig) { _ = rc.SetTarget("1.2.3.4") }),
rc: mkRC(t, "A", "@", "1.2.3.4"),
wantType: "A",
wantName: "@",
wantContent: "1.2.3.4",
},
{
name: "CNAME strips trailing dot",
rc: mkRC(t, "CNAME", "www", func(rc *models.RecordConfig) { _ = rc.SetTarget("ghs.example.net.") }),
rc: mkRC(t, "CNAME", "www", "ghs.example.net."),
wantType: "CNAME",
wantName: "www",
wantContent: "ghs.example.net",
},
{
name: "MX",
rc: mkRC(t, "MX", "@", func(rc *models.RecordConfig) { _ = rc.SetTargetMX(10, "mail.example.com.") }),
rc: mkRC(t, "MX", "@", 10, "mail.example.com."),
wantType: "MX",
wantName: "@",
wantContent: "mail.example.com",
},
{
name: "SRV",
rc: mkRC(t, "SRV", "_sip._tcp", func(rc *models.RecordConfig) { _ = rc.SetTargetSRV(10, 20, 5060, "sip.example.com.") }),
rc: mkRC(t, "SRV", "_sip._tcp", 10, 20, 5060, "sip.example.com."),
wantType: "SRV",
wantName: "_sip._tcp",
wantContent: "sip.example.com",
},
{
name: "AAAA",
rc: mkRC(t, "AAAA", "ipv6", func(rc *models.RecordConfig) { _ = rc.SetTarget("2a00:4b40:aaaa:2001::6") }),
rc: mkRC(t, "AAAA", "ipv6", "2a00:4b40:aaaa:2001::6"),
wantType: "AAAA",
wantName: "ipv6",
wantContent: "2a00:4b40:aaaa:2001::6",
},
{
name: "TXT",
rc: mkRC(t, "TXT", "@", func(rc *models.RecordConfig) { _ = rc.SetTargetTXT("hello world") }),
rc: mkRC(t, "TXT", "@", "hello world"),
wantType: "TXT",
wantName: "@",
wantContent: "hello world",
Expand Down Expand Up @@ -89,11 +87,12 @@ func TestRoundTrip(t *testing.T) {
// even though writes use the relative label.
n.ID = 42
n.Name = tc.rc.GetLabelFQDN()
rc2, err := toRecordConfig(testDomain, n)
dc := models.MustNewDomainConfig(testDomain)
rc2, err := toRecordConfig(dc, n)
if err != nil {
t.Fatalf("toRecordConfig: %v", err)
}
if got, want := rc2.GetTargetCombined(), tc.rc.GetTargetCombined(); got != want {
if got, want := rc2.String(), tc.rc.String(); got != want {
t.Errorf("round-trip target = %q, want %q", got, want)
}
if rc2.Type != tc.rc.Type {
Expand Down
2 changes: 1 addition & 1 deletion providers/websupport/records.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func (c *websupportProvider) GetZoneRecords(dc *models.DomainConfig) (models.Rec

recs := make(models.Records, 0, len(nativeRecs))
for _, n := range nativeRecs {
rc, err := toRecordConfig(dc.Name, n)
rc, err := toRecordConfig(dc, n)
if err != nil {
return nil, err
}
Expand Down
Loading