]> granicus.if.org Git - pdns/commitdiff
Add the CAA record
authorPieter Lexis <pieter.lexis@powerdns.com>
Tue, 5 Jan 2016 16:24:34 +0000 (17:24 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Tue, 15 Mar 2016 13:19:11 +0000 (14:19 +0100)
docs/markdown/types.md
pdns/dnsrecords.cc
pdns/dnsrecords.hh
pdns/qtype.hh
pdns/test-dnsrecords_cc.cc

index 653b371cdfe87e387daf1c0f21d7febdc62407bd..66b1684e98673960ef131c73d0584fcf2078c468 100644 (file)
@@ -31,6 +31,11 @@ mechanisms on a zone's apex. See the [howto](authoritative/howtos.md#using-alias
 for information on how to configure PowerDNS to serve records synthesized from
 ALIAS records.
 
+## CAA
+Since 4.0.0. The "Certification Authority Authorization" record, specified in
+[RFC 6844](https://tools.ietf.org/html/rfc6844), is used to specify Certificate
+Authorities that may issue certificates for a domain.
+
 ## CERT
 Specialised record type for storing certificates, defined in
 [RFC 2538](http://tools.ietf.org/html/rfc2538).
index d1c15666838d4497499972710d24f229060d4edc..86ff4078a65033aa6e30edf18589cbd311ebf85e 100644 (file)
@@ -486,6 +486,12 @@ boilerplate_conv(URI, QType::URI,
                  conv.xfrText(d_target, true, false);
                  )
 
+boilerplate_conv(CAA, QType::CAA,
+                 conv.xfr8BitInt(d_flags);
+                 conv.xfrUnquotedText(d_tag, true);
+                 conv.xfrText(d_value, true, false); /* no lenField */
+                )
+
 static uint16_t makeTag(const std::string& data)
 {
   const unsigned char* key=(const unsigned char*)data.c_str();
@@ -608,6 +614,7 @@ void reportOtherTypes()
    EUI64RecordContent::report();
    MINFORecordContent::report();
    URIRecordContent::report();
+   CAARecordContent::report();
 }
 
 void reportAllTypes()
index fc4a6bc003b4077ec8bf5bd9fa066cb5ba4566f6..43aa74527a92b107fb5917059d478b8bf526f839 100644 (file)
@@ -638,6 +638,14 @@ class URIRecordContent : public DNSRecordContent {
     string d_target;
 };
 
+class CAARecordContent : public DNSRecordContent {
+  public:
+    includeboilerplate(CAA)
+  private:
+    uint8_t d_flags;
+    string d_tag, d_value;
+};
+
 #define boilerplate(RNAME, RTYPE)                                                                         \
 RNAME##RecordContent::DNSRecordContent* RNAME##RecordContent::make(const DNSRecord& dr, PacketReader& pr) \
 {                                                                                                  \
index ad121333bf1aab43bbbd05191b6e8c07c0442c7a..888713eef239293cee4cb4cbbea37bf3a04cedab 100644 (file)
@@ -128,6 +128,7 @@ public:
     MAILA=254,
     ANY=255,
     URI=256,
+    CAA=257,
     DLV=32769,
     ADDR=65400,
     ALIAS=65401
@@ -218,6 +219,7 @@ private:
       qtype_insert("MAILA", 254);
       qtype_insert("ANY", 255);
       qtype_insert("URI", 256);
+      qtype_insert("CAA", 257);
       qtype_insert("DLV", 32769);
       qtype_insert("ADDR", 65400);
       qtype_insert("ALIAS", 65401);
index a5002f8eecd2f83575aaf1a4fb70dc76de76201d..f8da82f04eaf2d191e7247a0e47c45e9a693d23b 100644 (file)
@@ -167,6 +167,7 @@ BOOST_AUTO_TEST_CASE(test_record_types) {
      (CASE_S(QType::DLV, "20642 8 2 04443abe7e94c3985196beae5d548c727b044dda5151e60d7cd76a9fd931d00e", "\x50\xa2\x08\x02\x04\x44\x3a\xbe\x7e\x94\xc3\x98\x51\x96\xbe\xae\x5d\x54\x8c\x72\x7b\x04\x4d\xda\x51\x51\xe6\x0d\x7c\xd7\x6a\x9f\xd9\x31\xd0\x0e",false))
      (CASE_S(QType::URI, "10 1 \"ftp://ftp1.example.com/public\"", "\x0a\x01\x66\x74\x70\x3a\x2f\x2f\x66\x74\x70\x31\x2e\x65\x78\x61\x6d\x70\x6c\x65\x2e\x63\x6f\x6d\x2f\x70\x75\x62\x6c\x69\x63", false))
      (CASE_S(QType::URI, "10 1 \"ftp://ftp1.example.com/public/with/a/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/very/long/url\"", "\x0a\x01\x66\x74\x70\x3a\x2f\x2f\x66\x74\x70\x31\x2e\x65\x78\x61\x6d\x70\x6c\x65\x2e\x63\x6f\x6d\x2f\x70\x75\x62\x6c\x69\x63\x2f\x77\x69\x74\x68\x2f\x61\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x76\x65\x72\x79\x2f\x6c\x6f\x6e\x67\x2f\x75\x72\x6c", false))
+     (CASE_S(QType::CAA, "0 issue \"example.net\"", "\x00\x05\x69\x73\x73\x75\x65\x65\x78\x61\x6d\x70\x6c\x65\x2e\x6e\x65\x74",false))
      (CASE_S((QType::typeenum)65226,"\\# 3 414243","\x41\x42\x43",false))
 ;