From 9a28437b814a7cccec0974a75dc98f8166ce84b7 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sun, 15 Oct 2023 13:20:43 -0700 Subject: [PATCH 1/3] chunked_values should return _value_type not plain string --- octodns/record/chunked.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/octodns/record/chunked.py b/octodns/record/chunked.py index 8b115ed..8eef6fb 100644 --- a/octodns/record/chunked.py +++ b/octodns/record/chunked.py @@ -18,7 +18,7 @@ class _ChunkedValuesMixin(ValuesMixin): for i in range(0, len(value), self.CHUNK_SIZE) ] vs = '" "'.join(vs) - return f'"{vs}"' + return self._value_type(f'"{vs}"') @property def chunked_values(self): From ded53023e7e9b1941fef171d6f86631a20c05f9d Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sun, 15 Oct 2023 13:23:57 -0700 Subject: [PATCH 2/3] add support for chunked values to ValuesMixin.rrs --- CHANGELOG.md | 2 ++ octodns/record/base.py | 5 ++++- octodns/record/chunked.py | 3 +++ tests/test_octodns_record_txt.py | 36 ++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0ab5d2..2155ed8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ * Added ZoneNameFilter processor to enable ignoring/alerting on type-os like octodns.com.octodns.com +* Fixed issues with handling of chunking large TXT values for providers that use + the in-built `rrs` method ## v1.2.1 - 2023-09-29 - Now with fewer stale files diff --git a/octodns/record/base.py b/octodns/record/base.py index 16e6718..30ff3c4 100644 --- a/octodns/record/base.py +++ b/octodns/record/base.py @@ -312,13 +312,16 @@ class ValuesMixin(object): return ret + def rr_values(self): + return self.values + @property def rrs(self): return ( self.fqdn, self.ttl, self._type, - [v.rdata_text for v in self.values], + [v.rdata_text for v in self.rr_values()], ) def __repr__(self): diff --git a/octodns/record/chunked.py b/octodns/record/chunked.py index 8eef6fb..021d26e 100644 --- a/octodns/record/chunked.py +++ b/octodns/record/chunked.py @@ -27,6 +27,9 @@ class _ChunkedValuesMixin(ValuesMixin): values.append(self.chunked_value(v)) return values + def rr_values(self): + return self.chunked_values + class _ChunkedValue(str): _unescaped_semicolon_re = re.compile(r'\w;') diff --git a/tests/test_octodns_record_txt.py b/tests/test_octodns_record_txt.py index 1d46426..3d96352 100644 --- a/tests/test_octodns_record_txt.py +++ b/tests/test_octodns_record_txt.py @@ -142,3 +142,39 @@ class TestRecordTxt(TestCase): self.assertEqual(single.values, chunked.values) # should be chunked values, with quoting self.assertEqual(single.chunked_values, chunked.chunked_values) + + def test_rr(self): + zone = Zone('unit.tests.', []) + + # simple TXT + record = Record.new( + zone, + 'txt', + {'ttl': 42, 'type': 'TXT', 'values': ['short 1', 'short 2']}, + ) + self.assertEqual( + ('txt.unit.tests.', 42, 'TXT', ['"short 1"', '"short 2"']), + record.rrs, + ) + + # long chunked text + record = Record.new( + zone, + 'txt', + { + 'ttl': 42, + 'type': 'TXT', + 'values': [ + 'before', + 'v=DKIM1\\; h=sha256\\; k=rsa\\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx78E7PtJvr8vpoNgHdIAe+llFKoy8WuTXDd6Z5mm3D4AUva9MBt5fFetxg/kcRy3KMDnMw6kDybwbpS/oPw1ylk6DL1xit7Cr5xeYYSWKukxXURAlHwT2K72oUsFKRUvN1X9lVysAeo+H8H/22Z9fJ0P30sOuRIRqCaiz+OiUYicxy4xrpfH2s9a+o3yRwX3zhlp8GjRmmmyK5mf7CkQTCfjnKVsYtB7mabXXmClH9tlcymnBMoN9PeXxaS5JRRysVV8RBCC9/wmfp9y//cck8nvE/MavFpSUHvv+TfTTdVKDlsXPjKX8iZQv0nO3xhspgkqFquKjydiR8nf4meHhwIDAQAB', + 'z after', + ], + }, + ) + vals = [ + '"before"', + '"v=DKIM1\\; h=sha256\\; k=rsa\\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx78E7PtJvr8vpoNgHdIAe+llFKoy8WuTXDd6Z5mm3D4AUva9MBt5fFetxg/kcRy3KMDnMw6kDybwbpS/oPw1ylk6DL1xit7Cr5xeYYSWKukxXURAlHwT2K72oUsFKRUvN1X9lVysAeo+H8H/22Z9fJ0P30sOuRIRqCaiz+OiUYicxy4xrpfH" ' + '"2s9a+o3yRwX3zhlp8GjRmmmyK5mf7CkQTCfjnKVsYtB7mabXXmClH9tlcymnBMoN9PeXxaS5JRRysVV8RBCC9/wmfp9y//cck8nvE/MavFpSUHvv+TfTTdVKDlsXPjKX8iZQv0nO3xhspgkqFquKjydiR8nf4meHhwIDAQAB"', + '"z after"', + ] + self.assertEqual(('txt.unit.tests.', 42, 'TXT', vals), record.rrs) From 65f4a48bc1a1a14cd14042d9041916134a886c82 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sun, 15 Oct 2023 17:51:06 -0700 Subject: [PATCH 3/3] rr_values as a property for consistency --- octodns/record/base.py | 3 ++- octodns/record/chunked.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/octodns/record/base.py b/octodns/record/base.py index 30ff3c4..9bbb9aa 100644 --- a/octodns/record/base.py +++ b/octodns/record/base.py @@ -312,6 +312,7 @@ class ValuesMixin(object): return ret + @property def rr_values(self): return self.values @@ -321,7 +322,7 @@ class ValuesMixin(object): self.fqdn, self.ttl, self._type, - [v.rdata_text for v in self.rr_values()], + [v.rdata_text for v in self.rr_values], ) def __repr__(self): diff --git a/octodns/record/chunked.py b/octodns/record/chunked.py index 021d26e..976baea 100644 --- a/octodns/record/chunked.py +++ b/octodns/record/chunked.py @@ -27,6 +27,7 @@ class _ChunkedValuesMixin(ValuesMixin): values.append(self.chunked_value(v)) return values + @property def rr_values(self): return self.chunked_values