From e9faea35961664e7885d70acce1d286760b62743 Mon Sep 17 00:00:00 2001 From: Peter Strzyzewski Date: Tue, 2 Oct 2018 14:40:18 -0700 Subject: [PATCH 1/2] Matching entire string for wildcard in txt records with prefixes --- provider/aws.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/aws.go b/provider/aws.go index 951dab0a3..cbb0475ae 100644 --- a/provider/aws.go +++ b/provider/aws.go @@ -190,7 +190,7 @@ func (p *AWSProvider) Zones() (map[string]*route53.HostedZone, error) { // wildcardUnescape converts \\052.abc back to *.abc // Route53 stores wildcards escaped: http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DomainNameFormat.html?shortFooter=true#domain-name-format-asterisk func wildcardUnescape(s string) string { - if strings.HasPrefix(s, "\\052") { + if strings.Contains(s, "\\052") { s = strings.Replace(s, "\\052", "*", 1) } return s From 8084a5e41bc9c15e60da80464680fb4acec101ff Mon Sep 17 00:00:00 2001 From: Peter Strzyzewski Date: Thu, 4 Oct 2018 11:28:16 -0700 Subject: [PATCH 2/2] Fixed tests store records with escaped wildcard. Added test to verify wildcard record with prefix. --- provider/aws_test.go | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/provider/aws_test.go b/provider/aws_test.go index aac6a3e6a..2334c0af6 100644 --- a/provider/aws_test.go +++ b/provider/aws_test.go @@ -89,7 +89,7 @@ func (r *Route53APIStub) ListResourceRecordSetsPages(input *route53.ListResource // Route53 stores wildcards escaped: http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DomainNameFormat.html?shortFooter=true#domain-name-format-asterisk func wildcardEscape(s string) string { - if strings.HasPrefix(s, "*") { + if strings.Contains(s, "*") { s = strings.Replace(s, "*", "\\052", 1) } return s @@ -256,6 +256,7 @@ func TestAWSRecords(t *testing.T) { endpoint.NewEndpoint("list-test-alias.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeCNAME, "foo.eu-central-1.elb.amazonaws.com"), endpoint.NewEndpoint("*.wildcard-test-alias.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeCNAME, "foo.eu-central-1.elb.amazonaws.com"), endpoint.NewEndpointWithTTL("list-test-multiple.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeA, endpoint.TTL(recordTTL), "8.8.8.8", "8.8.4.4"), + endpoint.NewEndpointWithTTL("prefix-*.wildcard.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeTXT, endpoint.TTL(recordTTL), "random"), }) records, err := provider.Records() @@ -268,6 +269,7 @@ func TestAWSRecords(t *testing.T) { endpoint.NewEndpoint("list-test-alias.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeCNAME, "foo.eu-central-1.elb.amazonaws.com"), endpoint.NewEndpoint("*.wildcard-test-alias.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeCNAME, "foo.eu-central-1.elb.amazonaws.com"), endpoint.NewEndpointWithTTL("list-test-multiple.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeA, endpoint.TTL(recordTTL), "8.8.8.8", "8.8.4.4"), + endpoint.NewEndpointWithTTL("prefix-*.wildcard.zone-1.ext-dns-test-2.teapot.zalan.do", endpoint.RecordTypeTXT, endpoint.TTL(recordTTL), "random"), }) } @@ -919,10 +921,13 @@ func setupAWSRecords(t *testing.T, provider *AWSProvider, endpoints []*endpoint. require.NoError(t, provider.CreateRecords(endpoints)) + escapeAWSRecords(t, provider, "/hostedzone/zone-1.ext-dns-test-2.teapot.zalan.do.") + escapeAWSRecords(t, provider, "/hostedzone/zone-2.ext-dns-test-2.teapot.zalan.do.") + escapeAWSRecords(t, provider, "/hostedzone/zone-3.ext-dns-test-2.teapot.zalan.do.") + records, err = provider.Records() require.NoError(t, err) - validateEndpoints(t, records, endpoints) } func listAWSRecords(t *testing.T, client Route53API, zone string) []*route53.ResourceRecordSet { @@ -931,10 +936,7 @@ func listAWSRecords(t *testing.T, client Route53API, zone string) []*route53.Res HostedZoneId: aws.String(zone), }, func(resp *route53.ListResourceRecordSetsOutput, _ bool) bool { for _, recordSet := range resp.ResourceRecordSets { - switch aws.StringValue(recordSet.Type) { - case endpoint.RecordTypeA, endpoint.RecordTypeCNAME: - recordSets = append(recordSets, recordSet) - } + recordSets = append(recordSets, recordSet) } return true })) @@ -964,6 +966,29 @@ func clearAWSRecords(t *testing.T, provider *AWSProvider, zone string) { } } +// Route53 stores wildcards escaped: http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DomainNameFormat.html?shortFooter=true#domain-name-format-asterisk +func escapeAWSRecords(t *testing.T, provider *AWSProvider, zone string) { + recordSets := listAWSRecords(t, provider.client, zone) + + changes := make([]*route53.Change, 0, len(recordSets)) + for _, recordSet := range recordSets { + changes = append(changes, &route53.Change{ + Action: aws.String(route53.ChangeActionUpsert), + ResourceRecordSet: recordSet, + }) + } + + if len(changes) != 0 { + _, err := provider.client.ChangeResourceRecordSets(&route53.ChangeResourceRecordSetsInput{ + HostedZoneId: aws.String(zone), + ChangeBatch: &route53.ChangeBatch{ + Changes: changes, + }, + }) + require.NoError(t, err) + } +} + func newAWSProvider(t *testing.T, domainFilter DomainFilter, zoneIDFilter ZoneIDFilter, zoneTypeFilter ZoneTypeFilter, evaluateTargetHealth, dryRun bool, records []*endpoint.Endpoint) (*AWSProvider, *Route53APIStub) { client := NewRoute53APIStub()