]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth: add default-catalog-zone setting 13238/head
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Tue, 12 Sep 2023 10:34:43 +0000 (12:34 +0200)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Thu, 14 Sep 2023 08:01:36 +0000 (10:01 +0200)
docs/settings.rst
pdns/auth-main.cc
pdns/ws-auth.cc
regression-tests.api/runtests.py
regression-tests.api/test_Zones.py

index 95d3956baad64810a8c3495c0078cb0e1c5d5ed0..d8bed0d47ce18a97cc100dd6b1a8bcc7299653f2 100644 (file)
@@ -366,6 +366,18 @@ The value of :ref:`metadata-api-rectify` if it is not set on the zone.
 .. note::
   Pre 4.2.0 the default was always no.
 
+.. _setting-default-catalog-zone:
+
+``default-catalog-zone``
+------------------------
+
+- String:
+- Default: empty
+
+.. versionadded:: 4.8.3
+
+When a primary zone is created via the API, and the request does not specify a catalog zone, the name given here will be used.
+
 .. _setting-default-ksk-algorithms:
 .. _setting-default-ksk-algorithm:
 
index c28931fe3f2b1b57a5e6ac862d189365e779d229..e3d4b39b097f59c67afa5ed3b4388b4d55394bf5 100644 (file)
@@ -328,6 +328,8 @@ static void declareArguments()
   ::arg().setSwitch("consistent-backends", "Assume individual zones are not divided over backends. Send only ANY lookup operations to the backend to reduce the number of lookups") = "yes";
 
   ::arg().set("rng", "Specify the random number generator to use. Valid values are auto,sodium,openssl,getrandom,arc4random,urandom.") = "auto";
+
+  ::arg().set("default-catalog-zone", "Catalog zone to assign newly created primary zones (via the API) to") = "";
 #ifdef ENABLE_GSS_TSIG
   ::arg().setSwitch("enable-gss-tsig", "Enable GSS TSIG processing") = "no";
 #endif
@@ -1482,6 +1484,17 @@ int main(int argc, char** argv)
     g_log << Logger::Error << "Exiting because: " << PE.reason << endl;
     exit(1);
   }
+
+  try {
+    auto defaultCatalog = ::arg()["default-catalog-zone"];
+    if (!defaultCatalog.empty()) {
+      auto defCatalog = DNSName(defaultCatalog);
+    }
+  }
+  catch (const std::exception& e) {
+    g_log << Logger::Error << "Invalid value '" << ::arg()["default-catalog-zone"] << "' for default-catalog-zone: " << e.what() << endl;
+    exit(1);
+  }
   S.blacklist("special-memory-usage");
 
   DLOG(g_log << Logger::Warning << "Verbose logging in effect" << endl);
index fc8d7832fa3ab9fe5abcc4f5bd2046ef64a8d462..20bac3e3498076c0c60baff452747c16b2cc9c2e 100644 (file)
@@ -1872,6 +1872,13 @@ static void apiServerZonesPost(HttpRequest* req, HttpResponse* resp) {
 
   updateDomainSettingsFromDocument(B, di, zonename, document, !new_records.empty());
 
+  if (!catalog && kind == DomainInfo::Master) {
+    auto defaultCatalog = ::arg()["default-catalog-zone"];
+    if (!defaultCatalog.empty()) {
+      di.backend->setCatalog(zonename, DNSName(defaultCatalog));
+    }
+  }
+
   di.backend->commitTransaction();
 
   g_zoneCache.add(zonename, static_cast<int>(di.id)); // make new zone visible
index 50065051d1acc1ed6e617b0b8a0988d6baea6103..51e603e4b351a9b3b257f6e4a953ed2be8d3d303 100755 (executable)
@@ -75,6 +75,7 @@ default-soa-edit=INCEPTION-INCREMENT
 launch+=bind
 bind-config=bindbackend.conf
 loglevel=5
+default-catalog-zone=default-catalog.example.com
 """
 
 BINDBACKEND_CONF_TPL = """
index 7257168bb3128b16d2e9581930c86fb8b236c955..8193070a6053fdf2959cd503fafb15009bf13f72 100644 (file)
@@ -239,13 +239,16 @@ class AuthZones(ApiTestCase, AuthZonesHelperMixin):
 
     def test_create_zone_with_account(self):
         # soa_edit_api wins over serial
-        name, payload, data = self.create_zone(account='anaccount', serial=10)
+        name, payload, data = self.create_zone(account='anaccount', serial=10, kind='Master')
         print(data)
         for k in ('account', ):
             self.assertIn(k, data)
             if k in payload:
                 self.assertEqual(data[k], payload[k])
 
+        # as we did not set a catalog in our request, check that the default catalog was applied
+        self.assertEqual(data['catalog'], "default-catalog.example.com.")
+
     def test_create_zone_default_soa_edit_api(self):
         name, payload, data = self.create_zone()
         print(data)