diff options
author | Andrew Bartlett <abartlet@samba.org> | 2007-07-09 12:31:35 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 14:59:11 -0500 |
commit | 2d2cde7d95e0871ea66ce8186a54c3b28834051b (patch) | |
tree | f0cc4a6e2af5bf04d5891d923637e1603d8c307f /source4/dsdb | |
parent | b7b17c654da08e2abcad0e127ed30bb6991e64ab (diff) | |
download | samba-2d2cde7d95e0871ea66ce8186a54c3b28834051b.tar.gz samba-2d2cde7d95e0871ea66ce8186a54c3b28834051b.tar.bz2 samba-2d2cde7d95e0871ea66ce8186a54c3b28834051b.zip |
r23762: Fix DN renames over LDAP, and instrument the partition module. Add a
test to prove the behaviour of LDAP renames etc.
Fix LDB to return correct error code when failing to rename one DN
onto another.
Andrew Bartlett
(This used to be commit 3f3da9c4710b7752ed97f55c2fc3d32a63d352af)
Diffstat (limited to 'source4/dsdb')
-rw-r--r-- | source4/dsdb/samdb/ldb_modules/partition.c | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/source4/dsdb/samdb/ldb_modules/partition.c b/source4/dsdb/samdb/ldb_modules/partition.c index b0875d2965..73ee4ef3a6 100644 --- a/source4/dsdb/samdb/ldb_modules/partition.c +++ b/source4/dsdb/samdb/ldb_modules/partition.c @@ -120,25 +120,6 @@ static struct dsdb_control_current_partition *find_partition(struct partition_pr return NULL; }; -static struct ldb_module *find_backend(struct ldb_module *module, struct ldb_request *req, struct ldb_dn *dn) -{ - struct dsdb_control_current_partition *partition; - struct partition_private_data *data = talloc_get_type(module->private_data, - struct partition_private_data); - - /* Skip the lot if 'data' isn't here yet (initialistion) */ - if (!data) { - return module; - } - - partition = find_partition(data, dn); - if (!partition) { - return module; - } - - return make_module_for_next_request(req, module->ldb, partition->module); -}; - /* fire the caller's callback for every entry, but only send 'done' once. */ @@ -442,10 +423,31 @@ static int partition_delete(struct ldb_module *module, struct ldb_request *req) static int partition_rename(struct ldb_module *module, struct ldb_request *req) { /* Find backend */ - struct ldb_module *backend = find_backend(module, req, req->op.rename.olddn); - struct ldb_module *backend2 = find_backend(module, req, req->op.rename.newdn); + struct dsdb_control_current_partition *backend, *backend2; + + struct partition_private_data *data = talloc_get_type(module->private_data, + struct partition_private_data); + + /* Skip the lot if 'data' isn't here yet (initialistion) */ + if (!data) { + return LDB_ERR_OPERATIONS_ERROR; + } + + backend = find_partition(data, req->op.rename.olddn); + backend2 = find_partition(data, req->op.rename.newdn); + + if ((backend && !backend2) || (!backend && backend2)) { + return LDB_ERR_AFFECTS_MULTIPLE_DSAS; + } - if (backend->next != backend2->next) { + if (backend != backend2) { + ldb_asprintf_errstring(module->ldb, + "Cannot rename from %s in %s to %s in %s: %s", + ldb_dn_get_linearized(req->op.rename.olddn), + ldb_dn_get_linearized(backend->dn), + ldb_dn_get_linearized(req->op.rename.newdn), + ldb_dn_get_linearized(backend2->dn), + ldb_strerror(LDB_ERR_AFFECTS_MULTIPLE_DSAS)); return LDB_ERR_AFFECTS_MULTIPLE_DSAS; } |