]> granicus.if.org Git - pdns/commitdiff
Fixed IPSECKEY record handling
authorAki Tuomi <cmouse@desteem.org>
Mon, 13 May 2013 13:23:11 +0000 (16:23 +0300)
committerAki Tuomi <cmouse@desteem.org>
Mon, 13 May 2013 19:05:05 +0000 (22:05 +0300)
pdns/dnsrecords.cc
pdns/dnsrecords.hh

index 8aef60ebabdce7a6cf15364c059f6c7a65434421..29585f75d7b74630acfe5da6a9e69ba8a9150758 100644 (file)
@@ -156,13 +156,111 @@ boilerplate_conv(KX, ns_t_kx,
                 conv.xfrLabel(d_exchanger, false);
                 )
 
-boilerplate_conv(IPSECKEY, 45,  /* ns_t_ipsec */
-                conv.xfr8BitInt(d_preference);
+//boilerplate_conv(IPSECKEY, 45,  /* ns_t_ipsec */
+/*              conv.xfr8BitInt(d_preference);
                 conv.xfr8BitInt(d_gatewaytype);
                 conv.xfr8BitInt(d_algorithm);
                 conv.xfrLabel(d_gateway, false);
                 conv.xfrBlob(d_publickey);
                 )
+*/
+
+IPSECKEYRecordContent::DNSRecordContent* IPSECKEYRecordContent::make(const DNSRecord& dr, PacketReader& pr) 
+{ 
+    return new IPSECKEYRecordContent(dr, pr); 
+} 
+IPSECKEYRecordContent::IPSECKEYRecordContent(const DNSRecord& dr, PacketReader& pr) : DNSRecordContent(ns_t_ipseckey) 
+{ 
+    doRecordCheck(dr); xfrPacket(pr); 
+} 
+IPSECKEYRecordContent::DNSRecordContent* IPSECKEYRecordContent::make(const string& zonedata) 
+{ 
+    return new IPSECKEYRecordContent(zonedata); 
+} 
+void IPSECKEYRecordContent::toPacket(DNSPacketWriter& pw) 
+{ 
+    this->xfrPacket(pw); 
+} 
+void IPSECKEYRecordContent::report(void) {
+    regist(1, ns_t_ipseckey, &IPSECKEYRecordContent::make, &IPSECKEYRecordContent::make, "IPSECKEY"); 
+} 
+void IPSECKEYRecordContent::unreport(void) { 
+    unregist(1, ns_t_ipseckey); 
+} 
+IPSECKEYRecordContent::IPSECKEYRecordContent(const std::string& zoneData) : DNSRecordContent(ns_t_ipseckey) { 
+    try { 
+       RecordTextReader rtr(zoneData); 
+       xfrPacket(rtr); 
+    } catch(RecordTextException& rtr) { 
+       throw MOADNSException("Parsing record content: "+std::string(rtr.what())); 
+    } 
+} 
+
+std::string IPSECKEYRecordContent::getZoneRepresentation() const { 
+   std::string ret; 
+   RecordTextWriter conv(ret); 
+   conv.xfr8BitInt(d_preference);
+   conv.xfr8BitInt(d_gatewaytype);
+   conv.xfr8BitInt(d_algorithm);
+
+   // now we need to determine values
+   switch(d_gatewaytype) {
+   case 0: // no gateway
+     break;
+   case 1: // IPv4 GW
+     conv.xfrIP(d_ip4);
+     break;
+   case 2: // IPv6 GW
+     conv.xfrIP6(d_ip6);
+     break; 
+   case 3: // DNS label
+     conv.xfrLabel(d_gateway, false);
+   };
+
+   switch(d_algorithm) {
+   case 0:
+     break;
+   default:
+     conv.xfrBlob(d_publickey);
+   }
+   return ret;
+};
+
+template<class Convertor>
+void IPSECKEYRecordContent::xfrPacket(Convertor& conv)
+{
+   conv.xfr8BitInt(d_preference);
+   conv.xfr8BitInt(d_gatewaytype);
+   conv.xfr8BitInt(d_algorithm);
+   // now we need to determine values
+   switch(d_gatewaytype) {
+   case 0: // NO KEY
+     break;
+   case 1: // IPv4 GW
+     conv.xfrIP(d_ip4);
+     break;
+   case 2: // IPv6 GW
+     conv.xfrIP6(d_ip6);
+     break;
+   case 3: // DNS label
+     conv.xfrLabel(d_gateway, false); 
+     break;
+   default:
+     throw MOADNSException("Parsing record content: invalid gateway type");
+   };
+
+   switch(d_algorithm) {
+   case 0:
+     break;
+   case 1:
+   case 2:
+     conv.xfrBlob(d_publickey);
+     break;
+   default:
+     throw MOADNSException("Parsing record content: invalid algorithm type");
+   }  
+}
 
 boilerplate_conv(DHCID, 49, 
                 conv.xfrBlob(d_content);
index a8cfb52458c14f1b5ce5d692562f8a42faafd7fc..c60d3824e20e0f8c545c860a3f9c100852f6cecc 100644 (file)
@@ -98,6 +98,8 @@ public:
 private:
   uint8_t d_preference, d_gatewaytype, d_algorithm;
   string d_gateway, d_publickey;
+  uint32_t d_ip4;
+  string d_ip6;
 };
 
 class DHCIDRecordContent : public DNSRecordContent