]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth: run deleteDomain() inside a transaction 10037/head
authorKees Monshouwer <mind04@monshouwer.org>
Mon, 1 Feb 2021 19:18:52 +0000 (20:18 +0100)
committermind04 <mind04@monshouwer.org>
Tue, 2 Feb 2021 12:33:16 +0000 (13:33 +0100)
pdns/backends/gsql/gsqlbackend.cc
pdns/pdnsutil.cc
pdns/ws-auth.cc

index bcb351769b0ac690f8535ba719f4dcee46adbdf3..9b04247980aba2820b9e1f344b74526f5b9b6eeb 100644 (file)
@@ -1328,6 +1328,10 @@ bool GSQLBackend::createSlaveDomain(const string &ip, const DNSName &domain, con
 
 bool GSQLBackend::deleteDomain(const DNSName &domain)
 {
+  if (!d_inTransaction) {
+    throw PDNSException("deleteDomain called outside of transaction");
+  }
+
   DomainInfo di;
   if (!getDomainInfo(domain, di)) {
     return false;
index eb7f77cfa362b79da5f1890bd507844865a8ae2d..78fc8990075c8ea9c3116e5f85559a2de2bbb7ca 100644 (file)
@@ -819,8 +819,18 @@ static int deleteZone(const DNSName &zone) {
     return EXIT_FAILURE;
   }
 
-  if(di.backend->deleteDomain(zone))
-    return EXIT_SUCCESS;
+  di.backend->startTransaction(zone, -1);
+  try {
+    if(di.backend->deleteDomain(zone)) {
+      di.backend->commitTransaction();
+      return EXIT_SUCCESS;
+    }
+  } catch (...) {
+    di.backend->abortTransaction();
+    throw;
+  }
+
+  di.backend->abortTransaction();
 
   cerr<<"Failed to delete domain '"<<zone<<"'"<<endl;;
   return EXIT_FAILURE;
index 5588a45313e9f6b7955b9cee6bbec3b3adb8bc7a..0f3bebe163fc50fa08f414424423303c062eb224 100644 (file)
@@ -1792,8 +1792,17 @@ static void apiServerZoneDetail(HttpRequest* req, HttpResponse* resp) {
   }
   else if(req->method == "DELETE") {
     // delete domain
-    if(!di.backend->deleteDomain(zonename))
-      throw ApiException("Deleting domain '"+zonename.toString()+"' failed: backend delete failed/unsupported");
+
+    di.backend->startTransaction(zonename, -1);
+    try {
+      if(!di.backend->deleteDomain(zonename))
+        throw ApiException("Deleting domain '"+zonename.toString()+"' failed: backend delete failed/unsupported");
+
+      di.backend->commitTransaction();
+    } catch (...) {
+      di.backend->abortTransaction();
+      throw;
+    }
 
     // clear caches
     DNSSECKeeper::clearCaches(zonename);