s4:instancetype LDB module - perform here only the "instanceType" constraint checks
[samba.git] / source4 / dsdb / samdb / ldb_modules / instancetype.c
index 2044b05be4a461300509b6a054b95ae5272dbf49..e008deb02b39d08df2ab395d7ca7d2fc8ffe9163 100644 (file)
 #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 */