diff options
-rw-r--r-- | source4/dsdb/samdb/ldb_modules/tombstone_reanimate.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/source4/dsdb/samdb/ldb_modules/tombstone_reanimate.c b/source4/dsdb/samdb/ldb_modules/tombstone_reanimate.c index 070d952aa1..825bbf1464 100644 --- a/source4/dsdb/samdb/ldb_modules/tombstone_reanimate.c +++ b/source4/dsdb/samdb/ldb_modules/tombstone_reanimate.c @@ -352,30 +352,21 @@ static int tombstone_reanimate_modify(struct ldb_module *module, struct ldb_requ } /* Simple implementation */ - /* Rename request to modify distinguishedName */ - dn_new = ldb_dn_from_ldb_val(req, ldb, &el_dn->values[0]); - if (dn_new == NULL) { - return ldb_oom(ldb); - } - ret = _tr_do_rename(module, req, req->op.mod.message->dn, dn_new); - if (ret != LDB_SUCCESS) { - ldb_debug(ldb, LDB_DEBUG_ERROR, "Renaming object to %s has failed with %s\n", el_dn->values[0].data, ldb_strerror(ret)); - if (ret != LDB_ERR_ENTRY_ALREADY_EXISTS && ret != LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS ) { - /* Windows returns Operations Error in case we can't rename the object */ - return LDB_ERR_OPERATIONS_ERROR; - } - return ret; - } /* Modify request to: */ msg = ldb_msg_copy_shallow(ac, req->op.mod.message); if (msg == NULL) { return ldb_module_oom(ac->module); } - msg->dn = dn_new; - /* - delete isDeleted */ + /* - remove distinguishedName - we don't need it */ ldb_msg_remove_attr(msg, "distinguishedName"); + /* restore attributed depending on objectClass */ + ret = _tr_restore_attributes(ldb, res_obj->msgs[0], msg); + if (ret != LDB_SUCCESS) { + return ret; + } + /* - restore objectCategory if not present */ objectcategory = ldb_msg_find_attr_as_dn(ldb, ac, msg, "objectCategory"); @@ -398,6 +389,21 @@ static int tombstone_reanimate_modify(struct ldb_module *module, struct ldb_requ return ret; } + /* Rename request to modify distinguishedName */ + dn_new = ldb_dn_from_ldb_val(req, ldb, &el_dn->values[0]); + if (dn_new == NULL) { + return ldb_oom(ldb); + } + ret = _tr_do_rename(module, req, req->op.mod.message->dn, dn_new); + if (ret != LDB_SUCCESS) { + ldb_debug(ldb, LDB_DEBUG_ERROR, "Renaming object to %s has failed with %s\n", el_dn->values[0].data, ldb_strerror(ret)); + if (ret != LDB_ERR_ENTRY_ALREADY_EXISTS && ret != LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS ) { + /* Windows returns Operations Error in case we can't rename the object */ + return LDB_ERR_OPERATIONS_ERROR; + } + return ret; + } + return ldb_module_done(ac->req, NULL, NULL, LDB_SUCCESS); } |