TODO; test_permisive_modify
authorStefan Metzmacher <metze@samba.org>
Mon, 23 Sep 2013 07:50:37 +0000 (09:50 +0200)
committerStefan Metzmacher <metze@samba.org>
Wed, 25 Sep 2013 08:50:31 +0000 (10:50 +0200)
source4/dsdb/tests/python/ldap.py

index 5ed3981993eb955b4169e5305035265ab66b05e9..e02ec7ec655276d4c4de5d5a3251c1897dbf325b 100755 (executable)
@@ -710,6 +710,442 @@ class BasicTests(samba.tests.TestCase):
 
         delete_force(self.ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
 
+    def test_permisive_modify_add(self):
+        """Test permissive modify with MOD_ADD"""
+        print "Test permissive modify with MOD_ADD"""
+
+        userdn = "cn=ldaptestuser,cn=users," + self.base_dn
+
+        delete_force(self.ldb, userdn)
+
+        self.ldb.add({
+             "dn": userdn,
+             "objectclass": "user",
+             "userSharedFolderOther": ["vv0", "vv1", "vv2"]})
+
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 3)
+        # w2k8r2 reverse the order...
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "vv2")
+        self.assertEquals(res[0]["userSharedFolderOther"][1], "vv1")
+        self.assertEquals(res[0]["userSharedFolderOther"][2], "vv0")
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["userSharedFolderOther"] = MessageElement(["vv1"],
+                                                    FLAG_MOD_ADD,
+                                                    "userSharedFolderOther")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["userSharedFolderOther"] = MessageElement(["VV1"],
+                                                    FLAG_MOD_ADD,
+                                                    "userSharedFolderOther")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["userSharedFolderOther"] = MessageElement(["vv4","vv4"],
+                                                    FLAG_MOD_ADD,
+                                                    "userSharedFolderOther")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["userSharedFolderOther"] = MessageElement(["vv4","VV4"],
+                                                    FLAG_MOD_ADD,
+                                                    "userSharedFolderOther")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["userSharedFolderOther"] = MessageElement(["VV1", "VV1"],
+                                                    FLAG_MOD_ADD,
+                                                    "userSharedFolderOther")
+        ldb.modify(m, controls=["permissive_modify:1"])
+
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 3)
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "vv2")
+        self.assertEquals(res[0]["userSharedFolderOther"][1], "vv1")
+        self.assertEquals(res[0]["userSharedFolderOther"][2], "vv0")
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["userSharedFolderOther"] = MessageElement(["VV1", "VV1", "vv4", "VV4"],
+                                                    FLAG_MOD_ADD,
+                                                    "userSharedFolderOther")
+        ldb.modify(m, controls=["permissive_modify:1"])
+
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 4)
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "vv4")
+        self.assertEquals(res[0]["userSharedFolderOther"][1], "vv2")
+        self.assertEquals(res[0]["userSharedFolderOther"][2], "vv1")
+        self.assertEquals(res[0]["userSharedFolderOther"][3], "vv0")
+
+        delete_force(self.ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
+
+    def test_permisive_modify_replace(self):
+        """Test permissive modify with MOD_REPLACE"""
+        print "Test permissive modify with MOD_REPLACE"""
+
+        userdn = "cn=ldaptestuser,cn=users," + self.base_dn
+
+        delete_force(self.ldb, userdn)
+
+        self.ldb.add({
+             "dn": userdn,
+             "objectclass": "user",
+             "userSharedFolderOther": ["vv0", "vv1", "vv2"]})
+
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 3)
+        # w2k8r2 reverse the order...
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "vv2")
+        self.assertEquals(res[0]["userSharedFolderOther"][1], "vv1")
+        self.assertEquals(res[0]["userSharedFolderOther"][2], "vv0")
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["userSharedFolderOther"] = MessageElement(["vv0"],
+                                                    FLAG_MOD_REPLACE,
+                                                    "userSharedFolderOther")
+        ldb.modify(m)
+
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 1)
+        # w2k8r2 reverse the order...
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "vv0")
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["userSharedFolderOther"] = MessageElement(["VV0"],
+                                                    FLAG_MOD_REPLACE,
+                                                    "userSharedFolderOther")
+        ldb.modify(m)
+
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 1)
+        # w2k8r2 reverse the order...
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "VV0")
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["userSharedFolderOther"] = MessageElement(["vv0","vv0"],
+                                                    FLAG_MOD_REPLACE,
+                                                    "userSharedFolderOther")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
+        try:
+            # This even fails with permissive_modify
+            ldb.modify(m, controls=["permissive_modify:1"])
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["userSharedFolderOther"] = MessageElement(["vv0","VV0"],
+                                                    FLAG_MOD_REPLACE,
+                                                    "userSharedFolderOther")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
+        try:
+            # This even fails with permissive_modify
+            ldb.modify(m, controls=["permissive_modify:1"])
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
+
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 1)
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "VV0")
+
+        delete_force(self.ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
+
+    def test_permisive_modify_delete(self):
+        """Test permissive modify with MOD_DEL"""
+        print "Test permissive modify with MOD_DEL"""
+
+        userdn = "cn=ldaptestuser,cn=users," + self.base_dn
+
+        delete_force(self.ldb, userdn)
+
+        self.ldb.add({
+             "dn": userdn,
+             "objectclass": "user",
+             "userSharedFolderOther": ["vv0", "vv1", "vv2"]})
+
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 3)
+        # w2k8r2 reverse the order...
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "vv2")
+        self.assertEquals(res[0]["userSharedFolderOther"][1], "vv1")
+        self.assertEquals(res[0]["userSharedFolderOther"][2], "vv0")
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["userSharedFolderOther"] = MessageElement(["vv4"],
+                                                    FLAG_MOD_DELETE,
+                                                    "userSharedFolderOther")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_NO_SUCH_ATTRIBUTE)
+        ldb.modify(m, controls=["permissive_modify:1"])
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 3)
+        # w2k8r2 reverse the order...
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "vv2")
+        self.assertEquals(res[0]["userSharedFolderOther"][1], "vv1")
+        self.assertEquals(res[0]["userSharedFolderOther"][2], "vv0")
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["userSharedFolderOther"] = MessageElement(["vv0", "vv4"],
+                                                    FLAG_MOD_DELETE,
+                                                    "userSharedFolderOther")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_NO_SUCH_ATTRIBUTE)
+        ldb.modify(m, controls=["permissive_modify:1"])
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 2)
+        # w2k8r2 reverse the order...
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "vv2")
+        self.assertEquals(res[0]["userSharedFolderOther"][1], "vv1")
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["userSharedFolderOther"] = MessageElement(["vv0", "VV1", "vv4"],
+                                                    FLAG_MOD_DELETE,
+                                                    "userSharedFolderOther")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_NO_SUCH_ATTRIBUTE)
+        ldb.modify(m, controls=["permissive_modify:1"])
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 1)
+        # w2k8r2 reverse the order...
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "vv2")
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["userSharedFolderOther"] = MessageElement(["vv0", "VV1", "Vv2"],
+                                                    FLAG_MOD_DELETE,
+                                                    "userSharedFolderOther")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_NO_SUCH_ATTRIBUTE)
+        ldb.modify(m, controls=["permissive_modify:1"])
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertFalse("userSharedFolderOther" in res[0])
+
+        # and again
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_NO_SUCH_ATTRIBUTE)
+        ldb.modify(m, controls=["permissive_modify:1"])
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertFalse("userSharedFolderOther" in res[0])
+
+        delete_force(self.ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
+
+    def test_permisive_modify_mixed(self):
+        """Test permissive modify with mixed MOD_DEL/ADD/REPLACE"""
+        print "Test permissive modify with mixed MOD_DEL/ADD/REPLACE"""
+
+        userdn = "cn=ldaptestuser,cn=users," + self.base_dn
+
+        delete_force(self.ldb, userdn)
+
+        self.ldb.add({
+             "dn": userdn,
+             "objectclass": "user",
+             "userSharedFolderOther": ["vv0", "vv1", "vv2"]})
+
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 3)
+        # w2k8r2 reverse the order...
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "vv2")
+        self.assertEquals(res[0]["userSharedFolderOther"][1], "vv1")
+        self.assertEquals(res[0]["userSharedFolderOther"][2], "vv0")
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["e1"] = MessageElement(["VV4"],
+                                 FLAG_MOD_DELETE,
+                                 "userSharedFolderOther")
+        m["e2"] = MessageElement(["vv4"],
+                                 FLAG_MOD_REPLACE,
+                                 "userSharedFolderOther")
+        m["e2"] = MessageElement(["VV4"],
+                                 FLAG_MOD_ADD,
+                                 "userSharedFolderOther")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_NO_SUCH_ATTRIBUTE)
+        ldb.modify(m, controls=["permissive_modify:1"])
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 1)
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "vv4")
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["e1"] = MessageElement(["VV4"],
+                                 FLAG_MOD_DELETE,
+                                 "userSharedFolderOther")
+        m["e2"] = MessageElement(["vv5"],
+                                 FLAG_MOD_REPLACE,
+                                 "userSharedFolderOther")
+        m["e2"] = MessageElement(["VV5"],
+                                 FLAG_MOD_ADD,
+                                 "userSharedFolderOther")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
+        ldb.modify(m, controls=["permissive_modify:1"])
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 1)
+        # w2k8r2 reverse the order...
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "vv5")
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["e1"] = MessageElement(["VV5"],
+                                 FLAG_MOD_DELETE,
+                                 "userSharedFolderOther")
+        m["e2"] = MessageElement(["vv6"],
+                                 FLAG_MOD_REPLACE,
+                                 "userSharedFolderOther")
+        m["e3"] = MessageElement(["VV5"],
+                                 FLAG_MOD_DELETE,
+                                 "userSharedFolderOther")
+        m["e4"] = MessageElement(["VV5"],
+                                 FLAG_MOD_ADD,
+                                 "userSharedFolderOther")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_NO_SUCH_ATTRIBUTE)
+        ldb.modify(m, controls=["permissive_modify:1"])
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 2)
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "VV5")
+        self.assertEquals(res[0]["userSharedFolderOther"][1], "vv6")
+
+        m = Message()
+        m.dn = Dn(ldb, userdn)
+        m["e0"] = MessageElement(["VV7"],
+                                 FLAG_MOD_ADD,
+                                 "userSharedFolderOther")
+        m["e1"] = MessageElement(["VV7"],
+                                 FLAG_MOD_DELETE,
+                                 "userSharedFolderOther")
+        m["e2"] = MessageElement(["VV7"],
+                                 FLAG_MOD_ADD,
+                                 "userSharedFolderOther")
+        m["e3"] = MessageElement(["vv6"],
+                                 FLAG_MOD_REPLACE,
+                                 "userSharedFolderOther")
+        m["e4"] = MessageElement(["VV7"],
+                                 FLAG_MOD_ADD,
+                                 "userSharedFolderOther")
+        m["e5"] = MessageElement(["VV7"],
+                                 FLAG_MOD_ADD,
+                                 "userSharedFolderOther")
+        m["e6"] = MessageElement(["VV5"],
+                                 FLAG_MOD_DELETE,
+                                 "userSharedFolderOther")
+        m["e7"] = MessageElement(["VV5"],
+                                 FLAG_MOD_ADD,
+                                 "userSharedFolderOther")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
+        ldb.modify(m, controls=["permissive_modify:1"])
+        res = ldb.search(userdn, scope=SCOPE_BASE, attrs=["userSharedFolderOther"])
+        self.assertEquals(len(res), 1)
+        self.assertTrue("userSharedFolderOther" in res[0])
+        self.assertEquals(len(res[0]["userSharedFolderOther"]), 3)
+        self.assertEquals(res[0]["userSharedFolderOther"][0], "VV5")
+        self.assertEquals(res[0]["userSharedFolderOther"][1], "VV7")
+        self.assertEquals(res[0]["userSharedFolderOther"][2], "vv6")
+
+        delete_force(self.ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
+
     def test_attribute_ranges(self):
         """Test attribute ranges"""
         print "Test attribute ranges"