From 90203f87e7da3346ae9236e4d30c93b95a2ddad9 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 16 Feb 2010 14:45:16 +1100 Subject: s4-dsdb: change samdb_replace() to dsdb_replace() and allow for dsdb_flags This allows for controls to be added easily where they are needed. --- source4/dsdb/common/util.c | 99 +++++++++++++--------------------------------- 1 file changed, 27 insertions(+), 72 deletions(-) (limited to 'source4/dsdb/common/util.c') diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c index 12185f999d..5178253ae1 100644 --- a/source4/dsdb/common/util.c +++ b/source4/dsdb/common/util.c @@ -783,7 +783,7 @@ int samdb_msg_add_delete(struct ldb_context *sam_ldb, TALLOC_CTX *mem_ctx, struc const char *attr_name) { /* we use an empty replace rather than a delete, as it allows for - samdb_replace() to be used everywhere */ + dsdb_replace() to be used everywhere */ return ldb_msg_add_empty(msg, attr_name, LDB_FLAG_MOD_REPLACE, NULL); } @@ -980,27 +980,11 @@ int samdb_msg_set_string(struct ldb_context *sam_ldb, TALLOC_CTX *mem_ctx, struc return samdb_msg_add_string(sam_ldb, mem_ctx, msg, attr_name, str); } -/* - replace elements in a record -*/ -int samdb_replace(struct ldb_context *sam_ldb, TALLOC_CTX *mem_ctx, struct ldb_message *msg) -{ - int i; - - /* mark all the message elements as LDB_FLAG_MOD_REPLACE */ - for (i=0;inum_elements;i++) { - msg->elements[i].flags = LDB_FLAG_MOD_REPLACE; - } - - /* modify the samdb record */ - return ldb_modify(sam_ldb, msg); -} - /* * Handle ldb_request in transaction */ static int dsdb_autotransaction_request(struct ldb_context *sam_ldb, - struct ldb_request *req) + struct ldb_request *req) { int ret; @@ -1022,55 +1006,6 @@ static int dsdb_autotransaction_request(struct ldb_context *sam_ldb, return ret; } -/* - * replace elements in a record using LDB_CONTROL_AS_SYSTEM - * used to skip access checks on operations - * that are performed by the system - */ -int samdb_replace_as_system(struct ldb_context *sam_ldb, - TALLOC_CTX *mem_ctx, - struct ldb_message *msg) -{ - int i; - int ldb_ret; - struct ldb_request *req = NULL; - - /* mark all the message elements as LDB_FLAG_MOD_REPLACE */ - for (i=0;inum_elements;i++) { - msg->elements[i].flags = LDB_FLAG_MOD_REPLACE; - } - - - ldb_ret = ldb_msg_sanity_check(sam_ldb, msg); - if (ldb_ret != LDB_SUCCESS) { - return ldb_ret; - } - - ldb_ret = ldb_build_mod_req(&req, sam_ldb, mem_ctx, - msg, - NULL, - NULL, - ldb_op_default_callback, - NULL); - - if (ldb_ret != LDB_SUCCESS) { - talloc_free(req); - return ldb_ret; - } - - ldb_ret = ldb_request_add_control(req, LDB_CONTROL_AS_SYSTEM_OID, false, NULL); - if (ldb_ret != LDB_SUCCESS) { - talloc_free(req); - return ldb_ret; - } - - /* do request and auto start a transaction */ - ldb_ret = dsdb_autotransaction_request(sam_ldb, req); - - talloc_free(req); - return ldb_ret; -} - /* return a default security descriptor */ @@ -2119,7 +2054,7 @@ NTSTATUS samdb_set_password_sid(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, } /* modify the samdb record */ - ret = samdb_replace(ldb, mem_ctx, msg); + ret = dsdb_replace(ldb, msg, 0); if (ret != LDB_SUCCESS) { ldb_transaction_cancel(ldb); talloc_free(user_dn); @@ -3434,6 +3369,13 @@ int dsdb_request_add_controls(struct ldb_request *req, uint32_t dsdb_flags) } } + if (dsdb_flags & DSDB_FLAG_AS_SYSTEM) { + ret = ldb_request_add_control(req, LDB_CONTROL_AS_SYSTEM_OID, false, NULL); + if (ret != LDB_SUCCESS) { + return ret; + } + } + return LDB_SUCCESS; } @@ -3461,11 +3403,24 @@ int dsdb_modify(struct ldb_context *ldb, const struct ldb_message *message, return ret; } - ret = ldb_request(ldb, req); - if (ret == LDB_SUCCESS) { - ret = ldb_wait(req->handle, LDB_WAIT_ALL); - } + ret = dsdb_autotransaction_request(ldb, req); talloc_free(req); return ret; } + +/* + like dsdb_modify() but set all the element flags to + LDB_FLAG_MOD_REPLACE + */ +int dsdb_replace(struct ldb_context *ldb, struct ldb_message *msg, uint32_t dsdb_flags) +{ + int i; + + /* mark all the message elements as LDB_FLAG_MOD_REPLACE */ + for (i=0;inum_elements;i++) { + msg->elements[i].flags = LDB_FLAG_MOD_REPLACE; + } + + return dsdb_modify(ldb, msg, dsdb_flags); +} -- cgit