]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth: add default-catalog-zone setting 13240/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 10:06:22 +0000 (12:06 +0200)
(cherry picked from commit c8734ecd8cca0089a8a9c032bfab1069f60381e6)

docs/settings.rst
pdns/auth-main.cc
pdns/ws-auth.cc
regression-tests.api/runtests.py
regression-tests.api/test_Zones.py

index 782435ef5f9fda5ff3352cb10b7cacd3f6467d4b..d1d37a30ecbb09b2276c5cf91abb95a874ed8214 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 5bf5e1ccf6222ee5623376d48b08aa1d948e26ac..f69bf6e20b56eeb1a8132dcc28757d3bbbb1fb24 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
@@ -1479,6 +1481,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 20d79875f68204d10d4cafb5218447114dcae7a9..27c50b651c0e5961ea51dfcbd7db888ba5c1ace3 100644 (file)
@@ -1836,6 +1836,13 @@ static void apiServerZones(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, di.id); // make new zone visible
index 515439d7bb5790209afd12255f96fddfe1aa4932..f2d754f4ae858f8a984d153496faae5ec9fbc553 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 11e17543875616b2a105ac931d2dd80478033583..89c86c336fb86c1d0e90ffd6da2d7991397e9597 100644 (file)
@@ -157,13 +157,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)