From 83517d2e597878b86dc51edc6bb0bf25c7d62068 Mon Sep 17 00:00:00 2001 From: Matthias Dieter Wallnöfer Date: Sat, 5 Mar 2011 17:24:10 +0100 Subject: s4:instancetype LDB module - perform here only the "instanceType" constraint checks The boilerplate entries (when this support has been implemented) should be provided by the "new_partition" LDB module. These are for example the deleted object and lost and found container. --- source4/dsdb/samdb/ldb_modules/instancetype.c | 94 +++++---------------------- 1 file changed, 16 insertions(+), 78 deletions(-) (limited to 'source4/dsdb') diff --git a/source4/dsdb/samdb/ldb_modules/instancetype.c b/source4/dsdb/samdb/ldb_modules/instancetype.c index 2044b05be4..e008deb02b 100644 --- a/source4/dsdb/samdb/ldb_modules/instancetype.c +++ b/source4/dsdb/samdb/ldb_modules/instancetype.c @@ -38,66 +38,23 @@ #include "../libds/common/flags.h" #include "dsdb/samdb/ldb_modules/util.h" -struct it_context { - struct ldb_module *module; - struct ldb_request *req; - struct ldb_request *add_req; -}; - -static int it_add_callback(struct ldb_request *req, struct ldb_reply *ares) -{ - struct ldb_context *ldb; - struct it_context *ac; - - ac = talloc_get_type(req->context, struct it_context); - ldb = ldb_module_get_ctx(ac->module); - - if (!ares) { - return ldb_module_done(ac->req, NULL, NULL, - LDB_ERR_OPERATIONS_ERROR); - } - - if (ares->type == LDB_REPLY_REFERRAL) { - return ldb_module_send_referral(ac->req, ares->referral); - } - - if (ares->error != LDB_SUCCESS) { - return ldb_module_done(ac->req, ares->controls, - ares->response, ares->error); - } - - if (ares->type != LDB_REPLY_DONE) { - ldb_set_errstring(ldb, "Invalid reply type!"); - return ldb_module_done(ac->req, NULL, NULL, - LDB_ERR_OPERATIONS_ERROR); - } - - /* Add the boilerplate entries */ - - return ldb_module_done(ac->req, ares->controls, - ares->response, ares->error); -} - /* add_record: add instancetype attribute */ static int instancetype_add(struct ldb_module *module, struct ldb_request *req) { - struct ldb_context *ldb; + struct ldb_context *ldb = ldb_module_get_ctx(module); struct ldb_request *down_req; struct ldb_message *msg; struct ldb_message_element *el; - struct it_context *ac; uint32_t instanceType; int ret; - ldb = ldb_module_get_ctx(module); - - ldb_debug(ldb, LDB_DEBUG_TRACE, "instancetype_add_record\n"); - /* do not manipulate our control entries */ if (ldb_dn_is_special(req->op.add.message->dn)) { return ldb_next_request(module, req); } + ldb_debug(ldb, LDB_DEBUG_TRACE, "instancetype_add\n"); + el = ldb_msg_find_element(req->op.add.message, "instanceType"); if (el != NULL) { if (el->num_values != 1) { @@ -108,7 +65,8 @@ static int instancetype_add(struct ldb_module *module, struct ldb_request *req) instanceType = ldb_msg_find_attr_as_uint(req->op.add.message, "instanceType", 0); if (!(instanceType & INSTANCE_TYPE_IS_NC_HEAD)) { - /* if we have no NC add operation (no TYPE_IS_NC_HEAD) + /* + * If we have no NC add operation (no TYPE_IS_NC_HEAD) * then "instanceType" can only be "0" or "TYPE_WRITE". */ if ((instanceType != 0) && @@ -116,39 +74,19 @@ static int instancetype_add(struct ldb_module *module, struct ldb_request *req) ldb_set_errstring(ldb, "instancetype: if TYPE_IS_NC_HEAD wasn't set, then only TYPE_WRITE or 0 are allowed!"); return LDB_ERR_UNWILLING_TO_PERFORM; } - - return ldb_next_request(module, req); - } - - /* if we have a NC add operation then we need also the - * "TYPE_WRITE" flag in order to succeed. */ - if (!(instanceType & INSTANCE_TYPE_WRITE)) { - ldb_set_errstring(ldb, "instancetype: if TYPE_IS_NC_HEAD was set, then also TYPE_WRITE is requested!"); - return LDB_ERR_UNWILLING_TO_PERFORM; + } else { + /* + * If we have a NC add operation then we need also the + * "TYPE_WRITE" flag in order to succeed. + */ + if (!(instanceType & INSTANCE_TYPE_WRITE)) { + ldb_set_errstring(ldb, "instancetype: if TYPE_IS_NC_HEAD was set, then also TYPE_WRITE is requested!"); + return LDB_ERR_UNWILLING_TO_PERFORM; + } } - /* Forward the 'add' to the modules below, but if it - * succeeds, then we might need to add the boilerplate - * entries (lost+found, deleted objects) */ - ac = talloc(req, struct it_context); - if (ac == NULL) { - return ldb_oom(ldb); - } - ac->module = module; - ac->req = req; - - ret = ldb_build_add_req(&ac->add_req, ldb, ac, - ac->req->op.add.message, - ac->req->controls, - ac, it_add_callback, - ac->req); - LDB_REQ_SET_LOCATION(ac->add_req); - if (ret != LDB_SUCCESS) { - return ret; - } - - /* Do the original add */ - return ldb_next_request(ac->module, ac->add_req); + /* we did only tests, so proceed with the original request */ + return ldb_next_request(module, req); } /* we have to copy the message as the caller might have it as a const */ -- cgit