Skip to content

Commit 583cba3

Browse files
authored
IMPORT_TRANSFORM_SUFFIX: Fix for CNAMEs (#3192)
1 parent 1fde133 commit 583cba3

File tree

3 files changed

+29
-25
lines changed

3 files changed

+29
-25
lines changed

documentation/language-reference/domain-modifiers/IMPORT_TRANSFORM_STRIP.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@ Don't use this feature. It was added for a very specific situation at Stack Over
1616
`IMPORT_TRANSFORM_STRIP` is the same as `IMPORT_TRANSFORM` with an additional parameter: `suffixstrip`.
1717

1818
When `IMPORT_TRANSFORM_STRIP` is generating the label for new records, it
19-
checks the label. If the label ends with `suffixstrip`, that suffix is removed.
19+
checks the label. If the label ends with `.` + `suffixstrip`, that suffix is removed.
2020
If the label does not end with `suffixstrip`, an error is returned.
2121

22+
For CNAMEs, the `suffixstrip` is stripped from the beginning (prefix) of the target domain.
23+
2224
For example, if the domain is `com.extra` and the label is `foo.com`,
2325
`IMPORT_TRANSFORM` would generate a label `foo.com.com.extra`.
2426
`IMPORT_TRANSFORM_STRIP(... , '.com')` would generate
2527
the label `foo.com.extra` instead.
28+
A CNAME's target would be `foo.com.extra`.

pkg/normalize/validate.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"github.com/StackExchange/dnscontrol/v4/models"
1010
"github.com/StackExchange/dnscontrol/v4/pkg/transform"
1111
"github.com/StackExchange/dnscontrol/v4/providers"
12-
"github.com/miekg/dns"
1312
"github.com/miekg/dns/dnsutil"
1413
)
1514

@@ -239,13 +238,14 @@ func checkTargets(rec *models.RecordConfig, domain string) (errs []error) {
239238
}
240239

241240
func transformCNAME(target, oldDomain, newDomain, suffixstrip string) string {
242-
// Canonicalize. If it isn't a FQDN, add the newDomain.
243-
result := dnsutil.AddOrigin(target, oldDomain)
244-
if dns.IsFqdn(result) {
245-
result = result[:len(result)-1]
246-
}
247-
result = strings.TrimSuffix(result, suffixstrip)
248-
return dnsutil.AddOrigin(result, newDomain) + "."
241+
// Canonicalize the target. Add the newDomain minus the suffixstrip.
242+
// foo -> foo.oldDomain.newDomain
243+
// foo. -> foo.newDomain
244+
nd := strings.TrimPrefix(newDomain, suffixstrip+".")
245+
if strings.HasSuffix(target, ".") {
246+
return target + nd + "."
247+
}
248+
return dnsutil.AddOrigin(target, oldDomain) + "." + nd + "."
249249
}
250250

251251
func newRec(rec *models.RecordConfig, ttl uint32) *models.RecordConfig {
@@ -260,6 +260,7 @@ func transformLabel(label, suffixstrip string) (string, error) {
260260
if suffixstrip == "" {
261261
return label, nil
262262
}
263+
suffixstrip = "." + suffixstrip
263264
if !strings.HasSuffix(label, suffixstrip) {
264265
return "", fmt.Errorf("label %q does not end with %q", label, suffixstrip)
265266
}

pkg/normalize/validate_test.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -186,37 +186,37 @@ func Test_transform_cname_strip(t *testing.T) {
186186
p []string
187187
expected string
188188
}{
189-
{[]string{"ai.meta.stackexchange.com.", "stackexchange.com", "com.internal", ".com"},
189+
{[]string{"ai.meta.stackexchange.com.", "stackexchange.com", "com.internal", "com"},
190190
"ai.meta.stackexchange.com.internal."},
191-
{[]string{"askubuntu.com.", "askubuntu.com", "com.internal", ".com"},
191+
{[]string{"askubuntu.com.", "askubuntu.com", "com.internal", "com"},
192192
"askubuntu.com.internal."},
193-
{[]string{"blogoverflow.com.", "stackoverflow.com", "com.internal", ".com"},
193+
{[]string{"blogoverflow.com.", "stackoverflow.com", "com.internal", "com"},
194194
"blogoverflow.com.internal."},
195-
{[]string{"careers.stackoverflow.com.", "stackoverflow.com", "com.internal", ".com"},
195+
{[]string{"careers.stackoverflow.com.", "stackoverflow.com", "com.internal", "com"},
196196
"careers.stackoverflow.com.internal."},
197-
{[]string{"chat.stackexchange.com.", "askubuntu.com", "com.internal", ".com"},
197+
{[]string{"chat.stackexchange.com.", "askubuntu.com", "com.internal", "com"},
198198
"chat.stackexchange.com.internal."},
199-
{[]string{"chat.stackexchange.com.", "stackoverflow.com", "com.internal", ".com"},
199+
{[]string{"chat.stackexchange.com.", "stackoverflow.com", "com.internal", "com"},
200200
"chat.stackexchange.com.internal."},
201-
{[]string{"chat.stackexchange.com.", "superuser.com", "com.internal", ".com"},
201+
{[]string{"chat.stackexchange.com.", "superuser.com", "com.internal", "com"},
202202
"chat.stackexchange.com.internal."},
203-
{[]string{"sstatic.net.", "sstatic.net", "net.internal", ".net"},
203+
{[]string{"sstatic.net.", "sstatic.net", "net.internal", "net"},
204204
"sstatic.net.internal."},
205-
{[]string{"stackapps.com.", "stackapps.com", "com.internal", ".com"},
205+
{[]string{"stackapps.com.", "stackapps.com", "com.internal", "com"},
206206
"stackapps.com.internal."},
207-
{[]string{"stackexchange.com.", "stackexchange.com", "com.internal", ".com"},
207+
{[]string{"stackexchange.com.", "stackexchange.com", "com.internal", "com"},
208208
"stackexchange.com.internal."},
209-
{[]string{"stackoverflow.com.", "stackoverflow.com", "com.internal", ".com"},
209+
{[]string{"stackoverflow.com.", "stackoverflow.com", "com.internal", "com"},
210210
"stackoverflow.com.internal."},
211-
{[]string{"superuser.com.", "superuser.com", "com.internal", ".com"},
211+
{[]string{"superuser.com.", "superuser.com", "com.internal", "com"},
212212
"superuser.com.internal."},
213-
{[]string{"teststackoverflow.com.", "teststackoverflow.com", "com.internal", ".com"},
213+
{[]string{"teststackoverflow.com.", "teststackoverflow.com", "com.internal", "com"},
214214
"teststackoverflow.com.internal."},
215-
{[]string{"webapps.stackexchange.com.", "stackexchange.com", "com.internal", ".com"},
215+
{[]string{"webapps.stackexchange.com.", "stackexchange.com", "com.internal", "com"},
216216
"webapps.stackexchange.com.internal."},
217217
//
218-
{[]string{"sstatic.net.", "sstatic.net", "com.internal", ".com"},
219-
"sstatic.net.com.internal."},
218+
{[]string{"sstatic.net.", "sstatic.net", "com.internal", "com"},
219+
"sstatic.net.internal."},
220220
}
221221

222222
for _, test := range tests {

0 commit comments

Comments
 (0)