diff --git a/docs/_includes/matrix.html b/docs/_includes/matrix.html index c20ebd0ba..c295659e0 100644 --- a/docs/_includes/matrix.html +++ b/docs/_includes/matrix.html @@ -301,7 +301,9 @@ - + + + diff --git a/models/dns.go b/models/dns.go index 92f6e1b87..c4f9e6c4d 100644 --- a/models/dns.go +++ b/models/dns.go @@ -443,6 +443,22 @@ func SplitCombinedSrvValue(s string) (priority, weight, port uint16, target stri return uint16(priorityconv), uint16(weightconv), uint16(portconv), parts[3], nil } +// CombineCAAs will merge the tags and flags into the target field for all CAA records. +// Useful for providers that desire them as one field. +func (dc *DomainConfig) CombineCAAs() { + for _, rec := range dc.Records { + if rec.Type == "CAA" { + if rec.CombinedTarget { + pm := strings.Join([]string{"CombineCAAs: Already collapsed: ", rec.Name, rec.Target}, " ") + panic(pm) + } + rec.Target = rec.Content() + fmt.Printf("DEBUG: NEW TARGET: %v\n", rec.Target) + rec.CombinedTarget = true + } + } +} + func SplitCombinedCaaValue(s string) (tag string, flag uint8, value string, err error) { splitData := strings.SplitN(s, " ", 3) diff --git a/providers/gandi/gandiProvider.go b/providers/gandi/gandiProvider.go index 131765f5c..f316dbebe 100644 --- a/providers/gandi/gandiProvider.go +++ b/providers/gandi/gandiProvider.go @@ -32,8 +32,13 @@ var docNotes = providers.DocumentationNotes{ } func init() { - providers.RegisterDomainServiceProviderType("GANDI", newDsp, providers.CanUsePTR, - providers.CanUseSRV, docNotes, providers.CantUseNOPURGE) + providers.RegisterDomainServiceProviderType("GANDI", newDsp, + providers.CanUseCAA, + providers.CanUsePTR, + providers.CanUseSRV, + providers.CantUseNOPURGE, + docNotes, + ) providers.RegisterRegistrarType("GANDI", newReg) } @@ -74,6 +79,7 @@ func (c *GandiApi) GetNameservers(domain string) ([]*models.Nameserver, error) { func (c *GandiApi) GetDomainCorrections(dc *models.DomainConfig) ([]*models.Correction, error) { dc.Punycode() dc.CombineSRVs() + dc.CombineCAAs() dc.CombineMXs() domaininfo, err := c.getDomainInfo(dc.Name) if err != nil { diff --git a/providers/gandi/protocol.go b/providers/gandi/protocol.go index 28581a05f..de95e618d 100644 --- a/providers/gandi/protocol.go +++ b/providers/gandi/protocol.go @@ -193,13 +193,19 @@ func convert(r *gandirecord.RecordInfo, origin string) *models.RecordConfig { } switch r.Type { case "A", "AAAA", "NS", "CNAME", "PTR", "TXT": + // no-op + case "CAA": + var err error + rc.CaaTag, rc.CaaFlag, rc.Target, err = models.SplitCombinedCaaValue(r.Value) + if err != nil { + panic(fmt.Sprintf("gandi.convert bad caa value format: %#v (%s)", r.Value, err)) + } case "SRV": var err error rc.SrvPriority, rc.SrvWeight, rc.SrvPort, rc.Target, err = models.SplitCombinedSrvValue(r.Value) if err != nil { panic(fmt.Sprintf("gandi.convert bad srv value format: %#v (%s)", r.Value, err)) } - // no-op case "MX": var err error rc.MxPreference, rc.Target, err = models.SplitCombinedMxValue(r.Value)