]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Do not allow dangerous operations on secondary zones unless --force. 15133/head
authorMiod Vallat <miod.vallat@open-xchange.com>
Fri, 7 Feb 2025 14:23:59 +0000 (15:23 +0100)
committerMiod Vallat <miod.vallat@open-xchange.com>
Wed, 12 Feb 2025 10:58:17 +0000 (11:58 +0100)
This applies to: add-record, delete-rrset, edit-zone, increase-serial
and replace-rrset.

Fixes #11392, #15130

pdns/pdnsutil.cc

index d3b1700bcd853d8217570f7e385724a1f6ba2865..487233f1d4d68547220185cc3386a60021aaec71 100644 (file)
@@ -61,6 +61,7 @@ string g_programname="pdns";
 
 namespace {
   bool g_verbose;
+  bool g_force;
 }
 
 ArgvMap &arg()
@@ -945,6 +946,19 @@ static int increaseSerial(const DNSName& zone, DNSSECKeeper &dk)
     return -1;
   }
 
+  DomainInfo info;
+  if (!B.getDomainInfo(zone, info, false)) {
+    cout << "[Warning] Unable to get zone information for zone '" << zone << "'" << endl;
+    if (!g_force) {
+      throw PDNSException("Operation is not allowed unless --force");
+    }
+  }
+  else {
+    if (info.isSecondaryType() && !g_force) {
+      throw PDNSException("Operation on a secondary zone is not allowed unless --force");
+    }
+  }
+
   string soaEditKind;
   dk.getSoaEdit(zone, soaEditKind);
 
@@ -1204,6 +1218,28 @@ static int editZone(const DNSName &zone, const PDNSColors& col) {
     return EXIT_FAILURE;
   }
 
+  if (isatty(STDIN_FILENO) == 0) {
+    cerr << "edit-zone requires a terminal" << endl;
+    return EXIT_FAILURE;
+  }
+
+  if (di.isSecondaryType() && !g_force) {
+    cout << "Zone '" << zone << "' is a secondary zone." << endl;
+    while (true) {
+      cout << "Edit the zone anyway? (N/y) " << std::flush;
+      int resp = read1char();
+      if (resp != '\n') {
+        cout << endl;
+      }
+      if (resp == 'y' || resp == 'Y') {
+        break;
+      }
+      if (resp == 'n' || resp == 'N' || resp == '\n') {
+        return EXIT_FAILURE;
+      }
+    }
+  }
+
   /* ensure that the temporary file will only
      be accessible by the current user, not even
      by other users in the same group, and certainly
@@ -1596,6 +1632,9 @@ static int addOrReplaceRecord(bool addOrReplace, const vector<string>& cmds) {
     cerr << "Zone '" << zone << "' does not exist" << endl;
     return EXIT_FAILURE;
   }
+  if (di.isSecondaryType() && !g_force) {
+    throw PDNSException("Operation on a secondary zone is not allowed unless --force");
+  }
   rr.auth = true;
   rr.domain_id = di.id;
   rr.qname = name;
@@ -1718,6 +1757,9 @@ static int deleteRRSet(const std::string& zone_, const std::string& name_, const
     cerr << "Zone '" << zone << "' does not exist" << endl;
     return EXIT_FAILURE;
   }
+  if (di.isSecondaryType() && !g_force) {
+    throw PDNSException("Operation on a secondary zone is not allowed unless --force");
+  }
 
   DNSName name;
   if(name_=="@")
@@ -4582,6 +4624,7 @@ try
   }
 
   g_verbose = g_vm.count("verbose") != 0;
+  g_force = g_vm.count("force") != 0;
 
   if (g_vm.count("version") != 0) {
     cout<<"pdnsutil "<<VERSION<<endl;