samba-tool domain demote: Refuse to remove ourself
authorAndrew Bartlett <abartlet@samba.org>
Tue, 13 Oct 2015 02:26:20 +0000 (15:26 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 26 Oct 2015 04:11:22 +0000 (05:11 +0100)
This ensures that a different server is the one being demoted from the local database

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
python/samba/remove_dc.py
python/samba/tests/blackbox/samba_tool_drs.py

index ded7f00f6bf7d1ebcdbd60d6756dcf6cd47c2f66..89502121ad82f56cd75de8f886e560d162065aff 100644 (file)
@@ -127,9 +127,12 @@ def offline_remove_ntds_dc(samdb, ntds_dn,
     res = samdb.search("",
                        scope=ldb.SCOPE_BASE, attrs=["dsServiceName"])
     assert len(res) == 1
-    my_serviceName = res[0]["dsServiceName"][0]
+    my_serviceName = ldb.Dn(samdb, res[0]["dsServiceName"][0])
     server_dn = ntds_dn.parent()
 
+    if my_serviceName == ntds_dn:
+        raise DemoteException("Refusing to demote our own DSA: %s " % my_serviceName)
+
     try:
         msgs = samdb.search(base=ntds_dn, expression="objectClass=ntdsDSA",
                         attrs=["objectGUID"], scope=ldb.SCOPE_BASE)
@@ -191,7 +194,8 @@ def offline_remove_ntds_dc(samdb, ntds_dn,
 
 def remove_dc(samdb, dc_name):
 
-    # TODO: Check if this is the last server
+    # TODO: Check if this is the last server (covered mostly by
+    # refusing to remove our own name)
 
     samdb.transaction_start()
 
index b65f5af0f08969d9a3456b4b51c01113b7d91a4e..13678f5a07717de99ceb84dd2f3550be88ce6d7e 100644 (file)
@@ -163,6 +163,13 @@ class SambaToolDrsTests(samba.tests.BlackboxTestCase):
         self.assertEqual(ds_name, server_ds_name)
         self.assertEqual(ldap_service_name, server_ldap_service_name)
 
+        def demote_self():
+            # While we have this cloned, try demoting the other server on the clone
+            out = self.check_output("samba-tool domain demote --remove-other-dead-server=%s -H %s/private/sam.ldb"
+                                % (self.dc1,
+                                   self.tempdir))
+        self.assertRaises(samba.tests.BlackboxProcessError, demote_self)
+
         # While we have this cloned, try demoting the other server on the clone
         out = self.check_output("samba-tool domain demote --remove-other-dead-server=%s -H %s/private/sam.ldb"
                                 % (self.dc2,