diff options
-rw-r--r-- | source4/dsdb/samdb/ldb_modules/objectclass.c | 87 |
1 files changed, 7 insertions, 80 deletions
diff --git a/source4/dsdb/samdb/ldb_modules/objectclass.c b/source4/dsdb/samdb/ldb_modules/objectclass.c index a26dcd2cea..53c1cc7574 100644 --- a/source4/dsdb/samdb/ldb_modules/objectclass.c +++ b/source4/dsdb/samdb/ldb_modules/objectclass.c @@ -484,7 +484,6 @@ static int objectclass_do_add(struct oc_context *ac) return LDB_ERR_NO_SUCH_OBJECT; } } else { - const struct ldb_val *parent_guid; /* Fix up the DN to be in the standard form, taking particular care to match the parent DN */ ret = fix_dn(msg, @@ -499,21 +498,6 @@ static int objectclass_do_add(struct oc_context *ac) return ret; } - parent_guid = ldb_msg_find_ldb_val(ac->search_res->message, "objectGUID"); - if (parent_guid == NULL) { - ldb_asprintf_errstring(ldb, "objectclass: Cannot add %s, parent does not have an objectGUID!", - ldb_dn_get_linearized(msg->dn)); - talloc_free(mem_ctx); - return LDB_ERR_UNWILLING_TO_PERFORM; - } - - ret = ldb_msg_add_steal_value(msg, "parentGUID", discard_const(parent_guid)); - if (ret != LDB_SUCCESS) { - ldb_asprintf_errstring(ldb, "objectclass: Cannot add %s, failed to add parentGUID", - ldb_dn_get_linearized(msg->dn)); - talloc_free(mem_ctx); - return LDB_ERR_UNWILLING_TO_PERFORM; - } } if (schema) { ret = fix_attributes(ldb, schema, msg); @@ -1033,7 +1017,7 @@ static int objectclass_do_rename(struct oc_context *ac); static int objectclass_rename(struct ldb_module *module, struct ldb_request *req) { - static const char * const attrs[] = { "objectGUID", NULL }; + static const char * const attrs[] = { NULL }; struct ldb_context *ldb; struct ldb_request *search_req; struct oc_context *ac; @@ -1067,12 +1051,14 @@ static int objectclass_rename(struct ldb_module *module, struct ldb_request *req return LDB_ERR_OPERATIONS_ERROR; } - /* note that the results of this search are kept and used to - update the parentGUID in objectclass_rename_callback() */ + /* + it makes a search request, looking for the parent DN to fix up the new DN + to a standard one, at objectclass_do_rename() + */ ret = ldb_build_search_req(&search_req, ldb, ac, parent_dn, LDB_SCOPE_BASE, "(objectClass=*)", - attrs, NULL, + attrs, NULL, ac, get_search_callback, req); if (ret != LDB_SUCCESS) { @@ -1091,67 +1077,8 @@ static int objectclass_rename(struct ldb_module *module, struct ldb_request *req ac->step_fn = objectclass_do_rename; return ldb_next_request(ac->module, search_req); -} - -/* - called after the rename happens. - We now need to fix the parentGUID of the object to be the objectGUID of - the new parent -*/ -static int objectclass_rename_callback(struct ldb_request *req, struct ldb_reply *ares) -{ - struct ldb_context *ldb; - struct oc_context *ac; - const struct ldb_val *parent_guid; - struct ldb_request *mod_req = NULL; - int ret; - struct ldb_message *msg; - struct ldb_message_element *el = NULL; - ac = talloc_get_type(req->context, struct oc_context); - ldb = ldb_module_get_ctx(ac->module); - /* make sure the rename succeeded */ - if (!ares) { - return ldb_module_done(ac->req, NULL, NULL, - LDB_ERR_OPERATIONS_ERROR); - } - if (ares->error != LDB_SUCCESS) { - return ldb_module_done(ac->req, ares->controls, - ares->response, ares->error); - } - - talloc_free(ares); - - /* the ac->search_res should contain the new parents objectGUID */ - parent_guid = ldb_msg_find_ldb_val(ac->search_res->message, "objectGUID"); - if (parent_guid == NULL) { - ldb_asprintf_errstring(ldb, "objectclass: Cannot rename %s, new parent does not have an objectGUID!", - ldb_dn_get_linearized(ac->req->op.rename.newdn)); - return LDB_ERR_UNWILLING_TO_PERFORM; - - } - - /* construct the modify message */ - msg = ldb_msg_new(ac); - if (msg == NULL) { - ldb_oom(ldb); - return LDB_ERR_OPERATIONS_ERROR; - } - - msg->dn = ac->req->op.rename.newdn; - - ret = ldb_msg_add_value(msg, "parentGUID", parent_guid, &el); - if (ret != LDB_SUCCESS) { - return ret; - } - - el->flags = LDB_FLAG_MOD_REPLACE; - - ret = ldb_build_mod_req(&mod_req, ldb, ac, msg, - NULL, ac, oc_op_callback, req); - - return ldb_next_request(ac->module, mod_req); } static int objectclass_do_rename(struct oc_context *ac) @@ -1187,7 +1114,7 @@ static int objectclass_do_rename(struct oc_context *ac) ret = ldb_build_rename_req(&rename_req, ldb, ac, ac->req->op.rename.olddn, fixed_dn, ac->req->controls, - ac, objectclass_rename_callback, + ac, oc_op_callback, ac->req); if (ret != LDB_SUCCESS) { return ret; |