[SCM] Samba Shared Repository - branch master updated

Matthias Dieter Wallnöfer mdw at samba.org
Thu Nov 18 03:44:01 MST 2010


The branch, master has been updated
       via  ae272ac s4:repl_meta_data LDB module - allow also special DNs to be renamed correctly
       via  732ef93 s4:api.py - DN tests - test a bit more special DNs and merge the comparison tests
       via  ca7979e ldb:ldb_dn_explode - point out that on error cases "data" is implicitly free'd
      from  1c4807a s4-test: added greater control over tests to run

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit ae272acbdba5a8682dcdac98a59636863c129c8a
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Nov 18 10:44:52 2010 +0100

    s4:repl_meta_data LDB module - allow also special DNs to be renamed correctly
    
    Do always escape RDN values - this fixes bug #7794
    
    Autobuild-User: Matthias Dieter Wallnöfer <mdw at samba.org>
    Autobuild-Date: Thu Nov 18 10:43:40 UTC 2010 on sn-devel-104

commit 732ef9353dff56384e8bb01aa20d2a371cd995c2
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Nov 18 09:22:07 2010 +0100

    s4:api.py - DN tests - test a bit more special DNs and merge the comparison tests

commit ca7979e1a31ae33a99105fe821493fbded8c845f
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Nov 18 08:57:00 2010 +0100

    ldb:ldb_dn_explode - point out that on error cases "data" is implicitly free'd

-----------------------------------------------------------------------

Summary of changes:
 source4/dsdb/samdb/ldb_modules/repl_meta_data.c |    2 +-
 source4/dsdb/tests/python/sam.py                |    7 +++
 source4/lib/ldb/common/ldb_dn.c                 |    2 +-
 source4/lib/ldb/tests/python/api.py             |   58 ++++++++++++++++++----
 4 files changed, 56 insertions(+), 13 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
index 3db1fe9..f05d83e 100644
--- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
+++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
@@ -2609,7 +2609,7 @@ static int replmd_delete(struct ldb_module *module, struct ldb_request *req)
 		/* Add a formatted child */
 		retb = ldb_dn_add_child_fmt(new_dn, "%s=%s\\0ADEL:%s",
 						rdn_name,
-						rdn_value->data,
+						ldb_dn_escape_value(tmp_ctx, *rdn_value),
 						GUID_string(tmp_ctx, &guid));
 		if (!retb) {
 			DEBUG(0,(__location__ ": Unable to add a formatted child to dn: %s",
diff --git a/source4/dsdb/tests/python/sam.py b/source4/dsdb/tests/python/sam.py
index b64cce1..c3490da 100755
--- a/source4/dsdb/tests/python/sam.py
+++ b/source4/dsdb/tests/python/sam.py
@@ -92,6 +92,7 @@ class SamTests(unittest.TestCase):
 
         self.delete_force(self.ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
         self.delete_force(self.ldb, "cn=ldaptestuser2,cn=users," + self.base_dn)
+        self.delete_force(self.ldb, "cn=ldaptest\,specialuser,cn=users," + self.base_dn)
         self.delete_force(self.ldb, "cn=ldaptestcomputer,cn=computers," + self.base_dn)
         self.delete_force(self.ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
         self.delete_force(self.ldb, "cn=ldaptestgroup2,cn=users," + self.base_dn)
@@ -595,6 +596,12 @@ class SamTests(unittest.TestCase):
         self.delete_force(self.ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
         self.delete_force(self.ldb, "cn=ldaptestgroup2,cn=users," + self.base_dn)
 
+        # Make also a small test for accounts with special DNs ("," in this case)
+        ldb.add({
+            "dn": "cn=ldaptest\,specialuser,cn=users," + self.base_dn,
+            "objectclass": "user"})
+        self.delete_force(self.ldb, "cn=ldaptest\,specialuser,cn=users," + self.base_dn)
+
     def test_sam_attributes(self):
         """Test the behaviour of special attributes of SAM objects"""
         print "Testing the behaviour of special attributes of SAM objects\n"""
diff --git a/source4/lib/ldb/common/ldb_dn.c b/source4/lib/ldb/common/ldb_dn.c
index a17d516..9bf8658 100644
--- a/source4/lib/ldb/common/ldb_dn.c
+++ b/source4/lib/ldb/common/ldb_dn.c
@@ -729,7 +729,7 @@ static bool ldb_dn_explode(struct ldb_dn *dn)
 	return true;
 
 failed:
-	LDB_FREE(dn->components);
+	LDB_FREE(dn->components); /* "data" is implicitly free'd */
 	dn->comp_num = 0;
 	LDB_FREE(dn->ext_components);
 	dn->ext_comp_num = 0;
diff --git a/source4/lib/ldb/tests/python/api.py b/source4/lib/ldb/tests/python/api.py
index b8adbaa..efb9791 100755
--- a/source4/lib/ldb/tests/python/api.py
+++ b/source4/lib/ldb/tests/python/api.py
@@ -342,49 +342,74 @@ class DnTests(unittest.TestCase):
         x = ldb.Dn(self.ldb, "dc=foo11,bar=bloe")
         y = ldb.Dn(self.ldb, "dc=foo11,bar=bloe")
         self.assertEquals(x, y)
+        y = ldb.Dn(self.ldb, "dc=foo11,bar=blie")
+        self.assertNotEquals(x, y)
+        x = ldb.Dn(self.ldb, "")
+        y = ldb.Dn(self.ldb, "")
+        self.assertEquals(x, y)
+        x = ldb.Dn(self.ldb, "cn=foo\, bar\, bar,dc=test,dc=bloe")
+        y = ldb.Dn(self.ldb, "cn=foo\, bar\, bar,dc=test,dc=bloe")
+        self.assertEquals(x, y)
 
     def test_str(self):
         x = ldb.Dn(self.ldb, "dc=foo12,bar=bloe")
         self.assertEquals(x.__str__(), "dc=foo12,bar=bloe")
+        x = ldb.Dn(self.ldb, "")
+        self.assertEquals(x.__str__(), "")
+        x = ldb.Dn(self.ldb, "cn=foo\, bar\, bar,dc=test,dc=bloe")
+        self.assertEquals(x.__str__(), "cn=foo\, bar\, bar,dc=test,dc=bloe")
 
     def test_repr(self):
         x = ldb.Dn(self.ldb, "dc=foo13,bla=blie")
         self.assertEquals(x.__repr__(), "Dn('dc=foo13,bla=blie')")
+        x = ldb.Dn(self.ldb, "")
+        self.assertEquals(x.__repr__(), "Dn('')")
+        x = ldb.Dn(self.ldb, "cn=foo\, bar\, bar,dc=test,dc=bloe")
+        self.assertEquals(x.__repr__(), "Dn('cn=foo\\\\, bar\\\\, bar,dc=test,dc=bloe')")
 
     def test_get_casefold(self):
         x = ldb.Dn(self.ldb, "dc=foo14,bar=bloe")
         self.assertEquals(x.get_casefold(), "DC=FOO14,BAR=bloe")
+        x = ldb.Dn(self.ldb, "")
+        self.assertEquals(x.get_casefold(), "")
+        x = ldb.Dn(self.ldb, "cn=foo\, bar\, bar,dc=test,dc=bloe")
+        self.assertEquals(x.get_casefold(), "CN=FOO\, BAR\, BAR,DC=TEST,DC=BLOE")
 
     def test_validate(self):
         x = ldb.Dn(self.ldb, "dc=foo15,bar=bloe")
         self.assertTrue(x.validate())
+        x = ldb.Dn(self.ldb, "")
+        self.assertTrue(x.validate()) # the empty DN is valid (rootDSE)
+        x = ldb.Dn(self.ldb, "cn=foo\, bar\, bar,dc=test,dc=bloe")
+        self.assertTrue(x.validate())
 
     def test_parent(self):
         x = ldb.Dn(self.ldb, "dc=foo16,bar=bloe")
         self.assertEquals("bar=bloe", x.parent().__str__())
+        x = ldb.Dn(self.ldb, "cn=foo\, bar\, bar,dc=test,dc=bloe")
+        self.assertEquals("dc=test,dc=bloe", x.parent().__str__())
 
     def test_parent_nonexistant(self):
         x = ldb.Dn(self.ldb, "@BLA")
         self.assertEquals(None, x.parent())
-
-    def test_compare(self):
-        x = ldb.Dn(self.ldb, "dc=foo17,bar=bloe")
-        y = ldb.Dn(self.ldb, "dc=foo17,bar=bloe")
-        self.assertEquals(x, y)
-        z = ldb.Dn(self.ldb, "dc=foo17,bar=blie")
-        self.assertNotEquals(z, y)
+        x = ldb.Dn(self.ldb, "")
+        self.assertEquals(None, x.parent())
 
     def test_is_valid(self):
         x = ldb.Dn(self.ldb, "dc=foo18,dc=bloe")
         self.assertTrue(x.is_valid())
         x = ldb.Dn(self.ldb, "")
-        # is_valid()'s return values appears to be a side effect of 
-        # some other ldb functions. yuck.
-        # self.assertFalse(x.is_valid())
+        self.assertTrue(x.is_valid()) # the empty DN is valid (rootDSE)
+        x = ldb.Dn(self.ldb, "cn=foo\, bar\, bar,dc=test,dc=bloe")
+        self.assertTrue(x.is_valid())
 
     def test_is_special(self):
         x = ldb.Dn(self.ldb, "dc=foo19,bar=bloe")
         self.assertFalse(x.is_special())
+        x = ldb.Dn(self.ldb, "")
+        self.assertFalse(x.is_special())
+        x = ldb.Dn(self.ldb, "cn=foo\, bar\, bar,dc=test,dc=bloe")
+        self.assertFalse(x.is_special())
         x = ldb.Dn(self.ldb, "@FOOBAR")
         self.assertTrue(x.is_special())
 
@@ -399,6 +424,10 @@ class DnTests(unittest.TestCase):
         self.assertEquals(2, len(x))
         x = ldb.Dn(self.ldb, "dc=foo21")
         self.assertEquals(1, len(x))
+        x = ldb.Dn(self.ldb, "")
+        self.assertEquals(0, len(x)) # the empty DN has length 0
+        x = ldb.Dn(self.ldb, "cn=foo\, bar\, bar,dc=test,dc=bloe")
+        self.assertEquals(3, len(x))
 
     def test_add_child(self):
         x = ldb.Dn(self.ldb, "dc=foo22,bar=bloe")
@@ -434,11 +463,18 @@ class DnTests(unittest.TestCase):
     def test_canonical_string(self):
         x = ldb.Dn(self.ldb, "dc=foo25,bar=bloe")
         self.assertEquals("/bloe/foo25", x.canonical_str())
+        x = ldb.Dn(self.ldb, "")
+        self.assertEquals("/", x.canonical_str())
+        x = ldb.Dn(self.ldb, "cn=foo\, bar\, bar,dc=test,dc=bloe")
+        self.assertEquals("test.bloe/foo\, bar\, bar", x.canonical_str())
 
     def test_canonical_ex_string(self):
         x = ldb.Dn(self.ldb, "dc=foo26,bar=bloe")
         self.assertEquals("/bloe\nfoo26", x.canonical_ex_str())
-
+        x = ldb.Dn(self.ldb, "")
+        self.assertEquals("\n", x.canonical_ex_str())
+        x = ldb.Dn(self.ldb, "cn=foo\, bar\, bar,dc=test,dc=bloe")
+        self.assertEquals("test.bloe\nfoo\, bar\, bar", x.canonical_ex_str())
 
 class LdbMsgTests(unittest.TestCase):
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list