summaryrefslogtreecommitdiffstats
path: root/source4/dsdb/samdb
diff options
context:
space:
mode:
authorHoward Chu <hyc@symas.com>2013-09-19 10:41:16 -0700
committerNadezhda Ivanova <nivanova@samba.org>2013-09-24 07:43:39 +0200
commit5426e57898b2b60b7def1af24050df10b1394c9e (patch)
tree08a06288d24a57bf14036851032c4b0a30135fbd /source4/dsdb/samdb
parentfefdb27f51ee4b8807314106674f7a3be1941610 (diff)
downloadsamba-5426e57898b2b60b7def1af24050df10b1394c9e.tar.gz
samba-5426e57898b2b60b7def1af24050df10b1394c9e.tar.xz
samba-5426e57898b2b60b7def1af24050df10b1394c9e.zip
Fix DN RDN case in partition names
Move fix_dn from extended_dn_out.c to util.c Signed-off-by: Howard Chu <hyc@symas.com> Reviewed-by: Andrew Bartlett <abartlet@samba.org> Reviewed-by: Nadezhda Ivanova <nivanova@symas.com> Autobuild-User(master): Nadezhda Ivanova <nivanova@samba.org> Autobuild-Date(master): Tue Sep 24 07:43:39 CEST 2013 on sn-devel-104
Diffstat (limited to 'source4/dsdb/samdb')
-rw-r--r--source4/dsdb/samdb/ldb_modules/extended_dn_out.c33
-rw-r--r--source4/dsdb/samdb/ldb_modules/partition_init.c7
-rw-r--r--source4/dsdb/samdb/ldb_modules/util.c26
3 files changed, 35 insertions, 31 deletions
diff --git a/source4/dsdb/samdb/ldb_modules/extended_dn_out.c b/source4/dsdb/samdb/ldb_modules/extended_dn_out.c
index b1eacf59eb..70835226b7 100644
--- a/source4/dsdb/samdb/ldb_modules/extended_dn_out.c
+++ b/source4/dsdb/samdb/ldb_modules/extended_dn_out.c
@@ -140,35 +140,6 @@ static bool add_attrs(void *mem_ctx, char ***attrs, const char *attr)
return true;
}
-/* Fix the DN so that the relative attribute names are in upper case so that the DN:
- cn=Adminstrator,cn=users,dc=samba,dc=example,dc=com becomes
- CN=Adminstrator,CN=users,DC=samba,DC=example,DC=com
-*/
-static int fix_dn(struct ldb_context *ldb, struct ldb_dn *dn)
-{
- int i, ret;
- char *upper_rdn_attr;
-
- for (i=0; i < ldb_dn_get_comp_num(dn); i++) {
- /* We need the attribute name in upper case */
- upper_rdn_attr = strupper_talloc(dn,
- ldb_dn_get_component_name(dn, i));
- if (!upper_rdn_attr) {
- return ldb_oom(ldb);
- }
-
- /* And replace it with CN=foo (we need the attribute in upper case */
- ret = ldb_dn_set_component(dn, i, upper_rdn_attr,
- *ldb_dn_get_component_val(dn, i));
- talloc_free(upper_rdn_attr);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
- return LDB_SUCCESS;
-}
-
-
/* Inject the extended DN components, so the DN cn=Adminstrator,cn=users,dc=samba,dc=example,dc=com becomes
<GUID=541203ae-f7d6-47ef-8390-bfcf019f9583>;<SID=S-1-5-21-4177067393-1453636373-93818737-500>;cn=Adminstrator,cn=users,dc=samba,dc=example,dc=com */
@@ -458,7 +429,7 @@ static int extended_callback(struct ldb_request *req, struct ldb_reply *ares,
}
if (p && p->normalise) {
- ret = fix_dn(ldb, ares->message->dn);
+ ret = dsdb_fix_dn_rdncase(ldb, ares->message->dn);
if (ret != LDB_SUCCESS) {
return ldb_module_done(ac->req, NULL, NULL, ret);
}
@@ -600,7 +571,7 @@ static int extended_callback(struct ldb_request *req, struct ldb_reply *ares,
}
if (p->normalise) {
- ret = fix_dn(ldb, dn);
+ ret = dsdb_fix_dn_rdncase(ldb, dn);
if (ret != LDB_SUCCESS) {
talloc_free(dsdb_dn);
return ldb_module_done(ac->req, NULL, NULL, ret);
diff --git a/source4/dsdb/samdb/ldb_modules/partition_init.c b/source4/dsdb/samdb/ldb_modules/partition_init.c
index 98896a7a84..3e2648efa1 100644
--- a/source4/dsdb/samdb/ldb_modules/partition_init.c
+++ b/source4/dsdb/samdb/ldb_modules/partition_init.c
@@ -516,6 +516,13 @@ int partition_reload_if_required(struct ldb_module *module,
talloc_free(partition->ctrl->dn);
partition->ctrl->dn = talloc_steal(partition->ctrl, dn_res->msgs[0]->dn);
talloc_free(dn_res);
+ if (data->ldapBackend) {
+ ret = dsdb_fix_dn_rdncase(ldb, partition->ctrl->dn);
+ if (ret) {
+ talloc_free(mem_ctx);
+ return ret;
+ }
+ }
} else if (ret != LDB_ERR_NO_SUCH_OBJECT) {
ldb_asprintf_errstring(ldb,
"Failed to search for partition base %s in new partition at %s: %s",
diff --git a/source4/dsdb/samdb/ldb_modules/util.c b/source4/dsdb/samdb/ldb_modules/util.c
index 8d587a4cb3..147e357847 100644
--- a/source4/dsdb/samdb/ldb_modules/util.c
+++ b/source4/dsdb/samdb/ldb_modules/util.c
@@ -1419,3 +1419,29 @@ const struct dsdb_class *dsdb_get_structural_oc_from_msg(const struct dsdb_schem
return dsdb_get_last_structural_class(schema, oc_el);
}
+
+/* Fix the DN so that the relative attribute names are in upper case so that the DN:
+ cn=Adminstrator,cn=users,dc=samba,dc=example,dc=com becomes
+ CN=Adminstrator,CN=users,DC=samba,DC=example,DC=com
+*/
+int dsdb_fix_dn_rdncase(struct ldb_context *ldb, struct ldb_dn *dn)
+{
+ int i, ret;
+ char *upper_rdn_attr;
+
+ for (i=0; i < ldb_dn_get_comp_num(dn); i++) {
+ /* We need the attribute name in upper case */
+ upper_rdn_attr = strupper_talloc(dn,
+ ldb_dn_get_component_name(dn, i));
+ if (!upper_rdn_attr) {
+ return ldb_oom(ldb);
+ }
+ ret = ldb_dn_set_component(dn, i, upper_rdn_attr,
+ *ldb_dn_get_component_val(dn, i));
+ talloc_free(upper_rdn_attr);
+ if (ret != LDB_SUCCESS) {
+ return ret;
+ }
+ }
+ return LDB_SUCCESS;
+}