From 799e1232b3939b1204c85d7bc86e68a10797c4da Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sat, 20 Aug 2022 08:11:24 -0700 Subject: [PATCH] Record should work with encoded same as everything else --- octodns/record/__init__.py | 14 +++++--------- tests/test_octodns_idna.py | 8 ++++++++ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/octodns/record/__init__.py b/octodns/record/__init__.py index 7d6f8e8..36fef2d 100644 --- a/octodns/record/__init__.py +++ b/octodns/record/__init__.py @@ -78,7 +78,7 @@ class ValidationError(RecordException): @classmethod def build_message(cls, fqdn, reasons): reasons = '\n - '.join(reasons) - return f'Invalid record {fqdn}\n - {reasons}' + return f'Invalid record {idna_decode(fqdn)}\n - {reasons}' def __init__(self, fqdn, reasons): super(Exception, self).__init__(self.build_message(fqdn, reasons)) @@ -105,16 +105,12 @@ class Record(EqualityTupleMixin): @classmethod def new(cls, zone, name, data, source=None, lenient=False): - name = str(name).lower() - fqdn = ( - f'{idna_decode(name)}.{zone.decoded_name}' - if name - else zone.decoded_name - ) + name = idna_encode(str(name)) + fqdn = f'{name}.{zone.name}' if name else zone.name try: _type = data['type'] except KeyError: - raise Exception(f'Invalid record {fqdn}, missing type') + raise Exception(f'Invalid record {idna_decode(fqdn)}, missing type') try: _class = cls._CLASSES[_type] except KeyError: @@ -139,7 +135,7 @@ class Record(EqualityTupleMixin): n = len(fqdn) if n > 253: reasons.append( - f'invalid fqdn, "{fqdn}" is too long at {n} ' + f'invalid fqdn, "{idna_decode(fqdn)}" is too long at {n} ' 'chars, max is 253' ) for label in name.split('.'): diff --git a/tests/test_octodns_idna.py b/tests/test_octodns_idna.py index 399d1f6..3742439 100644 --- a/tests/test_octodns_idna.py +++ b/tests/test_octodns_idna.py @@ -59,6 +59,14 @@ class TestIdna(TestCase): self.assertEqual('zajęzyk.pl.', idna_decode('XN--ZAJZYK-Y4A.PL.')) self.assertEqual('xn--zajzyk-y4a.pl.', idna_encode('ZajęzyK.Pl.')) + def test_repeated_encode_decoded(self): + self.assertEqual( + 'zajęzyk.pl.', idna_decode(idna_decode('xn--zajzyk-y4a.pl.')) + ) + self.assertEqual( + 'xn--zajzyk-y4a.pl.', idna_encode(idna_encode('zajęzyk.pl.')) + ) + class TestIdnaDict(TestCase): plain = 'testing.tests.'