summaryrefslogtreecommitdiff
path: root/source4/dsdb
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2009-08-25 17:00:27 +1000
committerAndrew Tridgell <tridge@samba.org>2009-08-25 17:00:27 +1000
commit61ca4c491e1c13eb7d97847f743b0f540f1117c4 (patch)
tree549708cdefe3fca881f2de90cd84cdacb891af2a /source4/dsdb
parent3c7cbd60e5a63496a523086fdfcf5c43301e78f7 (diff)
downloadsamba-61ca4c491e1c13eb7d97847f743b0f540f1117c4.tar.gz
samba-61ca4c491e1c13eb7d97847f743b0f540f1117c4.tar.bz2
samba-61ca4c491e1c13eb7d97847f743b0f540f1117c4.zip
fixed DRS rename of deleted objects
The objectclass module checks that the target parent exists, and refuses renames if it doesn't exist. For this to work for deleted objects we have to do the search in the objectclass module with the "show deleted" control enabled.
Diffstat (limited to 'source4/dsdb')
-rw-r--r--source4/dsdb/samdb/ldb_modules/objectclass.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/source4/dsdb/samdb/ldb_modules/objectclass.c b/source4/dsdb/samdb/ldb_modules/objectclass.c
index 4f013709b2..eb35ad052e 100644
--- a/source4/dsdb/samdb/ldb_modules/objectclass.c
+++ b/source4/dsdb/samdb/ldb_modules/objectclass.c
@@ -997,6 +997,7 @@ static int objectclass_rename(struct ldb_module *module, struct ldb_request *req
struct oc_context *ac;
struct ldb_dn *parent_dn;
int ret;
+ struct ldb_control **ctrl;
ldb = ldb_module_get_ctx(module);
@@ -1025,12 +1026,30 @@ static int objectclass_rename(struct ldb_module *module, struct ldb_request *req
return LDB_ERR_OPERATIONS_ERROR;
}
+ /* we have to add the show deleted control, as otherwise DRS
+ deletes will be refused as we will think the target parent
+ does not exist */
+ ctrl = talloc_array(req, struct ldb_control, 2);
+ if (!ctrl) {
+ ldb_oom(ldb);
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
+ ctrl[0] = talloc(ctrl, struct ldb_control);
+ if (!ctrl[0]) {
+ ldb_oom(ldb);
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
+ ctrl[0]->oid = LDB_CONTROL_SHOW_DELETED_OID;
+ ctrl[0]->critical = 0;
+ ctrl[0]->data = NULL;
+ ctrl[1] = NULL;
+
/* note that the results of this search are kept and used to
update the parentGUID in objectclass_rename_callback() */
ret = ldb_build_search_req(&search_req, ldb,
ac, parent_dn, LDB_SCOPE_BASE,
"(objectClass=*)",
- attrs, NULL,
+ attrs, ctrl,
ac, get_search_callback,
req);
if (ret != LDB_SUCCESS) {