From a72e6287e5bc7cc48f8d8ea13333271fe8e28494 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Wed, 26 Nov 2014 06:23:51 +0100 Subject: [PATCH] s4-dsdb-tests: Move base tests for Tombstone reanimation in tombstone_reanimation module So we have them all in one place. While moving, I have: * inherited from the base class for Tombstone reanimations * replace self.ldb with self.samdb Change-Id: Id3e4f02cc2e0877d736da812c14c91e2311203d2 Signed-off-by: Kamen Mazdrashki Reviewed-by: Andrew Bartlett Reviewed-by: Garming Sam --- source4/dsdb/tests/python/deletetest.py | 173 -------------------- source4/dsdb/tests/python/tombstone_reanimation.py | 180 ++++++++++++++++++++- 2 files changed, 179 insertions(+), 174 deletions(-) diff --git a/source4/dsdb/tests/python/deletetest.py b/source4/dsdb/tests/python/deletetest.py index 60bb689485a..6044c9f7c0c 100755 --- a/source4/dsdb/tests/python/deletetest.py +++ b/source4/dsdb/tests/python/deletetest.py @@ -387,179 +387,6 @@ class BasicDeleteTests(BaseDeleteTests): self.assertFalse("CN=Deleted Objects" in str(objDeleted6.dn)) self.assertFalse("CN=Deleted Objects" in str(objDeleted7.dn)) -class BasicUndeleteTests(BaseDeleteTests): - - def setUp(self): - super(BasicUndeleteTests, self).setUp() - - def enable_recycle_bin(self): - msg = Message() - msg.dn = Dn(self.ldb, "") - msg["enableOptionalFeature"] = MessageElement( - "CN=Partitions," + self.configuration_dn + ":766ddcd8-acd0-445e-f3b9-a7f9b6744f2a", - FLAG_MOD_ADD, "enableOptionalFeature") - try: - self.ldb.modify(msg) - except LdbError, (num, _): - self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS) - - def undelete_deleted(self, olddn, newdn, samldb): - msg = Message() - msg.dn = Dn(samldb, olddn) - msg["isDeleted"] = MessageElement([], FLAG_MOD_DELETE, "isDeleted") - msg["distinguishedName"] = MessageElement([newdn], FLAG_MOD_REPLACE, "distinguishedName") - samldb.modify(msg, ["show_deleted:1"]) - - def undelete_deleted_with_mod(self, olddn, newdn): - msg = Message() - msg.dn = Dn(self.ldb, olddn) - msg["isDeleted"] = MessageElement([], FLAG_MOD_DELETE, "isDeleted") - msg["distinguishedName"] = MessageElement([newdn], FLAG_MOD_REPLACE, "distinguishedName") - msg["url"] = MessageElement(["www.samba.org"], FLAG_MOD_REPLACE, "url") - self.ldb.modify(msg, ["show_deleted:1"]) - - - def test_undelete(self): - print "Testing standard undelete operation" - usr1="cn=testuser,cn=users," + self.base_dn - delete_force(self.ldb, usr1) - self.ldb.add({ - "dn": usr1, - "objectclass": "user", - "description": "test user description", - "samaccountname": "testuser"}) - objLive1 = self.search_dn(usr1) - guid1=objLive1["objectGUID"][0] - self.ldb.delete(usr1) - objDeleted1 = self.search_guid(guid1) - self.undelete_deleted(str(objDeleted1.dn), usr1, self.ldb) - objLive2 = self.search_dn(usr1) - self.assertEqual(str(objLive2.dn).lower(),str(objLive1.dn).lower()) - delete_force(self.ldb, usr1) - - def __test_rename(self): - print "Testing attempt to rename deleted object" - usr1="cn=testuser,cn=users," + self.base_dn - self.ldb.add({ - "dn": usr1, - "objectclass": "user", - "description": "test user description", - "samaccountname": "testuser"}) - objLive1 = self.search_dn(usr1) - guid1=objLive1["objectGUID"][0] - self.ldb.delete(usr1) - objDeleted1 = self.search_guid(guid1) - #just to make sure we get the correct error if the show deleted is missing - try: - self.ldb.rename(str(objDeleted1.dn), usr1) - self.fail() - except LdbError, (num, _): - self.assertEquals(num,ERR_NO_SUCH_OBJECT) - - try: - self.ldb.rename(str(objDeleted1.dn), usr1, ["show_deleted:1"]) - self.fail() - except LdbError, (num, _): - self.assertEquals(num,ERR_UNWILLING_TO_PERFORM) - - def test_undelete_with_mod(self): - print "Testing standard undelete operation with modification of additional attributes" - usr1="cn=testuser,cn=users," + self.base_dn - self.ldb.add({ - "dn": usr1, - "objectclass": "user", - "description": "test user description", - "samaccountname": "testuser"}) - objLive1 = self.search_dn(usr1) - guid1=objLive1["objectGUID"][0] - self.ldb.delete(usr1) - objDeleted1 = self.search_guid(guid1) - self.undelete_deleted_with_mod(str(objDeleted1.dn), usr1) - objLive2 = self.search_dn(usr1) - self.assertEqual(objLive2["url"][0],"www.samba.org") - delete_force(self.ldb, usr1) - - def test_undelete_newuser(self): - print "Testing undelete user with a different dn" - usr1="cn=testuser,cn=users," + self.base_dn - usr2="cn=testuser2,cn=users," + self.base_dn - delete_force(self.ldb, usr1) - self.ldb.add({ - "dn": usr1, - "objectclass": "user", - "description": "test user description", - "samaccountname": "testuser"}) - objLive1 = self.search_dn(usr1) - guid1=objLive1["objectGUID"][0] - self.ldb.delete(usr1) - objDeleted1 = self.search_guid(guid1) - self.undelete_deleted(str(objDeleted1.dn), usr2, self.ldb) - objLive2 = self.search_dn(usr2) - delete_force(self.ldb, usr1) - delete_force(self.ldb, usr2) - - def test_undelete_existing(self): - print "Testing undelete user after a user with the same dn has been created" - usr1="cn=testuser,cn=users," + self.base_dn - self.ldb.add({ - "dn": usr1, - "objectclass": "user", - "description": "test user description", - "samaccountname": "testuser"}) - objLive1 = self.search_dn(usr1) - guid1=objLive1["objectGUID"][0] - self.ldb.delete(usr1) - self.ldb.add({ - "dn": usr1, - "objectclass": "user", - "description": "test user description", - "samaccountname": "testuser"}) - objDeleted1 = self.search_guid(guid1) - try: - self.undelete_deleted(str(objDeleted1.dn), usr1, self.ldb) - self.fail() - except LdbError, (num, _): - self.assertEquals(num, ERR_ENTRY_ALREADY_EXISTS) - - def test_undelete_cross_nc(self): - print "Cross NC undelete" - c1 = "cn=ldaptestcontainer," + self.base_dn - c2 = "cn=ldaptestcontainer2," + self.configuration_dn - c3 = "cn=ldaptestcontainer," + self.configuration_dn - c4 = "cn=ldaptestcontainer2," + self.base_dn - self.ldb.add({ - "dn": c1, - "objectclass": "container"}) - self.ldb.add({ - "dn": c2, - "objectclass": "container"}) - objLive1 = self.search_dn(c1) - objLive2 = self.search_dn(c2) - guid1=objLive1["objectGUID"][0] - guid2=objLive2["objectGUID"][0] - self.ldb.delete(c1) - self.ldb.delete(c2) - objDeleted1 = self.search_guid(guid1) - objDeleted2 = self.search_guid(guid2) - #try to undelete from base dn to config - try: - self.undelete_deleted(str(objDeleted1.dn), c3, self.ldb) - self.fail() - except LdbError, (num, _): - self.assertEquals(num, ERR_OPERATIONS_ERROR) - #try to undelete from config to base dn - try: - self.undelete_deleted(str(objDeleted2.dn), c4, self.ldb) - self.fail() - except LdbError, (num, _): - self.assertEquals(num, ERR_OPERATIONS_ERROR) - #assert undeletion will work in same nc - self.undelete_deleted(str(objDeleted1.dn), c4, self.ldb) - self.undelete_deleted(str(objDeleted2.dn), c3, self.ldb) - delete_force(self.ldb, c3) - delete_force(self.ldb, c4) - - if not "://" in host: if os.path.isfile(host): diff --git a/source4/dsdb/tests/python/tombstone_reanimation.py b/source4/dsdb/tests/python/tombstone_reanimation.py index 21df42d2914..4bc15251f43 100644 --- a/source4/dsdb/tests/python/tombstone_reanimation.py +++ b/source4/dsdb/tests/python/tombstone_reanimation.py @@ -3,6 +3,7 @@ # Tombstone reanimation tests # # Copyright (C) Kamen Mazdrashki 2014 +# Copyright (C) Nadezhda Ivanova 2014 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -26,7 +27,10 @@ import samba import samba.tests import samba.getopt as options -from ldb import (SCOPE_BASE, FLAG_MOD_DELETE, FLAG_MOD_REPLACE, Dn, Message, MessageElement) +from ldb import (SCOPE_BASE, FLAG_MOD_ADD, FLAG_MOD_DELETE, FLAG_MOD_REPLACE, Dn, Message, + MessageElement, LdbError, + ERR_ATTRIBUTE_OR_VALUE_EXISTS, ERR_NO_SUCH_OBJECT, ERR_ENTRY_ALREADY_EXISTS, + ERR_OPERATIONS_ERROR, ERR_UNWILLING_TO_PERFORM) class RestoredObjectAttributesBaseTestCase(samba.tests.TestCase): @@ -41,6 +45,7 @@ class RestoredObjectAttributesBaseTestCase(samba.tests.TestCase): self.samdb = samba.tests.connect_samdb_env("TEST_SERVER", "TEST_USERNAME", "TEST_PASSWORD", lp=lp) self.base_dn = self.samdb.domain_dn() self.schema_dn = self.samdb.get_schema_basedn().get_linearized() + self.configuration_dn = self.samdb.get_config_basedn().get_linearized() # Get the old "dSHeuristics" if it was set self.dsheuristics = self.samdb.get_dsheuristics() # Set the "dSHeuristics" to activate the correct "userPassword" behaviour @@ -120,6 +125,179 @@ class RestoredObjectAttributesBaseTestCase(samba.tests.TestCase): samdb.modify(msg, ["show_deleted:1"]) +class BaseRestoreObjectTestCase(RestoredObjectAttributesBaseTestCase): + + def setUp(self): + super(BaseRestoreObjectTestCase, self).setUp() + + def enable_recycle_bin(self): + msg = Message() + msg.dn = Dn(self.samdb, "") + msg["enableOptionalFeature"] = MessageElement( + "CN=Partitions," + self.configuration_dn + ":766ddcd8-acd0-445e-f3b9-a7f9b6744f2a", + FLAG_MOD_ADD, "enableOptionalFeature") + try: + self.samdb.modify(msg) + except LdbError, (num, _): + self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS) + + def undelete_deleted(self, olddn, newdn, samldb): + msg = Message() + msg.dn = Dn(samldb, olddn) + msg["isDeleted"] = MessageElement([], FLAG_MOD_DELETE, "isDeleted") + msg["distinguishedName"] = MessageElement([newdn], FLAG_MOD_REPLACE, "distinguishedName") + samldb.modify(msg, ["show_deleted:1"]) + + def undelete_deleted_with_mod(self, olddn, newdn): + msg = Message() + msg.dn = Dn(self.samdb, olddn) + msg["isDeleted"] = MessageElement([], FLAG_MOD_DELETE, "isDeleted") + msg["distinguishedName"] = MessageElement([newdn], FLAG_MOD_REPLACE, "distinguishedName") + msg["url"] = MessageElement(["www.samba.org"], FLAG_MOD_REPLACE, "url") + self.samdb.modify(msg, ["show_deleted:1"]) + + + def test_undelete(self): + print "Testing standard undelete operation" + usr1="cn=testuser,cn=users," + self.base_dn + samba.tests.delete_force(self.samdb, usr1) + self.samdb.add({ + "dn": usr1, + "objectclass": "user", + "description": "test user description", + "samaccountname": "testuser"}) + objLive1 = self.search_dn(usr1) + guid1=objLive1["objectGUID"][0] + self.samdb.delete(usr1) + objDeleted1 = self.search_guid(guid1) + self.undelete_deleted(str(objDeleted1.dn), usr1, self.samdb) + objLive2 = self.search_dn(usr1) + self.assertEqual(str(objLive2.dn).lower(),str(objLive1.dn).lower()) + samba.tests.delete_force(self.samdb, usr1) + + def test_rename(self): + print "Testing attempt to rename deleted object" + usr1="cn=testuser,cn=users," + self.base_dn + self.samdb.add({ + "dn": usr1, + "objectclass": "user", + "description": "test user description", + "samaccountname": "testuser"}) + objLive1 = self.search_dn(usr1) + guid1=objLive1["objectGUID"][0] + self.samdb.delete(usr1) + objDeleted1 = self.search_guid(guid1) + #just to make sure we get the correct error if the show deleted is missing + try: + self.samdb.rename(str(objDeleted1.dn), usr1) + self.fail() + except LdbError, (num, _): + self.assertEquals(num,ERR_NO_SUCH_OBJECT) + + try: + self.samdb.rename(str(objDeleted1.dn), usr1, ["show_deleted:1"]) + self.fail() + except LdbError, (num, _): + self.assertEquals(num, ERR_UNWILLING_TO_PERFORM) + + def test_undelete_with_mod(self): + print "Testing standard undelete operation with modification of additional attributes" + usr1="cn=testuser,cn=users," + self.base_dn + self.samdb.add({ + "dn": usr1, + "objectclass": "user", + "description": "test user description", + "samaccountname": "testuser"}) + objLive1 = self.search_dn(usr1) + guid1=objLive1["objectGUID"][0] + self.samdb.delete(usr1) + objDeleted1 = self.search_guid(guid1) + self.undelete_deleted_with_mod(str(objDeleted1.dn), usr1) + objLive2 = self.search_dn(usr1) + self.assertEqual(objLive2["url"][0],"www.samba.org") + samba.tests.delete_force(self.samdb, usr1) + + def test_undelete_newuser(self): + print "Testing undelete user with a different dn" + usr1="cn=testuser,cn=users," + self.base_dn + usr2="cn=testuser2,cn=users," + self.base_dn + samba.tests.delete_force(self.samdb, usr1) + self.samdb.add({ + "dn": usr1, + "objectclass": "user", + "description": "test user description", + "samaccountname": "testuser"}) + objLive1 = self.search_dn(usr1) + guid1=objLive1["objectGUID"][0] + self.samdb.delete(usr1) + objDeleted1 = self.search_guid(guid1) + self.undelete_deleted(str(objDeleted1.dn), usr2, self.samdb) + objLive2 = self.search_dn(usr2) + samba.tests.delete_force(self.samdb, usr1) + samba.tests.delete_force(self.samdb, usr2) + + def test_undelete_existing(self): + print "Testing undelete user after a user with the same dn has been created" + usr1="cn=testuser,cn=users," + self.base_dn + self.samdb.add({ + "dn": usr1, + "objectclass": "user", + "description": "test user description", + "samaccountname": "testuser"}) + objLive1 = self.search_dn(usr1) + guid1=objLive1["objectGUID"][0] + self.samdb.delete(usr1) + self.samdb.add({ + "dn": usr1, + "objectclass": "user", + "description": "test user description", + "samaccountname": "testuser"}) + objDeleted1 = self.search_guid(guid1) + try: + self.undelete_deleted(str(objDeleted1.dn), usr1, self.samdb) + self.fail() + except LdbError, (num, _): + self.assertEquals(num, ERR_ENTRY_ALREADY_EXISTS) + + def test_undelete_cross_nc(self): + print "Cross NC undelete" + c1 = "cn=ldaptestcontainer," + self.base_dn + c2 = "cn=ldaptestcontainer2," + self.configuration_dn + c3 = "cn=ldaptestcontainer," + self.configuration_dn + c4 = "cn=ldaptestcontainer2," + self.base_dn + self.samdb.add({ + "dn": c1, + "objectclass": "container"}) + self.samdb.add({ + "dn": c2, + "objectclass": "container"}) + objLive1 = self.search_dn(c1) + objLive2 = self.search_dn(c2) + guid1=objLive1["objectGUID"][0] + guid2=objLive2["objectGUID"][0] + self.samdb.delete(c1) + self.samdb.delete(c2) + objDeleted1 = self.search_guid(guid1) + objDeleted2 = self.search_guid(guid2) + #try to undelete from base dn to config + try: + self.undelete_deleted(str(objDeleted1.dn), c3, self.samdb) + self.fail() + except LdbError, (num, _): + self.assertEquals(num, ERR_OPERATIONS_ERROR) + #try to undelete from config to base dn + try: + self.undelete_deleted(str(objDeleted2.dn), c4, self.samdb) + self.fail() + except LdbError, (num, _): + self.assertEquals(num, ERR_OPERATIONS_ERROR) + #assert undeletion will work in same nc + self.undelete_deleted(str(objDeleted1.dn), c4, self.samdb) + self.undelete_deleted(str(objDeleted2.dn), c3, self.samdb) + samba.tests.delete_force(self.samdb, c3) + samba.tests.delete_force(self.samdb, c4) + + class RestoreUserObjectTestCase(RestoredObjectAttributesBaseTestCase): """Test cases for delete/reanimate user objects""" -- 2.11.4.GIT