ldb:rdn_name LDB module - add more RDN name constraints
authorMatthias Dieter Wallnöfer <mdw@samba.org>
Thu, 11 Nov 2010 08:12:17 +0000 (09:12 +0100)
committerMatthias Dieter Wallnöfer <mdw@samba.org>
Fri, 19 Nov 2010 23:06:35 +0000 (00:06 +0100)
And some small cleanups

Autobuild-User: Matthias Dieter Wallnöfer <mdw@samba.org>
Autobuild-Date: Sat Nov 20 00:06:35 CET 2010 on sn-devel-104

source4/dsdb/tests/python/ldap.py
source4/lib/ldb/modules/rdn_name.c

index d9a4f2a6b13e6967e2683c356279df121ad097a7..e148e99de63c17e3a5b6daa55501a185e5a5014d 100755 (executable)
@@ -887,6 +887,34 @@ objectClass: bootableDevice
         """Tests the RDN"""
         print "Tests the RDN"""
 
+        # empty RDN
+        try:
+            self.ldb.add({
+                 "dn": "=,cn=users," + self.base_dn,
+                 "objectclass": "group"})
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_INVALID_DN_SYNTAX)
+
+        # empty RDN name
+        try:
+            self.ldb.add({
+                 "dn": "=ldaptestgroup,cn=users," + self.base_dn,
+                 "objectclass": "group"})
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_INVALID_DN_SYNTAX)
+
+        # empty RDN value
+        try:
+            self.ldb.add({
+                 "dn": "cn=,cn=users," + self.base_dn,
+                 "objectclass": "group"})
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_INVALID_DN_SYNTAX)
+
+        # a wrong RDN candidate
         try:
             self.ldb.add({
                  "dn": "description=xyz,cn=users," + self.base_dn,
@@ -910,6 +938,30 @@ objectClass: bootableDevice
         self.assertTrue("name" in res[0])
         self.assertTrue(res[0]["name"][0] == "ldaptestgroup")
 
+        # new empty RDN
+        try:
+            self.ldb.rename("cn=ldaptestgroup,cn=users," + self.base_dn,
+                            "=,cn=users," + self.base_dn)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_INVALID_DN_SYNTAX)
+
+        # new empty RDN name
+        try:
+            self.ldb.rename("cn=ldaptestgroup,cn=users," + self.base_dn,
+                            "=ldaptestgroup,cn=users," + self.base_dn)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_INVALID_DN_SYNTAX)
+
+        # new empty RDN value
+        try:
+            self.ldb.rename("cn=ldaptestgroup,cn=users," + self.base_dn,
+                            "cn=,cn=users," + self.base_dn)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_NAMING_VIOLATION)
+
         m = Message()
         m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
         m["name"] = MessageElement("cn=ldaptestuser", FLAG_MOD_REPLACE,
index 38d87b0712e9a17e7162d5e8924e76b154e94a1c..313d9998e35db4509921b8cc298f5ffdee85b34c 100644 (file)
@@ -121,8 +121,13 @@ static int rdn_name_add(struct ldb_module *module, struct ldb_request *req)
        if (rdn_val_p == NULL) {
                return LDB_ERR_OPERATIONS_ERROR;
        }
+       if (rdn_val_p->length == 0) {
+               ldb_asprintf_errstring(ldb, "Empty RDN value on %s not permitted!",
+                                      ldb_dn_get_linearized(req->op.add.message->dn));
+               return LDB_ERR_INVALID_DN_SYNTAX;
+       }
        rdn_val = ldb_val_dup(msg, rdn_val_p);
-       
+
        /* Perhaps someone above us tried to set this? Then ignore it */
        ldb_msg_remove_attr(msg, "name");
 
@@ -275,16 +280,24 @@ static int rdn_rename_callback(struct ldb_request *req, struct ldb_reply *ares)
        if (msg->dn == NULL) {
                goto error;
        }
+
        rdn_name = ldb_dn_get_rdn_name(ac->req->op.rename.newdn);
        if (rdn_name == NULL) {
                goto error;
        }
+
        rdn_val_p = ldb_dn_get_rdn_val(msg->dn);
        if (rdn_val_p == NULL) {
-               return LDB_ERR_OPERATIONS_ERROR;
+               goto error;
+       }
+       if (rdn_val_p->length == 0) {
+               ldb_asprintf_errstring(ldb, "Empty RDN value on %s not permitted!",
+                                      ldb_dn_get_linearized(req->op.rename.olddn));
+               return ldb_module_done(ac->req, NULL, NULL,
+                                      LDB_ERR_NAMING_VIOLATION);
        }
        rdn_val = ldb_val_dup(msg, rdn_val_p);
-       
+
        if (ldb_msg_add_empty(msg, rdn_name, LDB_FLAG_MOD_REPLACE, NULL) != 0) {
                goto error;
        }
@@ -311,8 +324,7 @@ static int rdn_rename_callback(struct ldb_request *req, struct ldb_reply *ares)
        return ldb_next_request(ac->module, mod_req);
 
 error:
-       return ldb_module_done(ac->req, NULL, NULL,
-                                                LDB_ERR_OPERATIONS_ERROR);
+       return ldb_module_done(ac->req, NULL, NULL, LDB_ERR_OPERATIONS_ERROR);
 }
 
 static int rdn_name_rename(struct ldb_module *module, struct ldb_request *req)