Browse Source

Falidate record fields that should hold FQDNs w/tests

pull/873/head
Ross McFarland 4 years ago
parent
commit
f2b3505d43
No known key found for this signature in database GPG Key ID: 943B179E15D3B22A
2 changed files with 53 additions and 5 deletions
  1. +15
    -5
      octodns/record/__init__.py
  2. +38
    -0
      tests/test_octodns_record.py

+ 15
- 5
octodns/record/__init__.py View File

@ -1091,7 +1091,10 @@ class MxValue(EqualityTupleMixin):
exchange = None exchange = None
try: try:
exchange = value.get('exchange', None) or value['value'] exchange = value.get('exchange', None) or value['value']
if not exchange.endswith('.'):
if not FQDN(str(exchange), allow_underscores=True).is_valid:
reasons.append(f'Invalid MX exchange "{exchange}" is not '
'a valid FQDN.')
elif not exchange.endswith('.'):
reasons.append(f'MX value "{exchange}" missing trailing .') reasons.append(f'MX value "{exchange}" missing trailing .')
except KeyError: except KeyError:
reasons.append('missing exchange') reasons.append('missing exchange')
@ -1225,7 +1228,10 @@ class _NsValue(object):
data = (data,) data = (data,)
reasons = [] reasons = []
for value in data: for value in data:
if not value.endswith('.'):
if not FQDN(str(value), allow_underscores=True).is_valid:
reasons.append(f'Invalid NS value "{value}" is not '
'a valid FQDN.')
elif not value.endswith('.'):
reasons.append(f'NS value "{value}" missing trailing .') reasons.append(f'NS value "{value}" missing trailing .')
return reasons return reasons
@ -1413,9 +1419,13 @@ class SrvValue(EqualityTupleMixin):
except ValueError: except ValueError:
reasons.append(f'invalid port "{value["port"]}"') reasons.append(f'invalid port "{value["port"]}"')
try: try:
if not value['target'].endswith('.'):
reasons.append(f'SRV value "{value["target"]}" missing '
'trailing .')
target = value['target']
if not target.endswith('.'):
reasons.append(f'SRV value "{target}" missing trailing .')
if target != '.' and \
not FQDN(str(target), allow_underscores=True).is_valid:
reasons.append(f'Invalid SRV target "{target}" is not '
'a valid FQDN.')
except KeyError: except KeyError:
reasons.append('missing target') reasons.append('missing target')
return reasons return reasons


+ 38
- 0
tests/test_octodns_record.py View File

@ -2694,6 +2694,19 @@ class TestRecordValidation(TestCase):
self.assertEqual(['MX value "foo.bar.com" missing trailing .'], self.assertEqual(['MX value "foo.bar.com" missing trailing .'],
ctx.exception.reasons) ctx.exception.reasons)
# exchange must be a valid FQDN
with self.assertRaises(ValidationError) as ctx:
Record.new(self.zone, '', {
'type': 'MX',
'ttl': 600,
'value': {
'preference': 10,
'exchange': '100 foo.bar.com.'
}
})
self.assertEqual(['Invalid MX exchange "100 foo.bar.com." is not a '
'valid FQDN.'], ctx.exception.reasons)
def test_NXPTR(self): def test_NXPTR(self):
# doesn't blow up # doesn't blow up
Record.new(self.zone, '', { Record.new(self.zone, '', {
@ -2792,6 +2805,16 @@ class TestRecordValidation(TestCase):
self.assertEqual(['NS value "foo.bar" missing trailing .'], self.assertEqual(['NS value "foo.bar" missing trailing .'],
ctx.exception.reasons) ctx.exception.reasons)
# exchange must be a valid FQDN
with self.assertRaises(ValidationError) as ctx:
Record.new(self.zone, '', {
'type': 'NS',
'ttl': 600,
'value': '100 foo.bar.com.'
})
self.assertEqual(['Invalid NS value "100 foo.bar.com." is not a '
'valid FQDN.'], ctx.exception.reasons)
def test_PTR(self): def test_PTR(self):
# doesn't blow up (name & zone here don't make any sense, but not # doesn't blow up (name & zone here don't make any sense, but not
# important) # important)
@ -3109,6 +3132,21 @@ class TestRecordValidation(TestCase):
self.assertEqual(['SRV value "foo.bar.baz" missing trailing .'], self.assertEqual(['SRV value "foo.bar.baz" missing trailing .'],
ctx.exception.reasons) ctx.exception.reasons)
# target must be a valid FQDN
with self.assertRaises(ValidationError) as ctx:
Record.new(self.zone, '_srv._tcp', {
'type': 'SRV',
'ttl': 600,
'value': {
'priority': 1,
'weight': 2,
'port': 3,
'target': '100 foo.bar.com.'
}
})
self.assertEqual(['Invalid SRV target "100 foo.bar.com." is not a '
'valid FQDN.'], ctx.exception.reasons)
def test_TXT(self): def test_TXT(self):
# doesn't blow up (name & zone here don't make any sense, but not # doesn't blow up (name & zone here don't make any sense, but not
# important) # important)


Loading…
Cancel
Save