From 50a24605e6b484d1a6c8ae3f048e66beaab14d02 Mon Sep 17 00:00:00 2001 From: Tom Limoncelli Date: Sun, 7 Mar 2021 14:34:00 -0500 Subject: [PATCH] Fix TXT docs, remove AUTOSPLIT (#1083) --- docs/_functions/domain/TXT.md | 94 ++++++++----- pkg/js/helpers.js | 3 - pkg/js/static.go | 246 +++++++++++++++++----------------- 3 files changed, 186 insertions(+), 157 deletions(-) diff --git a/docs/_functions/domain/TXT.md b/docs/_functions/domain/TXT.md index 52fa46e45..b5580eb5f 100644 --- a/docs/_functions/domain/TXT.md +++ b/docs/_functions/domain/TXT.md @@ -10,11 +10,7 @@ TXT adds an TXT record To a domain. The name should be the relative label for the record. Use `@` for the domain apex. The contents is either a single or multiple strings. To -specify multiple strings, include them in an array. - -TXT records with multiple strings are only supported by some -providers. DNSControl will produce a validation error if the -provider does not support multiple strings. +specify multiple strings, specify them as an array. Each string is a JavaScript string (quoted using single or double quotes). The (somewhat complex) quoting rules of the DNS protocol @@ -30,46 +26,82 @@ Modifiers can be any number of [record modifiers](#record-modifiers) or json obj TXT('multiple', ['one', 'two', 'three']), // Multiple strings TXT('quoted', 'any "quotes" and escapes? ugh; no worries!'), TXT('_domainkey', 't=y; o=-;'), // Escapes are done for you automatically. - TXT('long', '#'.repeat(10), AUTOSPLIT) // Escapes are done for you automatically. + TXT('long', 'X'.repeat(300)) // Long strings are split automatically. ); {%endhighlight%} {% include endExample.html %} +NOTE: In the past, long strings had to be annotated with the keyword +`AUTOSPLIT`. This is no longer required. The keyword is now a no-op. -# Long and multiple strings +# Long strings -DNS RFCs limit TXT strings to 255 bytes, but you can have multiple -such strings. Most applications blindly concatenate the strings but -some services that use TXT records join them with a space between each -substring (citation needed!). +Strings that are longer than 255 octets (bytes) will be quietly +split into 255-octets chunks or the provider may report an error +if it does not handle multiple strings. -Not all providers support multiple strings and those that do often put -limits on them. -Therefore, DNSControl requires you to explicitly mark TXT records that -should be split. +# TXT record edge cases. -Here are some examples: +Most providers do not support the full possibilities of what a TXT +record can store. DNSControl can not handle all the edge cases +and incompatibles that providers have introduced. Instead, it +stores the string(s) that you provide and passes them to the provider +verbatim. The provider may opt to accept the data, fix it, or +reject it. This happens early in the processing, long before +the DNSControl talks to the provider's API. - VERY_LONG_STRING = 'Z'.repeat(300) +The RFCs specify that a TXT record stores one or more strings, +each is up to 255 octets (bytes) long. We call these individual +strings *chunks*. Each chunk may be zero to 255 octets long. +There is no limit to the number of chunks in a TXT record, +other than IP packet length restrictions. The contents of each chunk +may be octets of value from 0x00 to 0xff. - // This will produce a validation-time error: - TXT('long1', VERY_LONG_STRING), +In reality DNS Service Providers (DSPs) place many restrictions on TXT +records. - // String will be split on 255-byte boundaries: - TXT('long', VERY_LONG_STRING, AUTOSPLIT), +Some DSPs only support a single string of 255 octets or fewer. +Multiple strings, or any one string being longer than 255 octets will +result in an error. One provider limits the string to 254 octets, +which makes me think they're code has an off-by-one error. - // String split manually: - TXT('long', ['part1', 'part2', 'part3']), +Some DSPs only support one string, but it may be of any length. +Behind the scenes the provider splits it into 255-octet chunks +(except the last one, of course). -NOTE: Old releases of DNSControl blindly sent long strings to -providers. Some gave an error at that time, others quietly truncated -the strings, and some silently split them into multiple short -strings. If you see an error that mentions -`ERROR: txt target >255 bytes and AUTOSPLIT not set` this means you -need to add AUTOSPLIT to explicitly split the string manually. +Some DSPs support multiple strings, but API requests must be 512-bytes +or fewer, and with quoting, escaping, and other encoding mishegoss +you can't be sure what will be permitted until you actually try it. -An example error might look like this: +Regardless of the quantity and length of strings, some providers ban +double quotes, back-ticks, or other chars. - 2020/11/21 00:03:21 printIR.go:94: ERROR: txt target >255 bytes and AUTOSPLIT not set: label="20201._domainkey" index=0 len=424 string[:50]="v=DKIM1; k=rsa; t=s; s=email; p=MIIBIjANBgkqhkiG9w..." +# Testing the support of a provider +## How can you tell if a provider will support a particular `TXT()` record? + +Include the `TXT()` record in a `D()` as usual, along +with the `DnsProvider()` for that provider. Run `dnscontrol check` to +see if any errors are produced. The check command does not talk to +the provider's API, thus permitting you to do this without having an +account at that provider. + +## What if the provider rejects a string that is supported? + +Suppose I can create the TXT record using the DSP's web portal but +DNSControl rejects the string? + +It is possible that the provider code in DNSControl rejects strings +that the DSP accepts. This is because the test is done in code, not +by querying the provider's API. It is possible that the code was +written to work around a bug (such as rejecting a string with a +back-tick) but now that bug has been fixed. + +All such checks are in `providers/${providername}/auditrecords.go`. +You can try removing the check that you feel is in error and see if +the provider's API accepts the record. You can do this by running the +integration tests, or by simply adding that record to an existing +`dnsconfig.js` and seeing if `dnscontrol push` is able to push that +record into production. (Be careful if you are testing this on a +domain used in production.) diff --git a/pkg/js/helpers.js b/pkg/js/helpers.js index 448a71c70..6afc41e0a 100644 --- a/pkg/js/helpers.js +++ b/pkg/js/helpers.js @@ -842,7 +842,6 @@ function SPF_BUILDER(value) { // Only add the raw spf record if it isn't an empty string if (value.raw !== '') { rp = {}; - rp.txtSplitAlgorithm = 'multistring'; // Split the target if needed. if (value.ttl) { r.push(TXT(value.raw, rawspf, rp, TTL(value.ttl))); } else { @@ -864,8 +863,6 @@ function SPF_BUILDER(value) { p.txtMaxSize = value.txtMaxSize; } - p.txtSplitAlgorithm = 'multistring'; // Split the target if needed. - // Generate a TXT record with the metaparameters. if (value.ttl) { r.push(TXT(value.label, rawspf, p, TTL(value.ttl))); diff --git a/pkg/js/static.go b/pkg/js/static.go index b56635162..89daf8986 100644 --- a/pkg/js/static.go +++ b/pkg/js/static.go @@ -212,131 +212,131 @@ var _escData = map[string]*_escFile{ "/helpers.js": { name: "helpers.js", local: "pkg/js/helpers.js", - size: 28050, + size: 27896, modtime: 0, compressed: ` -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 +AA== `, }, }