Skip to content

Commit 12a6fed

Browse files
author
rnorthover
committed
Initial code changes for CAA record type. Comments to follow.
1 parent 85ccf44 commit 12a6fed

File tree

3 files changed

+128
-25
lines changed

3 files changed

+128
-25
lines changed

dyn/tm/records.py

Lines changed: 106 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99
from ..compat import force_unicode
1010

1111
__author__ = 'jnappi'
12-
__all__ = ['DNSRecord', 'ARecord', 'AAAARecord', 'ALIASRecord', 'CDSRecord',
13-
'CDNSKEYRecord', 'CERTRecord', 'CNAMERecord', 'CSYNCRecord',
14-
'DHCIDRecord', 'DNAMERecord', 'DNSKEYRecord', 'DSRecord',
15-
'KEYRecord', 'KXRecord', 'LOCRecord', 'IPSECKEYRecord', 'MXRecord',
16-
'NAPTRRecord', 'PTRRecord', 'PXRecord', 'NSAPRecord',
12+
__all__ = ['DNSRecord', 'ARecord', 'AAAARecord', 'ALIASRecord', 'CAARecord',
13+
'CDSRecord', 'CDNSKEYRecord', 'CERTRecord', 'CNAMERecord',
14+
'CSYNCRecord', 'DHCIDRecord', 'DNAMERecord', 'DNSKEYRecord',
15+
'DSRecord', 'KEYRecord', 'KXRecord', 'LOCRecord', 'IPSECKEYRecord',
16+
'MXRecord', 'NAPTRRecord', 'PTRRecord', 'PXRecord', 'NSAPRecord',
1717
'RPRecord', 'NSRecord', 'SOARecord', 'SPFRecord', 'SRVRecord',
1818
'TLSARecord', 'TXTRecord', 'SSHFPRecord', 'UNKNOWNRecord']
1919

@@ -1239,6 +1239,107 @@ def __repr__(self):
12391239
"""print override"""
12401240
return self.__str__()
12411241

1242+
class CAARecord(DNSRecord):
1243+
"""
1244+
"""
1245+
1246+
def __init__(self, zone, fqdn, *args, **kwargs):
1247+
"""Create a :class:`~dyn.tm.records.CAARecord` object
1248+
1249+
:param zone: Name of zone where the record will be added
1250+
:param fqdn: Name of node where the record will be added
1251+
:param flags: A byte
1252+
:param tag: A string defining the tag component of the <tag>=<value>
1253+
record property. May be one of:
1254+
issue: The issue property entry authorizes the holder of
1255+
the domain name <Issuer Domain Name> or a party acting under
1256+
the explicit authority of the holder of that domain name to
1257+
issue certificates for the domain in which the property is
1258+
published.
1259+
1260+
issuewild: The issuewild property entry authorizes the
1261+
holder of the domain name <Issuer Domain Name> or a party
1262+
acting under the explicit authority of the holder of that
1263+
domain name to issue wildcard certificates for the domain in
1264+
which the property is published.
1265+
1266+
iodef: Specifies a URL to which an issuer MAY report
1267+
certificate issue requests that are inconsistent with the
1268+
issuer's Certification Practices or Certificate Policy, or
1269+
that a Certificate Evaluator may use to report observation
1270+
of a possible policy violation.
1271+
:param value: A string representing the value component of the property.
1272+
This will be an issuer domain name or a URL.
1273+
:param ttl: TTL for this record. Use 0 for zone default
1274+
"""
1275+
fields = ['flags', 'tag', 'value', 'ttl']
1276+
1277+
create = kwargs.pop('create', None)
1278+
if create is not None:
1279+
super(CAARecord, self).__init__(zone, fqdn, create)
1280+
self._build(kwargs)
1281+
self._record_type = 'CAARecord'
1282+
else:
1283+
super(CAARecord, self).__init__(zone, fqdn)
1284+
self._record_type = 'CAARecord'
1285+
arg_length = len(args) + len(kwargs)
1286+
if 'record_id' in kwargs:
1287+
self._get_record(kwargs['record_id'])
1288+
elif arg_length == 1:
1289+
self._get_record(*args, **kwargs)
1290+
elif any(field in kwargs for field in fields) or arg_length >= 1:
1291+
self._post(*args, **kwargs)
1292+
1293+
def _post(self, flags, tag, value, ttl=0):
1294+
self._flags = flags
1295+
self._tag = tag
1296+
self._value = value
1297+
self._ttl = ttl
1298+
self.api_args = dict(
1299+
rdata=dict(flags=flags, tag=tag, value=value),
1300+
ttl=ttl
1301+
)
1302+
self._create_record(self.api_args)
1303+
1304+
def rdata(self):
1305+
return dict(caa_rdata=super(CAARecord, self).rdata())
1306+
1307+
@property
1308+
def flags(self):
1309+
self.pull()
1310+
return self._flags
1311+
1312+
@flags.setter
1313+
def flags(self, value):
1314+
self.api_args['rdata']['flags'] = value
1315+
self._update_record(self.api_args)
1316+
if self._implicitPublish:
1317+
self._flags = value
1318+
1319+
@property
1320+
def tag(self):
1321+
self.pull()
1322+
return self._tag
1323+
1324+
@tag.setter
1325+
def tag(self, value):
1326+
self.api_args['rdata']['tag'] = value
1327+
self._update_record(self.api_args)
1328+
if self._implicitPublish:
1329+
self._tag = value
1330+
1331+
@property
1332+
def value(self):
1333+
self.pull()
1334+
return self._value
1335+
1336+
@value.setter
1337+
def value(self, value):
1338+
self.api_args['rdata']['value'] = value
1339+
self._update_record(self.api_args)
1340+
if self._implicitPublish:
1341+
self._value = value
1342+
12421343

12431344
class DSRecord(DNSRecord):
12441345
"""The Delegation Signer (DS) record type is used in DNSSEC to create the

dyn/tm/services/dsf.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
from dyn.compat import force_unicode, string_types
77
from dyn.tm.utils import APIList, Active
88
from dyn.tm.errors import DynectInvalidArgumentError
9-
from dyn.tm.records import (ARecord, AAAARecord, ALIASRecord, CDSRecord,
10-
CDNSKEYRecord, CSYNCRecord, CERTRecord,
9+
from dyn.tm.records import (ARecord, AAAARecord, ALIASRecord, CAARecord,
10+
CDSRecord, CDNSKEYRecord, CSYNCRecord, CERTRecord,
1111
CNAMERecord, DHCIDRecord, DNAMERecord,
1212
DNSKEYRecord, DSRecord, KEYRecord, KXRecord,
1313
LOCRecord, IPSECKEYRecord, MXRecord, NAPTRRecord,

dyn/tm/zones.py

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from dyn.tm.errors import (DynectCreateError, DynectGetError,
1010
DynectInvalidArgumentError)
1111
from dyn.tm.records import (ARecord, AAAARecord, ALIASRecord, CDSRecord,
12-
CDNSKEYRecord, CSYNCRecord, CERTRecord,
12+
CAA, CDNSKEYRecord, CSYNCRecord, CERTRecord,
1313
CNAMERecord, DHCIDRecord, DNAMERecord,
1414
DNSKEYRecord, DSRecord, KEYRecord, KXRecord,
1515
LOCRecord, IPSECKEYRecord, MXRecord, NAPTRRecord,
@@ -27,15 +27,15 @@
2727
'ExternalNameserver', 'ExternalNameserverEntry']
2828

2929
RECS = {'A': ARecord, 'AAAA': AAAARecord, 'ALIAS': ALIASRecord,
30-
'CDS': CDSRecord, 'CDNSKEY': CDNSKEYRecord, 'CSYNC': CSYNCRecord,
31-
'CERT': CERTRecord, 'CNAME': CNAMERecord, 'DHCID': DHCIDRecord,
32-
'DNAME': DNAMERecord, 'DNSKEY': DNSKEYRecord, 'DS': DSRecord,
33-
'KEY': KEYRecord, 'KX': KXRecord, 'LOC': LOCRecord,
30+
'CAA': CAARecord, 'CDS': CDSRecord, 'CDNSKEY': CDNSKEYRecord,
31+
'CSYNC': CSYNCRecord, 'CERT': CERTRecord, 'CNAME': CNAMERecord,
32+
'DHCID': DHCIDRecord, 'DNAME': DNAMERecord, 'DNSKEY': DNSKEYRecord,
33+
'DS': DSRecord, 'KEY': KEYRecord, 'KX': KXRecord, 'LOC': LOCRecord,
3434
'IPSECKEY': IPSECKEYRecord, 'MX': MXRecord, 'NAPTR': NAPTRRecord,
3535
'PTR': PTRRecord, 'PX': PXRecord, 'NSAP': NSAPRecord,
36-
'RP': RPRecord, 'NS': NSRecord, 'SOA': SOARecord,
37-
'SPF': SPFRecord, 'SRV': SRVRecord, 'TLSA': TLSARecord,
38-
'TXT': TXTRecord, 'SSHFP': SSHFPRecord, 'UNKNOWN': UNKNOWNRecord}
36+
'RP': RPRecord, 'NS': NSRecord, 'SOA': SOARecord, 'SPF': SPFRecord,
37+
'SRV': SRVRecord, 'TLSA': TLSARecord, 'TXT': TXTRecord,
38+
'SSHFP': SSHFPRecord, 'UNKNOWN': UNKNOWNRecord}
3939

4040

4141
def get_all_zones():
@@ -522,14 +522,14 @@ def get_all_records_by_type(self, record_type):
522522
are owned by this node.
523523
524524
:param record_type: The type of :class:`DNSRecord` you wish returned.
525-
Valid record_type arguments are: 'A', 'AAAA', 'CERT', 'CNAME',
525+
Valid record_type arguments are: 'A', 'AAAA', 'CAA', 'CERT', 'CNAME',
526526
'DHCID', 'DNAME', 'DNSKEY', 'DS', 'KEY', 'KX', 'LOC', 'IPSECKEY',
527527
'MX', 'NAPTR', 'PTR', 'PX', 'NSAP', 'RP', 'NS', 'SOA', 'SPF',
528528
'SRV', and 'TXT'.
529529
:return: A :class:`List` of :class:`DNSRecord`'s
530530
"""
531531
names = {'A': 'ARecord', 'AAAA': 'AAAARecord', 'ALIAS': 'ALIASRecord',
532-
'CDS': 'CDSRecord', 'CDNSKEY': 'CDNSKEYRecord',
532+
'CAA': 'CAARecord', 'CDS': 'CDSRecord', 'CDNSKEY': 'CDNSKEYRecord',
533533
'CERT': 'CERTRecord', 'CSYNC': 'CSYNCRecord',
534534
'CNAME': 'CNAMERecord', 'DHCID': 'DHCIDRecord',
535535
'DNAME': 'DNAMERecord', 'DNSKEY': 'DNSKEYRecord',
@@ -1052,16 +1052,18 @@ def get_all_records_by_type(self, record_type):
10521052
'SRV', and 'TXT'.
10531053
:return: A list of :class:`DNSRecord`'s
10541054
"""
1055-
names = {'A': 'ARecord', 'AAAA': 'AAAARecord', 'CERT': 'CERTRecord',
1056-
'CNAME': 'CNAMERecord', 'DHCID': 'DHCIDRecord',
1057-
'DNAME': 'DNAMERecord', 'DNSKEY': 'DNSKEYRecord',
1058-
'DS': 'DSRecord', 'KEY': 'KEYRecord', 'KX': 'KXRecord',
1059-
'LOC': 'LOCRecord', 'IPSECKEY': 'IPSECKEYRecord',
1060-
'MX': 'MXRecord', 'NAPTR': 'NAPTRRecord', 'PTR': 'PTRRecord',
1055+
names = {'A': 'ARecord', 'AAAA': 'AAAARecord', 'CAA': 'CAARecord',
1056+
'CERT': 'CERTRecord', 'CNAME': 'CNAMERecord',
1057+
'DHCID': 'DHCIDRecord', 'DNAME': 'DNAMERecord',
1058+
'DNSKEY': 'DNSKEYRecord', 'DS': 'DSRecord',
1059+
'KEY': 'KEYRecord', 'KX': 'KXRecord', 'LOC': 'LOCRecord',
1060+
'IPSECKEY': 'IPSECKEYRecord', 'MX': 'MXRecord',
1061+
'NAPTR': 'NAPTRRecord', 'PTR': 'PTRRecord',
10611062
'PX': 'PXRecord', 'NSAP': 'NSAPRecord', 'RP': 'RPRecord',
10621063
'NS': 'NSRecord', 'SOA': 'SOARecord', 'SPF': 'SPFRecord',
1063-
'SRV': 'SRVRecord', 'TLSA': 'TLSARecord', 'TXT': 'TXTRecord',
1064-
'SSHFP': 'SSHFPRecord', 'ALIAS': 'ALIASRecord'}
1064+
'SRV': 'SRVRecord', 'TLSA': 'TLSARecord',
1065+
'TXT': 'TXTRecord', 'SSHFP': 'SSHFPRecord',
1066+
'ALIAS': 'ALIASRecord'}
10651067
constructor = RECS[record_type]
10661068
uri = '/{}/{}/{}/'.format(names[record_type], self.zone,
10671069
self.fqdn)

0 commit comments

Comments
 (0)