diff options
-rw-r--r-- | source4/dsdb/samdb/ldb_modules/objectguid.c | 13 | ||||
-rw-r--r-- | source4/dsdb/samdb/ldb_modules/password_hash.c | 7 | ||||
-rw-r--r-- | source4/dsdb/samdb/ldb_modules/samldb.c | 48 |
3 files changed, 42 insertions, 26 deletions
diff --git a/source4/dsdb/samdb/ldb_modules/objectguid.c b/source4/dsdb/samdb/ldb_modules/objectguid.c index 71591f187f..96457447fb 100644 --- a/source4/dsdb/samdb/ldb_modules/objectguid.c +++ b/source4/dsdb/samdb/ldb_modules/objectguid.c @@ -133,8 +133,10 @@ static int objectguid_add_async(struct ldb_module *module, struct ldb_request *r return LDB_ERR_OPERATIONS_ERROR; } + *down_req = *req; + /* we have to copy the message as the caller might have it as a const */ - msg = ldb_msg_copy_shallow(down_req, req->op.add.message); + down_req->op.add.message = msg = ldb_msg_copy_shallow(down_req, req->op.add.message); if (msg == NULL) { return LDB_ERR_OPERATIONS_ERROR; } @@ -152,16 +154,7 @@ static int objectguid_add_async(struct ldb_module *module, struct ldb_request *r if (ret) { return ret; } - - down_req->op.add.message = msg; - down_req->controls = req->controls; - down_req->creds = req->creds; - - down_req->async.context = req->async.context; - down_req->async.callback = req->async.callback; - down_req->async.timeout = req->async.timeout; - /* go on with the call chain */ ret = ldb_next_request(module, down_req); diff --git a/source4/dsdb/samdb/ldb_modules/password_hash.c b/source4/dsdb/samdb/ldb_modules/password_hash.c index 617962b909..0d4f0c6a0f 100644 --- a/source4/dsdb/samdb/ldb_modules/password_hash.c +++ b/source4/dsdb/samdb/ldb_modules/password_hash.c @@ -205,6 +205,8 @@ static int password_hash_handle(struct ldb_module *module, struct ldb_request *r case LDB_REQ_MODIFY: modified_orig_request->op.mod.message = msg2; break; + default: + return LDB_ERR_OPERATIONS_ERROR; } /* Send the (modified) request of the original caller down to the database */ @@ -1275,7 +1277,7 @@ static int password_hash_add_async_do_add(struct ldb_async_handle *h) { ac = talloc_get_type(h->private_data, struct ph_async_context); - domain = get_domain_data(ac->module, ac, ac->search_res); + domain = get_domain_data(ac->module, ac, ac->dom_res); if (domain == NULL) { return LDB_ERR_OPERATIONS_ERROR; } @@ -1693,7 +1695,8 @@ static int ph_async_wait(struct ldb_async_handle *handle) { return LDB_SUCCESS; } } - return LDB_SUCCESS; + + break; case PH_MOD_DO_REQ: if (ac->down_req->async.handle->state != LDB_ASYNC_DONE) { diff --git a/source4/dsdb/samdb/ldb_modules/samldb.c b/source4/dsdb/samdb/ldb_modules/samldb.c index 31cf6143a1..8a708af83b 100644 --- a/source4/dsdb/samdb/ldb_modules/samldb.c +++ b/source4/dsdb/samdb/ldb_modules/samldb.c @@ -625,6 +625,20 @@ static int samldb_fill_user_or_computer_object(struct ldb_module *module, const return LDB_ERR_OPERATIONS_ERROR; } + /* make sure we also add person, organizationalPerson and top */ + if ( ! samldb_find_or_add_attribute(module, msg2, "objectclass", "person", "person")) { + talloc_free(mem_ctx); + return LDB_ERR_OPERATIONS_ERROR; + } + if ( ! samldb_find_or_add_attribute(module, msg2, "objectclass", "organizationalPerson", "organizationalPerson")) { + talloc_free(mem_ctx); + return LDB_ERR_OPERATIONS_ERROR; + } + if ( ! samldb_find_or_add_attribute(module, msg2, "objectclass", "top", "top")) { + talloc_free(mem_ctx); + return LDB_ERR_OPERATIONS_ERROR; + } + /* meddle with objectclass */ if (ldb_msg_find_element(msg2, "samAccountName") == NULL) { @@ -762,13 +776,16 @@ static int samldb_add(struct ldb_module *module, struct ldb_request *req) return ldb_next_request(module, req); } - /* is user or computer? add all relevant missing objects */ - if ((samldb_find_attribute(msg, "objectclass", "user") != NULL) || - (samldb_find_attribute(msg, "objectclass", "computer") != NULL)) { - ret = samldb_fill_user_or_computer_object(module, msg, &msg2); - if (ret) { - return ret; - } + /* is user or computer? Skip if not */ + if ((samldb_find_attribute(msg, "objectclass", "user") == NULL) && + (samldb_find_attribute(msg, "objectclass", "computer") == NULL)) { + return ldb_next_request(module, req); + } + + /* add all relevant missing objects */ + ret = samldb_fill_user_or_computer_object(module, msg, &msg2); + if (ret) { + return ret; } /* is group? add all relevant missing objects */ @@ -830,13 +847,16 @@ static int samldb_add_async(struct ldb_module *module, struct ldb_request *req) return LDB_ERR_OPERATIONS_ERROR; } - /* is user or computer? add all relevant missing objects */ - if ((samldb_find_attribute(msg, "objectclass", "user") != NULL) || - (samldb_find_attribute(msg, "objectclass", "computer") != NULL)) { - ret = samldb_fill_user_or_computer_object(module, msg, &msg2); - if (ret) { - return ret; - } + /* is user or computer? Skip if not */ + if ((samldb_find_attribute(msg, "objectclass", "user") == NULL) && + (samldb_find_attribute(msg, "objectclass", "computer") == NULL)) { + return ldb_next_request(module, req); + } + + /* add all relevant missing objects */ + ret = samldb_fill_user_or_computer_object(module, msg, &msg2); + if (ret) { + return ret; } /* is group? add all relevant missing objects */ |