]> granicus.if.org Git - pdns/commitdiff
Lua: Give access to the dnsheader
authorPieter Lexis <pieter.lexis@powerdns.com>
Thu, 13 Oct 2016 16:03:37 +0000 (18:03 +0200)
committerPieter Lexis <pieter.lexis@powerdns.com>
Fri, 9 Dec 2016 09:22:12 +0000 (10:22 +0100)
docs/markdown/recursor/scripting.md
pdns/lua-recursor4.cc
pdns/lua-recursor4.hh
pdns/pdns_recursor.cc

index 2beb7c75842a692b2c3d471f60b14aa781498298..862fb1d8cdb5e1c3a76346fe3e55212fc900ef4f 100644 (file)
@@ -107,6 +107,11 @@ It also supports the following methods:
   the answer too, which defaults to the name of the question
 * `addPolicyTag(tag)`: add a policy tag.
 * `discardPolicy(policyname)`: skip the filtering policy (for example RPZ) named `policyname` for this query. This is mostly useful in the `prerpz` hook.
+* `getDH()` - Returns the DNS Header of the query or nil. A DNS header offers the following methods:
+     * `getRD()`, `getAA()`, `getAD()`, `getCD()`, `getTC()`: query these bits from the DNS Header
+     * `getRCODE()`: get the RCODE of the query
+     * `getOPCODE()`: get the OPCODE of the query
+     * `getID()`: get the ID of the query
 * `getPolicyTags()`: get the current policy tags as a table of strings.
 * `getRecords()`: get a table of DNS Records in this DNS Question (or answer by now)
 * `setPolicyTags(tags)`: update the policy tags, taking a table of strings.
@@ -128,12 +133,7 @@ With this hook, undesired traffic can be dropped rapidly before using precious C
 for parsing.
 
 `remoteip` is the IP(v6) address of the requestor, `localip` is the address on which the query arrived.
-`dh` is the DNS Header of the query, and it offers the following methods:
-
-* `getRD()`, `getAA()`, `getAD()`, `getCD()`, `getRD()`, `getRD()`, `getTC()`: query these bits from the DNS Header
-* `getRCODE()`: get the RCODE of the query
-* `getOPCODE()`: get the OPCODE of the query
-* `getID()`: get the ID of the query
+`dh` is the DNS Header of the query, and it offers the same functions as the `dq.getDH()` object described above.
 
 As an example, to filter all queries coming from 1.2.3.0/24, or with the AD bit set:
 
index a80701b0c0a2b2b272c08149697c176848d9b537..36769190b71f7b66a9ec96b5fceba22e1211bf22 100644 (file)
@@ -159,6 +159,13 @@ static int getFakePTRRecords(const DNSName& qname, const std::string& prefix, ve
 
 }
 
+boost::optional<dnsheader> RecursorLua4::DNSQuestion::getDH() const
+{
+  if (dh)
+    return *dh;
+  return boost::optional<dnsheader>();
+}
+
 vector<pair<uint16_t, string> > RecursorLua4::DNSQuestion::getEDNSOptions() const
 {
   if(ednsOptions)
@@ -397,6 +404,7 @@ RecursorLua4::RecursorLua4(const std::string& fname)
       pol.d_custom = shared_ptr<DNSRecordContent>(DNSRecordContent::mastermake(QType::CNAME, 1, content));
     }
   );
+  d_lw->registerFunction("getDH", &DNSQuestion::getDH);
   d_lw->registerFunction("getEDNSOptions", &DNSQuestion::getEDNSOptions);
   d_lw->registerFunction("getEDNSOption", &DNSQuestion::getEDNSOption);
   d_lw->registerFunction("getEDNSSubnet", &DNSQuestion::getEDNSSubnet);
index f0b9a078dc1958a0de0a5b1b299ee484dfbef1b5..3acce5d51bccaadf5e900fa44110322d827cfb4f 100644 (file)
@@ -55,6 +55,7 @@ public:
     const uint16_t qtype;
     const ComboAddress& local;
     const ComboAddress& remote;
+    const struct dnsheader* dh{nullptr};
     const bool isTcp;
     const std::vector<pair<uint16_t, string>>* ednsOptions{nullptr};
     vector<DNSRecord>* currentRecords{nullptr};
@@ -69,6 +70,7 @@ public:
     void addAnswer(uint16_t type, const std::string& content, boost::optional<int> ttl, boost::optional<string> name);
     void addRecord(uint16_t type, const std::string& content, DNSResourceRecord::Place place, boost::optional<int> ttl, boost::optional<string> name);
     vector<pair<int,DNSRecord> > getRecords() const;
+    boost::optional<dnsheader> getDH() const;
     vector<pair<uint16_t, string> > getEDNSOptions() const;
     boost::optional<string> getEDNSOption(uint16_t code) const;
     boost::optional<Netmask> getEDNSSubnet() const;
index a0f7cccce9b150515a5d85e687a8d55f6b8447e8..31c6cd734e69de7330c90dbd549eade870a48858 100644 (file)
@@ -752,6 +752,7 @@ void startDoResolve(void *p)
       dq->policyTags = &dc->d_policyTags;
       dq->appliedPolicy = &appliedPolicy;
       dq->currentRecords = &ret;
+      dq->dh = &dc->d_mdp.d_header;
     }
 
     if(dc->d_mdp.d_qtype==QType::ANY && !dc->d_tcp && g_anyToTcp) {