]> granicus.if.org Git - pdns/commitdiff
lua-auth4: Move prequery to new lua framework
authorAki Tuomi <cmouse@cmouse.fi>
Sun, 11 Jun 2017 16:47:30 +0000 (19:47 +0300)
committerAki Tuomi <cmouse@cmouse.fi>
Mon, 18 Dec 2017 10:53:58 +0000 (12:53 +0200)
This changes how prequery gets called

pdns/lua-auth.cc
pdns/lua-auth.hh
pdns/lua-auth4.cc
pdns/lua-auth4.hh
pdns/packethandler.cc
pdns/packethandler.hh
pdns/slavecommunicator.cc

index 67563e103a7dab3d127c968712e6be32e2adad17..55bf4bfe0f208504a90338ff11ed0de9146c7298 100644 (file)
@@ -32,11 +32,6 @@ AuthLua::AuthLua(const std::string &fname)
   // empty
 }
 
-DNSPacket* AuthLua::prequery(DNSPacket *p)
-{
-  return 0;
-}
-
 #else
 
 
@@ -207,47 +202,4 @@ void AuthLua::registerLuaDNSPacket(void) {
 }
 #endif
 
-DNSPacket* AuthLua::prequery(DNSPacket *p)
-{
-  lua_getglobal(d_lua,"prequery");
-  if(!lua_isfunction(d_lua, -1)) {
-    // cerr<<"No such function 'prequery'\n";
-    lua_pop(d_lua, 1);
-    return 0;
-  }
-  
-  DNSPacket *r=0;
-  // allocate a fresh packet and prefill the question
-  r=p->replyPacket();
-
-  // wrap it
-  LuaDNSPacket* lua_dp = (LuaDNSPacket *)lua_newuserdata(d_lua, sizeof(LuaDNSPacket));
-  lua_dp->d_p=r;
-  
-  // make it of the right type
-  luaL_getmetatable(d_lua, "LuaDNSPacket");
-  lua_setmetatable(d_lua, -2);
-
-  if(lua_pcall(d_lua,  1, 1, 0)) { // error 
-    string error=string("lua error in prequery: ")+lua_tostring(d_lua, -1);
-    theL()<<Logger::Error<<error<<endl;
-
-    lua_pop(d_lua, 1);
-    throw runtime_error(error);
-  }
-  bool res=lua_toboolean(d_lua, 1);
-  lua_pop(d_lua, 1);
-  if(res) {
-    // prequery created our response, use it
-    theL()<<Logger::Info<<"overriding query from lua prequery result"<<endl;
-    return r;
-  }
-  else
-  {
-    // prequery wanted nothing to do with this question
-    delete r;
-    return 0;
-  }
-}
-
 #endif
index f0b349f088918bd288246ceaf20d2518801bbf04..266bf9e5ed1147376e81f294fd34445659e8670f 100644 (file)
@@ -32,7 +32,6 @@ class AuthLua : public PowerDNSLua
 public:
   explicit AuthLua(const std::string& fname);
   // ~AuthLua();
-  DNSPacket* prequery(DNSPacket *p);
 
 private:
   void registerLuaDNSPacket(void);
index 0973673a708cbbc7758528c76297dc8a08931f87..b1f09ccfdaa30f1e2ec9292158e4832c3a690516 100644 (file)
@@ -13,6 +13,8 @@ AuthLua4::AuthLua4() { prepareContext(); }
 
 bool AuthLua4::updatePolicy(const DNSName &qname, QType qtype, const DNSName &zonename, DNSPacket *packet) { return false; }
 bool AuthLua4::axfrfilter(const ComboAddress& remote, const DNSName& zone, const DNSResourceRecord& in, vector<DNSResourceRecord>& out) { return false; }
+DNSPacket *AuthLua4::prequery(DNSPacket *q) { return NULL; }
+
 AuthLua4::~AuthLua4() { }
 
 #else
@@ -46,7 +48,7 @@ void AuthLua4::postPrepareContext() {
   d_lw->registerFunction<DNSPacket, Netmask()>("getRealRemote", [](DNSPacket &p) { return p.getRealRemote(); });
   d_lw->registerFunction<DNSPacket, ComboAddress()>("getLocal", [](DNSPacket &p) { return p.getLocal(); });
   d_lw->registerFunction<DNSPacket, unsigned int()>("getRemotePort", [](DNSPacket &p) { return p.getRemotePort(); });
-
+  d_lw->registerFunction<DNSPacket, std::tuple<const std::string, unsigned int>()>("getQuestion", [](DNSPacket &p) { return std::make_tuple(p.qdomain.toString(), static_cast<unsigned int>(p.qtype.getCode())); });
   d_lw->registerFunction<DNSPacket, void(bool)>("setA", [](DNSPacket &p, bool a) { return p.setA(a); });
   d_lw->registerFunction<DNSPacket, void(unsigned int)>("setID", [](DNSPacket &p, unsigned int id) { return p.setID(static_cast<uint16_t>(id)); });
   d_lw->registerFunction<DNSPacket, void(bool)>("setRA", [](DNSPacket &p, bool ra) { return p.setRA(ra); });
@@ -91,6 +93,7 @@ void AuthLua4::postPrepareContext() {
 void AuthLua4::postLoad() {
   d_update_policy = d_lw->readVariable<boost::optional<luacall_update_policy_t>>("updatepolicy").get_value_or(0);
   d_axfr_filter = d_lw->readVariable<boost::optional<luacall_axfr_filter_t>>("axfrfilter").get_value_or(0);
+  d_prequery = d_lw->readVariable<boost::optional<luacall_prequery_t>>("prequery").get_value_or(0);
 
 }
 
@@ -146,6 +149,16 @@ bool AuthLua4::updatePolicy(const DNSName &qname, QType qtype, const DNSName &zo
   return d_update_policy(upq);
 }
 
+DNSPacket *AuthLua4::prequery(DNSPacket *q) {
+  if (d_prequery == NULL) return NULL;
+
+  DNSPacket *r = q->replyPacket();
+  if (d_prequery(r))
+    return r;
+  delete r;
+  return NULL;
+}
+
 AuthLua4::~AuthLua4() { }
 
 #endif
index f5178cffa4caf801d53653cae5e18c2cf1b3d686..46cc0deb839d8194e5a1b8913c53a0acfcca6f0c 100644 (file)
@@ -15,6 +15,7 @@ public:
   AuthLua4();
   bool updatePolicy(const DNSName &qname, QType qtype, const DNSName &zonename, DNSPacket *packet);
   bool axfrfilter(const ComboAddress&, const DNSName&, const DNSResourceRecord&, std::vector<DNSResourceRecord>&);
+  DNSPacket *prequery(DNSPacket *p);
 
   ~AuthLua4(); // this is so unique_ptr works with an incomplete type
 protected:
@@ -33,7 +34,9 @@ private:
 
   typedef std::function<bool(const UpdatePolicyQuery&)> luacall_update_policy_t;
   typedef std::function<std::tuple<int, std::unordered_map<int, std::unordered_map<std::string,boost::variant<unsigned int,std::string> > > >(const ComboAddress&, const DNSName&, const DNSResourceRecord&)> luacall_axfr_filter_t;
+  typedef std::function<bool(DNSPacket*)> luacall_prequery_t;
 
   luacall_update_policy_t d_update_policy;
   luacall_axfr_filter_t d_axfr_filter;
+  luacall_prequery_t d_prequery;
 };
index 427c1fb19a547564c41b33156e9c93aeda674b12..2d4451f3088bc40a12d32eb9d282b8ff64977417 100644 (file)
@@ -71,7 +71,8 @@ PacketHandler::PacketHandler():B(s_programname), d_dk(&B)
   }
   else
   {
-    d_pdl = std::unique_ptr<AuthLua>(new AuthLua(fname));
+    d_pdl = std::unique_ptr<AuthLua4>(new AuthLua4());
+    d_pdl->loadFile(fname);
   }
   fname = ::arg()["lua-dnsupdate-policy-script"];
   if (fname.empty())
index b2dcd3fd041e4586766f93747f64330f06617e18..6c76445a5e7d97dd7e7f26208e73122cf833e8e4 100644 (file)
@@ -110,7 +110,7 @@ private:
   bool d_doIPv6AdditionalProcessing;
   bool d_doDNAME;
   bool d_doExpandALIAS;
-  std::unique_ptr<AuthLua> d_pdl;
+  std::unique_ptr<AuthLua4> d_pdl;
   std::unique_ptr<AuthLua4> d_update_policy_lua;
 
   UeberBackend B; // every thread an own instance
index 4b6da4dbfdd1dc0901624da36fa629e899ee2707..5adb410988b408a619130a69c7bef1036316f0f3 100644 (file)
@@ -342,7 +342,8 @@ void CommunicatorClass::suck(const DNSName &domain, const string &remote)
     }
     if(!script.empty()){
       try {
-        pdl.reset(new AuthLua4(script));
+        pdl.reset(new AuthLua4());
+        pdl->loadFile(script);
         L<<Logger::Info<<"Loaded Lua script '"<<script<<"' to edit the incoming AXFR of '"<<domain<<"'"<<endl;
       }
       catch(std::exception& e) {