diff --git a/integrationTest/integration_test.go b/integrationTest/integration_test.go index bb40d62a4..da6490b69 100644 --- a/integrationTest/integration_test.go +++ b/integrationTest/integration_test.go @@ -179,6 +179,12 @@ func makeTests() []*TestGroup { tc("Create RP", rp("foo", "other.example.com.", "bar.com.")), tc("Create RP", rp("foo", "other.example.com.", "example.com.")), ), + testgroup("RP", + requires(providers.CanUseRP), + tc("Create RP", rp("foo", "user", "server")), + tc("Create RP", rp("foo", "user2", "server")), + tc("Create RP", rp("foo", "user2", "waiter")), + ), // TXT diff --git a/pkg/rtype/rp.go b/pkg/rtype/rp.go index 62942b5f2..101610a5b 100644 --- a/pkg/rtype/rp.go +++ b/pkg/rtype/rp.go @@ -1,10 +1,13 @@ package rtype import ( + "fmt" + "github.com/StackExchange/dnscontrol/v4/models" "github.com/StackExchange/dnscontrol/v4/pkg/domaintags" "github.com/StackExchange/dnscontrol/v4/pkg/rtypecontrol" "github.com/miekg/dns" + "github.com/miekg/dns/dnsutil" ) func init() { @@ -27,10 +30,11 @@ func (handle *RP) FromArgs(dcn *domaintags.DomainNameVarieties, rec *models.Reco } fields := &RP{ dns.RP{ - Mbox: args[1].(string), - Txt: args[2].(string), + Mbox: dnsutil.AddOrigin(args[1].(string), dcn.NameASCII), + Txt: dnsutil.AddOrigin(args[2].(string), dcn.NameASCII), }, } + fmt.Printf("RP FromArgs: %+v\n", fields) return handle.FromStruct(dcn, rec, args[0].(string), fields) } diff --git a/pkg/rtypecontrol/import.go b/pkg/rtypecontrol/import.go index f94697807..1f0a5c285 100644 --- a/pkg/rtypecontrol/import.go +++ b/pkg/rtypecontrol/import.go @@ -99,7 +99,18 @@ func NewRecordConfigFromStruct(name string, ttl uint32, t string, fields any, dc // setRecordNames updates the .Name* fields. func setRecordNames(rec *models.RecordConfig, dcn *domaintags.DomainNameVarieties, n string) { - // FYI(tlim): This code could be collapse + + if strings.HasSuffix(n, ".") { + nr := n[:len(n)-1] + rec.Name = strings.ToLower(domaintags.EfficientToASCII(nr)) + rec.NameRaw = nr + rec.NameUnicode = domaintags.EfficientToUnicode(rec.Name) + rec.NameFQDN = rec.Name + rec.NameFQDNRaw = rec.NameRaw + rec.NameFQDNUnicode = rec.NameUnicode + return + } + if rec.SubDomain == "" { // Not _EXTEND() mode: if n == "@" { @@ -109,9 +120,6 @@ func setRecordNames(rec *models.RecordConfig, dcn *domaintags.DomainNameVarietie rec.NameFQDN = dcn.NameASCII rec.NameFQDNRaw = dcn.NameRaw rec.NameFQDNUnicode = dcn.NameUnicode - rec.NameFQDN = dcn.NameASCII - rec.NameFQDNRaw = dcn.NameRaw - rec.NameFQDNUnicode = dcn.NameUnicode } else { rec.Name = strings.ToLower(domaintags.EfficientToASCII(n)) rec.NameRaw = n diff --git a/pkg/rtypecontrol/setrecordnames_test.go b/pkg/rtypecontrol/setrecordnames_test.go index 8764b39b8..8be330bed 100644 --- a/pkg/rtypecontrol/setrecordnames_test.go +++ b/pkg/rtypecontrol/setrecordnames_test.go @@ -172,6 +172,20 @@ func TestSetRecordNames(t *testing.T) { NameFQDNUnicode: "www.bücher.bücher.com", }, }, + { + name: "dotted_label", + rec: &models.RecordConfig{}, + dc: dc, + n: "example.com.", + expectedRec: &models.RecordConfig{ + Name: "example.com", + NameRaw: "example.com", + NameUnicode: "example.com", + NameFQDN: "example.com", + NameFQDNRaw: "example.com", + NameFQDNUnicode: "example.com", + }, + }, } for _, tt := range tests { diff --git a/providers/bind/bindProvider.go b/providers/bind/bindProvider.go index e7bc11211..497687906 100644 --- a/providers/bind/bindProvider.go +++ b/providers/bind/bindProvider.go @@ -215,7 +215,6 @@ func ParseZoneContents(content string, zoneName string, zonefileName string) (mo switch rtype { case dns.TypeRP: name := rr.Header().Name - name = strings.TrimSuffix(name, ".") prec, err = rtypecontrol.NewRecordConfigFromStruct(name, rr.Header().Ttl, "RP", rr, domaintags.MakeDomainNameVarieties(zoneName)) if err != nil { return nil, err