summaryrefslogtreecommitdiffstats
path: root/source4/dsdb
diff options
context:
space:
mode:
authorKamen Mazdrashki <kamenim@samba.org>2014-11-07 07:11:59 +0100
committerAndrew Bartlett <abartlet@samba.org>2015-02-03 05:02:11 +0100
commitd5fc8b080fe47bf6f93de136788d56d51c526cb4 (patch)
treee88525bbcce0f848e037d4407502179eb26f1686 /source4/dsdb
parent72c55980e3adf1f47cf973c8c1a3f87e98121276 (diff)
downloadsamba-d5fc8b080fe47bf6f93de136788d56d51c526cb4.tar.gz
samba-d5fc8b080fe47bf6f93de136788d56d51c526cb4.tar.xz
samba-d5fc8b080fe47bf6f93de136788d56d51c526cb4.zip
s4-dsdb/reanimate: Swap rename->modify operations to modify->rename sequence
This way it is more visible that we work on 'deleted object' during modify and also will help us to handle 'stop rename for deletec objects' propertly in future [MS-ADTS]: 3.1.1.5.3.7.3 Undelete Processing Specifics Change-Id: I9bb644e099a4a2afcb261ad22515c9c4ce4875bb Signed-off-by: Kamen Mazdrashki <kamenim@samba.org> Reviewed-by: Andrew Bartlett <abartlet@samba.org> Reviewed-by: Garming Sam <garming@catalyst.net.nz>
Diffstat (limited to 'source4/dsdb')
-rw-r--r--source4/dsdb/samdb/ldb_modules/tombstone_reanimate.c38
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);
}