Fix DN RDN case in partition names
authorHoward Chu <hyc@symas.com>
Thu, 19 Sep 2013 17:41:16 +0000 (10:41 -0700)
committerNadezhda Ivanova <nivanova@samba.org>
Tue, 24 Sep 2013 05:43:39 +0000 (07:43 +0200)
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

source4/dsdb/samdb/ldb_modules/extended_dn_out.c
source4/dsdb/samdb/ldb_modules/partition_init.c
source4/dsdb/samdb/ldb_modules/util.c

index b1eacf59eb8d98485828b8ff6fb928f83218d886..70835226b7e0f7918e07ca03cfdf35b7855f3a87 100644 (file)
@@ -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);
index 98896a7a84080ac21820bdb71ae0991395223371..3e2648efa11ae3216f879afd6c6e3ce434f3bf32 100644 (file)
@@ -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", 
index 8d587a4cb3862714607441c45bd47a0f84db9022..147e3578471fa6f1b1d799e4f266e66895bc7a16 100644 (file)
@@ -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;
+}