]> granicus.if.org Git - pdns/commitdiff
preliminary infrastructure for signing messages with TSIG in a clean way
authorBert Hubert <bert.hubert@netherlabs.nl>
Sat, 16 May 2009 15:33:21 +0000 (15:33 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Sat, 16 May 2009 15:33:21 +0000 (15:33 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1359 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/dnsparser.cc
pdns/dnsparser.hh
pdns/dnswriter.hh

index f6e7f9f27aa21ac4b5308e508979742dc113c97b..b30727e0f0a74e712dee5e7ac36786c2ddc355d0 100644 (file)
@@ -220,6 +220,8 @@ void MOADNSParser::init(const char *packet, unsigned int len)
       else 
        dr.d_place=DNSRecord::Additional;
       
+      unsigned int recordStartPos=pr.d_pos;
+
       string label=pr.getLabel();
       
       pr.getDnsrecordheader(ah);
@@ -232,6 +234,9 @@ void MOADNSParser::init(const char *packet, unsigned int len)
 
       dr.d_content=boost::shared_ptr<DNSRecordContent>(DNSRecordContent::mastermake(dr, pr));
       d_answers.push_back(make_pair(dr, pr.d_pos));
+
+      if(dr.d_type == QType::TSIG && dr.d_class == 0xff) 
+       d_tsigPos = recordStartPos + sizeof(struct dnsheader);
     }
 
 #if 0    
index e9fb29252157ecb5c21579f97cf5ca96fed0a1c3..0eaa08aa69733019f7c995a8dff8799422347288 100644 (file)
@@ -200,12 +200,12 @@ public:
     throw runtime_error("Unknown DNS type '"+name+"'");
   }
 
-  static const string NumberToType(uint16_t num)
+  static const string NumberToType(uint16_t num, uint16_t classnum=1)
   {
-    if(!getNamemap().count(make_pair(1,num)))
+    if(!getNamemap().count(make_pair(classnum,num)))
       return "#" + lexical_cast<string>(num);
       //      throw runtime_error("Unknown DNS type with numerical id "+lexical_cast<string>(num));
-    return getNamemap()[make_pair(1,num)];
+    return getNamemap()[make_pair(classnum,num)];
   }
 
   explicit DNSRecordContent(uint16_t type) : d_qtype(type)
@@ -266,17 +266,17 @@ struct DNSRecord
 };
 
 //! This class can be used to parse incoming packets, and is copyable
-class MOADNSParser
+class MOADNSParser : public boost::noncopyable
 {
 public:
   //! Parse from a string
-  MOADNSParser(const string& buffer) 
+  MOADNSParser(const string& buffer)  : d_tsigPos(0)
   {
     init(buffer.c_str(), (unsigned int)buffer.size());
   }
 
   //! Parse from a pointer and length
-  MOADNSParser(const char *packet, unsigned int len)
+  MOADNSParser(const char *packet, unsigned int len) : d_tsigPos(0)
   {
     init(packet, len);
   }
@@ -298,11 +298,15 @@ public:
     return pr;
   }
 
-  
+  uint16_t getTSIGPos()
+  {
+    return d_tsigPos;
+  }
 private:
   void getDnsrecordheader(struct dnsrecordheader &ah);
   void init(const char *packet, unsigned int len);
   vector<uint8_t> d_content;
+  uint16_t d_tsigPos;
 };
 
 string simpleCompress(const string& label, const string& root="");
index e5d418d07c3111ca03caf22f863c3ef2ad3ef184..f07d0cc08083b2bee6c8a3bd9dae22f157b64b1f 100644 (file)
@@ -93,9 +93,10 @@ public:
   
   dnsheader* getHeader();
   void getRecords(string& records);
+  const vector<uint8_t>& getRecordBeingWritten() { return d_record; }
 
 private:
-  vector<uint8_t>& d_content;
+  vector <uint8_t>& d_content;
   vector <uint8_t> d_record;
   string d_qname;
   uint16_t d_qtype, d_qclass;