The branch, master has been updated via 8585de8 ldb:rdn_name LDB module - add more RDN name constraints via bb679a4 ldb:ldb_rename on ldap backends - handle the case when the RDN value is empty from d0993e1 s4:netlogon/LogonGetDomainInfo - handle a NULL "dns_hostname"
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 8585de88815490ed3c41571030bf20bff02a67d4 Author: Matthias Dieter Wallnöfer <m...@samba.org> Date: Thu Nov 11 09:12:17 2010 +0100 ldb:rdn_name LDB module - add more RDN name constraints And some small cleanups Autobuild-User: Matthias Dieter Wallnöfer <m...@samba.org> Autobuild-Date: Sat Nov 20 00:06:35 CET 2010 on sn-devel-104 commit bb679a4da3a32c61529fb56a0cbc9f6d6668146e Author: Matthias Dieter Wallnöfer <m...@samba.org> Date: Fri Nov 19 23:01:39 2010 +0100 ldb:ldb_rename on ldap backends - handle the case when the RDN value is empty Otherwise we get "<RDN name>=(null),..." ----------------------------------------------------------------------- Summary of changes: source4/dsdb/tests/python/ldap.py | 52 +++++++++++++++++++++++++++++++++++ source4/lib/ldb-samba/ldb_ildap.c | 2 +- source4/lib/ldb/ldb_ldap/ldb_ldap.c | 2 +- source4/lib/ldb/modules/rdn_name.c | 22 +++++++++++--- 4 files changed, 71 insertions(+), 7 deletions(-) Changeset truncated at 500 lines: diff --git a/source4/dsdb/tests/python/ldap.py b/source4/dsdb/tests/python/ldap.py index d9a4f2a..e148e99 100755 --- a/source4/dsdb/tests/python/ldap.py +++ b/source4/dsdb/tests/python/ldap.py @@ -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, diff --git a/source4/lib/ldb-samba/ldb_ildap.c b/source4/lib/ldb-samba/ldb_ildap.c index e2176d6..3c28690 100644 --- a/source4/lib/ldb-samba/ldb_ildap.c +++ b/source4/lib/ldb-samba/ldb_ildap.c @@ -633,7 +633,7 @@ static int ildb_rename(struct ildb_context *ac) if ((rdn_name != NULL) && (rdn_val != NULL)) { msg->r.ModifyDNRequest.newrdn = talloc_asprintf(msg, "%s=%s", rdn_name, - ldb_dn_escape_value(msg, *rdn_val)); + rdn_val->length > 0 ? ldb_dn_escape_value(msg, *rdn_val) : ""); } else { msg->r.ModifyDNRequest.newrdn = talloc_strdup(msg, ""); } diff --git a/source4/lib/ldb/ldb_ldap/ldb_ldap.c b/source4/lib/ldb/ldb_ldap/ldb_ldap.c index ee677cc..b328ebf 100644 --- a/source4/lib/ldb/ldb_ldap/ldb_ldap.c +++ b/source4/lib/ldb/ldb_ldap/ldb_ldap.c @@ -410,7 +410,7 @@ static int lldb_rename(struct lldb_context *lldb_ac) if ((rdn_name != NULL) && (rdn_val != NULL)) { newrdn = talloc_asprintf(lldb_ac, "%s=%s", rdn_name, - ldb_dn_escape_value(lldb, *rdn_val)); + rdn_val->length > 0 ? ldb_dn_escape_value(lldb, *rdn_val) : ""); } else { newrdn = talloc_strdup(lldb_ac, ""); } diff --git a/source4/lib/ldb/modules/rdn_name.c b/source4/lib/ldb/modules/rdn_name.c index 38d87b0..313d999 100644 --- a/source4/lib/ldb/modules/rdn_name.c +++ b/source4/lib/ldb/modules/rdn_name.c @@ -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) -- Samba Shared Repository