Disable descriptor module unless enabled in smb.conf
[ira/wip.git] / source4 / dsdb / samdb / ldb_modules / descriptor.c
index e6fb8562c76e23bf33392a8a5e0e070fb34a3895..7b5b700916dc899229a57b02146d495ae29805c1 100644 (file)
 #include "auth/auth.h"
 #include "param/param.h"
 
+struct descriptor_data {
+       bool inherit;
+};
+
 struct descriptor_context {
                struct ldb_module *module;
                struct ldb_request *req;
@@ -49,15 +53,15 @@ struct descriptor_context {
                int (*step_fn)(struct descriptor_context *);
 };
 
-static struct dsdb_class * get_last_structural_class(const struct dsdb_schema *schema, struct ldb_message_element *element)
+static const struct dsdb_class * get_last_structural_class(const struct dsdb_schema *schema, struct ldb_message_element *element)
 {
-       struct dsdb_class *last_class = NULL;
+       const struct dsdb_class *last_class = NULL;
        int i;
        for (i = 0; i < element->num_values; i++){
                if (!last_class)
                        last_class = dsdb_class_by_lDAPDisplayName_ldb_val(schema, &element->values[i]);
                else {
-                       struct dsdb_class *tmp_class = dsdb_class_by_lDAPDisplayName_ldb_val(schema, &element->values[i]);
+                       const struct dsdb_class *tmp_class = dsdb_class_by_lDAPDisplayName_ldb_val(schema, &element->values[i]);
                        if (tmp_class->subClass_order > last_class->subClass_order)
                                last_class = tmp_class;
                }
@@ -134,14 +138,24 @@ static struct dom_sid *get_default_group(TALLOC_CTX *mem_ctx,
                                         struct ldb_context *ldb,
                                         struct dom_sid *dag)
 {
-       return dag;
+       int *domainFunctionality;
+
+       domainFunctionality = talloc_get_type(
+               ldb_get_opaque(ldb, "domainFunctionality"), int);
+
+       if (*domainFunctionality
+                       && (*domainFunctionality >= DS_DOMAIN_FUNCTION_2008)) {
+               return dag;
+       }
+
+       return NULL;
 }
 
 static DATA_BLOB *get_new_descriptor(struct ldb_module *module,
                                     struct ldb_dn *dn,
                                     TALLOC_CTX *mem_ctx,
                                     const struct dsdb_class *objectclass,
-                                    struct ldb_val *parent,
+                                    const struct ldb_val *parent,
                                     struct ldb_val *object)
 {
        struct security_descriptor *user_descriptor = NULL, *parent_descriptor = NULL;
@@ -316,9 +330,10 @@ static int descriptor_do_add(struct descriptor_context *ac)
        struct ldb_message *msg;
        TALLOC_CTX *mem_ctx;
        int ret;
-       struct ldb_val *sd_val = NULL, *parentsd_val = NULL;
+       struct ldb_val *sd_val = NULL;
+       const struct ldb_val *parentsd_val = NULL;
        DATA_BLOB *sd;
-       struct dsdb_class *objectclass;
+       const struct dsdb_class *objectclass;
 
        ldb = ldb_module_get_ctx(ac->module);
        schema = dsdb_get_schema(ldb);
@@ -384,10 +399,15 @@ static int descriptor_add(struct ldb_module *module, struct ldb_request *req)
        struct descriptor_context *ac;
        struct ldb_dn *parent_dn;
        int ret;
+       struct descriptor_data *data;
        static const char * const descr_attrs[] = { "nTSecurityDescriptor", NULL };
 
+       data = talloc_get_type(ldb_module_get_private(module), struct descriptor_data);
        ldb = ldb_module_get_ctx(module);
 
+       if (!data->inherit)
+               return ldb_next_request(module, req);
+
        ldb_debug(ldb, LDB_DEBUG_TRACE, "descriptor_add\n");
 
        if (ldb_dn_is_special(req->op.add.message->dn)) {
@@ -441,11 +461,31 @@ static int descriptor_rename(struct ldb_module *module, struct ldb_request *req)
        return ldb_next_request(module, req);
 }
 
+static int descriptor_init(struct ldb_module *module)
+{
+       struct ldb_context *ldb;
+       struct descriptor_data *data;
+
+       ldb = ldb_module_get_ctx(module);
+       data = talloc(module, struct descriptor_data);
+       if (data == NULL) {
+               ldb_oom(ldb);
+               return LDB_ERR_OPERATIONS_ERROR;
+       }
+
+       data->inherit = lp_parm_bool(ldb_get_opaque(ldb, "loadparm"),
+                                 NULL, "acl", "inheritance", false);
+       ldb_module_set_private(module, data);
+       return ldb_next_init(module);
+}
+
+
 _PUBLIC_ const struct ldb_module_ops ldb_descriptor_module_ops = {
        .name              = "descriptor",
        .add           = descriptor_add,
        .modify        = descriptor_modify,
        .rename        = descriptor_rename,
+       .init_context  = descriptor_init
 };