Skip to content

Commit dffed12

Browse files
authored
Merge pull request #74 from hakastein/chunk-txt
split TXT/SPF records longer than 255 characters
2 parents 8554e81 + b4469e4 commit dffed12

File tree

3 files changed

+31
-3
lines changed

3 files changed

+31
-3
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## v0.0.8 - 20??-??-?? - ???
2+
3+
- Split long TXT values using chunked_value before writing
4+
15
## v0.0.7 - 2025-01-17 - Back to the base
26

37
- Add support for Provider base class parameters

octodns_bind/__init__.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -320,9 +320,8 @@ def _apply(self, plan):
320320
for value in values:
321321
value = value.rdata_text
322322
if record._type in ('SPF', 'TXT'):
323-
# TXT values need to be quoted
324-
value = value.replace('"', '\\"')
325-
value = f'"{value}"'
323+
# TXT values need to be quoted and split if longer than 255 characters
324+
value = record.chunked_value(value)
326325
name = '@' if record.name == '' else record.name
327326
if name == prev_name:
328327
name = ''

tests/test_provider_octodns_bind.py

+25
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,31 @@ def test_list_zones_custon_extension(self):
190190
list(source.list_zones()),
191191
)
192192

193+
def test_split_long_txt_record(self):
194+
long_txt = 'a' * 300
195+
196+
with TemporaryDirectory() as td:
197+
provider = ZoneFileProvider('target', td.dirname)
198+
desired = Zone('unit.tests.', [])
199+
200+
txt_record = Record.new(
201+
desired,
202+
'longtxt',
203+
{'type': 'TXT', 'ttl': 42, 'value': long_txt},
204+
)
205+
desired.add_record(txt_record)
206+
207+
changes = [Create(txt_record)]
208+
plan = Plan(None, desired, changes, True)
209+
provider._apply(plan)
210+
211+
with open(join(td.dirname, 'unit.tests.')) as fh:
212+
content = fh.read()
213+
expected_split = f'"{"a" * 255}" "{"a" * 45}"'
214+
self.assertIn(
215+
f'longtxt 42 IN TXT {expected_split}', content
216+
)
217+
193218
@patch('octodns_bind.ZoneFileProvider._serial')
194219
def test_apply(self, serial_mock):
195220
serial_mock.side_effect = [424344, 454647, 484950]

0 commit comments

Comments
 (0)