From 9052e7a1a7b7c0dac4799b839dd02c51064b8dcf Mon Sep 17 00:00:00 2001 From: Patrik Kernstock Date: Tue, 21 May 2019 04:31:59 +0200 Subject: [PATCH] OVH: Fixed DKIM when having longer keys (#487) (#488) * OVH: Fixed DKIM when having longer keys (#487) * Shorter error message, typo fix --- providers/ovh/protocol.go | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/providers/ovh/protocol.go b/providers/ovh/protocol.go index 25ca2b661..245e63e83 100644 --- a/providers/ovh/protocol.go +++ b/providers/ovh/protocol.go @@ -2,6 +2,7 @@ package ovh import ( "fmt" + "strings" "github.com/StackExchange/dnscontrol/models" "github.com/miekg/dns/dnsutil" @@ -77,7 +78,7 @@ func (c *ovhProvider) fetchRecords(fqdn string) ([]*Record, error) { records := make([]*Record, len(recordIds)) for i, id := range recordIds { - r, err := c.fecthRecord(fqdn, id) + r, err := c.fetchRecord(fqdn, id) if err != nil { return nil, err } @@ -87,7 +88,7 @@ func (c *ovhProvider) fetchRecords(fqdn string) ([]*Record, error) { return records, nil } -func (c *ovhProvider) fecthRecord(fqdn string, id int) (*Record, error) { +func (c *ovhProvider) fetchRecord(fqdn string, id int) (*Record, error) { var response Record err := c.client.CallAPI("GET", fmt.Sprintf("/domain/zone/%s/record/%d", fqdn, id), nil, &response, true) @@ -111,6 +112,9 @@ func (c *ovhProvider) deleteRecordFunc(id int64, fqdn string) func() error { // Returns a function that can be invoked to create a record in a zone. func (c *ovhProvider) createRecordFunc(rc *models.RecordConfig, fqdn string) func() error { return func() error { + if c.isDKIMRecord(rc) { + rc.Type = "DKIM" + } record := Record{ SubDomain: dnsutil.TrimDomainName(rc.GetLabelFQDN(), fqdn), FieldType: rc.Type, @@ -129,6 +133,9 @@ func (c *ovhProvider) createRecordFunc(rc *models.RecordConfig, fqdn string) fun // Returns a function that can be invoked to update a record in a zone. func (c *ovhProvider) updateRecordFunc(old *Record, rc *models.RecordConfig, fqdn string) func() error { return func() error { + if c.isDKIMRecord(rc) { + rc.Type = "DKIM" + } record := Record{ SubDomain: rc.GetLabel(), FieldType: rc.Type, @@ -141,10 +148,20 @@ func (c *ovhProvider) updateRecordFunc(old *Record, rc *models.RecordConfig, fqd record.SubDomain = "" } - return c.client.CallAPI("PUT", fmt.Sprintf("/domain/zone/%s/record/%d", fqdn, old.ID), &record, &Void{}, true) + err := c.client.CallAPI("PUT", fmt.Sprintf("/domain/zone/%s/record/%d", fqdn, old.ID), &record, &Void{}, true) + if err != nil && rc.Type == "DKIM" && strings.Contains(err.Error(), "alter read-only properties: fieldType") { + err = fmt.Errorf("This usually occurs when DKIM value is longer than the TXT record limit what OVH allows. Delete the TXT record to get past this limitation. [Original error: %s]", err.Error()) + } + + return err } } +// Check if provided record is DKIM +func (c *ovhProvider) isDKIMRecord(rc *models.RecordConfig) bool { + return (rc != nil && rc.Type == "TXT" && strings.Contains(rc.GetLabel(), "._domainkey")) +} + func (c *ovhProvider) refreshZone(fqdn string) error { return c.client.CallAPI("POST", fmt.Sprintf("/domain/zone/%s/refresh", fqdn), nil, &Void{}, true) }