]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
dns: test for treating fully qualified zones same as unqualified
authorAaron Haslett <aaronhaslett@catalyst.net.nz>
Mon, 20 Aug 2018 04:07:15 +0000 (16:07 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Thu, 20 Dec 2018 22:40:26 +0000 (23:40 +0100)
Failing test that checks if fully qualified zone names are treated the same
as unqualified zone names by the dns zone creation RPC method. Fix to follow.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13214
Signed-off-by: Aaron Haslett <aaronhaslett@catalyst.net.nz>
Reviewed-by: Gary Lockyer <gary@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
python/samba/tests/dns.py
selftest/knownfail.d/dns

index 8762abf8f596f8d010223e2af30d6782952df550..275d4fcd692142ae409d2d2de65faba2adb51e94 100644 (file)
@@ -1080,7 +1080,7 @@ class TestZones(DNSTest):
             if num != werror.WERR_DNS_ERROR_ZONE_DOES_NOT_EXIST:
                 raise
 
-    def create_zone(self, zone, aging_enabled=False):
+    def make_zone_obj(self, zone, aging_enabled=False):
         zone_create = dnsserver.DNS_RPC_ZONE_CREATE_INFO_LONGHORN()
         zone_create.pszZoneName = zone
         zone_create.dwZoneType = dnsp.DNS_ZONE_TYPE_PRIMARY
@@ -1089,6 +1089,10 @@ class TestZones(DNSTest):
         zone_create.fDsIntegrated = 1
         zone_create.fLoadExisting = 1
         zone_create.fAllowUpdate = dnsp.DNS_ZONE_UPDATE_UNSECURE
+        return zone_create
+
+    def create_zone(self, zone, aging_enabled=False):
+        zone_create = self.make_zone_obj(zone, aging_enabled)
         try:
             client_version = dnsserver.DNS_CLIENT_VERSION_LONGHORN
             self.rpc_conn.DnssrvOperation2(client_version,
@@ -1100,7 +1104,7 @@ class TestZones(DNSTest):
                                            dnsserver.DNSSRV_TYPEID_ZONE_CREATE,
                                            zone_create)
         except WERRORError as e:
-            self.fail(str(e))
+            self.fail(e)
 
     def set_params(self, **kwargs):
         zone = kwargs.pop('zone', None)
@@ -1546,6 +1550,59 @@ class TestZones(DNSTest):
             else:
                 self.assertEqual(len(recs), 1)
 
+    def test_fully_qualified_zone(self):
+
+        def create_zone_expect_exists(zone):
+            try:
+                zone_create = self.make_zone_obj(zone)
+                client_version = dnsserver.DNS_CLIENT_VERSION_LONGHORN
+                zc_type = dnsserver.DNSSRV_TYPEID_ZONE_CREATE
+                self.rpc_conn.DnssrvOperation2(client_version,
+                                               0,
+                                               self.server_ip,
+                                               None,
+                                               0,
+                                               'ZoneCreate',
+                                               zc_type,
+                                               zone_create)
+            except WERRORError as e:
+                enum, _ = e.args
+                if enum != werror.WERR_DNS_ERROR_ZONE_ALREADY_EXISTS:
+                    self.fail(e)
+                return
+            self.fail("Zone {} should already exist".format(zone))
+
+        # Create unqualified, then check creating qualified fails.
+        self.create_zone(self.zone)
+        create_zone_expect_exists(self.zone + '.')
+
+        # Same again, but the other way around.
+        self.create_zone(self.zone + '2.')
+        create_zone_expect_exists(self.zone + '2')
+
+        client_version = dnsserver.DNS_CLIENT_VERSION_LONGHORN
+        request_filter = dnsserver.DNS_ZONE_REQUEST_PRIMARY
+        tid = dnsserver.DNSSRV_TYPEID_DWORD
+        typeid, res = self.rpc_conn.DnssrvComplexOperation2(client_version,
+                                                            0,
+                                                            self.server_ip,
+                                                            None,
+                                                            'EnumZones',
+                                                            tid,
+                                                            request_filter)
+
+        self.delete_zone(self.zone)
+        self.delete_zone(self.zone + '2')
+
+        # Two zones should've been created, neither of them fully qualified.
+        zones_we_just_made = []
+        zones = [str(z.pszZoneName) for z in res.ZoneArray]
+        for zone in zones:
+            if zone.startswith(self.zone):
+                zones_we_just_made.append(zone)
+        self.assertEqual(len(zones_we_just_made), 2)
+        self.assertEqual(set(zones_we_just_made), {self.zone + '2', self.zone})
+
     def delete_zone(self, zone):
         self.rpc_conn.DnssrvOperation2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
                                        0,
index ec345372046a31ac833aaf13c41f4443f8f29f3a..10a6c03e0e106552da754d66e03e58435d4513b2 100644 (file)
@@ -50,6 +50,7 @@ samba.tests.dns.__main__.TestZones.test_dns_tombstone_custom_match_rule_no_recor
 samba.tests.dns.__main__.TestZones.test_dns_tombstone_custom_match_rule_fail\(rodc:local\)
 samba.tests.dns.__main__.TestZones.test_dynamic_record_static_update\(rodc:local\)
 samba.tests.dns.__main__.TestZones.test_static_record_dynamic_update\(rodc:local\)
+samba.tests.dns.__main__.TestZones.test_fully_qualified_zone
 
 samba.tests.dns.__main__.TestZones.test_set_aging\(vampire_dc:local\)
 samba.tests.dns.__main__.TestZones.test_aging_update\(vampire_dc:local\)