]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth: make sure we recheck SOA for notifies 10399/head
authorKees Monshouwer <mind04@monshouwer.org>
Tue, 13 Apr 2021 13:15:23 +0000 (15:15 +0200)
committermind04 <mind04@monshouwer.org>
Tue, 13 Apr 2021 13:15:23 +0000 (15:15 +0200)
modules/bindbackend/bindbackend2.cc
modules/bindbackend/bindbackend2.hh
modules/lmdbbackend/lmdbbackend.cc
modules/lmdbbackend/lmdbbackend.hh
modules/remotebackend/httpconnector.cc
modules/remotebackend/remotebackend.cc
modules/remotebackend/remotebackend.hh
pdns/backends/gsql/gsqlbackend.cc
pdns/backends/gsql/gsqlbackend.hh
pdns/dnsbackend.hh
pdns/slavecommunicator.cc

index 1d3312ed2d1c620b5abecc1ec01b011bb6ae7ad9..675e8186772bef90a0a6d54dc3308172ac0a3e66 100644 (file)
@@ -184,15 +184,25 @@ void Bind2Backend::setNotified(uint32_t id, uint32_t serial)
   safePutBBDomainInfo(bbd);
 }
 
-void Bind2Backend::setFresh(uint32_t domain_id)
+void Bind2Backend::setLastCheck(uint32_t domain_id, time_t lastcheck)
 {
   BB2DomainInfo bbd;
   if (safeGetBBDomainInfo(domain_id, &bbd)) {
-    bbd.d_lastcheck = time(nullptr);
+    bbd.d_lastcheck = lastcheck;
     safePutBBDomainInfo(bbd);
   }
 }
 
+void Bind2Backend::setStale(uint32_t domain_id)
+{
+  setLastCheck(domain_id, 0);
+}
+
+void Bind2Backend::setFresh(uint32_t domain_id)
+{
+  setLastCheck(domain_id, time(nullptr));
+}
+
 bool Bind2Backend::startTransaction(const DNSName& qname, int id)
 {
   if (id < 0) {
index 93c1fe85e1d6de702f3b61ce563857eeeabbba3b..e5bd7cf9c7e43bcb7eeab2cbcc921fca72dca9c3 100644 (file)
@@ -199,6 +199,7 @@ public:
   static DNSBackend* maker();
   static std::mutex s_startup_lock;
 
+  void setStale(uint32_t domain_id) override;
   void setFresh(uint32_t domain_id) override;
   void setNotified(uint32_t id, uint32_t serial) override;
   bool startTransaction(const DNSName& qname, int id) override;
@@ -251,6 +252,7 @@ private:
   static bool safeRemoveBBDomainInfo(const DNSName& name);
   shared_ptr<SSQLite3> d_dnssecdb;
   bool getNSEC3PARAM(const DNSName& name, NSEC3PARAMRecordContent* ns3p);
+  void setLastCheck(uint32_t domain_id, time_t lastcheck);
   class handle
   {
   public:
index 03b0d5438a84cd22666d79e8e99d5820fe1e08d8..d2d0fc8add2af41effc8839f1e51db788bca4bed 100644 (file)
@@ -932,6 +932,13 @@ bool LMDBBackend::setAccount(const DNSName& domain, const std::string& account)
   });
 }
 
+void LMDBBackend::setStale(uint32_t domain_id)
+{
+  genChangeDomain(domain_id, [](DomainInfo& di) {
+    di.last_check = 0;
+  });
+}
+
 void LMDBBackend::setFresh(uint32_t domain_id)
 {
   genChangeDomain(domain_id, [](DomainInfo& di) {
index 9951841d09800af1d57fc42a6ad2cda0741069bb..a489770b6c5d81849eef01fa80f855ae89792080 100644 (file)
@@ -97,6 +97,7 @@ public:
   }
 
   bool setDomainMetadata(const DNSName& name, const std::string& kind, const std::vector<std::string>& meta) override;
+  void setStale(uint32_t domain_id) override;
   void setFresh(uint32_t domain_id) override;
   void setNotified(uint32_t id, uint32_t serial) override;
   bool setAccount(const DNSName& domain, const std::string& account) override;
index 795a9f72b7734c9430be20cb76b133f3d53e82e5..99c0676e0eddbf9f2b11e2551e9d75fb684cac5c 100644 (file)
@@ -260,6 +260,10 @@ void HTTPConnector::restful_requestbuilder(const std::string& method, const Json
     req.preparePost();
     verb = "PATCH";
   }
+  else if (method == "setStale") {
+    req.preparePost();
+    verb = "PATCH";
+  }
   else if (method == "setFresh") {
     req.preparePost();
     verb = "PATCH";
index 5da00da83db18d3597dc5f615b5c309e0375c24c..248a55004f8735afd2a633afa634f40f2da780da 100644 (file)
@@ -927,6 +927,18 @@ void RemoteBackend::getUnfreshSlaveInfos(vector<DomainInfo>* domains)
   }
 }
 
+void RemoteBackend::setStale(uint32_t domain_id)
+{
+  Json query = Json::object{
+    {"method", "setStale"},
+    {"parameters", Json::object{{"id", static_cast<double>(domain_id)}}}};
+
+  Json answer;
+  if (this->send(query) == false || this->recv(answer) == false) {
+    g_log << Logger::Error << kBackendId << " Failed to execute RPC for RemoteBackend::setStale(" << domain_id << ")" << endl;
+  }
+}
+
 void RemoteBackend::setFresh(uint32_t domain_id)
 {
   Json query = Json::object{
index 7c2b6c129f78edf5bf978998cab15c0a13833fb9..7832682a1c6cb0cff4259eece7b135cca09f98af 100644 (file)
@@ -202,6 +202,7 @@ public:
   void getUpdatedMasters(vector<DomainInfo>* domains) override;
   void alsoNotifies(const DNSName& domain, set<string>* ips) override;
   void getUnfreshSlaveInfos(vector<DomainInfo>* domains) override;
+  void setStale(uint32_t domain_id) override;
   void setFresh(uint32_t domain_id) override;
 
   static DNSBackend* maker();
index 5f55bd48a69af6b1824ede9261adcceb73a299b0..a44026c99f9bcf10be94ce614bd56d0440674d5a 100644 (file)
@@ -207,22 +207,28 @@ void GSQLBackend::setNotified(uint32_t domain_id, uint32_t serial)
   }
 }
 
-void GSQLBackend::setFresh(uint32_t domain_id)
+void GSQLBackend::setLastCheck(uint32_t domain_id, time_t lastcheck)
 {
   try {
     reconnectIfNeeded();
 
-    d_UpdateLastCheckOfZoneQuery_stmt->
-      bind("last_check", time(nullptr))->
-      bind("domain_id", domain_id)->
-      execute()->
-      reset();
+    d_UpdateLastCheckOfZoneQuery_stmt->bind("last_check", lastcheck)->bind("domain_id", domain_id)->execute()->reset();
   }
   catch (SSqlException &e) {
-    throw PDNSException("GSQLBackend unable to refresh domain_id "+itoa(domain_id)+": "+e.txtReason());
+    throw PDNSException("GSQLBackend unable to update last_check for domain_id " + itoa(domain_id) + ": " + e.txtReason());
   }
 }
 
+void GSQLBackend::setStale(uint32_t domain_id)
+{
+  setLastCheck(domain_id, 0);
+}
+
+void GSQLBackend::setFresh(uint32_t domain_id)
+{
+  setLastCheck(domain_id, time(nullptr));
+}
+
 bool GSQLBackend::setMasters(const DNSName &domain, const vector<ComboAddress> &masters)
 {
   vector<string> masters_s;
index 0aa79f54a63c970e0a2bea96a31195cb436e2c19..207992da3ae5847a51e123747cc9d8c5e5c06d16 100644 (file)
@@ -198,6 +198,7 @@ public:
   bool deleteDomain(const DNSName &domain) override;
   bool superMasterAdd(const string &ip, const string &nameserver, const string &account) override; 
   bool superMasterBackend(const string &ip, const DNSName &domain, const vector<DNSResourceRecord>&nsset, string *nameserver, string *account, DNSBackend **db) override;
+  void setStale(uint32_t domain_id) override;
   void setFresh(uint32_t domain_id) override;
   void getUnfreshSlaveInfos(vector<DomainInfo> *domains) override;
   void getUpdatedMasters(vector<DomainInfo> *updatedDomains) override;
@@ -244,6 +245,7 @@ protected:
   string pattern2SQLPattern(const string& pattern);
   void extractRecord(SSqlStatement::row_t& row, DNSResourceRecord& rr);
   void extractComment(SSqlStatement::row_t& row, Comment& c);
+  void setLastCheck(uint32_t domain_id, time_t lastcheck);
   bool isConnectionUsable() {
     if (d_db) {
       return d_db->isConnectionUsable();
index f200a0526a6436706f23e61f33ae78bd781fe1a7..4341183394174109d085c9a9910410c2fd5b4a03 100644 (file)
@@ -311,12 +311,17 @@ public:
   virtual void getUpdatedMasters(vector<DomainInfo>* domains)
   {
   }
-  
+
+  //! Called by PowerDNS to inform a backend that a domain need to be checked for freshness
+  virtual void setStale(uint32_t domain_id)
+  {
+  }
+
   //! Called by PowerDNS to inform a backend that a domain has been checked for freshness
   virtual void setFresh(uint32_t domain_id)
   {
-
   }
+
   //! Called by PowerDNS to inform a backend that the changes in the domain have been reported to slaves
   virtual void setNotified(uint32_t id, uint32_t serial)
   {
index 619c7e66605be7fe1db0a964523fd158c2aec145..0038a126c232e74b86a929d0721d69cfbf544da2 100644 (file)
@@ -951,6 +951,10 @@ void CommunicatorClass::slaveRefresh(PacketHandler *P)
       } else if (newCount % 10 == 0) {
         g_log<<Logger::Notice<<"Unable to retrieve SOA for "<<di.zone<<", this was the "<<std::to_string(newCount)<<"th time. Skipping SOA checks until "<<nextCheck<<endl;
       }
+      // Make sure we recheck SOA for notifies
+      if (di.receivedNotify) {
+        di.backend->setStale(di.id);
+      }
       continue;
     }