The branch, master has been updated via 05425fc... s4-drs: replace manual checks with dsdb_modify_permissive() via 2908f21... s4-drs: use a permissive modify in addentry via 4694b46... s4-dsdb: added dsdb_modify_permissive() from 6ec6fa0... s3: eventlogadm.c: add -s option to use alternative config file.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 05425fcf14f0695e5e230a698885203cc7c7ab2b Author: Andrew Tridgell <tri...@samba.org> Date: Mon Feb 15 17:39:20 2010 +1100 s4-drs: replace manual checks with dsdb_modify_permissive() Much simpler to use the permissive control instead of manually munging the SPN list. commit 2908f21c65ad8385f645cd841a25fe0f8f45feb0 Author: Andrew Tridgell <tri...@samba.org> Date: Mon Feb 15 17:38:47 2010 +1100 s4-drs: use a permissive modify in addentry It is not an error if entries already exist. commit 4694b4677ac58cd99d005d33aaf8c1b154e63b29 Author: Andrew Tridgell <tri...@samba.org> Date: Mon Feb 15 17:38:16 2010 +1100 s4-dsdb: added dsdb_modify_permissive() This will be used in the drsuapi server ----------------------------------------------------------------------- Summary of changes: source4/dsdb/common/util.c | 36 +++++++++++++++++++++++++++++++++ source4/rpc_server/drsuapi/addentry.c | 2 +- source4/rpc_server/drsuapi/writespn.c | 33 +----------------------------- 3 files changed, 38 insertions(+), 33 deletions(-) Changeset truncated at 500 lines: diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c index d659767..eb021df 100644 --- a/source4/dsdb/common/util.c +++ b/source4/dsdb/common/util.c @@ -3360,3 +3360,39 @@ int dsdb_load_udv_v1(struct ldb_context *samdb, struct ldb_dn *dn, TALLOC_CTX *m talloc_free(v2); return LDB_SUCCESS; } + + +/* + a modify with the 'permissive' control + this means no error for entries that already exist on adds, or + removal of entries that don't exist +*/ +int dsdb_modify_permissive(struct ldb_context *ldb, + const struct ldb_message *message) +{ + struct ldb_request *req; + int ret; + + ret = ldb_build_mod_req(&req, ldb, ldb, + message, + NULL, + NULL, + ldb_op_default_callback, + NULL); + + if (ret != LDB_SUCCESS) return ret; + + ret = ldb_request_add_control(req, LDB_CONTROL_PERMISSIVE_MODIFY_OID, false, NULL); + if (ret != LDB_SUCCESS) { + talloc_free(req); + return ret; + } + + ret = ldb_request(ldb, req); + if (ret == LDB_SUCCESS) { + ret = ldb_wait(req->handle, LDB_WAIT_ALL); + } + + talloc_free(req); + return ret; +} diff --git a/source4/rpc_server/drsuapi/addentry.c b/source4/rpc_server/drsuapi/addentry.c index f63a967..b1c361d 100644 --- a/source4/rpc_server/drsuapi/addentry.c +++ b/source4/rpc_server/drsuapi/addentry.c @@ -128,7 +128,7 @@ static WERROR drsuapi_add_SPNs(struct drsuapi_bind_state *b_state, return WERR_NOMEM; } - ret = ldb_modify(b_state->sam_ctx, msg); + ret = dsdb_modify_permissive(b_state->sam_ctx, msg); if (ret != LDB_SUCCESS) { DEBUG(0,(__location__ ": Failed to add SPNs - %s\n", ldb_errstring(b_state->sam_ctx))); diff --git a/source4/rpc_server/drsuapi/writespn.c b/source4/rpc_server/drsuapi/writespn.c index 8e20c88..65a7183 100644 --- a/source4/rpc_server/drsuapi/writespn.c +++ b/source4/rpc_server/drsuapi/writespn.c @@ -47,9 +47,6 @@ WERROR dcesrv_drsuapi_DsWriteAccountSpn(struct dcesrv_call_state *dce_call, TALL struct drsuapi_DsWriteAccountSpnRequest1 *req; struct ldb_message *msg; int count, i, ret; - struct ldb_result *res; - const char *attrs[] = { "servicePrincipalName", NULL }; - struct ldb_message_element *el; unsigned spn_count=0; req = &r->in.req->req1; @@ -66,35 +63,8 @@ WERROR dcesrv_drsuapi_DsWriteAccountSpn(struct dcesrv_call_state *dce_call, TALL return WERR_OK; } - /* load the existing SPNs, as these are - * ignored for adds and deletes (see MS-DRSR - * section 4.1.28.3) - */ - ret = ldb_search(b_state->sam_ctx, msg, &res, msg->dn, LDB_SCOPE_BASE, - attrs, NULL); - if (ret != LDB_SUCCESS) { - DEBUG(0,("Failed to load existing SPNs on %s: %s\n", - ldb_dn_get_linearized(msg->dn), - ldb_errstring(b_state->sam_ctx))); - r->out.res->res1.status = WERR_DS_OBJ_NOT_FOUND; - return WERR_OK; - } - el = ldb_msg_find_element(res->msgs[0], "servicePrincipalName"); - /* construct mods */ for (i = 0; i < count; i++) { - bool found = false; - int j; - for (j=0; el && j<el->num_values; j++) { - if (samdb_ldb_val_case_cmp(req->spn_names[i].str, &el->values[j]) == 0) { - found = true; - break; - } - } - if ((req->operation == DRSUAPI_DS_SPN_OPERATION_ADD && found) || - (req->operation == DRSUAPI_DS_SPN_OPERATION_DELETE && !found)) { - continue; - } ret = samdb_msg_add_string(b_state->sam_ctx, msg, msg, "servicePrincipalName", req->spn_names[i].str); @@ -125,8 +95,7 @@ WERROR dcesrv_drsuapi_DsWriteAccountSpn(struct dcesrv_call_state *dce_call, TALL } /* Apply to database */ - - ret = ldb_modify(b_state->sam_ctx, msg); + ret = dsdb_modify_permissive(b_state->sam_ctx, msg); if (ret != 0) { DEBUG(0,("Failed to modify SPNs on %s: %s\n", ldb_dn_get_linearized(msg->dn), -- Samba Shared Repository