RP works with dotted hosts

This commit is contained in:
Thomas Limoncelli 2025-12-04 14:51:32 -05:00
parent b0a909b853
commit 843478172c
No known key found for this signature in database
5 changed files with 38 additions and 7 deletions

View file

@ -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.", "bar.com.")),
tc("Create RP", rp("foo", "other.example.com.", "example.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 // TXT

View file

@ -1,10 +1,13 @@
package rtype package rtype
import ( import (
"fmt"
"github.com/StackExchange/dnscontrol/v4/models" "github.com/StackExchange/dnscontrol/v4/models"
"github.com/StackExchange/dnscontrol/v4/pkg/domaintags" "github.com/StackExchange/dnscontrol/v4/pkg/domaintags"
"github.com/StackExchange/dnscontrol/v4/pkg/rtypecontrol" "github.com/StackExchange/dnscontrol/v4/pkg/rtypecontrol"
"github.com/miekg/dns" "github.com/miekg/dns"
"github.com/miekg/dns/dnsutil"
) )
func init() { func init() {
@ -27,10 +30,11 @@ func (handle *RP) FromArgs(dcn *domaintags.DomainNameVarieties, rec *models.Reco
} }
fields := &RP{ fields := &RP{
dns.RP{ dns.RP{
Mbox: args[1].(string), Mbox: dnsutil.AddOrigin(args[1].(string), dcn.NameASCII),
Txt: args[2].(string), Txt: dnsutil.AddOrigin(args[2].(string), dcn.NameASCII),
}, },
} }
fmt.Printf("RP FromArgs: %+v\n", fields)
return handle.FromStruct(dcn, rec, args[0].(string), fields) return handle.FromStruct(dcn, rec, args[0].(string), fields)
} }

View file

@ -99,7 +99,18 @@ func NewRecordConfigFromStruct(name string, ttl uint32, t string, fields any, dc
// setRecordNames updates the .Name* fields. // setRecordNames updates the .Name* fields.
func setRecordNames(rec *models.RecordConfig, dcn *domaintags.DomainNameVarieties, n string) { 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 == "" { if rec.SubDomain == "" {
// Not _EXTEND() mode: // Not _EXTEND() mode:
if n == "@" { if n == "@" {
@ -109,9 +120,6 @@ func setRecordNames(rec *models.RecordConfig, dcn *domaintags.DomainNameVarietie
rec.NameFQDN = dcn.NameASCII rec.NameFQDN = dcn.NameASCII
rec.NameFQDNRaw = dcn.NameRaw rec.NameFQDNRaw = dcn.NameRaw
rec.NameFQDNUnicode = dcn.NameUnicode rec.NameFQDNUnicode = dcn.NameUnicode
rec.NameFQDN = dcn.NameASCII
rec.NameFQDNRaw = dcn.NameRaw
rec.NameFQDNUnicode = dcn.NameUnicode
} else { } else {
rec.Name = strings.ToLower(domaintags.EfficientToASCII(n)) rec.Name = strings.ToLower(domaintags.EfficientToASCII(n))
rec.NameRaw = n rec.NameRaw = n

View file

@ -172,6 +172,20 @@ func TestSetRecordNames(t *testing.T) {
NameFQDNUnicode: "www.bücher.bücher.com", 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 { for _, tt := range tests {

View file

@ -215,7 +215,6 @@ func ParseZoneContents(content string, zoneName string, zonefileName string) (mo
switch rtype { switch rtype {
case dns.TypeRP: case dns.TypeRP:
name := rr.Header().Name name := rr.Header().Name
name = strings.TrimSuffix(name, ".")
prec, err = rtypecontrol.NewRecordConfigFromStruct(name, rr.Header().Ttl, "RP", rr, domaintags.MakeDomainNameVarieties(zoneName)) prec, err = rtypecontrol.NewRecordConfigFromStruct(name, rr.Header().Ttl, "RP", rr, domaintags.MakeDomainNameVarieties(zoneName))
if err != nil { if err != nil {
return nil, err return nil, err